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
* 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)
- Change app name, logo, customize default language, currency + more
- 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
- Orders show as normal in WooCommerce

View File

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

View File

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

View File

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

View File

@ -6,13 +6,15 @@ import 'package:woosignal/woosignal.dart';
class FirebaseProvider implements NyProvider {
@override
boot(Nylo nylo) async {
return null;
}
@override
afterBoot(Nylo nylo) async {
if (getEnv('FCM_ENABLED') != true) return;
if (getEnv('FCM_ENABLED', defaultValue: false) != true) return;
await Firebase.initializeApp(
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/checkout_session.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:woosignal/models/payload/order_wc.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.subtotal = cartItem.subtotal;
tmpLineItem.subtotal = (parseWcPrice(cartItem.subtotal) * parseWcPrice(cartItem.quantity.toString())).toString();
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/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 = {
// ...
User: (data) => User.fromJson(data)
};
/*

View File

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

View File

@ -8,10 +8,10 @@
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/app/controllers/account_order_detail_controller.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/woosignal_ui.dart';
import 'package:nylo_framework/nylo_framework.dart';
@ -29,10 +29,14 @@ class AccountOrderDetailPage extends NyStatefulWidget {
class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
int? _orderId;
Order? _order;
bool _isLoading = true;
@override
init() async {
super.init();
}
@override
boot() async {
_orderId = widget.controller.data();
await _fetchOrder();
}
@ -48,149 +52,160 @@ class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
),
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,
),
resizeToAvoidBottomInset: false,
body: SafeAreaWidget(
child: _isLoading
? AppLoaderWidget()
: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
child: afterLoad(child: () => Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
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>[
Padding(
padding: EdgeInsets.only(top: 8),
Flexible(
child: Text("${trans("Ships to").capitalize()}:"),
),
Flexible(
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>[
Flexible(
child: Text("${trans("Ships to").capitalize()}:"),
),
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,
[
[
_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: 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 {
_order = await (appWooSignal((api) {
return api.retrieveOrder(_orderId!);
}));
if (_order != null) {
setState(() {
_isLoading = false;
});
}
_order = await (appWooSignal((api) => api.retrieveOrder(_orderId!)));
}
}

View File

@ -58,7 +58,6 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
CheckoutSession.getInstance.paymentType = paymentTypes.firstWhere(
(paymentType) => paymentType?.id == 20,
orElse: () => paymentTypes.first);
print(CheckoutSession.getInstance.paymentType?.name);
}
_getTaxes();
}
@ -203,126 +202,124 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
resizeToAvoidBottomInset: false,
body: SafeAreaWidget(
child: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
child: ListView(
shrinkWrap: true,
children: <Widget>[
Expanded(
child: ListView(
shrinkWrap: true,
children: [
CheckoutStoreHeadingWidget(),
CheckoutUserDetailsWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () {
setState(() {
_showFullLoader = true;
});
_getTaxes();
},
),
CheckoutPaymentTypeWidget(
ListView(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children: [
CheckoutStoreHeadingWidget(),
CheckoutUserDetailsWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () {
setState(() {
_showFullLoader = true;
});
_getTaxes();
},
),
CheckoutPaymentTypeWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
),
CheckoutShippingTypeWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
wooSignalApp: _wooSignalApp,
),
if (_wooSignalApp!.couponEnabled == true)
CheckoutSelectCouponWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
),
CheckoutShippingTypeWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
wooSignalApp: _wooSignalApp,
Container(
decoration: BoxDecoration(
boxShadow: wsBoxShadow(),
color: Colors.white,
// borderRadius: BorderRadius.circular(16)
),
if (_wooSignalApp!.couponEnabled == true)
CheckoutSelectCouponWidget(
context: context,
checkoutSession: checkoutSession,
resetState: () => setState(() {}),
),
Container(
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,
padding: EdgeInsets.symmetric(vertical: 16),
margin: EdgeInsets.only(top: 20),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 8),
child: Row(
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,
),
),
],
),
)),
Icon(Icons.receipt),
Padding(padding: EdgeInsets.only(right: 8),),
Text(trans("Order Summary")).fontWeightBold()
],
),
],
),
)
],
),
),
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(
decoration: BoxDecoration(

View File

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

View File

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

View File

@ -84,7 +84,7 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
"${trans("Select a")} ${_product!.attributes[attributeIndex].name}",
bodyWidget: ListView.separated(
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) {
return ListTile(
title: Text(

View File

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

View File

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

View File

@ -138,72 +138,69 @@ class CheckoutRowLine extends StatelessWidget {
final bool showBorderBottom;
@override
Widget build(BuildContext context) => Flexible(
child: InkWell(
child: Container(
height: 125,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
Widget build(BuildContext context) => Container(
height: 125,
padding: EdgeInsets.all(8),
decoration: showBorderBottom == true
? BoxDecoration(
border: Border(
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>[
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,
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Flexible(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
leadImage,
Expanded(
child: Container(
child: Text(
leadTitle!,
style:
Theme.of(context).textTheme.titleMedium,
maxLines: 2,
overflow: TextOverflow.ellipsis,
softWrap: false,
),
padding: EdgeInsets.only(left: 15),
margin: EdgeInsets.only(right: 10),
),
),
],
leadImage,
Expanded(
child: Container(
child: Text(
leadTitle!,
style:
Theme.of(context).textTheme.titleMedium,
maxLines: 2,
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 {

View File

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

View File

@ -1,7 +1,7 @@
# Official WooSignal App Template for WooCommerce
# Label StoreMax
# Version: 6.7.0
# Version: 6.8.0
# Author: Anthony Gordon
# Homepage: https://woosignal.com
# Documentation: https://woosignal.com/docs/app/label-storemax
@ -29,14 +29,14 @@ dependencies:
google_fonts: ^4.0.5
analyzer: ^5.12.0
intl: ^0.18.0
nylo_framework: ^5.1.0
woosignal: ^3.5.0
nylo_framework: ^5.1.1
woosignal: ^3.6.1
wp_json_api: ^3.3.2
cached_network_image: ^3.2.3
package_info_plus: ^4.0.2
money_formatter: ^0.0.3
flutter_web_browser: ^0.17.1
webview_flutter: ^3.0.4
webview_flutter: 3.0.4
pull_to_refresh_flutter3: 2.0.1
url_launcher: ^6.1.6
bubble_tab_indicator: ^0.1.5
@ -46,11 +46,11 @@ dependencies:
flutter_spinkit: ^5.1.0
auto_size_text: ^3.0.0
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_staggered_grid_view: ^0.6.2
flutter_swiper_view: ^1.1.8
firebase_messaging: ^14.6.3
firebase_messaging: ^14.6.4
firebase_core: ^2.14.0
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
- Light and dark mode
- Theme customization
- Stripe, Cash On Delivery, PayPal
- Stripe, Cash On Delivery, PayPal, RazorPay
- Localized for en, es, pt, it, hi, fr, zh, tr, nl
- Orders show as normal in WooCommerce