Compare commits

..

12 Commits
v6.6.1 ... 6.x

Author SHA1 Message Date
b279212a95 Launcher icon (all res.) changed to raster icon 2023-09-21 19:24:02 +02:00
ed1a9d70fb Changes reflecting personalization 2023-09-19 10:45:02 +02:00
4f11e7bb00 Upload files to 'LabelStoreMax/public/assets/app_icon' 2023-09-18 18:13:59 +00:00
Anthony
2f9118085c v6.9.1 2023-08-28 22:16:33 +01:00
Anthony
c620aa71cc v6.10.0 2023-08-21 02:54:53 +01:00
Anthony
63244606be v6.10.0 2023-08-21 02:54:18 +01:00
Anthony
3b350dbefb v6.9.0 2023-07-13 03:32:31 +01:00
Anthony
6deab507d8 v6.8.2 2023-07-05 00:00:42 +01:00
Anthony
a2698557ea v6.8.1 2023-07-03 21:00:28 +01:00
Anthony
fedd76fc67 v6.8.0 2023-07-03 07:46:19 +01:00
Anthony
456f313056 v6.7.0 2023-06-20 15:07:07 +07:00
Anthony
f67f486838 v6.6.2 2023-06-14 14:39:03 +07:00
56 changed files with 859 additions and 486 deletions

3
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -1,9 +1,9 @@
# *<! ------ App ------!>* # *<! ------ App ------!>*
APP_NAME="MyApp" APP_NAME="Raster"
APP_ENV="local" APP_ENV="local"
APP_DEBUG="true" APP_DEBUG="true"
APP_URL="https://mywoocommercestore.com" APP_URL="https://rasterdoo.com"
ASSET_PATH_PUBLIC="public/assets/" ASSET_PATH_PUBLIC="public/assets/"
ASSET_PATH_IMAGES="public/assets/images" ASSET_PATH_IMAGES="public/assets/images"
@ -14,12 +14,12 @@ DARK_THEME_ID="default_dark_theme"
# *<! ------ Language ------!>* # *<! ------ Language ------!>*
DEFAULT_LOCALE=null DEFAULT_LOCALE="en"
# supports: "en" (English), "es" (Spanish), "fr" (French), "hi" (Hindi), "it" (Italian), "pt" (Portuguese) or "zh" (Simplified Chinese) # supports: "en" (English), "es" (Spanish), "fr" (French), "hi" (Hindi), "it" (Italian), "pt" (Portuguese) or "zh" (Simplified Chinese)
# *<! ------ WooSignal Config ------!>* # *<! ------ WooSignal Config ------!>*
APP_KEY="your app key" APP_KEY="app_50818d11780aaba6b545076dea5b90"
# App key from WooSignal link: https://woosignal.com/dashboard # App key from WooSignal link: https://woosignal.com/dashboard
# *<! ------ STRIPE (OPTIONAL) ------!>* # *<! ------ STRIPE (OPTIONAL) ------!>*
@ -51,4 +51,8 @@ RAZORPAY_API_KEY=""
PRODUCT_PLACEHOLDER_IMAGE="https://woosignal.com/images/woocommerce-placeholder.png" PRODUCT_PLACEHOLDER_IMAGE="https://woosignal.com/images/woocommerce-placeholder.png"
# Sets the default placeholder image for products with no image # Sets the default placeholder image for products with no image
AUTH_USER_KEY="AUTH_USER" AUTH_USER_KEY="AUTH_USER"
FCM_ENABLED=null
ENCRYPT_KEY=null
ENCRYPT_SECRET=null

View File

@ -1,3 +1,50 @@
## [6.10.1] - 2023-08-28
* Refactor project for Nylo 5.x.
* Fix AndroidManifest splash screen
* Pubspec.yaml dependency updates
## [6.10.0] - 2023-08-21
* Small refactor to project
* Pubspec.yaml dependency updates
## [6.9.0] - 2023-07-13
* Pull firebase config via woosignal api
* New encrypt key and secret added to .env
* fix fetchRelated to return "publish" products
* Pubspec.yaml dependency updates
## [6.8.2] - 2023-07-04
* Update gradle + kotlin versions.
* Pubspec.yaml dependency updates.
## [6.8.1] - 2023-07-03
* Fix auth bug.
* Pubspec.yaml dependency updates.
## [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.
* New Firebase provider for FCM.
* Pubspec.yaml dependency updates.
## [6.6.2] - 2023-06-14
* Page bug fixes
* Pubspec.yaml dependency updates.
## [6.6.1] - 2023-05-28 ## [6.6.1] - 2023-05-28
* Refactor widgets + bug fixes * Refactor widgets + bug fixes
@ -28,7 +75,7 @@
* Fix the ThemeColor.get helper method to support ColorStyles. * Fix the ThemeColor.get helper method to support ColorStyles.
* Pubspec.yaml dependency updates * Pubspec.yaml dependency updates
* ## [6.4.0] - 2023-01-06 ## [6.4.0] - 2023-01-06
* Upgrade to Nylo v4.0.0 * Upgrade to Nylo v4.0.0
* Update copyright * Update copyright

View File

@ -4,8 +4,7 @@
# WooCommerce App: Label StoreMax # WooCommerce App: Label StoreMax
### Label StoreMax - v6.6.1 ### Label StoreMax
[Official WooSignal WooCommerce App](https://woosignal.com) [Official WooSignal WooCommerce App](https://woosignal.com)
@ -44,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

@ -12,7 +12,7 @@
<application <application
android:name="${applicationName}" android:name="${applicationName}"
android:label="Label StoreMax" android:label="Raster Knjizara"
android:icon="@mipmap/launcher_icon"> android:icon="@mipmap/launcher_icon">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
@ -31,15 +31,7 @@
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme"
/> />
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,12 +1,12 @@
buildscript { buildscript {
ext.kotlin_version = '1.6.10' ext.kotlin_version = '1.7.10'
repositories { repositories {
google() google()
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.0.1' classpath 'com.android.tools.build:gradle:7.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
@ -26,6 +26,6 @@ subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(':app')
} }
task clean(type: Delete) { tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

View File

@ -155,7 +155,7 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1300; LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
@ -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

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1300" LastUpgradeVersion = "1430"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

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

@ -16,7 +16,7 @@ class BearerAuthInterceptor extends Interceptor {
} }
@override @override
void onError(DioError err, ErrorInterceptorHandler handler) { void onError(DioException err, ErrorInterceptorHandler handler) {
handler.next(err); handler.next(err);
} }
} }

View File

@ -18,7 +18,7 @@ class LoggingInterceptor extends Interceptor {
} }
@override @override
void onError(DioError err, ErrorInterceptorHandler handler) { void onError(DioException err, ErrorInterceptorHandler handler) {
print( print(
'ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}'); 'ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}');
handler.next(err); handler.next(err);

View File

@ -22,31 +22,10 @@ class AppProvider implements NyProvider {
]); ]);
await WooSignal.instance await WooSignal.instance
.init(appKey: getEnv('APP_KEY'), debugMode: getEnv('APP_DEBUG')); .init(appKey: getEnv('APP_KEY'), debugMode: getEnv('APP_DEBUG'),
encryptKey: getEnv('ENCRYPT_KEY', defaultValue: null),
// Notifications encryptSecret: getEnv('ENCRYPT_SECRET', defaultValue: null)
/// await Firebase.initializeApp( );
/// options: DefaultFirebaseOptions.currentPlatform,
/// );
///
/// FirebaseMessaging messaging = FirebaseMessaging.instance;
///
/// NotificationSettings settings = await messaging.requestPermission(
/// alert: true,
/// announcement: false,
/// badge: true,
/// carPlay: false,
/// criticalAlert: false,
/// provisional: false,
/// sound: true,
/// );
///
/// if (settings.authorizationStatus == AuthorizationStatus.authorized) {
/// String? token = await messaging.getToken();
/// if (token != null) {
/// WooSignal.instance.setFcmToken(token);
/// }
/// }
AppHelper.instance.appConfig = WooSignalApp(); AppHelper.instance.appConfig = WooSignalApp();
AppHelper.instance.appConfig!.themeFont = "Poppins"; AppHelper.instance.appConfig!.themeFont = "Poppins";
@ -70,7 +49,7 @@ class AppProvider implements NyProvider {
}; };
// WooSignal Setup // WooSignal Setup
WooSignalApp? wooSignalApp = await (appWooSignal((api) => api.getApp())); WooSignalApp? wooSignalApp = await (appWooSignal((api) => api.getApp(encrypted: shouldEncrypt())));
Locale locale = Locale('en'); Locale locale = Locale('en');
if (wooSignalApp != null) { if (wooSignalApp != null) {
@ -116,6 +95,7 @@ class AppProvider implements NyProvider {
nylo.addModelDecoders(modelDecoders); nylo.addModelDecoders(modelDecoders);
nylo.addValidationRules(validationRules); nylo.addValidationRules(validationRules);
nylo.toastNotification = getToastNotificationWidget;
return nylo; return nylo;
} }
@ -124,4 +104,4 @@ class AppProvider implements NyProvider {
afterBoot(Nylo nylo) async { afterBoot(Nylo nylo) async {
} }
} }

View File

@ -0,0 +1,49 @@
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_app/bootstrap/app_helper.dart';
import 'package:flutter_app/firebase_options.dart';
import 'package:nylo_framework/nylo_framework.dart';
import 'package:woosignal/woosignal.dart';
class FirebaseProvider implements NyProvider {
@override
boot(Nylo nylo) async {
return null;
}
@override
afterBoot(Nylo nylo) async {
bool? firebaseFcmIsEnabled = AppHelper.instance.appConfig?.firebaseFcmIsEnabled;
if (firebaseFcmIsEnabled == null) {
firebaseFcmIsEnabled = getEnv('FCM_ENABLED', defaultValue: false);
}
if (firebaseFcmIsEnabled != true) return;
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
if (settings.authorizationStatus != AuthorizationStatus.authorized) {
return;
}
String? token = await messaging.getToken();
if (token != null) {
WooSignal.instance.setFcmToken(token);
}
}
}

View File

@ -33,16 +33,16 @@ razorPay(context,
Order? order = await appWooSignal((api) => api.createOrder(orderWC)); Order? order = await appWooSignal((api) => api.createOrder(orderWC));
if (order != null) { if (order != null) {
Cart.getInstance.clear();
Navigator.pushNamed(context, "/checkout-status", arguments: order);
} else {
showToastNotification( showToastNotification(
context, context,
title: "Error".tr(), title: "Error".tr(),
description: trans("Something went wrong, please contact our store"), description: trans("Something went wrong, please contact our store"),
); );
state.reloadState(showLoader: false); state.reloadState(showLoader: false);
return;
} }
Cart.getInstance.clear();
Navigator.pushNamed(context, "/checkout-status", arguments: order);
}); });
razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, (PaymentFailureResponse response) { razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, (PaymentFailureResponse response) {

View File

@ -118,7 +118,7 @@ stripePay(context,
return; return;
} }
Navigator.pushNamed(context, "/checkout-status", arguments: order); routeTo('/checkout-status', navigationType: NavigationType.pushAndForgetAll, data: order);
} on StripeException catch (e) { } on StripeException catch (e) {
if (getEnv('APP_DEBUG', defaultValue: true)) { if (getEnv('APP_DEBUG', defaultValue: true)) {
NyLogger.error(e.error.message!); NyLogger.error(e.error.message!);

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

@ -48,7 +48,7 @@ import 'package:flutter/services.dart' show rootBundle;
Future<User?> getUser() async => Future<User?> getUser() async =>
(await (NyStorage.read<User>(SharedKey.authUser))); (await (NyStorage.read<User>(SharedKey.authUser)));
Future appWooSignal(Function(WooSignal) api) async { Future appWooSignal(Function(WooSignal api) api) async {
return await api(WooSignal.instance); return await api(WooSignal.instance);
} }
@ -667,4 +667,16 @@ bool isProductNew(Product? product) {
NyLogger.error(e.toString()); NyLogger.error(e.toString());
} }
return false; return false;
}
bool shouldEncrypt() {
String? encryptKey = getEnv('ENCRYPT_KEY', defaultValue: "");
if (encryptKey == null || encryptKey == "") {
return false;
}
String? encryptSecret = getEnv('ENCRYPT_KEY', defaultValue: "");
if (encryptSecret == null || encryptSecret == "") {
return false;
}
return true;
} }

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

@ -1,6 +1,9 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_app/config/toast_notification.dart';
import 'package:flutter_app/resources/widgets/app_loader_widget.dart'; import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
import 'package:flutter_app/resources/widgets/toast_notification_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';
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
@ -16,3 +19,14 @@ Widget logo = StoreLogo();
Widget loader = AppLoaderWidget(); Widget loader = AppLoaderWidget();
// resources/widgets/app_loader_widget.dart // resources/widgets/app_loader_widget.dart
Widget getToastNotificationWidget({
required ToastNotificationStyleType style,
Function(ToastNotificationStyleMetaHelper helper)? toastNotificationStyleMeta, Function? onDismiss}) {
if (toastNotificationStyleMeta == null) return SizedBox.shrink();
ToastMeta toastMeta = toastNotificationStyleMeta(NyToastNotificationStyleMetaHelper(style));
return ToastNotification(toastMeta, onDismiss: onDismiss);
// resources/widgets/toast_notification.dart
}

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

@ -15,7 +15,7 @@ import 'package:nylo_framework/nylo_framework.dart';
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
*/ */
const appPaymentGateways = []; const appPaymentGateways = ["CashOnDelivery"];
// Available: "Stripe", "CashOnDelivery", "PayPal", "RazorPay" // Available: "Stripe", "CashOnDelivery", "PayPal", "RazorPay"
// e.g. app_payment_gateways = ["Stripe", "CashOnDelivery"]; will only use Stripe and Cash on Delivery. // e.g. app_payment_gateways = ["Stripe", "CashOnDelivery"]; will only use Stripe and Cash on Delivery.

View File

@ -1,3 +1,4 @@
import '/app/providers/firebase_provider.dart';
import 'package:flutter_app/app/providers/app_provider.dart'; import 'package:flutter_app/app/providers/app_provider.dart';
import 'package:flutter_app/app/providers/event_provider.dart'; import 'package:flutter_app/app/providers/event_provider.dart';
import 'package:flutter_app/app/providers/route_provider.dart'; import 'package:flutter_app/app/providers/route_provider.dart';
@ -17,4 +18,7 @@ final Map<Type, NyProvider> providers = {
AppProvider: AppProvider(), AppProvider: AppProvider(),
RouteProvider: RouteProvider(), RouteProvider: RouteProvider(),
EventProvider: EventProvider(), EventProvider: EventProvider(),
FirebaseProvider: FirebaseProvider(),
}; };

View File

@ -0,0 +1,34 @@
import 'package:nylo_framework/nylo_framework.dart';
/// ToastNotificationStyleMetaHelper is used to return
/// the correct value for the [ToastNotificationStyleType] toast style.
class NyToastNotificationStyleMetaHelper extends ToastNotificationStyleMetaHelper {
NyToastNotificationStyleMetaHelper(ToastNotificationStyleType? style) : super(style);
onSuccess() {
return ToastMeta.success();
}
onWarning() {
return ToastMeta.warning();
}
onInfo() {
return ToastMeta.info();
}
onDanger() {
return ToastMeta.danger();
}
// Example customizing a notification
// onSuccess() {
// return ToastMeta.success(
// title: "Hello",
// description: "World",
// action: () {},
// backgroundColor: Colors.Yellow
// );
// }
}

View File

@ -8,9 +8,9 @@
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
*/ */
final Map<Type, dynamic> validationRules = { final Map<String, dynamic> validationRules = {
/// Example /// Example
// SimplePassword: (attribute) => SimplePassword(attribute) // "simple_password": (attribute) => SimplePassword(attribute)
}; };
/// Example validation class /// Example validation class

View File

@ -0,0 +1,66 @@
// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
import 'package:flutter/foundation.dart'
show defaultTargetPlatform, kIsWeb, TargetPlatform;
import 'package:flutter_app/bootstrap/app_helper.dart';
/// Default [FirebaseOptions] for use with your Firebase apps.
class DefaultFirebaseOptions {
static FirebaseOptions get currentPlatform {
if (kIsWeb) {
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for web - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
}
switch (defaultTargetPlatform) {
case TargetPlatform.android:
if (AppHelper.instance.appConfig?.firebaseOptionsAndroid == null) {
throw UnsupportedError(
'Add a valid Firebase json config on https://woosignal.com for your WooCommerce store',
);
}
return FirebaseOptions(
apiKey: AppHelper.instance.appConfig!.firebaseOptionsAndroid!['apiKey'],
appId: AppHelper.instance.appConfig!.firebaseOptionsAndroid!['appId'],
messagingSenderId: AppHelper.instance.appConfig!.firebaseOptionsAndroid!['messagingSenderId'],
projectId: AppHelper.instance.appConfig!.firebaseOptionsAndroid!['projectId'],
storageBucket: AppHelper.instance.appConfig!.firebaseOptionsAndroid!['storageBucket'],
);
case TargetPlatform.iOS:
if (AppHelper.instance.appConfig?.firebaseOptionsIos == null) {
throw UnsupportedError(
'Add a valid Firebase plist config on https://woosignal.com for your WooCommerce store',
);
}
return FirebaseOptions(
apiKey: AppHelper.instance.appConfig!.firebaseOptionsIos!['apiKey'],
appId: AppHelper.instance.appConfig!.firebaseOptionsIos!['appId'],
messagingSenderId: AppHelper.instance.appConfig!.firebaseOptionsIos!['messagingSenderId'],
projectId: AppHelper.instance.appConfig!.firebaseOptionsIos!['projectId'],
storageBucket: AppHelper.instance.appConfig!.firebaseOptionsIos!['storageBucket'],
iosClientId: AppHelper.instance.appConfig!.firebaseOptionsIos!['iosClientId'],
iosBundleId: AppHelper.instance.appConfig!.firebaseOptionsIos!['iosBundleId'],
);
case TargetPlatform.macOS:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for macos - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.windows:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for windows - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.linux:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for linux - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
default:
throw UnsupportedError(
'DefaultFirebaseOptions are not supported for this platform.',
);
}
}
}

View File

@ -15,4 +15,4 @@ void main() async {
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
), ),
); );
} }

View File

@ -67,7 +67,8 @@ class _AccountDeletePageState extends NyState<AccountDeletePage> {
PrimaryButton( PrimaryButton(
title: trans("Yes, delete my account"), title: trans("Yes, delete my account"),
isLoading: isLocked('delete_account'), isLoading: isLocked('delete_account'),
action: _deleteAccount), action: _deleteAccount,
),
LinkButton(title: trans("Back"), action: pop) LinkButton(title: trans("Back"), action: pop)
], ],
) )

View File

@ -226,7 +226,7 @@ class _AccountLandingPageState extends NyState<AccountLandingPage> {
String? token = wpUserLoginResponse.data!.userToken; String? token = wpUserLoginResponse.data!.userToken;
String userId = wpUserLoginResponse.data!.userId.toString(); String userId = wpUserLoginResponse.data!.userId.toString();
User user = User.fromUserAuthResponse(token: token, userId: userId); User user = User.fromUserAuthResponse(token: token, userId: userId);
await Auth.set(user, key: SharedKey.authUser); await user.save(SharedKey.authUser);
showToastNotification(context, showToastNotification(context,
title: trans("Hello"), title: trans("Hello"),

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,150 +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()}"), loading: 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!, _order!.shipping!.firstName,
formatType: formatForDateTime(FormatType.date), _order!.shipping!.lastName
), ].where((t) => t != null).toList().join(" "),
), _order!.shipping!.address1,
), _order!.shipping!.address2,
Container( _order!.shipping!.city,
margin: EdgeInsets.only(top: 10, bottom: 10), _order!.shipping!.state,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), _order!.shipping!.postcode,
child: Row( _order!.shipping!.country,
crossAxisAlignment: CrossAxisAlignment.start, ]
mainAxisAlignment: MainAxisAlignment.spaceBetween, .where((t) => (t != "" && t != null))
children: <Widget>[ .toList()
Flexible( .join("\n"),
child: Text("${trans("Ships to").capitalize()}:"), 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,
),
),
],
)),
), ),
); );
} }
@ -202,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

@ -236,7 +236,7 @@ class _AccountRegistrationPageState extends NyState<AccountRegistrationPage> {
String? token = wpUserRegisterResponse.data!.userToken; String? token = wpUserRegisterResponse.data!.userToken;
String userId = wpUserRegisterResponse.data!.userId.toString(); String userId = wpUserRegisterResponse.data!.userId.toString();
User user = User.fromUserAuthResponse(token: token, userId: userId); User user = User.fromUserAuthResponse(token: token, userId: userId);
await Auth.set(user, key: SharedKey.authUser); await user.save(SharedKey.authUser);
await WPJsonAPI.instance.api((request) => request.wpUpdateUserInfo(token, await WPJsonAPI.instance.api((request) => request.wpUpdateUserInfo(token,
firstName: firstName, lastName: lastName)); firstName: firstName, lastName: lastName));

View File

@ -8,6 +8,7 @@
// 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/product_category_search_loader_controller.dart'; import 'package:flutter_app/app/controllers/product_category_search_loader_controller.dart';
import 'package:flutter_app/app/controllers/browse_category_controller.dart'; import 'package:flutter_app/app/controllers/browse_category_controller.dart';
@ -64,7 +65,7 @@ class _BrowseCategoryPageState extends NyState<BrowseCategoryPage> {
children: <Widget>[ children: <Widget>[
Text(trans("Browse"), Text(trans("Browse"),
style: Theme.of(context).textTheme.titleMedium), style: Theme.of(context).textTheme.titleMedium),
Text(parseHtmlString(productCategory!.name)) afterNotNull(productCategory, child: () => Text(parseHtmlString(productCategory!.name)), loading: CupertinoActivityIndicator())
], ],
), ),
centerTitle: true, centerTitle: true,

View File

@ -8,6 +8,7 @@
// 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/browse_search_controller.dart'; import 'package:flutter_app/app/controllers/browse_search_controller.dart';
import 'package:flutter_app/app/controllers/product_search_loader_controller.dart'; import 'package:flutter_app/app/controllers/product_search_loader_controller.dart';
@ -56,7 +57,7 @@ class _BrowseSearchState extends NyState<BrowseSearchPage> {
children: <Widget>[ children: <Widget>[
Text(trans("Search results for"), Text(trans("Search results for"),
style: Theme.of(context).textTheme.titleMedium), style: Theme.of(context).textTheme.titleMedium),
Text("\"" + _search! + "\"") afterNotNull(_search, child: () => Text("\"" + _search! + "\""), loading: CupertinoActivityIndicator())
], ],
), ),
centerTitle: true, centerTitle: true,

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
@ -121,7 +122,7 @@ class _CheckoutStatusState extends NyState<CheckoutStatusPage> {
child: ListView.builder( child: ListView.builder(
itemCount: _order?.lineItems == null itemCount: _order?.lineItems == null
? 0 ? 0
: _order?.lineItems?.length, : _order?.lineItems?.length ?? 0,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
ws_order.LineItems lineItem = _order!.lineItems![index]; ws_order.LineItems lineItem = _order!.lineItems![index];
return Container( return Container(
@ -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

@ -20,7 +20,7 @@ class AppVersionWidget extends StatelessWidget {
return NyFutureBuilder<PackageInfo>( return NyFutureBuilder<PackageInfo>(
future: PackageInfo.fromPlatform(), future: PackageInfo.fromPlatform(),
child: (BuildContext context, data) => Padding( child: (BuildContext context, data) => Padding(
child: Text("${trans("Version")}: ${data.version}", child: Text("${trans("Version")}: ${data?.version}",
style: Theme.of(context) style: Theme.of(context)
.textTheme .textTheme
.bodyMedium! .bodyMedium!

View File

@ -41,6 +41,8 @@ class _CartIconWidgetState extends State<CartIconWidget> {
future: Cart.getInstance.getCart(), future: Cart.getInstance.getCart(),
child: (BuildContext context, child: (BuildContext context,
data) { data) {
if (data == null) return SizedBox.shrink();
List<int?> cartItems = List<int?> cartItems =
data.map((e) => e.quantity).toList(); data.map((e) => e.quantity).toList();
String cartValue = "0"; String cartValue = "0";

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

@ -55,6 +55,8 @@ class ProductDetailRelatedProductsWidget extends StatelessWidget {
child: NyFutureBuilder<List<Product>>( child: NyFutureBuilder<List<Product>>(
future: fetchRelated(), future: fetchRelated(),
child: (context, relatedProducts) { child: (context, relatedProducts) {
if (relatedProducts == null) return SizedBox.shrink();
if (relatedProducts.isEmpty) { if (relatedProducts.isEmpty) {
return SizedBox.shrink(); return SizedBox.shrink();
} }
@ -75,6 +77,6 @@ class ProductDetailRelatedProductsWidget extends StatelessWidget {
} }
Future<List<Product>> fetchRelated() async => await (appWooSignal( Future<List<Product>> fetchRelated() async => await (appWooSignal(
(api) => api.getProducts(perPage: 100, include: product!.relatedIds), (api) => api.getProducts(perPage: 100, include: product!.relatedIds, status: "publish"),
)); ));
} }

View File

@ -93,6 +93,15 @@ class _ProductDetailReviewsWidgetState
NyFutureBuilder<List<ProductReview>>( NyFutureBuilder<List<ProductReview>>(
future: fetchReviews(), future: fetchReviews(),
child: (context, reviews) { child: (context, reviews) {
if (reviews == null) {
return Container(
child: ListTile(
title: Text(
trans('There are no reviews yet.'),
),
),
);
}
int reviewsCount = reviews.length; int reviewsCount = reviews.length;
List<Widget> childrenWidgets = []; List<Widget> childrenWidgets = [];
List<ProductDetailReviewTileWidget> children = reviews List<ProductDetailReviewTileWidget> children = reviews

View File

@ -0,0 +1,90 @@
import 'package:animate_do/animate_do.dart';
import 'package:flutter/material.dart';
import 'package:nylo_framework/nylo_framework.dart';
class ToastNotification extends StatelessWidget {
const ToastNotification(ToastMeta toastMeta, {Function? onDismiss, Key? key}) : _toastMeta = toastMeta, _dismiss = onDismiss, super(key: key);
final Function? _dismiss;
final ToastMeta _toastMeta;
@override
Widget build(BuildContext context) {
return Stack(children: [
InkWell(
onTap: () {
if (_toastMeta.action != null) {
_toastMeta.action!();
}
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 18.0),
margin: EdgeInsets.symmetric(horizontal: 8.0),
height: 100,
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4),
),
color: _toastMeta.color,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Pulse(
child: Container(
child: Center(
child: IconButton(
onPressed: () {},
icon: _toastMeta.icon ?? SizedBox.shrink(),
padding: EdgeInsets.only(right: 16),
),
),
),
infinite: true,
duration: Duration(milliseconds: 1500),
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
_toastMeta.title.tr(),
style: Theme.of(context)
.textTheme
.headlineSmall!
.copyWith(color: Colors.white),
),
Text(
_toastMeta.description.tr(),
style: Theme.of(context)
.textTheme
.bodyLarge!
.copyWith(color: Colors.white),
),
],
),
),
],
),
),
),
Positioned(
top: 0,
right: 0,
child: IconButton(
onPressed: () {
if (_dismiss != null) {
_dismiss!();
}
},
icon: Icon(
Icons.close,
color: Colors.white,
)),
)
]);
}
}

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 {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

@ -13,10 +13,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _flutterfire_internals name: _flutterfire_internals
sha256: "8eb354cb8ebed8a9fdf63699d15deff533bc133128898afaf754926b57d611b6" sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.5"
analyzer: analyzer:
dependency: "direct main" dependency: "direct main"
description: description:
@ -26,7 +26,7 @@ packages:
source: hosted source: hosted
version: "5.12.0" version: "5.12.0"
animate_do: animate_do:
dependency: transitive dependency: "direct main"
description: description:
name: animate_do name: animate_do
sha256: "9aeacc1a7238f971c039bdf45d13c628be554a242e0251c4ddda09d19a1a923f" sha256: "9aeacc1a7238f971c039bdf45d13c628be554a242e0251c4ddda09d19a1a923f"
@ -45,10 +45,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: args name: args
sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.1" version: "2.4.2"
asn1lib:
dependency: transitive
description:
name: asn1lib
sha256: b74e3842a52c61f8819a1ec8444b4de5419b41a7465e69d4aa681445377398b0
url: "https://pub.dev"
source: hosted
version: "1.4.1"
async: async:
dependency: transitive dependency: transitive
description: description:
@ -141,10 +149,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: collection name: collection
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.1" version: "1.17.2"
convert: convert:
dependency: transitive dependency: transitive
description: description:
@ -177,22 +185,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.5" version: "1.0.5"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: f4f1f73ab3fd2afcbcca165ee601fe980d966af6a21b5970c6c9376955c528ad
url: "https://pub.dev"
source: hosted
version: "2.3.1"
device_info_plus: device_info_plus:
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:
@ -205,10 +205,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dio name: dio
sha256: "347d56c26d63519552ef9a569f2a593dda99a81fdbdff13c584b7197cfe05059" sha256: a9d76e72985d7087eb7c5e7903224ae52b337131518d127c554b9405936752b8
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.2" version: "5.2.1+1"
encrypt:
dependency: transitive
description:
name: encrypt
sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb"
url: "https://pub.dev"
source: hosted
version: "5.0.1"
equatable:
dependency: transitive
description:
name: equatable
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
url: "https://pub.dev"
source: hosted
version: "2.0.5"
event_bus_plus:
dependency: transitive
description:
name: event_bus_plus
sha256: cbd27754d4c567f78fc88e7875e26c31d866d919f220523f34b29bf008f8fb1a
url: "https://pub.dev"
source: hosted
version: "0.6.1"
eventify: eventify:
dependency: transitive dependency: transitive
description: description:
@ -245,10 +269,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_core name: firebase_core
sha256: "250678b816279b3240c3a33e1f76bf712c00718f1fbeffc85873a5da8c077379" sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.13.0" version: "2.15.1"
firebase_core_platform_interface: firebase_core_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -261,34 +285,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: firebase_core_web name: firebase_core_web
sha256: "8c0f4c87d20e2d001a5915df238c1f9c88704231f591324205f5a5d2a7740a45" sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.0" version: "2.7.0"
firebase_messaging: firebase_messaging:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_messaging name: firebase_messaging
sha256: "9cfe5c4560fb83393511ca7620f8fb3f22c9a80303052f10290e732fcfb801bd" sha256: "6c1a2a047d6f165b7c5f947467ac5138731a2af82c7af1c12d691dbb834f6b73"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.6.1" version: "14.6.7"
firebase_messaging_platform_interface: firebase_messaging_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_platform_interface name: firebase_messaging_platform_interface
sha256: "7e25cb71019ccef8b1fd7b37969af79f04c467974cce4dfc291fa36974edd7ba" sha256: bcba58d28f8cda607a323240c6d314c2c62b62ebfbb0f2d704ebefef07b52b5f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.5.1" version: "4.5.6"
firebase_messaging_web: firebase_messaging_web:
dependency: transitive dependency: transitive
description: description:
name: firebase_messaging_web name: firebase_messaging_web
sha256: "5d9840cc8126ea723b1bda901389cb542902f664f2653c16d4f8114e95f13cec" sha256: "962d09ec9dfa486cbbc218258ad41e8ec7997a2eba46919049496e1cafd960c5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.5.1" version: "3.5.6"
flare_flutter: flare_flutter:
dependency: transitive dependency: transitive
description: description:
@ -322,10 +346,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_dotenv name: flutter_dotenv
sha256: d9283d92059a22e9834bc0a31336658ffba77089fb6f3cc36751f1fc7c6661a3 sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.2" version: "5.1.0"
flutter_launcher_icons: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -415,10 +439,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_stripe name: flutter_stripe
sha256: "51c3ab5f7a705d864d719eb13882abbb3964c4f61983a13af6dc56607537b1e4" sha256: "2acc4a31f9fed946a1fb230d708169ff0448f2a356fc728780ced52eb0df7712"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.0" version: "9.3.0"
flutter_styled_toast: flutter_styled_toast:
dependency: transitive dependency: transitive
description: description:
@ -457,10 +481,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:
@ -537,10 +561,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: intl name: intl
sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.18.0" version: "0.18.1"
js: js:
dependency: transitive dependency: transitive
description: description:
@ -557,38 +581,38 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.8.1" version: "4.8.1"
json_dart_generator:
dependency: transitive
description:
name: json_dart_generator
sha256: "88c710a9278e1f8a9ad65a695350153f517d7deeca293ea45c6f997c066437a5"
url: "https://pub.dev"
source: hosted
version: "1.1.0+1"
lints: lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: lints name: lints
sha256: "6b0206b0bf4f04961fc5438198ccb3a885685cd67d4d4a32cc20ad7f8adbe015" sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
logger:
dependency: transitive
description:
name: logger
sha256: "7ad7215c15420a102ec687bb320a7312afd449bac63bfb1c60d9787c27b9767f"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.15" version: "0.12.16"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.5.0"
math_expressions: math_expressions:
dependency: "direct main" dependency: "direct main"
description: description:
@ -617,18 +641,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: nylo_framework name: nylo_framework
sha256: f9960dce938d1046166cc97f7ab613638d7e4f45e6e2a9b30e7d2b004d1d833d sha256: "535684c9fd422f7a45ad83b1228ea42a87782a0655aa227c44fe75b9d3bcb8c5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.2" version: "5.3.2"
nylo_support: nylo_support:
dependency: transitive dependency: transitive
description: description:
name: nylo_support name: nylo_support
sha256: "011a1614b2440ffcbac821e6624ca25355e304af6c8b5c298203bbbe547da00e" sha256: "903f510366ca1af7982ec69d45fd8b9bd25c9cdbf6380f8736cd50fa37eed8cd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.2" version: "5.7.0"
octo_image: octo_image:
dependency: transitive dependency: transitive
description: description:
@ -649,10 +673,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: package_info_plus name: package_info_plus
sha256: "28386bbe89ab5a7919a47cea99cdd1128e5a6e0bbd7eaafe20440ead84a15de3" sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.1" version: "4.1.0"
package_info_plus_platform_interface: package_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -817,10 +841,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 +873,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:
@ -878,10 +902,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.10.0"
sqflite: sqflite:
dependency: transitive dependency: transitive
description: description:
@ -934,26 +958,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: stripe_android name: stripe_android
sha256: "89c6c9a9e6fbe6eea4b15b6c0eb012490155c37a6b4298851f77987fde4fee43" sha256: "0396c877823e84f0053f7d57fed506798635a9d48f0f044859c85216db6194fd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.0" version: "9.3.0"
stripe_ios: stripe_ios:
dependency: transitive dependency: transitive
description: description:
name: stripe_ios name: stripe_ios
sha256: e397609a5083b79706814342b40a2a58f1b97ecab2b9d6cae8d8e9f59646fc8c sha256: "81092043f0ae86ba6f5c16f76b16bbc97c4579eee58130e84cf4b30e36b4b649"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.1" version: "9.3.1"
stripe_platform_interface: stripe_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: stripe_platform_interface name: stripe_platform_interface
sha256: c1e90deb6e9939181f0fbc39b4f81c2e640b1b9fe4b3586ff84af7e8c46df2e4 sha256: "554380d197004cff235ae0327f1c3b596a3d22575af83e07c15ed07b6b62c45e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.0" version: "9.3.0"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
@ -974,10 +998,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.5.1" version: "0.6.0"
theme_provider: theme_provider:
dependency: transitive dependency: transitive
description: description:
@ -998,10 +1022,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: url_launcher name: url_launcher
sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.11" version: "6.1.12"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
@ -1090,6 +1114,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
webview_flutter: webview_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1142,10 +1174,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: woosignal name: woosignal
sha256: "985313603ad26dbb48420ce1b9029ebec7b6681861bab094c5f89d1710281ac3" sha256: "089a373122ae0e202e64e214ce4a549af29e589128bdc8c8a54f3da68a2355aa"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.5.0" version: "3.8.0"
wp_json_api: wp_json_api:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1179,5 +1211,5 @@ packages:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.0.0 <4.0.0" dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=3.7.0-0" flutter: ">=3.10.0"

View File

@ -1,14 +1,14 @@
# Official WooSignal App Template for WooCommerce # Official WooSignal App Template for WooCommerce
# Label StoreMax # Label StoreMax
# Version: 6.6.1 # Version: 6.10.1
# 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
### Change App Icon ### Change App Icon
# 1 Replace: public/assets/icon/appicon.png (1024px1024px icon size) # 1 Replace: public/assets/icon/appicon.png (1024px1024px icon size)
# 2 Run this command from the terminal: "flutter pub run flutter_launcher_icons:main" # 2 Run this command from the terminal: "dart pub run flutter_launcher_icons:main"
### Uploading the IOS/Android app ### Uploading the IOS/Android app
# IOS https://flutter.dev/docs/deployment/ios # IOS https://flutter.dev/docs/deployment/ios
@ -29,16 +29,16 @@ 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.0.2 nylo_framework: ^5.3.2
woosignal: ^3.5.0 woosignal: ^3.8.0
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.1 package_info_plus: ^4.1.0
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.12
bubble_tab_indicator: ^0.1.5 bubble_tab_indicator: ^0.1.5
status_alert: ^1.0.1 status_alert: ^1.0.1
math_expressions: ^2.4.0 math_expressions: ^2.4.0
@ -46,12 +46,12 @@ 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.4.1 firebase_messaging: ^14.6.7
firebase_core: ^2.10.0 firebase_core: ^2.15.1
flutter: flutter:
sdk: flutter sdk: flutter
flutter_localizations: flutter_localizations:
@ -60,16 +60,17 @@ dependencies:
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.5 cupertino_icons: ^1.0.5
collection: ^1.15.0 collection: ^1.17.1
flutter_stripe: ^9.2.0 flutter_stripe: ^9.3.0
razorpay_flutter: ^1.3.5 razorpay_flutter: ^1.3.5
animate_do: ^3.0.2
dependency_overrides: dependency_overrides:
http: ^1.0.0 http: ^1.0.0
dev_dependencies: dev_dependencies:
flutter_launcher_icons: ^0.13.1 flutter_launcher_icons: ^0.13.1
lints: ^2.0.0 lints: ^2.1.1
flutter_test: flutter_test:
sdk: flutter sdk: flutter

View File

@ -4,7 +4,7 @@
# WooCommerce App: Label StoreMax # WooCommerce App: Label StoreMax
### Label StoreMax - v6.6.1 ### Label StoreMax
[Official WooSignal WooCommerce App](https://woosignal.com) [Official WooSignal WooCommerce App](https://woosignal.com)
@ -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