This commit is contained in:
Anthony 2023-07-03 07:46:19 +01:00
parent 456f313056
commit fedd76fc67
20 changed files with 382 additions and 347 deletions

View File

@ -1,3 +1,11 @@
## [6.8.0] - 2023-07-03
* UI fixes.
* Fix price on coupon page error alerts.
* Fix issue where IOS builds were not using the correct build version.
* Small refactor to the project.
* Pubspec.yaml dependency updates.
## [6.7.0] - 2023-06-20 ## [6.7.0] - 2023-06-20
* Refactor project for Nylo 5.x. * Refactor project for Nylo 5.x.

View File

@ -43,7 +43,7 @@ Full documentation this available [here](https://woosignal.com/docs/app/label-st
- Browse products, make orders, customer login (via WordPress) - Browse products, make orders, customer login (via WordPress)
- Change app name, logo, customize default language, currency + more - Change app name, logo, customize default language, currency + more
- Light and dark mode - Light and dark mode
- Stripe, Cash On Delivery, PayPal - Stripe, Cash On Delivery, PayPal, RazorPay
- Localized for en, es, pt, it, hi, fr, zh, tr, nl, de - Localized for en, es, pt, it, hi, fr, zh, tr, nl, de
- Orders show as normal in WooCommerce - Orders show as normal in WooCommerce

View File

@ -373,6 +373,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.flutter.app; PRODUCT_BUNDLE_IDENTIFIER = com.flutter.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -511,6 +512,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.flutter.app; PRODUCT_BUNDLE_IDENTIFIER = com.flutter.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -543,6 +545,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.flutter.app; PRODUCT_BUNDLE_IDENTIFIER = com.flutter.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

View File

@ -17,7 +17,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string> <string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
@ -34,7 +34,7 @@
</dict> </dict>
</array> </array>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string> <string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>MinimumOSVersion</key> <key>MinimumOSVersion</key>

View File

@ -19,7 +19,7 @@ class User extends Model {
toJson() => {"token": token, "user_id": userId}; toJson() => {"token": token, "user_id": userId};
fromJson(dynamic data) { User.fromJson(dynamic data) {
token = data['token']; token = data['token'];
userId = data['user_id']; userId = data['user_id'];
} }

View File

@ -6,13 +6,15 @@ import 'package:woosignal/woosignal.dart';
class FirebaseProvider implements NyProvider { class FirebaseProvider implements NyProvider {
@override
boot(Nylo nylo) async { boot(Nylo nylo) async {
return null; return null;
} }
@override
afterBoot(Nylo nylo) async { afterBoot(Nylo nylo) async {
if (getEnv('FCM_ENABLED') != true) return; if (getEnv('FCM_ENABLED', defaultValue: false) != true) return;
await Firebase.initializeApp( await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, options: DefaultFirebaseOptions.currentPlatform,

View File

@ -15,6 +15,7 @@ import 'package:flutter_app/app/models/cart.dart';
import 'package:flutter_app/app/models/cart_line_item.dart'; import 'package:flutter_app/app/models/cart_line_item.dart';
import 'package:flutter_app/app/models/checkout_session.dart'; import 'package:flutter_app/app/models/checkout_session.dart';
import 'package:flutter_app/bootstrap/app_helper.dart'; import 'package:flutter_app/bootstrap/app_helper.dart';
import 'package:flutter_app/bootstrap/helpers.dart';
import 'package:flutter_app/bootstrap/shared_pref/sp_auth.dart'; import 'package:flutter_app/bootstrap/shared_pref/sp_auth.dart';
import 'package:woosignal/models/payload/order_wc.dart'; import 'package:woosignal/models/payload/order_wc.dart';
import 'package:woosignal/models/response/tax_rate.dart'; import 'package:woosignal/models/response/tax_rate.dart';
@ -51,7 +52,7 @@ Future<OrderWC> buildOrderWC({TaxRate? taxRate, bool markPaid = true}) async {
tmpLineItem.variationId = cartItem.variationId; tmpLineItem.variationId = cartItem.variationId;
} }
tmpLineItem.subtotal = cartItem.subtotal; tmpLineItem.subtotal = (parseWcPrice(cartItem.subtotal) * parseWcPrice(cartItem.quantity.toString())).toString();
lineItems.add(tmpLineItem); lineItems.add(tmpLineItem);
} }

View File

@ -1,3 +1,4 @@
import 'package:flutter_app/app/models/user.dart';
import 'package:flutter_app/app/networking/api_service.dart'; import 'package:flutter_app/app/networking/api_service.dart';
import 'package:flutter_app/app/networking/dio/base_api_service.dart'; import 'package:flutter_app/app/networking/dio/base_api_service.dart';
@ -12,6 +13,7 @@ import 'package:flutter_app/app/networking/dio/base_api_service.dart';
final Map<Type, dynamic> modelDecoders = { final Map<Type, dynamic> modelDecoders = {
// ... // ...
User: (data) => User.fromJson(data)
}; };
/* /*

View File

@ -15,4 +15,5 @@ import 'package:nylo_framework/nylo_framework.dart';
final Map<Type, NyEvent> events = { final Map<Type, NyEvent> events = {
LoginEvent: LoginEvent(), LoginEvent: LoginEvent(),
LogoutEvent: LogoutEvent(), LogoutEvent: LogoutEvent(),
AuthUserEvent: AuthUserEvent(),
}; };

View File

@ -8,10 +8,10 @@
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_app/app/controllers/account_order_detail_controller.dart'; import 'package:flutter_app/app/controllers/account_order_detail_controller.dart';
import 'package:flutter_app/bootstrap/helpers.dart'; import 'package:flutter_app/bootstrap/helpers.dart';
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
import 'package:flutter_app/resources/widgets/safearea_widget.dart'; import 'package:flutter_app/resources/widgets/safearea_widget.dart';
import 'package:flutter_app/resources/widgets/woosignal_ui.dart'; import 'package:flutter_app/resources/widgets/woosignal_ui.dart';
import 'package:nylo_framework/nylo_framework.dart'; import 'package:nylo_framework/nylo_framework.dart';
@ -29,10 +29,14 @@ class AccountOrderDetailPage extends NyStatefulWidget {
class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> { class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
int? _orderId; int? _orderId;
Order? _order; Order? _order;
bool _isLoading = true;
@override @override
init() async { init() async {
super.init();
}
@override
boot() async {
_orderId = widget.controller.data(); _orderId = widget.controller.data();
await _fetchOrder(); await _fetchOrder();
} }
@ -48,149 +52,160 @@ class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
), ),
margin: EdgeInsets.only(left: 0), margin: EdgeInsets.only(left: 0),
), ),
title: Text("${trans("Order").capitalize()} #${_orderId.toString()}"), title: afterNotNull(_orderId, child: () => Text("${trans("Order").capitalize()} #${_orderId.toString()}"), loadingPlaceholder: CupertinoActivityIndicator()),
centerTitle: true, centerTitle: true,
), ),
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
body: SafeAreaWidget( body: SafeAreaWidget(
child: _isLoading child: afterLoad(child: () => Column(
? AppLoaderWidget() crossAxisAlignment: CrossAxisAlignment.center,
: Column( mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[
mainAxisAlignment: MainAxisAlignment.center, Padding(
padding: EdgeInsets.only(top: 8),
child: Text(
"${trans("Date Ordered").capitalize()}: ${dateFormatted(
date: _order?.dateCreated ?? "",
formatType: formatForDateTime(FormatType.date),
)}",
),
),
Container(
margin: EdgeInsets.only(top: 10, bottom: 10),
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
Padding( Flexible(
padding: EdgeInsets.only(top: 8), child: Text("${trans("Ships to").capitalize()}:"),
),
Flexible(
child: Text( child: Text(
"${trans("Date Ordered").capitalize()}: ${dateFormatted( [
date: _order?.dateCreated ?? "", [
formatType: formatForDateTime(FormatType.date), _order!.shipping!.firstName,
)}", _order!.shipping!.lastName
), ].where((t) => t != null).toList().join(" "),
), _order!.shipping!.address1,
Container( _order!.shipping!.address2,
margin: EdgeInsets.only(top: 10, bottom: 10), _order!.shipping!.city,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), _order!.shipping!.state,
child: Row( _order!.shipping!.postcode,
crossAxisAlignment: CrossAxisAlignment.start, _order!.shipping!.country,
mainAxisAlignment: MainAxisAlignment.spaceBetween, ]
children: <Widget>[ .where((t) => (t != "" && t != null))
Flexible( .toList()
child: Text("${trans("Ships to").capitalize()}:"), .join("\n"),
), textAlign: TextAlign.right,
Flexible(
child: Text(
[
[
_order!.shipping!.firstName,
_order!.shipping!.lastName
].where((t) => t != null).toList().join(" "),
_order!.shipping!.address1,
_order!.shipping!.address2,
_order!.shipping!.city,
_order!.shipping!.state,
_order!.shipping!.postcode,
_order!.shipping!.country,
]
.where((t) => (t != "" && t != null))
.toList()
.join("\n"),
textAlign: TextAlign.right,
),
),
],
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
boxShadow:
(Theme.of(context).brightness == Brightness.light)
? wsBoxShadow()
: null,
color: (Theme.of(context).brightness == Brightness.light)
? Colors.white
: Color(0xFF2C2C2C),
),
),
Expanded(
child: ListView.builder(
itemBuilder: (cxt, i) {
LineItems lineItem = _order!.lineItems![i];
return Card(
child: ListTile(
contentPadding: EdgeInsets.only(
top: 5, bottom: 5, left: 8, right: 6),
title: Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color(0xFFFCFCFC), width: 1),
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
child: Text(
lineItem.name!,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Text(
formatStringCurrency(total: lineItem.price)
.capitalize(),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
),
subtitle: Padding(
padding: const EdgeInsets.only(top: 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
formatStringCurrency(
total: lineItem.total,
),
style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(
fontWeight: FontWeight.w600,
),
textAlign: TextAlign.left,
),
Text(
"x${lineItem.quantity.toString()}",
style: Theme.of(context)
.textTheme
.bodyLarge,
textAlign: TextAlign.left,
),
],
),
],
),
),
),
);
},
itemCount: _order!.lineItems!.length,
), ),
), ),
], ],
), ),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
boxShadow:
(Theme.of(context).brightness == Brightness.light)
? wsBoxShadow()
: null,
color: (Theme.of(context).brightness == Brightness.light)
? Colors.white
: Color(0xFF2C2C2C),
),
),
Expanded(
child: ListView.builder(
itemBuilder: (cxt, i) {
LineItems lineItem = _order!.lineItems![i];
return Card(
child: ListTile(
contentPadding: EdgeInsets.only(
top: 5, bottom: 5, left: 8, right: 6),
title: Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color(0xFFFCFCFC), width: 1),
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
child: Text(
lineItem.name!,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
Container(
width: 70,
alignment: Alignment.topRight,
child: Text(
formatStringCurrency(total: lineItem.total)
.capitalize(),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.bold
),
),
),
],
),
),
subtitle: Container(
decoration: BoxDecoration(
border: Border(
top: BorderSide(color: Colors.grey[100]!)
)
),
padding: const EdgeInsets.only(top: 10),
margin: EdgeInsets.only(top: 4),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
formatStringCurrency(
total: lineItem.price,
),
style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(
fontWeight: FontWeight.w600,
),
textAlign: TextAlign.left,
),
Text(
"x ${lineItem.quantity.toString()}",
style: Theme.of(context)
.textTheme
.bodyLarge,
textAlign: TextAlign.left,
),
],
),
],
),
),
),
);
},
itemCount: _order?.lineItems?.length ?? 0,
),
),
],
)),
), ),
); );
} }
@ -201,13 +216,6 @@ class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
} }
_fetchOrder() async { _fetchOrder() async {
_order = await (appWooSignal((api) { _order = await (appWooSignal((api) => api.retrieveOrder(_orderId!)));
return api.retrieveOrder(_orderId!);
}));
if (_order != null) {
setState(() {
_isLoading = false;
});
}
} }
} }

View File

@ -58,7 +58,6 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
CheckoutSession.getInstance.paymentType = paymentTypes.firstWhere( CheckoutSession.getInstance.paymentType = paymentTypes.firstWhere(
(paymentType) => paymentType?.id == 20, (paymentType) => paymentType?.id == 20,
orElse: () => paymentTypes.first); orElse: () => paymentTypes.first);
print(CheckoutSession.getInstance.paymentType?.name);
} }
_getTaxes(); _getTaxes();
} }
@ -203,126 +202,124 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
body: SafeAreaWidget( body: SafeAreaWidget(
child: Container( child: Container(
child: Column( child: ListView(
mainAxisAlignment: MainAxisAlignment.start, shrinkWrap: true,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Expanded( ListView(
child: ListView( shrinkWrap: true,
shrinkWrap: true, physics: NeverScrollableScrollPhysics(),
children: [ children: [
CheckoutStoreHeadingWidget(), CheckoutStoreHeadingWidget(),
CheckoutUserDetailsWidget( CheckoutUserDetailsWidget(
context: context, context: context,
checkoutSession: checkoutSession, checkoutSession: checkoutSession,
resetState: () { resetState: () {
setState(() { setState(() {
_showFullLoader = true; _showFullLoader = true;
}); });
_getTaxes(); _getTaxes();
}, },
), ),
CheckoutPaymentTypeWidget( CheckoutPaymentTypeWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
),
CheckoutShippingTypeWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
wooSignalApp: _wooSignalApp,
),
if (_wooSignalApp!.couponEnabled == true)
CheckoutSelectCouponWidget(
context: context, context: context,
checkoutSession: checkoutSession, checkoutSession: checkoutSession,
resetState: () => setState(() {}), resetState: () => setState(() {}),
), ),
CheckoutShippingTypeWidget( Container(
context: context, decoration: BoxDecoration(
checkoutSession: checkoutSession, boxShadow: wsBoxShadow(),
resetState: () => setState(() {}), color: Colors.white,
wooSignalApp: _wooSignalApp, // borderRadius: BorderRadius.circular(16)
), ),
if (_wooSignalApp!.couponEnabled == true) padding: EdgeInsets.symmetric(vertical: 16),
CheckoutSelectCouponWidget( margin: EdgeInsets.only(top: 20),
context: context, child: Column(
checkoutSession: checkoutSession, children: [
resetState: () => setState(() {}), Container(
), padding: EdgeInsets.symmetric(horizontal: 8),
Container( child: Row(
decoration: BoxDecoration(
boxShadow: wsBoxShadow(),
color: Colors.white,
// borderRadius: BorderRadius.circular(16)
),
padding: EdgeInsets.symmetric(vertical: 16),
margin: EdgeInsets.only(top: 20),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 8),
child: Row(
children: [
Icon(Icons.receipt),
Padding(padding: EdgeInsets.only(right: 8),),
Text(trans("Order Summary")).fontWeightBold()
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Padding(padding: EdgeInsets.only(top: 16)), Icon(Icons.receipt),
CheckoutSubtotal( Padding(padding: EdgeInsets.only(right: 8),),
title: trans("Subtotal"), Text(trans("Order Summary")).fontWeightBold()
),
CheckoutCouponAmountWidget(
checkoutSession: checkoutSession),
if (_wooSignalApp!.disableShipping != 1)
CheckoutMetaLine(
title: trans("Shipping fee"),
amount: CheckoutSession
.getInstance.shippingType ==
null
? trans("Select shipping")
: CheckoutSession
.getInstance.shippingType!
.getTotal(withFormatting: true)),
if (_taxRate != null)
CheckoutTaxTotal(taxRate: _taxRate),
Padding(padding: EdgeInsets.only(top: 8, left: 8, right: 8)),
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: RichText(
textAlign: TextAlign.left,
text: TextSpan(
text:
'${trans('By completing this order, I agree to all')} ',
style: Theme.of(context).textTheme.bodySmall!.copyWith(
fontSize: 12,
),
children: <TextSpan>[
TextSpan(
recognizer: TapGestureRecognizer()..onTap = _openTermsLink,
text: trans("Terms and conditions").toLowerCase(),
style: Theme.of(context)
.textTheme
.bodySmall!
.copyWith(
color: ThemeColor.get(context)
.primaryAccent,
fontSize: 12,
),
),
TextSpan(
text: ".",
style: Theme.of(context)
.textTheme
.bodySmall!
.copyWith(
color: Colors.black87,
fontSize: 12,
),
),
],
),
)),
], ],
), ),
], ),
), Column(
) crossAxisAlignment: CrossAxisAlignment.start,
], mainAxisAlignment: MainAxisAlignment.end,
), children: [
Padding(padding: EdgeInsets.only(top: 16)),
CheckoutSubtotal(
title: trans("Subtotal"),
),
CheckoutCouponAmountWidget(
checkoutSession: checkoutSession),
if (_wooSignalApp!.disableShipping != 1)
CheckoutMetaLine(
title: trans("Shipping fee"),
amount: CheckoutSession
.getInstance.shippingType ==
null
? trans("Select shipping")
: CheckoutSession
.getInstance.shippingType!
.getTotal(withFormatting: true)),
if (_taxRate != null)
CheckoutTaxTotal(taxRate: _taxRate),
Padding(padding: EdgeInsets.only(top: 8, left: 8, right: 8)),
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: RichText(
textAlign: TextAlign.left,
text: TextSpan(
text:
'${trans('By completing this order, I agree to all')} ',
style: Theme.of(context).textTheme.bodySmall!.copyWith(
fontSize: 12,
),
children: <TextSpan>[
TextSpan(
recognizer: TapGestureRecognizer()..onTap = _openTermsLink,
text: trans("Terms and conditions").toLowerCase(),
style: Theme.of(context)
.textTheme
.bodySmall!
.copyWith(
color: ThemeColor.get(context)
.primaryAccent,
fontSize: 12,
),
),
TextSpan(
text: ".",
style: Theme.of(context)
.textTheme
.bodySmall!
.copyWith(
color: Colors.black87,
fontSize: 12,
),
),
],
),
)),
],
),
],
),
)
],
), ),
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(

View File

@ -34,6 +34,7 @@ class _CheckoutStatusState extends NyState<CheckoutStatusPage> {
_order = widget.controller.data(); _order = widget.controller.data();
await Cart.getInstance.clear(); await Cart.getInstance.clear();
CheckoutSession.getInstance.clear(); CheckoutSession.getInstance.clear();
setState(() { });
} }
@override @override
@ -161,7 +162,7 @@ class _CheckoutStatusState extends NyState<CheckoutStatusPage> {
), ),
Text( Text(
formatStringCurrency( formatStringCurrency(
total: lineItem.total.toString(), total: lineItem.subtotal.toString(),
), ),
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
) )

View File

@ -179,7 +179,7 @@ class _CouponPageState extends State<CouponPage> {
if (minimumAmount != 0 && doubleSubtotal < minimumAmount) { if (minimumAmount != 0 && doubleSubtotal < minimumAmount) {
_showAlert( _showAlert(
message: trans("Spend a minimum of minimumAmount to redeem", message: trans("Spend a minimum of minimumAmount to redeem",
arguments: {"minimumAmount": minimumAmount.toString()}), arguments: {"minimumAmount": formatStringCurrency(total: minimumAmount.toString())}),
style: ToastNotificationStyleType.DANGER); style: ToastNotificationStyleType.DANGER);
return; return;
} }
@ -189,7 +189,7 @@ class _CouponPageState extends State<CouponPage> {
if (maximumAmount != 0 && doubleSubtotal > maximumAmount) { if (maximumAmount != 0 && doubleSubtotal > maximumAmount) {
_showAlert( _showAlert(
message: trans("Spend less than maximumAmount to redeem", message: trans("Spend less than maximumAmount to redeem",
arguments: {"maximumAmount": maximumAmount.toString()}), arguments: {"maximumAmount": formatStringCurrency(total: maximumAmount.toString())}),
style: ToastNotificationStyleType.DANGER); style: ToastNotificationStyleType.DANGER);
return; return;
} }

View File

@ -84,7 +84,7 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
"${trans("Select a")} ${_product!.attributes[attributeIndex].name}", "${trans("Select a")} ${_product!.attributes[attributeIndex].name}",
bodyWidget: ListView.separated( bodyWidget: ListView.separated(
itemCount: _product!.attributes[attributeIndex].options!.length, itemCount: _product!.attributes[attributeIndex].options!.length,
separatorBuilder: (BuildContext context, int index) => Divider(), separatorBuilder: (BuildContext context, int index) => Divider(color: Colors.black12),
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return ListTile( return ListTile(
title: Text( title: Text(

View File

@ -6,31 +6,45 @@ import 'package:nylo_framework/nylo_framework.dart';
/// light_theme_colors.dart and dark_theme_colors.dart. /// light_theme_colors.dart and dark_theme_colors.dart.
abstract class ColorStyles extends BaseColorStyles { abstract class ColorStyles extends BaseColorStyles {
// general // general
@override
Color get background; Color get background;
Color get backgroundContainer; Color get backgroundContainer;
@override
Color get primaryContent; Color get primaryContent;
@override
Color get primaryAccent; Color get primaryAccent;
@override
Color get surfaceBackground; Color get surfaceBackground;
@override
Color get surfaceContent; Color get surfaceContent;
// app bar // app bar
@override
Color get appBarBackground; Color get appBarBackground;
@override
Color get appBarPrimaryContent; Color get appBarPrimaryContent;
// buttons // buttons
@override
Color get buttonBackground; Color get buttonBackground;
@override
Color get buttonPrimaryContent; Color get buttonPrimaryContent;
// bottom tab bar // bottom tab bar
@override
Color get bottomTabBarBackground; Color get bottomTabBarBackground;
// bottom tab bar - icons // bottom tab bar - icons
@override
Color get bottomTabBarIconSelected; Color get bottomTabBarIconSelected;
@override
Color get bottomTabBarIconUnselected; Color get bottomTabBarIconUnselected;
// bottom tab bar - label // bottom tab bar - label
@override
Color get bottomTabBarLabelUnselected; Color get bottomTabBarLabelUnselected;
@override
Color get bottomTabBarLabelSelected; Color get bottomTabBarLabelSelected;
Color get inputPrimaryContent; Color get inputPrimaryContent;

View File

@ -27,10 +27,11 @@ class CheckoutSelectCouponWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
bool hasCoupon = checkoutSession.coupon != null; bool hasCoupon = checkoutSession.coupon != null;
return InkWell( return Container(
onTap: _actionCoupon, height: 50,
child: Container( padding: EdgeInsets.symmetric(vertical: 5),
padding: EdgeInsets.symmetric(vertical: 5), child: InkWell(
onTap: _actionCoupon,
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,

View File

@ -138,72 +138,69 @@ class CheckoutRowLine extends StatelessWidget {
final bool showBorderBottom; final bool showBorderBottom;
@override @override
Widget build(BuildContext context) => Flexible( Widget build(BuildContext context) => Container(
child: InkWell( height: 125,
child: Container( padding: EdgeInsets.all(8),
height: 125, decoration: showBorderBottom == true
child: Column( ? BoxDecoration(
crossAxisAlignment: CrossAxisAlignment.start, border: Border(
mainAxisAlignment: MainAxisAlignment.center, bottom: BorderSide(color: Colors.black12, width: 1),
),
)
: BoxDecoration(),
child: InkWell(
onTap: action,
borderRadius: BorderRadius.circular(8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
child: Text(
heading,
style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(fontSize: 16, fontWeight: FontWeight.bold),
),
padding: EdgeInsets.only(bottom: 8),
),
Flexible(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
Padding(
child: Text(
heading,
style: Theme.of(context)
.textTheme
.bodyMedium!
.copyWith(fontSize: 16, fontWeight: FontWeight.bold),
),
padding: EdgeInsets.only(bottom: 8),
),
Flexible( Flexible(
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Flexible( leadImage,
child: Row( Expanded(
crossAxisAlignment: CrossAxisAlignment.center, child: Container(
mainAxisAlignment: MainAxisAlignment.start, child: Text(
children: <Widget>[ leadTitle!,
leadImage, style:
Expanded( Theme.of(context).textTheme.titleMedium,
child: Container( maxLines: 2,
child: Text( overflow: TextOverflow.ellipsis,
leadTitle!, softWrap: false,
style: ),
Theme.of(context).textTheme.titleMedium, padding: EdgeInsets.only(left: 15),
maxLines: 2, margin: EdgeInsets.only(right: 10),
overflow: TextOverflow.ellipsis,
softWrap: false,
),
padding: EdgeInsets.only(left: 15),
margin: EdgeInsets.only(right: 10),
),
),
],
), ),
), ),
Icon(Icons.arrow_forward_ios),
], ],
), ),
) ),
Icon(Icons.arrow_forward_ios),
], ],
), ),
padding: EdgeInsets.all(8), )
decoration: showBorderBottom == true ],
? BoxDecoration( ),
border: Border( ),
bottom: BorderSide(color: Colors.black12, width: 1), );
),
)
: BoxDecoration(),
),
onTap: action,
borderRadius: BorderRadius.circular(8),
),
flex: 3,
);
} }
class TextEditingRow extends StatelessWidget { class TextEditingRow extends StatelessWidget {

View File

@ -189,10 +189,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: device_info_plus name: device_info_plus
sha256: "499c61743e13909c13374a8c209075385858c614b9c0f2487b5f9995eeaf7369" sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.0.1" version: "9.0.2"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -269,10 +269,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_messaging name: firebase_messaging
sha256: "77d93f897c893fa7c8de433f6950123bd9c56f27fd7f88a032a53102ca23fcee" sha256: "7a09d8c21147f009882a27c96de1918ea283f974d73cb6fae1d234bb9ec18d8b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.6.3" version: "14.6.4"
firebase_messaging_platform_interface: firebase_messaging_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -457,10 +457,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_widget_from_html_core name: flutter_widget_from_html_core
sha256: "77f05cd7a738078dcdbe07741140d58b2fe7509197f3855a91269fb5a90f4bee" sha256: "60485f3c562c46783ea3e6cd344dc3fc2d51444bda42ffc4b8e11abdc10837e1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.10.1" version: "0.10.2"
fluttertoast: fluttertoast:
dependency: transitive dependency: transitive
description: description:
@ -617,18 +617,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: nylo_framework name: nylo_framework
sha256: "905f0f013413ab07433b37aeab2ac05865dea0dc7c2cf93336b881cd5eeb32e4" sha256: a10e1ea240e04aa64a90a6170bc2eebd585b9c0f85b1557e323c5a49312add2b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.0" version: "5.1.1"
nylo_support: nylo_support:
dependency: transitive dependency: transitive
description: description:
name: nylo_support name: nylo_support
sha256: "7324d3fccb315619a28ce292d15f8ac1150aa6111faddbf1de991305fdf80479" sha256: "09c5eace0c4fa4cef5148b3b7820fd0a8b24154c964c34c1396372315ef815d6"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.3.0" version: "5.3.1"
octo_image: octo_image:
dependency: transitive dependency: transitive
description: description:
@ -817,10 +817,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences name: shared_preferences
sha256: "16d3fb6b3692ad244a695c0183fca18cf81fd4b821664394a781de42386bf022" sha256: "0344316c947ffeb3a529eac929e1978fcd37c26be4e8468628bac399365a3ca1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.2.0"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
@ -849,10 +849,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_platform_interface name: shared_preferences_platform_interface
sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.0" version: "2.3.0"
shared_preferences_web: shared_preferences_web:
dependency: transitive dependency: transitive
description: description:
@ -1142,10 +1142,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: woosignal name: woosignal
sha256: "985313603ad26dbb48420ce1b9029ebec7b6681861bab094c5f89d1710281ac3" sha256: "2daf353de3ff3e6b2087bf886fc9cd66effc8e78e3e1c71eee755ec978204a6b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.5.0" version: "3.6.1"
wp_json_api: wp_json_api:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -1,7 +1,7 @@
# Official WooSignal App Template for WooCommerce # Official WooSignal App Template for WooCommerce
# Label StoreMax # Label StoreMax
# Version: 6.7.0 # Version: 6.8.0
# Author: Anthony Gordon # Author: Anthony Gordon
# Homepage: https://woosignal.com # Homepage: https://woosignal.com
# Documentation: https://woosignal.com/docs/app/label-storemax # Documentation: https://woosignal.com/docs/app/label-storemax
@ -29,14 +29,14 @@ dependencies:
google_fonts: ^4.0.5 google_fonts: ^4.0.5
analyzer: ^5.12.0 analyzer: ^5.12.0
intl: ^0.18.0 intl: ^0.18.0
nylo_framework: ^5.1.0 nylo_framework: ^5.1.1
woosignal: ^3.5.0 woosignal: ^3.6.1
wp_json_api: ^3.3.2 wp_json_api: ^3.3.2
cached_network_image: ^3.2.3 cached_network_image: ^3.2.3
package_info_plus: ^4.0.2 package_info_plus: ^4.0.2
money_formatter: ^0.0.3 money_formatter: ^0.0.3
flutter_web_browser: ^0.17.1 flutter_web_browser: ^0.17.1
webview_flutter: ^3.0.4 webview_flutter: 3.0.4
pull_to_refresh_flutter3: 2.0.1 pull_to_refresh_flutter3: 2.0.1
url_launcher: ^6.1.6 url_launcher: ^6.1.6
bubble_tab_indicator: ^0.1.5 bubble_tab_indicator: ^0.1.5
@ -46,11 +46,11 @@ dependencies:
flutter_spinkit: ^5.1.0 flutter_spinkit: ^5.1.0
auto_size_text: ^3.0.0 auto_size_text: ^3.0.0
html: ^0.15.1 html: ^0.15.1
flutter_widget_from_html_core: ^0.10.0 flutter_widget_from_html_core: ^0.10.2
flutter_rating_bar: ^4.0.1 flutter_rating_bar: ^4.0.1
flutter_staggered_grid_view: ^0.6.2 flutter_staggered_grid_view: ^0.6.2
flutter_swiper_view: ^1.1.8 flutter_swiper_view: ^1.1.8
firebase_messaging: ^14.6.3 firebase_messaging: ^14.6.4
firebase_core: ^2.14.0 firebase_core: ^2.14.0
flutter: flutter:
sdk: flutter sdk: flutter

View File

@ -45,7 +45,7 @@ Full documentation this available [here](https://woosignal.com/docs/app/ios/labe
- Change app name, logo, customize default language, currency + more - Change app name, logo, customize default language, currency + more
- Light and dark mode - Light and dark mode
- Theme customization - Theme customization
- Stripe, Cash On Delivery, PayPal - Stripe, Cash On Delivery, PayPal, RazorPay
- Localized for en, es, pt, it, hi, fr, zh, tr, nl - Localized for en, es, pt, it, hi, fr, zh, tr, nl
- Orders show as normal in WooCommerce - Orders show as normal in WooCommerce