Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b279212a95 | |||
| ed1a9d70fb | |||
| 4f11e7bb00 | |||
|
|
2f9118085c | ||
|
|
c620aa71cc | ||
|
|
63244606be | ||
|
|
3b350dbefb | ||
|
|
6deab507d8 | ||
|
|
a2698557ea | ||
|
|
fedd76fc67 | ||
|
|
456f313056 | ||
|
|
f67f486838 | ||
|
|
688ce6bec8 | ||
|
|
05a7aedf54 | ||
|
|
adc32e730d |
3
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@ -1,9 +1,9 @@
|
||||
# *<! ------ App ------!>*
|
||||
|
||||
APP_NAME="MyApp"
|
||||
APP_NAME="Raster"
|
||||
APP_ENV="local"
|
||||
APP_DEBUG="true"
|
||||
APP_URL="https://mywoocommercestore.com"
|
||||
APP_URL="https://rasterdoo.com"
|
||||
|
||||
ASSET_PATH_PUBLIC="public/assets/"
|
||||
ASSET_PATH_IMAGES="public/assets/images"
|
||||
@ -14,12 +14,12 @@ DARK_THEME_ID="default_dark_theme"
|
||||
|
||||
# *<! ------ Language ------!>*
|
||||
|
||||
DEFAULT_LOCALE=null
|
||||
DEFAULT_LOCALE="en"
|
||||
# supports: "en" (English), "es" (Spanish), "fr" (French), "hi" (Hindi), "it" (Italian), "pt" (Portuguese) or "zh" (Simplified Chinese)
|
||||
|
||||
# *<! ------ WooSignal Config ------!>*
|
||||
|
||||
APP_KEY="your app key"
|
||||
APP_KEY="app_50818d11780aaba6b545076dea5b90"
|
||||
# App key from WooSignal link: https://woosignal.com/dashboard
|
||||
|
||||
# *<! ------ STRIPE (OPTIONAL) ------!>*
|
||||
@ -52,3 +52,7 @@ PRODUCT_PLACEHOLDER_IMAGE="https://woosignal.com/images/woocommerce-placeholder.
|
||||
# Sets the default placeholder image for products with no image
|
||||
|
||||
AUTH_USER_KEY="AUTH_USER"
|
||||
FCM_ENABLED=null
|
||||
|
||||
ENCRYPT_KEY=null
|
||||
ENCRYPT_SECRET=null
|
||||
@ -1,3 +1,56 @@
|
||||
## [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
|
||||
|
||||
* Refactor widgets + bug fixes
|
||||
* Refactor extensions.dart
|
||||
* Pubspec.yaml dependency updates.
|
||||
|
||||
## [6.6.0] - 2023-05-18
|
||||
|
||||
* Nylo v5.0.0 migration
|
||||
@ -22,7 +75,7 @@
|
||||
* Fix the ThemeColor.get helper method to support ColorStyles.
|
||||
* Pubspec.yaml dependency updates
|
||||
|
||||
* ## [6.4.0] - 2023-01-06
|
||||
## [6.4.0] - 2023-01-06
|
||||
|
||||
* Upgrade to Nylo v4.0.0
|
||||
* Update copyright
|
||||
|
||||
@ -4,8 +4,7 @@
|
||||
|
||||
# WooCommerce App: Label StoreMax
|
||||
|
||||
### Label StoreMax - v6.6.0
|
||||
|
||||
### Label StoreMax
|
||||
|
||||
[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)
|
||||
- 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
|
||||
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
<application
|
||||
android:name="${applicationName}"
|
||||
android:label="Label StoreMax"
|
||||
android:label="Raster Knjizara"
|
||||
android:icon="@mipmap/launcher_icon">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
@ -31,15 +31,7 @@
|
||||
android:name="io.flutter.embedding.android.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>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 12 KiB |
@ -1,12 +1,12 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.6.10'
|
||||
ext.kotlin_version = '1.7.10'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
}
|
||||
@ -26,6 +26,6 @@ subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
||||
@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
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
|
||||
|
||||
@ -155,7 +155,7 @@
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 1300;
|
||||
LastUpgradeCheck = 1430;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
97C146ED1CF9000F007C117D = {
|
||||
@ -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";
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
LastUpgradeVersion = "1430"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
import 'package:flutter_app/app/controllers/woosignal_api_loader_controller.dart';
|
||||
import 'package:woosignal/models/response/product_category.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductCategorySearchLoaderController
|
||||
extends WooSignalApiLoaderController<Product> {
|
||||
|
||||
@ -14,7 +14,7 @@ import 'package:flutter_app/app/models/cart_line_item.dart';
|
||||
import 'package:flutter_app/bootstrap/enums/wishlist_action_enums.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/product_variation.dart'
|
||||
as ws_product_variation;
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
||||
import 'package:flutter_app/app/controllers/woosignal_api_loader_controller.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductLoaderController extends WooSignalApiLoaderController<Product> {
|
||||
ProductLoaderController();
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
import 'package:flutter_app/app/controllers/woosignal_api_loader_controller.dart';
|
||||
import 'package:woosignal/models/response/product_review.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductReviewsLoaderController
|
||||
extends WooSignalApiLoaderController<ProductReview> {
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
||||
import 'package:flutter_app/app/controllers/woosignal_api_loader_controller.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductSearchLoaderController
|
||||
extends WooSignalApiLoaderController<Product> {
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/product_variation.dart';
|
||||
import 'package:woosignal/models/response/products.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/product.dart' as ws_product;
|
||||
|
||||
class CartLineItem {
|
||||
String? name;
|
||||
|
||||
@ -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'];
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ class BearerAuthInterceptor extends Interceptor {
|
||||
}
|
||||
|
||||
@override
|
||||
void onError(DioError err, ErrorInterceptorHandler handler) {
|
||||
void onError(DioException err, ErrorInterceptorHandler handler) {
|
||||
handler.next(err);
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ class LoggingInterceptor extends Interceptor {
|
||||
}
|
||||
|
||||
@override
|
||||
void onError(DioError err, ErrorInterceptorHandler handler) {
|
||||
void onError(DioException err, ErrorInterceptorHandler handler) {
|
||||
print(
|
||||
'ERROR[${err.response?.statusCode}] => PATH: ${err.requestOptions.path}');
|
||||
handler.next(err);
|
||||
|
||||
@ -22,31 +22,10 @@ class AppProvider implements NyProvider {
|
||||
]);
|
||||
|
||||
await WooSignal.instance
|
||||
.init(appKey: getEnv('APP_KEY'), debugMode: getEnv('APP_DEBUG'));
|
||||
|
||||
// Notifications
|
||||
/// 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);
|
||||
/// }
|
||||
/// }
|
||||
.init(appKey: getEnv('APP_KEY'), debugMode: getEnv('APP_DEBUG'),
|
||||
encryptKey: getEnv('ENCRYPT_KEY', defaultValue: null),
|
||||
encryptSecret: getEnv('ENCRYPT_SECRET', defaultValue: null)
|
||||
);
|
||||
|
||||
AppHelper.instance.appConfig = WooSignalApp();
|
||||
AppHelper.instance.appConfig!.themeFont = "Poppins";
|
||||
@ -70,7 +49,7 @@ class AppProvider implements NyProvider {
|
||||
};
|
||||
|
||||
// WooSignal Setup
|
||||
WooSignalApp? wooSignalApp = await (appWooSignal((api) => api.getApp()));
|
||||
WooSignalApp? wooSignalApp = await (appWooSignal((api) => api.getApp(encrypted: shouldEncrypt())));
|
||||
Locale locale = Locale('en');
|
||||
|
||||
if (wooSignalApp != null) {
|
||||
@ -116,6 +95,7 @@ class AppProvider implements NyProvider {
|
||||
|
||||
nylo.addModelDecoders(modelDecoders);
|
||||
nylo.addValidationRules(validationRules);
|
||||
nylo.toastNotification = getToastNotificationWidget;
|
||||
|
||||
return nylo;
|
||||
}
|
||||
|
||||
49
LabelStoreMax/lib/app/providers/firebase_provider.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
81
LabelStoreMax/lib/app/providers/payments/razorpay_pay.dart
Normal file
@ -0,0 +1,81 @@
|
||||
//
|
||||
// LabelCore
|
||||
// Label StoreMAX
|
||||
//
|
||||
// Created by Anthony Gordon.
|
||||
// 2023, WooSignal Ltd. All rights reserved.
|
||||
//
|
||||
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// 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/widgets.dart';
|
||||
import 'package:flutter_app/app/models/cart.dart';
|
||||
import 'package:flutter_app/bootstrap/data/order_wc.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/pages/checkout_confirmation_page.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:razorpay_flutter/razorpay_flutter.dart';
|
||||
import 'package:woosignal/models/response/tax_rate.dart';
|
||||
import 'package:woosignal/models/payload/order_wc.dart';
|
||||
import 'package:woosignal/models/response/order.dart';
|
||||
|
||||
razorPay(context,
|
||||
{required CheckoutConfirmationPageState state, TaxRate? taxRate}) async {
|
||||
Razorpay razorpay = Razorpay();
|
||||
|
||||
razorpay.on(Razorpay.EVENT_PAYMENT_SUCCESS,
|
||||
(PaymentSuccessResponse response) async {
|
||||
OrderWC orderWC = await buildOrderWC(taxRate: taxRate);
|
||||
|
||||
Order? order = await appWooSignal((api) => api.createOrder(orderWC));
|
||||
|
||||
if (order != null) {
|
||||
showToastNotification(
|
||||
context,
|
||||
title: "Error".tr(),
|
||||
description: trans("Something went wrong, please contact our store"),
|
||||
);
|
||||
state.reloadState(showLoader: false);
|
||||
return;
|
||||
}
|
||||
Cart.getInstance.clear();
|
||||
Navigator.pushNamed(context, "/checkout-status", arguments: order);
|
||||
});
|
||||
|
||||
razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, (PaymentFailureResponse response) {
|
||||
showToastNotification(context,
|
||||
title: trans("Error"),
|
||||
description: response.message ?? "",
|
||||
style: ToastNotificationStyleType.WARNING);
|
||||
state.reloadState(showLoader: false);
|
||||
});
|
||||
|
||||
razorpay.on(Razorpay.EVENT_EXTERNAL_WALLET, _handleExternalWallet);
|
||||
|
||||
// CHECKOUT HELPER
|
||||
await checkout(taxRate, (total, billingDetails, cart) async {
|
||||
var options = {
|
||||
'key': getEnv('RAZORPAY_API_KEY'),
|
||||
'amount': (double.parse(total) * 100).toInt(),
|
||||
'name': getEnv('APP_NAME'),
|
||||
'description': await cart.cartShortDesc(),
|
||||
'prefill': {
|
||||
"name": [
|
||||
billingDetails!.billingAddress?.firstName,
|
||||
billingDetails.billingAddress?.lastName
|
||||
].where((t) => t != null || t != "").toList().join(" "),
|
||||
"method": "card",
|
||||
'email': billingDetails.billingAddress?.emailAddress ?? ""
|
||||
}
|
||||
};
|
||||
|
||||
state.reloadState(showLoader: true);
|
||||
|
||||
razorpay.open(options);
|
||||
});
|
||||
}
|
||||
|
||||
void _handleExternalWallet(ExternalWalletResponse response) {}
|
||||
@ -118,7 +118,7 @@ stripePay(context,
|
||||
return;
|
||||
}
|
||||
|
||||
Navigator.pushNamed(context, "/checkout-status", arguments: order);
|
||||
routeTo('/checkout-status', navigationType: NavigationType.pushAndForgetAll, data: order);
|
||||
} on StripeException catch (e) {
|
||||
if (getEnv('APP_DEBUG', defaultValue: true)) {
|
||||
NyLogger.error(e.error.message!);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -1,81 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/themes/styles/color_styles.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
|
||||
extension NyText on Text {
|
||||
/// Set the Style to use [displayLarge].
|
||||
Text displayLarge(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.displayLarge);
|
||||
}
|
||||
|
||||
/// Set the Style to use [displayMedium].
|
||||
Text displayMedium(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.displayMedium);
|
||||
}
|
||||
|
||||
/// Set the Style to use [displaySmall].
|
||||
Text displaySmall(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.displaySmall);
|
||||
}
|
||||
|
||||
/// Set the Style to use [headlineLarge].
|
||||
Text headingLarge(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.headlineLarge);
|
||||
}
|
||||
|
||||
/// Set the Style to use [headlineMedium].
|
||||
Text headingMedium(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.headlineMedium);
|
||||
}
|
||||
|
||||
/// Set the Style to use [headlineSmall].
|
||||
Text headingSmall(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.headlineSmall);
|
||||
}
|
||||
|
||||
/// Set the Style to use [titleLarge].
|
||||
Text titleLarge(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.titleLarge);
|
||||
}
|
||||
|
||||
/// Set the Style to use [titleMedium].
|
||||
Text titleMedium(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.titleMedium);
|
||||
}
|
||||
|
||||
/// Set the Style to use [titleSmall].
|
||||
Text titleSmall(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.titleSmall);
|
||||
}
|
||||
|
||||
/// Set the Style to use [bodyLarge].
|
||||
Text large(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.bodyLarge);
|
||||
}
|
||||
|
||||
/// Set the Style to use [bodyMedium].
|
||||
Text medium(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.bodyMedium);
|
||||
}
|
||||
|
||||
/// Set the Style to use [bodySmall].
|
||||
Text small(BuildContext context) {
|
||||
return setStyle(Theme.of(context).textTheme.bodySmall);
|
||||
}
|
||||
|
||||
/// Make the font bold.
|
||||
Text fontWeightBold() {
|
||||
return copyWith(style: TextStyle(fontWeight: FontWeight.bold));
|
||||
}
|
||||
|
||||
/// Make the font light.
|
||||
Text fontWeightLight() {
|
||||
return copyWith(style: TextStyle(fontWeight: FontWeight.w300));
|
||||
}
|
||||
|
||||
/// Change the [style].
|
||||
Text setStyle(TextStyle? style) => copyWith(style: style);
|
||||
|
||||
/// Sets the color from your [ColorStyles] or [Color].
|
||||
Text setColor(
|
||||
BuildContext context, Color Function(ColorStyles color) newColor,
|
||||
@ -84,59 +12,6 @@ extension NyText on Text {
|
||||
style: TextStyle(
|
||||
color: newColor(ThemeColor.get(context, themeId: themeId))));
|
||||
}
|
||||
|
||||
/// Aligns text to the left.
|
||||
Text alignLeft() {
|
||||
return copyWith(textAlign: TextAlign.left);
|
||||
}
|
||||
|
||||
/// Aligns text to the right.
|
||||
Text alignRight() {
|
||||
return copyWith(textAlign: TextAlign.right);
|
||||
}
|
||||
|
||||
/// Aligns text to the center.
|
||||
Text alignCenter() {
|
||||
return copyWith(textAlign: TextAlign.center);
|
||||
}
|
||||
|
||||
/// Aligns text to the center.
|
||||
Text setMaxLines(int maxLines) {
|
||||
return copyWith(maxLines: maxLines);
|
||||
}
|
||||
|
||||
/// Change the [fontFamily].
|
||||
Text setFontFamily(String fontFamily) =>
|
||||
copyWith(style: TextStyle(fontFamily: fontFamily));
|
||||
|
||||
/// Helper to apply changes.
|
||||
Text copyWith(
|
||||
{Key? key,
|
||||
StrutStyle? strutStyle,
|
||||
TextAlign? textAlign,
|
||||
TextDirection? textDirection = TextDirection.ltr,
|
||||
Locale? locale,
|
||||
bool? softWrap,
|
||||
TextOverflow? overflow,
|
||||
double? textScaleFactor,
|
||||
int? maxLines,
|
||||
String? semanticsLabel,
|
||||
TextWidthBasis? textWidthBasis,
|
||||
TextStyle? style}) {
|
||||
return Text(data ?? "",
|
||||
key: key ?? this.key,
|
||||
strutStyle: strutStyle ?? this.strutStyle,
|
||||
textAlign: textAlign ?? this.textAlign,
|
||||
textDirection: textDirection ?? this.textDirection,
|
||||
locale: locale ?? this.locale,
|
||||
softWrap: softWrap ?? this.softWrap,
|
||||
overflow: overflow ?? this.overflow,
|
||||
textScaleFactor: textScaleFactor ?? this.textScaleFactor,
|
||||
maxLines: maxLines ?? this.maxLines,
|
||||
semanticsLabel: semanticsLabel ?? this.semanticsLabel,
|
||||
textWidthBasis: textWidthBasis ?? this.textWidthBasis,
|
||||
style: style != null ? this.style?.merge(style) ?? style : this.style);
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if the [Product] is new.
|
||||
|
||||
@ -38,7 +38,7 @@ import 'package:money_formatter/money_formatter.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:status_alert/status_alert.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/tax_rate.dart';
|
||||
import 'package:woosignal/woosignal.dart';
|
||||
import 'package:wp_json_api/models/responses/wp_user_info_response.dart';
|
||||
@ -48,7 +48,7 @@ import 'package:flutter/services.dart' show rootBundle;
|
||||
Future<User?> getUser() async =>
|
||||
(await (NyStorage.read<User>(SharedKey.authUser)));
|
||||
|
||||
Future appWooSignal(Function(WooSignal) api) async {
|
||||
Future appWooSignal(Function(WooSignal api) api) async {
|
||||
return await api(WooSignal.instance);
|
||||
}
|
||||
|
||||
@ -668,3 +668,15 @@ bool isProductNew(Product? product) {
|
||||
}
|
||||
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;
|
||||
}
|
||||
@ -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)
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
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/toast_notification_widget.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();
|
||||
// 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
|
||||
}
|
||||
@ -15,4 +15,5 @@ import 'package:nylo_framework/nylo_framework.dart';
|
||||
final Map<Type, NyEvent> events = {
|
||||
LoginEvent: LoginEvent(),
|
||||
LogoutEvent: LogoutEvent(),
|
||||
AuthUserEvent: AuthUserEvent(),
|
||||
};
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import 'package:flutter_app/app/models/payment_type.dart';
|
||||
import 'package:flutter_app/app/providers/payments/cash_on_delivery.dart';
|
||||
import 'package:flutter_app/app/providers/payments/paypal_pay.dart';
|
||||
import 'package:flutter_app/app/providers/payments/razorpay_pay.dart';
|
||||
import 'package:flutter_app/app/providers/payments/stripe_pay.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
@ -14,7 +15,7 @@ import 'package:nylo_framework/nylo_framework.dart';
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
const appPaymentGateways = [];
|
||||
const appPaymentGateways = ["CashOnDelivery"];
|
||||
// Available: "Stripe", "CashOnDelivery", "PayPal", "RazorPay"
|
||||
// e.g. app_payment_gateways = ["Stripe", "CashOnDelivery"]; will only use Stripe and Cash on Delivery.
|
||||
|
||||
@ -43,6 +44,14 @@ List<PaymentType> paymentTypeList = [
|
||||
pay: payPalPay,
|
||||
),
|
||||
|
||||
addPayment(
|
||||
id: 5,
|
||||
name: "RazorPay",
|
||||
description: trans("Debit or Credit Card"),
|
||||
assetImage: "razorpay.png",
|
||||
pay: razorPay,
|
||||
),
|
||||
|
||||
// e.g. add more here
|
||||
|
||||
// addPayment(
|
||||
|
||||
@ -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/event_provider.dart';
|
||||
import 'package:flutter_app/app/providers/route_provider.dart';
|
||||
@ -17,4 +18,7 @@ final Map<Type, NyProvider> providers = {
|
||||
AppProvider: AppProvider(),
|
||||
RouteProvider: RouteProvider(),
|
||||
EventProvider: EventProvider(),
|
||||
FirebaseProvider: FirebaseProvider(),
|
||||
|
||||
};
|
||||
|
||||
|
||||
34
LabelStoreMax/lib/config/toast_notification.dart
Normal 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
|
||||
// );
|
||||
// }
|
||||
}
|
||||
@ -1,4 +1,3 @@
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@ -9,9 +8,9 @@ import 'package:nylo_framework/nylo_framework.dart';
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
final Map<Type, dynamic> validationRules = {
|
||||
final Map<String, dynamic> validationRules = {
|
||||
/// Example
|
||||
// SimplePassword: (attribute) => SimplePassword(attribute)
|
||||
// "simple_password": (attribute) => SimplePassword(attribute)
|
||||
};
|
||||
|
||||
/// Example validation class
|
||||
|
||||
66
LabelStoreMax/lib/firebase_options.dart
Normal 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.',
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -67,7 +67,8 @@ class _AccountDeletePageState extends NyState<AccountDeletePage> {
|
||||
PrimaryButton(
|
||||
title: trans("Yes, delete my account"),
|
||||
isLoading: isLocked('delete_account'),
|
||||
action: _deleteAccount),
|
||||
action: _deleteAccount,
|
||||
),
|
||||
LinkButton(title: trans("Back"), action: pop)
|
||||
],
|
||||
)
|
||||
|
||||
@ -226,7 +226,7 @@ class _AccountLandingPageState extends NyState<AccountLandingPage> {
|
||||
String? token = wpUserLoginResponse.data!.userToken;
|
||||
String userId = wpUserLoginResponse.data!.userId.toString();
|
||||
User user = User.fromUserAuthResponse(token: token, userId: userId);
|
||||
await Auth.set(user, key: SharedKey.authUser);
|
||||
await user.save(SharedKey.authUser);
|
||||
|
||||
showToastNotification(context,
|
||||
title: trans("Hello"),
|
||||
|
||||
@ -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,25 +52,22 @@ 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()}"), loading: CupertinoActivityIndicator()),
|
||||
centerTitle: true,
|
||||
),
|
||||
resizeToAvoidBottomInset: false,
|
||||
body: SafeAreaWidget(
|
||||
child: _isLoading
|
||||
? AppLoaderWidget()
|
||||
: Column(
|
||||
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!,
|
||||
"${trans("Date Ordered").capitalize()}: ${dateFormatted(
|
||||
date: _order?.dateCreated ?? "",
|
||||
formatType: formatForDateTime(FormatType.date),
|
||||
),
|
||||
)}",
|
||||
),
|
||||
),
|
||||
Container(
|
||||
@ -135,21 +136,34 @@ class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
|
||||
Flexible(
|
||||
child: Text(
|
||||
lineItem.name!,
|
||||
maxLines: 1,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
formatStringCurrency(total: lineItem.price)
|
||||
Container(
|
||||
width: 70,
|
||||
alignment: Alignment.topRight,
|
||||
child: Text(
|
||||
formatStringCurrency(total: lineItem.total)
|
||||
.capitalize(),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
subtitle: Padding(
|
||||
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:
|
||||
@ -162,7 +176,7 @@ class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
|
||||
children: <Widget>[
|
||||
Text(
|
||||
formatStringCurrency(
|
||||
total: lineItem.total,
|
||||
total: lineItem.price,
|
||||
),
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
@ -187,11 +201,11 @@ class _AccountOrderDetailPageState extends NyState<AccountOrderDetailPage> {
|
||||
),
|
||||
);
|
||||
},
|
||||
itemCount: _order!.lineItems!.length,
|
||||
itemCount: _order?.lineItems?.length ?? 0,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -202,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!)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,7 +236,7 @@ class _AccountRegistrationPageState extends NyState<AccountRegistrationPage> {
|
||||
String? token = wpUserRegisterResponse.data!.userToken;
|
||||
String userId = wpUserRegisterResponse.data!.userId.toString();
|
||||
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,
|
||||
firstName: firstName, lastName: lastName));
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
// 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/product_category_search_loader_controller.dart';
|
||||
import 'package:flutter_app/app/controllers/browse_category_controller.dart';
|
||||
@ -20,7 +21,7 @@ import 'package:flutter_app/resources/widgets/woosignal_ui.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:woosignal/models/response/product_category.dart';
|
||||
import 'package:woosignal/models/response/products.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/product.dart' as ws_product;
|
||||
|
||||
class BrowseCategoryPage extends NyStatefulWidget {
|
||||
final BrowseCategoryController controller = BrowseCategoryController();
|
||||
@ -64,7 +65,7 @@ class _BrowseCategoryPageState extends NyState<BrowseCategoryPage> {
|
||||
children: <Widget>[
|
||||
Text(trans("Browse"),
|
||||
style: Theme.of(context).textTheme.titleMedium),
|
||||
Text(parseHtmlString(productCategory!.name))
|
||||
afterNotNull(productCategory, child: () => Text(parseHtmlString(productCategory!.name)), loading: CupertinoActivityIndicator())
|
||||
],
|
||||
),
|
||||
centerTitle: true,
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
// 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/browse_search_controller.dart';
|
||||
import 'package:flutter_app/app/controllers/product_search_loader_controller.dart';
|
||||
@ -16,7 +17,7 @@ import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/safearea_widget.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:woosignal/models/response/products.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/product.dart' as ws_product;
|
||||
|
||||
class BrowseSearchPage extends NyStatefulWidget {
|
||||
final BrowseSearchController controller = BrowseSearchController();
|
||||
@ -56,7 +57,7 @@ class _BrowseSearchState extends NyState<BrowseSearchPage> {
|
||||
children: <Widget>[
|
||||
Text(trans("Search results for"),
|
||||
style: Theme.of(context).textTheme.titleMedium),
|
||||
Text("\"" + _search! + "\"")
|
||||
afterNotNull(_search, child: () => Text("\"" + _search! + "\""), loading: CupertinoActivityIndicator())
|
||||
],
|
||||
),
|
||||
centerTitle: true,
|
||||
|
||||
@ -16,7 +16,6 @@ import 'package:flutter_app/app/models/customer_address.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/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/buttons.dart';
|
||||
import 'package:flutter_app/resources/widgets/safearea_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/text_row_widget.dart';
|
||||
@ -30,26 +29,19 @@ class CartPage extends StatefulWidget {
|
||||
_CartPageState createState() => _CartPageState();
|
||||
}
|
||||
|
||||
class _CartPageState extends State<CartPage> {
|
||||
class _CartPageState extends NyState<CartPage> {
|
||||
_CartPageState();
|
||||
|
||||
bool _isLoading = true, _isCartEmpty = false;
|
||||
List<CartLineItem> _cartLines = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_cartCheck();
|
||||
boot() async {
|
||||
await _cartCheck();
|
||||
CheckoutSession.getInstance.coupon = null;
|
||||
}
|
||||
|
||||
_cartCheck() async {
|
||||
List<CartLineItem> cart = await Cart.getInstance.getCart();
|
||||
if (cart.isEmpty) {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
_isCartEmpty = true;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@ -59,25 +51,18 @@ class _CartPageState extends State<CartPage> {
|
||||
await (appWooSignal((api) => api.cartCheck(cartJSON)));
|
||||
if (cartRes.isEmpty) {
|
||||
Cart.getInstance.saveCartToPref(cartLineItems: []);
|
||||
setState(() {
|
||||
_isCartEmpty = true;
|
||||
_isLoading = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
_cartLines = cartRes.map((json) => CartLineItem.fromJson(json)).toList();
|
||||
if (_cartLines.isNotEmpty) {
|
||||
Cart.getInstance.saveCartToPref(cartLineItems: _cartLines);
|
||||
}
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
void _actionProceedToCheckout() async {
|
||||
List<CartLineItem> cartLineItems = await Cart.getInstance.getCart();
|
||||
|
||||
if (_isLoading == true) {
|
||||
if (isLoading()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -163,9 +148,6 @@ class _CartPageState extends State<CartPage> {
|
||||
style: ToastNotificationStyleType.WARNING,
|
||||
icon: Icons.remove_shopping_cart,
|
||||
);
|
||||
if (_cartLines.isEmpty) {
|
||||
_isCartEmpty = true;
|
||||
}
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@ -177,7 +159,6 @@ class _CartPageState extends State<CartPage> {
|
||||
description: trans("Cart cleared"),
|
||||
style: ToastNotificationStyleType.SUCCESS,
|
||||
icon: Icons.delete_outline);
|
||||
_isCartEmpty = true;
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@ -214,9 +195,8 @@ class _CartPageState extends State<CartPage> {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
_isCartEmpty
|
||||
? Expanded(
|
||||
child: FractionallySizedBox(
|
||||
Expanded(
|
||||
child: afterLoad(child: () => _cartLines.isEmpty ? FractionallySizedBox(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
@ -237,14 +217,7 @@ class _CartPageState extends State<CartPage> {
|
||||
),
|
||||
heightFactor: 0.5,
|
||||
widthFactor: 1,
|
||||
),
|
||||
)
|
||||
: (_isLoading
|
||||
? Expanded(
|
||||
child: AppLoaderWidget(),
|
||||
)
|
||||
: Expanded(
|
||||
child: ListView.builder(
|
||||
) : ListView.builder(
|
||||
padding: const EdgeInsets.all(8),
|
||||
itemCount: _cartLines.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
@ -260,9 +233,8 @@ class _CartPageState extends State<CartPage> {
|
||||
actionRemoveItem: () =>
|
||||
actionRemoveItem(index: index),
|
||||
);
|
||||
}),
|
||||
flex: 3,
|
||||
)),
|
||||
})),
|
||||
),
|
||||
Divider(
|
||||
color: Colors.black45,
|
||||
),
|
||||
@ -271,7 +243,7 @@ class _CartPageState extends State<CartPage> {
|
||||
child: (BuildContext context, data) => Padding(
|
||||
child: TextRowWidget(
|
||||
title: trans("Total"),
|
||||
text: (_isLoading ? "" : data),
|
||||
text: isLoading() ? '' : data,
|
||||
),
|
||||
padding: EdgeInsets.only(bottom: 15, top: 15),
|
||||
),
|
||||
|
||||
@ -16,7 +16,6 @@ import 'package:flutter_app/app/models/checkout_session.dart';
|
||||
import 'package:flutter_app/app/models/customer_country.dart';
|
||||
import 'package:flutter_app/app/models/payment_type.dart';
|
||||
import 'package:flutter_app/bootstrap/app_helper.dart';
|
||||
import 'package:flutter_app/bootstrap/extensions.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/buttons.dart';
|
||||
@ -59,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();
|
||||
}
|
||||
@ -186,7 +184,7 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(trans("Checkout")),
|
||||
Text(_wooSignalApp?.appName ?? getEnv('APP_NAME')).small(context),
|
||||
Text(_wooSignalApp?.appName ?? getEnv('APP_NAME')).bodySmall(context),
|
||||
],
|
||||
),
|
||||
centerTitle: false,
|
||||
@ -204,13 +202,12 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
|
||||
resizeToAvoidBottomInset: false,
|
||||
body: SafeAreaWidget(
|
||||
child: Container(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: ListView(
|
||||
shrinkWrap: true,
|
||||
children: <Widget>[
|
||||
ListView(
|
||||
shrinkWrap: true,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
children: [
|
||||
CheckoutStoreHeadingWidget(),
|
||||
CheckoutUserDetailsWidget(
|
||||
@ -324,7 +321,6 @@ class CheckoutConfirmationPageState extends NyState<CheckoutConfirmationPage> {
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(16)
|
||||
|
||||
@ -34,6 +34,7 @@ class _CheckoutStatusState extends NyState<CheckoutStatusPage> {
|
||||
_order = widget.controller.data();
|
||||
await Cart.getInstance.clear();
|
||||
CheckoutSession.getInstance.clear();
|
||||
setState(() { });
|
||||
}
|
||||
|
||||
@override
|
||||
@ -77,7 +78,7 @@ class _CheckoutStatusState extends NyState<CheckoutStatusPage> {
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
Text(
|
||||
"${trans("Order Ref")}. #${_order!.id.toString()}",
|
||||
"${trans("Order Ref")}. #${_order?.id.toString()}",
|
||||
style: Theme.of(context).textTheme.bodyLarge,
|
||||
textAlign: TextAlign.left,
|
||||
),
|
||||
@ -119,9 +120,9 @@ class _CheckoutStatusState extends NyState<CheckoutStatusPage> {
|
||||
),
|
||||
Expanded(
|
||||
child: ListView.builder(
|
||||
itemCount: _order!.lineItems == null
|
||||
itemCount: _order?.lineItems == null
|
||||
? 0
|
||||
: _order!.lineItems!.length,
|
||||
: _order?.lineItems?.length ?? 0,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
ws_order.LineItems lineItem = _order!.lineItems![index];
|
||||
return Container(
|
||||
@ -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,
|
||||
)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -14,7 +14,6 @@ import 'package:flutter_app/app/models/cart_line_item.dart';
|
||||
import 'package:flutter_app/bootstrap/app_helper.dart';
|
||||
import 'package:flutter_app/bootstrap/enums/wishlist_action_enums.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/buttons.dart';
|
||||
import 'package:flutter_app/resources/widgets/cart_icon_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/product_detail_body_widget.dart';
|
||||
@ -23,7 +22,7 @@ import 'package:flutter_app/resources/widgets/woosignal_ui.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/product_variation.dart'
|
||||
as ws_product_variation;
|
||||
import 'package:woosignal/models/response/products.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/product.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class ProductDetailPage extends NyStatefulWidget {
|
||||
@ -36,7 +35,6 @@ class ProductDetailPage extends NyStatefulWidget {
|
||||
}
|
||||
|
||||
class _ProductDetailState extends NyState<ProductDetailPage> {
|
||||
bool _isLoading = true;
|
||||
ws_product.Product? _product;
|
||||
|
||||
List<ws_product_variation.ProductVariation> _productVariations = [];
|
||||
@ -45,14 +43,15 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
|
||||
|
||||
@override
|
||||
init() async {
|
||||
super.init();
|
||||
}
|
||||
|
||||
@override
|
||||
boot() async {
|
||||
_product = widget.controller.data();
|
||||
if (_product!.type == "variable") {
|
||||
await _fetchProductVariations();
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
_fetchProductVariations() async {
|
||||
@ -76,9 +75,6 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
|
||||
}
|
||||
}
|
||||
_productVariations = tmpVariations;
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
_modalBottomSheetOptionsForAttribute(int attributeIndex) {
|
||||
@ -88,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(
|
||||
@ -232,7 +228,7 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
|
||||
actions: <Widget>[
|
||||
if (_wooSignalApp!.wishlistEnabled!)
|
||||
NyFutureBuilder(
|
||||
future: hasAddedWishlistProduct(_product!.id),
|
||||
future: hasAddedWishlistProduct(_product?.id),
|
||||
child: (context, dynamic isInFavourites) {
|
||||
return isInFavourites
|
||||
? IconButton(
|
||||
@ -256,9 +252,7 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
|
||||
centerTitle: true,
|
||||
),
|
||||
body: SafeArea(
|
||||
child: _isLoading
|
||||
? AppLoaderWidget()
|
||||
: Column(
|
||||
child: afterLoad(child: () => Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
@ -281,7 +275,7 @@ class _ProductDetailState extends NyState<ProductDetailPage> {
|
||||
quantity: widget.controller.quantity,
|
||||
)
|
||||
],
|
||||
),
|
||||
))
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:woosignal/models/response/product_review.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import '../../app/controllers/product_reviews_controller.dart';
|
||||
|
||||
class ProductReviewsPage extends NyStatefulWidget {
|
||||
|
||||
@ -10,25 +10,21 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/cached_image_widget.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class WishListPageWidget extends StatefulWidget {
|
||||
@override
|
||||
_WishListPageWidgetState createState() => _WishListPageWidgetState();
|
||||
}
|
||||
|
||||
class _WishListPageWidgetState extends State<WishListPageWidget> {
|
||||
class _WishListPageWidgetState extends NyState<WishListPageWidget> {
|
||||
List<Product> _products = [];
|
||||
bool? isLoading;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
isLoading = true;
|
||||
loadProducts();
|
||||
boot() async {
|
||||
await loadProducts();
|
||||
}
|
||||
|
||||
loadProducts() async {
|
||||
@ -36,9 +32,6 @@ class _WishListPageWidgetState extends State<WishListPageWidget> {
|
||||
List<int> productIds =
|
||||
favouriteProducts.map((e) => e['id']).cast<int>().toList();
|
||||
if (productIds.isEmpty) {
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
_products = await (appWooSignal((api) => api.getProducts(
|
||||
@ -47,9 +40,6 @@ class _WishListPageWidgetState extends State<WishListPageWidget> {
|
||||
status: "publish",
|
||||
stockStatus: "instock",
|
||||
)));
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
@ -60,9 +50,8 @@ class _WishListPageWidgetState extends State<WishListPageWidget> {
|
||||
title: Text(trans("Wishlist")),
|
||||
),
|
||||
body: SafeArea(
|
||||
child: isLoading!
|
||||
? AppLoaderWidget()
|
||||
: _products.isEmpty && isLoading == false
|
||||
child: afterLoad(
|
||||
child: () => _products.isEmpty
|
||||
? Center(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
@ -150,6 +139,7 @@ class _WishListPageWidgetState extends State<WishListPageWidget> {
|
||||
return Divider();
|
||||
},
|
||||
itemCount: _products.length)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -20,7 +20,7 @@ class AppVersionWidget extends StatelessWidget {
|
||||
return NyFutureBuilder<PackageInfo>(
|
||||
future: PackageInfo.fromPlatform(),
|
||||
child: (BuildContext context, data) => Padding(
|
||||
child: Text("${trans("Version")}: ${data.version}",
|
||||
child: Text("${trans("Version")}: ${data?.version}",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium!
|
||||
|
||||
@ -41,6 +41,8 @@ class _CartIconWidgetState extends State<CartIconWidget> {
|
||||
future: Cart.getInstance.getCart(),
|
||||
child: (BuildContext context,
|
||||
data) {
|
||||
if (data == null) return SizedBox.shrink();
|
||||
|
||||
List<int?> cartItems =
|
||||
data.map((e) => e.quantity).toList();
|
||||
String cartValue = "0";
|
||||
|
||||
@ -27,10 +27,11 @@ class CheckoutSelectCouponWidget extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool hasCoupon = checkoutSession.coupon != null;
|
||||
return InkWell(
|
||||
onTap: _actionCoupon,
|
||||
child: Container(
|
||||
return Container(
|
||||
height: 50,
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
child: InkWell(
|
||||
onTap: _actionCoupon,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
||||
@ -20,7 +20,7 @@ import 'package:flutter_swiper_view/flutter_swiper_view.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/product_category.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class CompoHomeWidget extends StatefulWidget {
|
||||
CompoHomeWidget({Key? key, required this.wooSignalApp}) : super(key: key);
|
||||
|
||||
@ -22,6 +22,7 @@ import 'package:flutter_app/resources/pages/wishlist_page_widget.dart';
|
||||
import 'package:flutter_app/resources/pages/home_search_page.dart';
|
||||
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/compo_home_widget.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class CompoThemeWidget extends StatefulWidget {
|
||||
@ -87,7 +88,7 @@ class CompoThemeWidgetState extends State<CompoThemeWidget> {
|
||||
id: 1,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.home),
|
||||
label: 'Home',
|
||||
label: 'Home'.tr(),
|
||||
),
|
||||
tabWidget: CompoHomeWidget(wooSignalApp: widget.wooSignalApp)),
|
||||
);
|
||||
@ -97,7 +98,7 @@ class CompoThemeWidgetState extends State<CompoThemeWidget> {
|
||||
id: 2,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.search),
|
||||
label: 'Search',
|
||||
label: 'Search'.tr(),
|
||||
),
|
||||
tabWidget: HomeSearchPage()),
|
||||
);
|
||||
@ -107,7 +108,7 @@ class CompoThemeWidgetState extends State<CompoThemeWidget> {
|
||||
id: 3,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.favorite_border),
|
||||
label: 'Wishlist',
|
||||
label: 'Wishlist'.tr(),
|
||||
),
|
||||
tabWidget: WishListPageWidget(),
|
||||
));
|
||||
@ -116,7 +117,7 @@ class CompoThemeWidgetState extends State<CompoThemeWidget> {
|
||||
items.add(BottomNavItem(
|
||||
id: 4,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.shopping_cart), label: 'Cart'),
|
||||
icon: Icon(Icons.shopping_cart), label: 'Cart'.tr()),
|
||||
tabWidget: CartPage(),
|
||||
));
|
||||
|
||||
@ -124,7 +125,7 @@ class CompoThemeWidgetState extends State<CompoThemeWidget> {
|
||||
items.add(BottomNavItem(
|
||||
id: 5,
|
||||
bottomNavigationBarItem:
|
||||
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Account'),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Account'.tr()),
|
||||
tabWidget: (await authCheck())
|
||||
? AccountDetailPage(showLeadingBackButton: false)
|
||||
: AccountLandingPage(
|
||||
|
||||
@ -11,7 +11,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/app/controllers/product_loader_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/cart_icon_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/home_drawer_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/safearea_widget.dart';
|
||||
@ -20,7 +19,7 @@ import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
import 'package:woosignal/models/response/product_category.dart' as ws_category;
|
||||
import 'package:woosignal/models/response/products.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/product.dart' as ws_product;
|
||||
|
||||
class MelloThemeWidget extends StatefulWidget {
|
||||
MelloThemeWidget(
|
||||
@ -33,7 +32,7 @@ class MelloThemeWidget extends StatefulWidget {
|
||||
_MelloThemeWidgetState createState() => _MelloThemeWidgetState();
|
||||
}
|
||||
|
||||
class _MelloThemeWidgetState extends State<MelloThemeWidget> {
|
||||
class _MelloThemeWidgetState extends NyState<MelloThemeWidget> {
|
||||
final RefreshController _refreshController =
|
||||
RefreshController(initialRefresh: false);
|
||||
final ProductLoaderController _productLoaderController =
|
||||
@ -41,20 +40,21 @@ class _MelloThemeWidgetState extends State<MelloThemeWidget> {
|
||||
|
||||
List<ws_category.ProductCategory> _categories = [];
|
||||
|
||||
bool _shouldStopRequests = false, _isLoading = true;
|
||||
bool _shouldStopRequests = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_home();
|
||||
void init() async {
|
||||
super.init();
|
||||
}
|
||||
|
||||
@override
|
||||
boot() async {
|
||||
await _home();
|
||||
}
|
||||
|
||||
_home() async {
|
||||
await fetchProducts();
|
||||
await _fetchCategories();
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
_fetchCategories() async {
|
||||
@ -110,9 +110,7 @@ class _MelloThemeWidgetState extends State<MelloThemeWidget> {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: _isLoading
|
||||
? AppLoaderWidget()
|
||||
: RefreshableScrollContainer(
|
||||
child: afterLoad(child: () => RefreshableScrollContainer(
|
||||
controller: _refreshController,
|
||||
onRefresh: _onRefresh,
|
||||
onLoading: _onLoading,
|
||||
@ -121,7 +119,7 @@ class _MelloThemeWidgetState extends State<MelloThemeWidget> {
|
||||
bannerHeight: MediaQuery.of(context).size.height / 3.5,
|
||||
bannerImages: bannerImages,
|
||||
modalBottomSheetMenu: _modalBottomSheetMenu,
|
||||
),
|
||||
)),
|
||||
flex: 1,
|
||||
),
|
||||
],
|
||||
|
||||
@ -12,7 +12,6 @@ import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/app/controllers/product_loader_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/cached_image_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/home_drawer_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/no_results_for_products_widget.dart';
|
||||
@ -23,7 +22,7 @@ import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
import 'package:woosignal/models/response/product_category.dart' as ws_category;
|
||||
import 'package:woosignal/models/response/products.dart' as ws_product;
|
||||
import 'package:woosignal/models/response/product.dart' as ws_product;
|
||||
|
||||
class NoticHomeWidget extends StatefulWidget {
|
||||
NoticHomeWidget({Key? key, required this.wooSignalApp}) : super(key: key);
|
||||
@ -34,7 +33,7 @@ class NoticHomeWidget extends StatefulWidget {
|
||||
_NoticHomeWidgetState createState() => _NoticHomeWidgetState();
|
||||
}
|
||||
|
||||
class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
class _NoticHomeWidgetState extends NyState<NoticHomeWidget> {
|
||||
Widget? activeWidget;
|
||||
final RefreshController _refreshController =
|
||||
RefreshController(initialRefresh: false);
|
||||
@ -43,20 +42,16 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
ProductLoaderController();
|
||||
List<ws_category.ProductCategory> _categories = [];
|
||||
|
||||
bool _shouldStopRequests = false, _isLoading = true;
|
||||
bool _shouldStopRequests = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_home();
|
||||
boot() async {
|
||||
await _home();
|
||||
}
|
||||
|
||||
_home() async {
|
||||
await fetchProducts();
|
||||
await _fetchCategories();
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
_fetchCategories() async {
|
||||
@ -114,10 +109,8 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
(_isLoading
|
||||
? Expanded(child: AppLoaderWidget())
|
||||
: Expanded(
|
||||
child: ListView(
|
||||
Expanded(
|
||||
child: afterLoad(child: () => ListView(
|
||||
shrinkWrap: true,
|
||||
children: [
|
||||
Container(
|
||||
@ -138,7 +131,7 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
height: MediaQuery.of(context).size.height / 2.5,
|
||||
),
|
||||
Container(
|
||||
height: 100,
|
||||
height: 75,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -149,7 +142,7 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.headlineMedium,
|
||||
maxLines: 2,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
)
|
||||
@ -157,7 +150,7 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
),
|
||||
),
|
||||
Container(
|
||||
height: 250,
|
||||
height: 380,
|
||||
child: SmartRefresher(
|
||||
enablePullDown: true,
|
||||
enablePullUp: true,
|
||||
@ -192,7 +185,6 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
shrinkWrap: false,
|
||||
itemBuilder: (cxt, i) {
|
||||
return Container(
|
||||
// height: 200,
|
||||
width:
|
||||
MediaQuery.of(context).size.width /
|
||||
2.5,
|
||||
@ -208,8 +200,7 @@ class _NoticHomeWidgetState extends State<NoticHomeWidget> {
|
||||
)
|
||||
],
|
||||
),
|
||||
flex: 1,
|
||||
)),
|
||||
),flex: 1,),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@ -22,6 +22,7 @@ import 'package:flutter_app/resources/pages/wishlist_page_widget.dart';
|
||||
import 'package:flutter_app/resources/pages/home_search_page.dart';
|
||||
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/notic_home_widget.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class NoticThemeWidget extends StatefulWidget {
|
||||
@ -86,7 +87,7 @@ class _NoticThemeWidgetState extends State<NoticThemeWidget> {
|
||||
id: 1,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.home),
|
||||
label: 'Home',
|
||||
label: 'Home'.tr(),
|
||||
),
|
||||
tabWidget: NoticHomeWidget(wooSignalApp: widget.wooSignalApp)),
|
||||
);
|
||||
@ -96,7 +97,7 @@ class _NoticThemeWidgetState extends State<NoticThemeWidget> {
|
||||
id: 2,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.search),
|
||||
label: 'Search',
|
||||
label: 'Search'.tr(),
|
||||
),
|
||||
tabWidget: HomeSearchPage()),
|
||||
);
|
||||
@ -106,7 +107,7 @@ class _NoticThemeWidgetState extends State<NoticThemeWidget> {
|
||||
id: 3,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.favorite_border),
|
||||
label: 'Wishlist',
|
||||
label: 'Wishlist'.tr(),
|
||||
),
|
||||
tabWidget: WishListPageWidget(),
|
||||
));
|
||||
@ -115,7 +116,9 @@ class _NoticThemeWidgetState extends State<NoticThemeWidget> {
|
||||
items.add(BottomNavItem(
|
||||
id: 4,
|
||||
bottomNavigationBarItem: BottomNavigationBarItem(
|
||||
icon: Icon(Icons.shopping_cart), label: 'Cart'),
|
||||
icon: Icon(Icons.shopping_cart),
|
||||
label: 'Cart'.tr(),
|
||||
),
|
||||
tabWidget: CartPage(),
|
||||
));
|
||||
|
||||
@ -123,7 +126,9 @@ class _NoticThemeWidgetState extends State<NoticThemeWidget> {
|
||||
items.add(BottomNavItem(
|
||||
id: 5,
|
||||
bottomNavigationBarItem:
|
||||
BottomNavigationBarItem(icon: Icon(Icons.person), label: 'Account'),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.person),
|
||||
label: 'Account'.tr(),
|
||||
),
|
||||
tabWidget: (await authCheck())
|
||||
? AccountDetailPage(showLeadingBackButton: false)
|
||||
: AccountLandingPage(
|
||||
|
||||
@ -15,7 +15,7 @@ import 'package:flutter_app/resources/widgets/product_detail_image_swiper_widget
|
||||
import 'package:flutter_app/resources/widgets/product_detail_related_products_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/product_detail_reviews_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/product_detail_upsell_widget.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class ProductDetailBodyWidget extends StatelessWidget {
|
||||
|
||||
@ -13,7 +13,7 @@ import 'package:flutter_app/resources/widgets/woosignal_ui.dart';
|
||||
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductDetailDescriptionWidget extends StatelessWidget {
|
||||
const ProductDetailDescriptionWidget({Key? key, required this.product})
|
||||
|
||||
@ -13,7 +13,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/widgets/buttons.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductDetailFooterActionsWidget extends StatelessWidget {
|
||||
const ProductDetailFooterActionsWidget(
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductDetailHeaderWidget extends StatelessWidget {
|
||||
const ProductDetailHeaderWidget({Key? key, required this.product})
|
||||
|
||||
@ -12,7 +12,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/resources/widgets/cached_image_widget.dart';
|
||||
import 'package:flutter_swiper_view/flutter_swiper_view.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
|
||||
class ProductDetailImageSwiperWidget extends StatelessWidget {
|
||||
const ProductDetailImageSwiperWidget(
|
||||
|
||||
@ -12,7 +12,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_app/bootstrap/helpers.dart';
|
||||
import 'package:flutter_app/resources/widgets/woosignal_ui.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class ProductDetailRelatedProductsWidget extends StatelessWidget {
|
||||
@ -55,7 +55,9 @@ class ProductDetailRelatedProductsWidget extends StatelessWidget {
|
||||
child: NyFutureBuilder<List<Product>>(
|
||||
future: fetchRelated(),
|
||||
child: (context, relatedProducts) {
|
||||
if (relatedProducts == null) {
|
||||
if (relatedProducts == null) return SizedBox.shrink();
|
||||
|
||||
if (relatedProducts.isEmpty) {
|
||||
return SizedBox.shrink();
|
||||
}
|
||||
return ListView(
|
||||
@ -74,9 +76,7 @@ class ProductDetailRelatedProductsWidget extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
Future<List<Product>> fetchRelated() async {
|
||||
return await (appWooSignal(
|
||||
(api) => api.getProducts(perPage: 100, include: product!.relatedIds),
|
||||
Future<List<Product>> fetchRelated() async => await (appWooSignal(
|
||||
(api) => api.getProducts(perPage: 100, include: product!.relatedIds, status: "publish"),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ import 'package:flutter_app/resources/widgets/product_detail_review_tile_widget.
|
||||
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/product_review.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class ProductDetailReviewsWidget extends StatefulWidget {
|
||||
@ -93,6 +93,15 @@ class _ProductDetailReviewsWidgetState
|
||||
NyFutureBuilder<List<ProductReview>>(
|
||||
future: fetchReviews(),
|
||||
child: (context, reviews) {
|
||||
if (reviews == null) {
|
||||
return Container(
|
||||
child: ListTile(
|
||||
title: Text(
|
||||
trans('There are no reviews yet.'),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
int reviewsCount = reviews.length;
|
||||
List<Widget> childrenWidgets = [];
|
||||
List<ProductDetailReviewTileWidget> children = reviews
|
||||
|
||||
@ -13,7 +13,7 @@ import 'package:flutter_app/app/controllers/product_loader_controller.dart';
|
||||
import 'package:flutter_app/resources/widgets/app_loader_widget.dart';
|
||||
import 'package:flutter_app/resources/widgets/woosignal_ui.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/woosignal_app.dart';
|
||||
|
||||
class ProductDetailUpsellWidget extends StatefulWidget {
|
||||
|
||||
@ -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,
|
||||
)),
|
||||
)
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||
import 'package:flutter_swiper_view/flutter_swiper_view.dart';
|
||||
import 'package:nylo_framework/nylo_framework.dart';
|
||||
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
|
||||
import 'package:woosignal/models/response/products.dart';
|
||||
import 'package:woosignal/models/response/product.dart';
|
||||
import 'package:woosignal/models/response/tax_rate.dart';
|
||||
|
||||
class RefreshableScrollContainer extends StatelessWidget {
|
||||
@ -108,7 +108,7 @@ class RefreshableScrollContainer extends StatelessWidget {
|
||||
.map((product) => StaggeredGridTile.fit(
|
||||
crossAxisCellCount: 1,
|
||||
child: Container(
|
||||
height: 200,
|
||||
height: 300,
|
||||
child: ProductItemContainer(
|
||||
product: product,
|
||||
onTap: onTap,
|
||||
@ -138,10 +138,19 @@ class CheckoutRowLine extends StatelessWidget {
|
||||
final bool showBorderBottom;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => Flexible(
|
||||
child: InkWell(
|
||||
child: Container(
|
||||
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,
|
||||
@ -190,19 +199,7 @@ class CheckoutRowLine extends StatelessWidget {
|
||||
)
|
||||
],
|
||||
),
|
||||
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,
|
||||
);
|
||||
}
|
||||
|
||||
@ -316,16 +313,16 @@ class ProductItemContainer extends StatelessWidget {
|
||||
return SizedBox.shrink();
|
||||
}
|
||||
|
||||
return LayoutBuilder(
|
||||
builder: (cxt, constraints) => InkWell(
|
||||
double height = 280;
|
||||
return InkWell(
|
||||
child: Container(
|
||||
margin: EdgeInsets.all(4),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
child: ListView(
|
||||
shrinkWrap: true,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
children: <Widget>[
|
||||
Container(
|
||||
height: constraints.maxHeight / 1.6,
|
||||
height: 180,
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(3.0),
|
||||
child: Stack(
|
||||
@ -340,7 +337,7 @@ class ProductItemContainer extends StatelessWidget {
|
||||
? product!.images.first.src
|
||||
: getEnv("PRODUCT_PLACEHOLDER_IMAGE")),
|
||||
fit: BoxFit.contain,
|
||||
height: constraints.maxHeight / 1.6,
|
||||
height: height,
|
||||
width: double.infinity,
|
||||
),
|
||||
if (isProductNew(product))
|
||||
@ -354,7 +351,6 @@ class ProductItemContainer extends StatelessWidget {
|
||||
padding: EdgeInsets.all(3),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white70,
|
||||
// borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: RichText(
|
||||
textAlign: TextAlign.center,
|
||||
@ -394,8 +390,7 @@ class ProductItemContainer extends StatelessWidget {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
Flexible(
|
||||
child: Container(
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 4),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
@ -439,7 +434,6 @@ class ProductItemContainer extends StatelessWidget {
|
||||
].toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -447,7 +441,6 @@ class ProductItemContainer extends StatelessWidget {
|
||||
? onTap!(product)
|
||||
: Navigator.pushNamed(context, "/product-detail",
|
||||
arguments: product),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 77 KiB |
@ -13,10 +13,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _flutterfire_internals
|
||||
sha256: "8eb354cb8ebed8a9fdf63699d15deff533bc133128898afaf754926b57d611b6"
|
||||
sha256: "1a5e13736d59235ce0139621b4bbe29bc89839e202409081bc667eb3cd20674c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.1"
|
||||
version: "1.3.5"
|
||||
analyzer:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -26,7 +26,7 @@ packages:
|
||||
source: hosted
|
||||
version: "5.12.0"
|
||||
animate_do:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: animate_do
|
||||
sha256: "9aeacc1a7238f971c039bdf45d13c628be554a242e0251c4ddda09d19a1a923f"
|
||||
@ -45,10 +45,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: c372bb384f273f0c2a8aaaa226dad84dc27c8519a691b888725dec59518ad53a
|
||||
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||
url: "https://pub.dev"
|
||||
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:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -141,10 +149,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
|
||||
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.1"
|
||||
version: "1.17.2"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -177,22 +185,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
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:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus
|
||||
sha256: "9b1a0c32b2a503f8fe9f8764fac7b5fcd4f6bd35d8f49de5350bccf9e2a33b8a"
|
||||
sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.0.0"
|
||||
version: "9.0.2"
|
||||
device_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -205,10 +205,42 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dio
|
||||
sha256: "347d56c26d63519552ef9a569f2a593dda99a81fdbdff13c584b7197cfe05059"
|
||||
sha256: a9d76e72985d7087eb7c5e7903224ae52b337131518d127c554b9405936752b8
|
||||
url: "https://pub.dev"
|
||||
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:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: eventify
|
||||
sha256: b829429f08586cc2001c628e7499e3e3c2493a1d895fd73b00ecb23351aa5a66
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -237,10 +269,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_core
|
||||
sha256: "250678b816279b3240c3a33e1f76bf712c00718f1fbeffc85873a5da8c077379"
|
||||
sha256: c78132175edda4bc532a71e01a32964e4b4fcf53de7853a422d96dac3725f389
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.13.0"
|
||||
version: "2.15.1"
|
||||
firebase_core_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -253,34 +285,34 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_core_web
|
||||
sha256: "8c0f4c87d20e2d001a5915df238c1f9c88704231f591324205f5a5d2a7740a45"
|
||||
sha256: "4cf4d2161530332ddc3c562f19823fb897ff37a9a774090d28df99f47370e973"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.7.0"
|
||||
firebase_messaging:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_messaging
|
||||
sha256: "9cfe5c4560fb83393511ca7620f8fb3f22c9a80303052f10290e732fcfb801bd"
|
||||
sha256: "6c1a2a047d6f165b7c5f947467ac5138731a2af82c7af1c12d691dbb834f6b73"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.6.1"
|
||||
version: "14.6.7"
|
||||
firebase_messaging_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_messaging_platform_interface
|
||||
sha256: "7e25cb71019ccef8b1fd7b37969af79f04c467974cce4dfc291fa36974edd7ba"
|
||||
sha256: bcba58d28f8cda607a323240c6d314c2c62b62ebfbb0f2d704ebefef07b52b5f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.1"
|
||||
version: "4.5.6"
|
||||
firebase_messaging_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_messaging_web
|
||||
sha256: "5d9840cc8126ea723b1bda901389cb542902f664f2653c16d4f8114e95f13cec"
|
||||
sha256: "962d09ec9dfa486cbbc218258ad41e8ec7997a2eba46919049496e1cafd960c5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.5.1"
|
||||
version: "3.5.6"
|
||||
flare_flutter:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -314,10 +346,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_dotenv
|
||||
sha256: d9283d92059a22e9834bc0a31336658ffba77089fb6f3cc36751f1fc7c6661a3
|
||||
sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.2"
|
||||
version: "5.1.0"
|
||||
flutter_launcher_icons:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
@ -407,10 +439,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_stripe
|
||||
sha256: "95f3c4b907493ff5cdd6b3cdeda03bb59c2bc409d0c0bfb44db948374f9c3595"
|
||||
sha256: "2acc4a31f9fed946a1fb230d708169ff0448f2a356fc728780ced52eb0df7712"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.1.1"
|
||||
version: "9.3.0"
|
||||
flutter_styled_toast:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -449,10 +481,18 @@ 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:
|
||||
name: fluttertoast
|
||||
sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.2.2"
|
||||
freezed_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -481,10 +521,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: google_fonts
|
||||
sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6"
|
||||
sha256: "2776c66b3e97c6cdd58d1bd3281548b074b64f1fd5c8f82391f7456e38849567"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.4"
|
||||
version: "4.0.5"
|
||||
html:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -494,13 +534,13 @@ packages:
|
||||
source: hosted
|
||||
version: "0.15.3"
|
||||
http:
|
||||
dependency: transitive
|
||||
dependency: "direct overridden"
|
||||
description:
|
||||
name: http
|
||||
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
|
||||
sha256: "4c3f04bfb64d3efd508d06b41b825542f08122d30bda4933fb95c069d22a4fa3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.13.6"
|
||||
version: "1.0.0"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -521,10 +561,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: intl
|
||||
sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6
|
||||
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.18.0"
|
||||
version: "0.18.1"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -541,38 +581,38 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
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:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: lints
|
||||
sha256: "6b0206b0bf4f04961fc5438198ccb3a885685cd67d4d4a32cc20ad7f8adbe015"
|
||||
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
|
||||
url: "https://pub.dev"
|
||||
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:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
|
||||
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.15"
|
||||
version: "0.12.16"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
|
||||
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.0"
|
||||
version: "0.5.0"
|
||||
math_expressions:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -601,18 +641,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: nylo_framework
|
||||
sha256: "89cd06e70cd5e402e16174385bcbe24cb4954fc4ce2e6de30e774e5a19fd6b56"
|
||||
sha256: "535684c9fd422f7a45ad83b1228ea42a87782a0655aa227c44fe75b9d3bcb8c5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.0"
|
||||
version: "5.3.2"
|
||||
nylo_support:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: nylo_support
|
||||
sha256: "72228f50a1e37bc2e3c27dfe28ce72b7f72aa120829fb83b8c0d15f6f15c074b"
|
||||
sha256: "903f510366ca1af7982ec69d45fd8b9bd25c9cdbf6380f8736cd50fa37eed8cd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.0"
|
||||
version: "5.7.0"
|
||||
octo_image:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -633,10 +673,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: package_info_plus
|
||||
sha256: d39e8fbff4c5aef4592737e25ad6ac500df006ce7a7a8e1f838ce1256e167542
|
||||
sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "4.1.0"
|
||||
package_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -773,6 +813,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
razorpay_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: razorpay_flutter
|
||||
sha256: d73a536032f6939f0a6706cff958904d471eb1acb3dc957c8cc4e1628f0fbc28
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.5"
|
||||
recase:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -793,10 +841,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:
|
||||
@ -825,10 +873,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:
|
||||
@ -854,10 +902,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
|
||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
version: "1.10.0"
|
||||
sqflite:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -910,26 +958,26 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stripe_android
|
||||
sha256: "89c6c9a9e6fbe6eea4b15b6c0eb012490155c37a6b4298851f77987fde4fee43"
|
||||
sha256: "0396c877823e84f0053f7d57fed506798635a9d48f0f044859c85216db6194fd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.2.0"
|
||||
version: "9.3.0"
|
||||
stripe_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stripe_ios
|
||||
sha256: "1ce3922c9e9fd2e3ced6b9d349966fa19074794eec1c9bac3cec1bca53e98c85"
|
||||
sha256: "81092043f0ae86ba6f5c16f76b16bbc97c4579eee58130e84cf4b30e36b4b649"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.1.0"
|
||||
version: "9.3.1"
|
||||
stripe_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stripe_platform_interface
|
||||
sha256: c1e90deb6e9939181f0fbc39b4f81c2e640b1b9fe4b3586ff84af7e8c46df2e4
|
||||
sha256: "554380d197004cff235ae0327f1c3b596a3d22575af83e07c15ed07b6b62c45e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.2.0"
|
||||
version: "9.3.0"
|
||||
synchronized:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -950,10 +998,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
|
||||
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.1"
|
||||
version: "0.6.0"
|
||||
theme_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -974,10 +1022,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3
|
||||
sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.11"
|
||||
version: "6.1.12"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -1066,6 +1114,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
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:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -1118,10 +1174,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: woosignal
|
||||
sha256: "67d6962b9b38e0da217bc136ddfd76dea7f9e876905f8b196be49f0f6b83e922"
|
||||
sha256: "089a373122ae0e202e64e214ce4a549af29e589128bdc8c8a54f3da68a2355aa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.0"
|
||||
version: "3.8.0"
|
||||
wp_json_api:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -1155,5 +1211,5 @@ packages:
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.0.0 <4.0.0"
|
||||
flutter: ">=3.7.0-0"
|
||||
dart: ">=3.1.0-185.0.dev <4.0.0"
|
||||
flutter: ">=3.10.0"
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
# Official WooSignal App Template for WooCommerce
|
||||
|
||||
# Label StoreMax
|
||||
# Version: 6.6.0
|
||||
# Version: 6.10.1
|
||||
# Author: Anthony Gordon
|
||||
# Homepage: https://woosignal.com
|
||||
# Documentation: https://woosignal.com/docs/app/label-storemax
|
||||
|
||||
### Change App Icon
|
||||
# 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
|
||||
# IOS https://flutter.dev/docs/deployment/ios
|
||||
@ -26,19 +26,19 @@ environment:
|
||||
flutter: ">=3.0.0"
|
||||
|
||||
dependencies:
|
||||
google_fonts: ^4.0.3
|
||||
google_fonts: ^4.0.5
|
||||
analyzer: ^5.12.0
|
||||
intl: ^0.18.0
|
||||
nylo_framework: ^5.0.0
|
||||
woosignal: ^3.4.0
|
||||
nylo_framework: ^5.3.2
|
||||
woosignal: ^3.8.0
|
||||
wp_json_api: ^3.3.2
|
||||
cached_network_image: ^3.2.3
|
||||
package_info_plus: ^4.0.0
|
||||
package_info_plus: ^4.1.0
|
||||
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
|
||||
url_launcher: ^6.1.12
|
||||
bubble_tab_indicator: ^0.1.5
|
||||
status_alert: ^1.0.1
|
||||
math_expressions: ^2.4.0
|
||||
@ -46,12 +46,12 @@ 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.4.1
|
||||
firebase_core: ^2.10.0
|
||||
firebase_messaging: ^14.6.7
|
||||
firebase_core: ^2.15.1
|
||||
flutter:
|
||||
sdk: flutter
|
||||
flutter_localizations:
|
||||
@ -60,12 +60,17 @@ dependencies:
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: ^1.0.5
|
||||
collection: ^1.15.0
|
||||
flutter_stripe: ^9.1.1
|
||||
collection: ^1.17.1
|
||||
flutter_stripe: ^9.3.0
|
||||
razorpay_flutter: ^1.3.5
|
||||
animate_do: ^3.0.2
|
||||
|
||||
dependency_overrides:
|
||||
http: ^1.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_launcher_icons: ^0.13.1
|
||||
lints: ^2.0.0
|
||||
lints: ^2.1.1
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
# WooCommerce App: Label StoreMax
|
||||
|
||||
### Label StoreMax - v6.6.0
|
||||
### Label StoreMax
|
||||
|
||||
|
||||
[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
|
||||
- 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
|
||||
|
||||
|
||||