diff --git a/android/app/build.gradle b/android/app/build.gradle
index f359571..86d39d5 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -24,9 +24,10 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+apply plugin: 'com.google.gms.google-services'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
@@ -39,10 +40,11 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "us.minipos.flutter_wisetronic"
- minSdkVersion 16
- targetSdkVersion 29
+ minSdkVersion 19
+ targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
+ multiDexEnabled true
}
buildTypes {
@@ -60,4 +62,6 @@ flutter {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'com.android.support:multidex:1.0.3'
+ implementation 'com.google.firebase:firebase-messaging:21.0.1'
}
diff --git a/android/app/google-services.json b/android/app/google-services.json
new file mode 100644
index 0000000..b0c44ec
--- /dev/null
+++ b/android/app/google-services.json
@@ -0,0 +1,39 @@
+{
+ "project_info": {
+ "project_number": "972052001940",
+ "project_id": "wisetronicsite",
+ "storage_bucket": "wisetronicsite.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:972052001940:android:6c418edf0744da8d5c3081",
+ "android_client_info": {
+ "package_name": "us.minipos.flutter_wisetronic"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "972052001940-95is9u4av26k6qag4aaq6fgqi716s1ap.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyCZoTVIxTKDaqoZz-aM0uVWKNMvc5nco0s"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "972052001940-95is9u4av26k6qag4aaq6fgqi716s1ap.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index ca3b311..1eba08e 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,8 +1,20 @@
+
+
+ android:icon="@mipmap/launcher_icon">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/Application.kt b/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/Application.kt
new file mode 100644
index 0000000..bb0c919
--- /dev/null
+++ b/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/Application.kt
@@ -0,0 +1,18 @@
+package us.minipos.flutter_wisetronic
+
+import io.flutter.app.FlutterApplication
+import io.flutter.plugin.common.PluginRegistry
+import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
+import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
+
+class Application : FlutterApplication(), PluginRegistry.PluginRegistrantCallback {
+ override fun onCreate() {
+ super.onCreate()
+ FlutterFirebaseMessagingService.setPluginRegistrant(this)
+ }
+
+ override fun registerWith(registry: PluginRegistry?) {
+// GeneratedPluginRegistrant.registerWith(registry)
+ FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/MainActivity.kt b/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/MainActivity.kt
index d1ff66c..6ce6980 100644
--- a/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/MainActivity.kt
+++ b/android/app/src/main/kotlin/us/minipos/flutter_wisetronic/MainActivity.kt
@@ -1,6 +1,12 @@
package us.minipos.flutter_wisetronic
+import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
+ override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
+ GeneratedPluginRegistrant.registerWith(flutterEngine);
+ }
}
diff --git a/android/build.gradle b/android/build.gradle
index 3100ad2..246bfed 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -6,8 +6,9 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.0'
+ classpath 'com.android.tools.build:gradle:3.5.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath 'com.google.gms:google-services:4.3.5'
}
}
diff --git a/assets/images/apple_pay.png b/assets/images/apple_pay.png
new file mode 100644
index 0000000..bf1add3
Binary files /dev/null and b/assets/images/apple_pay.png differ
diff --git a/assets/images/denied.png b/assets/images/denied.png
new file mode 100644
index 0000000..9a5fcc8
Binary files /dev/null and b/assets/images/denied.png differ
diff --git a/assets/images/google_pay.png b/assets/images/google_pay.png
new file mode 100644
index 0000000..1b013d9
Binary files /dev/null and b/assets/images/google_pay.png differ
diff --git a/assets/images/group_number.png b/assets/images/group_number.png
new file mode 100644
index 0000000..bd33b65
Binary files /dev/null and b/assets/images/group_number.png differ
diff --git a/assets/images/icon.png b/assets/images/icon.png
new file mode 100644
index 0000000..b9752ec
Binary files /dev/null and b/assets/images/icon.png differ
diff --git a/assets/images/master.png b/assets/images/master.png
new file mode 100644
index 0000000..e64587d
Binary files /dev/null and b/assets/images/master.png differ
diff --git a/assets/images/under_renovation.png b/assets/images/under_renovation.png
new file mode 100644
index 0000000..7d9baba
Binary files /dev/null and b/assets/images/under_renovation.png differ
diff --git a/assets/images/visa.png b/assets/images/visa.png
new file mode 100644
index 0000000..7d60b92
Binary files /dev/null and b/assets/images/visa.png differ
diff --git a/assets/tessdata/OCRB.traineddata b/assets/tessdata/OCRB.traineddata
new file mode 100644
index 0000000..842bd20
Binary files /dev/null and b/assets/tessdata/OCRB.traineddata differ
diff --git a/assets/tessdata/chi_sim.traineddata b/assets/tessdata/chi_sim.traineddata
new file mode 100644
index 0000000..eeb66cf
Binary files /dev/null and b/assets/tessdata/chi_sim.traineddata differ
diff --git a/assets/tessdata/chi_sim_vert.traineddata b/assets/tessdata/chi_sim_vert.traineddata
new file mode 100644
index 0000000..851996c
Binary files /dev/null and b/assets/tessdata/chi_sim_vert.traineddata differ
diff --git a/assets/tessdata/chi_tra.traineddata b/assets/tessdata/chi_tra.traineddata
new file mode 100644
index 0000000..5f1fe27
Binary files /dev/null and b/assets/tessdata/chi_tra.traineddata differ
diff --git a/assets/tessdata/chi_tra_vert.traineddata b/assets/tessdata/chi_tra_vert.traineddata
new file mode 100644
index 0000000..a794935
Binary files /dev/null and b/assets/tessdata/chi_tra_vert.traineddata differ
diff --git a/assets/tessdata/eng.traineddata b/assets/tessdata/eng.traineddata
new file mode 100644
index 0000000..f4744c2
Binary files /dev/null and b/assets/tessdata/eng.traineddata differ
diff --git a/assets/tessdata/financial.traineddata b/assets/tessdata/financial.traineddata
new file mode 100644
index 0000000..71b43ce
Binary files /dev/null and b/assets/tessdata/financial.traineddata differ
diff --git a/assets/tessdata/pdf.ttf b/assets/tessdata/pdf.ttf
new file mode 100644
index 0000000..d1472b2
Binary files /dev/null and b/assets/tessdata/pdf.ttf differ
diff --git a/assets/tessdata_config.json b/assets/tessdata_config.json
new file mode 100644
index 0000000..997e8dc
--- /dev/null
+++ b/assets/tessdata_config.json
@@ -0,0 +1,12 @@
+{
+ "files": [
+ "eng.traineddata",
+ "OCRB.traineddata",
+ "pdf.ttf",
+ "financial.traineddata",
+ "chi_sim.traineddata",
+ "chi_sim_vert.traineddata",
+ "chi_tra.traineddata",
+ "chi_tra_vert.traineddata"
+ ]
+}
\ No newline at end of file
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..b01b47e
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+set -e
+
+function build_all() {
+ echo "1. Build Web"
+ flutter build web --dart-define=FLUTTER_WEB_USE_EXPERIMENTAL_CANVAS_TEXT=true --web-renderer html
+ echo "2.1 Build Android APK"
+ flutter build apk --release --verbose
+ echo "2.2 Build Android APK"
+ flutter build apk --split-per-abi
+ echo "2.3 Build Android AppBundle"
+ flutter build appbundle
+ echo "3. Build iOS"
+ flutter build ios --release
+ echo "All done!"
+ exit
+}
+
+function build_web() {
+ echo "<<< Build Web >>>"
+ flutter build web --dart-define=FLUTTER_WEB_USE_EXPERIMENTAL_CANVAS_TEXT=true --web-renderer html
+ echo "Done!"
+ exit
+}
+
+function build_android() {
+ echo "1 Build Android APK"
+ flutter build apk --release --verbose
+ echo "2 Build Android APK"
+ flutter build apk --split-per-abi
+ echo "3 Build Android AppBundle"
+ flutter build appbundle
+ echo "Done!"
+ exit
+}
+
+function build_ios() {
+ echo "<<< Build iOS >>>"
+ flutter build ios --release
+ echo "Done!"
+}
+
+PS3='Please choice: '
+options=("Build All" "Build Web" "Build Android" "Build iOS")
+select opt in "${options[@]}"; do
+ case $opt in
+ "Build All")
+ build_all
+ ;;
+ "Build Web")
+ build_web
+ ;;
+ "Build Android")
+ build_android
+ ;;
+ "Build iOS")
+ build_ios
+ ;;
+ *) echo "Invalid option $REPLY";;
+ esac
+done
\ No newline at end of file
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index e8efba1..b2f5fae 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1,2 +1,3 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 399e934..88c2914 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1,2 +1,3 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index e0a0df6..d3d7377 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -492,4 +492,4 @@
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
-}
+}
\ No newline at end of file
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index 70693e4..c36168d 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -7,6 +7,7 @@ import Flutter
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
+ GMSServices.provideAPIKey("AIzaSyA8BezbDC1M9Em7uzEIW4NCxXq0JZNL4ko")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
index dc9ada4..72fd2b8 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
index 28c6bf0..d13c00f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
index 2ccbfd9..3a2d75e 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
index f091b6b..85a356f 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
index 4cde121..0efd89b 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
index d0ef06e..0fae04c 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
index dcdc230..e94e903 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
index 2ccbfd9..3a2d75e 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
index c8f9ed8..2eb2c3d 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
index a6d6b86..916018a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
index a6d6b86..916018a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
index 75b2d16..a8267dc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
index c4df70d..7dd20c7 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
index 6a84f41..d95b6dc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
index d0e1f58..62db198 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index c13be3c..567ce94 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -41,5 +41,20 @@
UIViewControllerBasedStatusBarAppearance
+ io.flutter.embedded_views_preview
+
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ 3ds.stripesdk.io
+ CFBundleURLSchemes
+
+ stripesdk
+
+
+
diff --git a/lib/constants.dart b/lib/constants.dart
index 010e385..b0deeb1 100644
--- a/lib/constants.dart
+++ b/lib/constants.dart
@@ -1,5 +1,8 @@
class Constants {
+
+ static const bool ENABLE_NATIVE_PAY = false;
+
static const int FONT_GOOGLE = 0xe800;
static const int FONT_ALEXA = 0xe801;
static const int FONT_APPLE = 0xe802;
@@ -16,8 +19,49 @@ class Constants {
static const int FONT_TOPTONS = 0xe813;
static const bool DEBUG = false;
- static const BASE_API_URL = 'https://api.minipos.us/';
+ static const int BUSINESS_ID = 310; //310, 680, 357(notjust), 651(kiosk);
+ static const String APP_TITLE = 'MiniPOS Ponit of Sale System';
+ static const String BASE_API_URL = 'https://api.minipos.us/'; //'https://sandbox.minipos.us/', 'https://api.minipos.us/'
+ static const String TUTORIAL_URL = 'https://archive.wisetronic.com/wisetronic-products-documentation/';
static const String API_SECRET = 'pei326sami1223HellowWorldabcdEd';
static const KEY_USER_ID = 'user_id';
static const KEY_ACCESS_TOKEN = 'access_token';
+ static const KEY_CARTINFOS = "cart_infos";
+ static const ORDERS_PER_PAGE = 10;
+
+ static const KEY_LAST_VISIT = 'last-visits';
+
+ static const int TICKET_PER_PAGE_MOBILE = 20;
+ static const int TICKET_PER_PAGE_DESKTOP = 40;
+ static const int BLOG_PER_PAGE_MOBILE = 20;
+ static const int BLOG_PER_PAGE_DESKTOP = 30;
+
+ static const double BREADCRUMB_HEIGHT = 38;
+
+ static const int HOT_SALE_ID = -1;
+ static const int FEATURED_PRODUCT_ID = -2;
+
+ static const String PAYMENT_METHOD_PAY_ON_DELIVERY = 'POD';
+ static const String PAYMENT_METHOD_CODE_CHASE = 'chase';
+ static const String PAYMENT_METHOD_CODE_SQUARE = 'web-credit-card';
+ static const String PAYMENT_METHOD_CODE_OTT_ALIPAY = 'ALIPAY';
+ static const String PAYMENT_METHOD_CODE_OTT_WECHATPAY = 'WECHATPAY';
+ static const String PAYMENT_METHOD_CODE_PAYPAL = 'paypal';
+ static const String PAYMENT_METHOD_CODE_STRIPE = 'stripe';
+ static const String PAYMENT_METHOD_CODE_POD = 'payondeliverypickup';
+ static const String PAYMENT_METHOD_NATIVE_PAY = 'native_pay';
+
+ static const String STRIPE_STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation';
+ static const String STRIPE_CLIENT_SECRET = 'client_secret';
+ static const String STRIPE_STATUS_SUCCEDED = 'succeeded';
+
+ static const int STATUS_PENDING = 0;
+ static const int STATUS_ACCEPT = 1;
+ static const int STATUS_PROCESSING = 2;
+ static const int STATUS_COMPLETE = 5;
+ static const int STATUS_CANCELLED = -1;
+
+ static const String PAYMENT_STATUS_UNPAID = 'UNPAID';
+ static const String PAYMENT_STATUS_PAID = 'PAID';
+ static const String PAYMENT_STATUS_PARTIALPAID = 'PARTIALPAID';
}
\ No newline at end of file
diff --git a/lib/dialog/image_viewer.dart b/lib/dialog/image_viewer.dart
new file mode 100644
index 0000000..a745584
--- /dev/null
+++ b/lib/dialog/image_viewer.dart
@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:photo_view/photo_view.dart';
+
+class ImageViewer extends StatefulWidget {
+ final Key key;
+ final ImageProvider imageProvider;
+
+ ImageViewer(this.imageProvider, {this.key}) :
+ super(key: key);
+
+ @override
+ State createState() {
+ return ImageViewState();
+ }
+
+}
+
+class ImageViewState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ width: MediaQuery.of(context).size.width - 100.0,
+ height: MediaQuery.of(context).size.height - 120.0,
+ child: PhotoView(
+ imageProvider: widget.imageProvider,
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/dialog/logout_dialog.dart b/lib/dialog/logout_dialog.dart
new file mode 100644
index 0000000..c546594
--- /dev/null
+++ b/lib/dialog/logout_dialog.dart
@@ -0,0 +1,52 @@
+
+import 'package:flutter/material.dart';
+
+import '../constants.dart';
+import '../events/eventbus.dart';
+import '../events/events.dart';
+import '../generated/l10n.dart';
+import '../routes.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../utils/utils.dart';
+
+AlertDialog logoutDialog(BuildContext context) {
+ return AlertDialog(
+ title: Text(S
+ .of(context)
+ .warning),
+ content: Text(S
+ .of(context)
+ .are_you_sure_to_logout),
+ actions: [
+ FlatButton(
+ child: Text(S
+ .of(context)
+ .cancel),
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ ),
+ FlatButton(
+ child: Text(S
+ .of(context)
+ .yes_i_am_sure),
+ onPressed: () {
+ Navigator.of(context).pop();
+ Utils.getBox().then((box) {
+ box.delete(Constants.KEY_USER_ID);
+ box.delete(
+ Constants.KEY_ACCESS_TOKEN);
+ store.dispatch(
+ new UpdateCurrentUser(null));
+ eventBus.fire(
+ new OnCurrentUserUpdated());
+ Routes.router.navigateTo(
+ context, '/', replace: true,
+ clearStack: true);
+ });
+ },
+ )
+ ],
+ );
+}
\ No newline at end of file
diff --git a/lib/events/events.dart b/lib/events/events.dart
index 1bd8007..3241f25 100644
--- a/lib/events/events.dart
+++ b/lib/events/events.dart
@@ -1,4 +1,123 @@
+import 'package:flutter/material.dart';
+
+import '../models/business.dart';
+import '../models/comment.dart';
+import '../models/position.dart';
+import '../models/product.dart';
+
class OpenDrawer {
+}
+
+class OnGetCurrentUserFailed {
+ dynamic error;
+ OnGetCurrentUserFailed(this.error);
+}
+
+class OnCurrentUserUpdated {
+ OnCurrentUserUpdated();
+}
+
+class OnProgressEvent {
+ bool showProgress;
+ double progress;
+ OnProgressEvent(this.showProgress, this.progress);
+}
+
+class OnUploadCommentImageProgressEvent {
+ bool showProgress;
+ double progress;
+ OnUploadCommentImageProgressEvent(this.showProgress, this.progress);
+}
+
+class OnCommentUpdatedEvent {
+ Comment comment;
+ OnCommentUpdatedEvent(this.comment);
+}
+
+class OnAddressesUpdated {
+ OnAddressesUpdated();
+}
+
+class OnTicketsUpdated {
+ OnTicketsUpdated();
+}
+
+class OnUpdateLocatedAddressSuccess {
+ OnUpdateLocatedAddressSuccess();
+}
+
+class OnGotDeepLinkUri {
+ Uri uri;
+ OnGotDeepLinkUri(this.uri);
+}
+
+class OnUploadImageProgressEvent {
+ int id;
+ bool showProgress;
+ double progress;
+ OnUploadImageProgressEvent(this.id, this.showProgress, this.progress);
+}
+
+class OnSubmitProgressEvent {
+ bool showProgress;
+ double progress;
+ OnSubmitProgressEvent(this.showProgress, this.progress);
+}
+
+class OnCartInfoUpdated {
+ OnCartInfoUpdated();
+}
+
+class OnAttributePageChanged {
+ int index;
+ OnAttributePageChanged(this.index);
+}
+
+class OnAttributeSelectionsChanged {
+ Map selections;
+ OnAttributeSelectionsChanged(this.selections);
+}
+
+class OnProductWillAddToCart {
+ Product product;
+ Map selections;
+ double price;
+ String description;
+ Business business;
+ GlobalKey buttonKey;
+ OnProductWillAddToCart(this.product, this.selections, this.price, this.description, this.business, {this.buttonKey});
+}
+
+class OnProductWillRemoveFromCart {
+ Product product;
+ int productListIndex;
+ Business business;
+ OnProductWillRemoveFromCart(this.product, this.productListIndex, this.business);
+}
+
+class OnOrderUpdated {
+ OnOrderUpdated();
+}
+
+class SubscribeToTopic {
+ String topic;
+ SubscribeToTopic(this.topic);
+}
+
+class UnSubscribeToTopic {
+ String topic;
+ UnSubscribeToTopic(this.topic);
+}
+
+class GetCurrentPositionSuccess {
+ Position position;
+ bool getAddressFromServer = true;
+ GetCurrentPositionSuccess(this.position, this.getAddressFromServer);
+}
+
+class GetCurrentPositionFailed {
+ Exception exception;
+ GetCurrentPositionFailed(this.exception);
}
\ No newline at end of file
diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart
index 04bcfa0..d937362 100644
--- a/lib/generated/intl/messages_en.dart
+++ b/lib/generated/intl/messages_en.dart
@@ -19,41 +19,465 @@ typedef String MessageIfAbsent(String messageStr, List args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'en';
- static m0(oss) => "Download at ${oss}";
+ static m0(qty) => "and ${qty} items more";
+
+ static m1(value) => "Available for order over \$${value}";
+
+ static m2(hour) => "Order now and delivery start at ${hour}:00.";
+
+ static m3(optionName) => "Multiple choice ${optionName}";
+
+ static m4(km, time) => "The delivery guy are ${km} away from the customer, and it will take about ${time} to deliver.";
+
+ static m5(shippingfee) => "Delivery fee ${shippingfee}+";
+
+ static m6(length, width, height) => "Dimentions: ${length}(L)x${width}(W)x${height}(H)";
+
+ static m7(discount) => "-\$${discount}";
+
+ static m8(oss) => "Download at ${oss}";
+
+ static m9(expirationDate) => "Expires on ${expirationDate}";
+
+ static m10(mon, yer) => "Exp: ${mon}/${yer}";
+
+ static m11(name, rate) => "${name}(${rate}%)";
+
+ static m12(num) => "${num} follow-ups";
+
+ static m13(second) => "Retry after ${second}s";
+
+ static m14(hours) => "${Intl.plural(hours, one: '1 hr', other: '${hours} hrs')}";
+
+ static m15(minamount) => "\$${minamount}+";
+
+ static m16(shipfee) => "Delivery \$${shipfee}+";
+
+ static m17(minutes) => "${Intl.plural(minutes, one: '1 min', other: '${minutes} mins')}";
+
+ static m18(minprice) => "${minprice} more";
+
+ static m19(amount) => "Pay \$${amount} now";
+
+ static m20(method) => "Pay with ${method}";
+
+ static m21(mobile) => "Payment verification code has been sent to your mobile phone ${mobile}. Please enter the verification code below.";
+
+ static m22(discount) => "${discount}%off";
+
+ static m23(amount, discount) => "-\$${amount}(${discount}%off)";
+
+ static m24(optionName) => "Please choice ${optionName}.";
+
+ static m25(sold_qty) => " ${sold_qty} sold/mo";
+
+ static m26(subtotal) => "Subtotal: ${subtotal}";
+
+ static m27(num) => "Table#: ${num}";
+
+ static m28(num) => "Ticket #${num}";
+
+ static m29(time) => "Today ${time}";
+
+ static m30(time) => "Tomorrow ${time}";
+
+ static m31(weight) => "Weight: ${weight}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => {
"about" : MessageLookupByLibrary.simpleMessage("About"),
"about_us" : MessageLookupByLibrary.simpleMessage("About us"),
+ "account_binding" : MessageLookupByLibrary.simpleMessage("Account binding"),
+ "add_credit_card" : MessageLookupByLibrary.simpleMessage("Add credit card"),
+ "add_new_address" : MessageLookupByLibrary.simpleMessage("Add new address"),
+ "add_new_ticket" : MessageLookupByLibrary.simpleMessage("Create a new ticket"),
+ "add_new_ticket_desc" : MessageLookupByLibrary.simpleMessage("Please enter your question."),
+ "add_pictures" : MessageLookupByLibrary.simpleMessage("Add pictures"),
+ "add_to_basket" : MessageLookupByLibrary.simpleMessage("Add to basket"),
+ "address" : MessageLookupByLibrary.simpleMessage("Address"),
+ "after_renewed" : MessageLookupByLibrary.simpleMessage("After renewal"),
+ "alipay" : MessageLookupByLibrary.simpleMessage("Alipay"),
+ "amount_not_meet" : MessageLookupByLibrary.simpleMessage("The order amount does not meet the minimum requirements."),
+ "and_more_item_token" : m0,
+ "are_you_sure_to_cancel_the_order" : MessageLookupByLibrary.simpleMessage("Are you sure you want to cancel the order?"),
+ "are_you_sure_to_delete_the_address" : MessageLookupByLibrary.simpleMessage("Are you sure you want to delete the address?"),
+ "are_you_sure_to_empty_basket" : MessageLookupByLibrary.simpleMessage("Are you sure you want to empty the basket?"),
+ "are_you_sure_to_logout" : MessageLookupByLibrary.simpleMessage("Are you sure you want to logout?"),
+ "are_you_sure_to_remove_the_card" : MessageLookupByLibrary.simpleMessage("Are you srue you want to remove the credit card?"),
+ "are_you_sure_to_remove_the_item" : MessageLookupByLibrary.simpleMessage("Are you sure you want to remove the item?"),
+ "are_you_sure_to_remove_the_picture" : MessageLookupByLibrary.simpleMessage("Are you sure you want to remove the picture?"),
+ "attach_pictures" : MessageLookupByLibrary.simpleMessage("Attach pictures"),
+ "attach_pictures_desc" : MessageLookupByLibrary.simpleMessage("Upload pictures(screen shot) to make your question clearer."),
+ "available_for_order_over_token" : m1,
+ "avatar" : MessageLookupByLibrary.simpleMessage("Avatar"),
+ "back" : MessageLookupByLibrary.simpleMessage("Back"),
+ "basic_info" : MessageLookupByLibrary.simpleMessage("Basic info."),
"blog" : MessageLookupByLibrary.simpleMessage("Blog"),
+ "book_now_delivery_later_token" : m2,
+ "business_card" : MessageLookupByLibrary.simpleMessage("Business card"),
+ "business_cooperation" : MessageLookupByLibrary.simpleMessage("Business cooperation"),
+ "by_email" : MessageLookupByLibrary.simpleMessage("By Emails"),
+ "by_phone" : MessageLookupByLibrary.simpleMessage("By phone"),
+ "camera" : MessageLookupByLibrary.simpleMessage("Camera"),
+ "canada_post" : MessageLookupByLibrary.simpleMessage("Canada Post"),
+ "canada_post_delivery" : MessageLookupByLibrary.simpleMessage("Canada Post delivery"),
+ "cancel" : MessageLookupByLibrary.simpleMessage("Cancel"),
+ "cancel_order" : MessageLookupByLibrary.simpleMessage("Cancel order"),
+ "change_email" : MessageLookupByLibrary.simpleMessage("Change email address"),
+ "change_email_desc" : MessageLookupByLibrary.simpleMessage("Enter your new Email, and then click \'Get code\' button to get the validation code."),
+ "change_mobile" : MessageLookupByLibrary.simpleMessage("Change mobile number"),
+ "change_mobile_desc" : MessageLookupByLibrary.simpleMessage("Enter your new mobile number, and then click \'Get code\' button to get the validation code."),
+ "change_nickname" : MessageLookupByLibrary.simpleMessage("Change nickname"),
+ "change_password" : MessageLookupByLibrary.simpleMessage("Change password"),
+ "change_password_desc" : MessageLookupByLibrary.simpleMessage("Please enter the old password and your desired new password."),
+ "check_option_is_optional" : MessageLookupByLibrary.simpleMessage("Optional. You can tap Next without selection."),
+ "check_option_is_required" : MessageLookupByLibrary.simpleMessage("Option is required. Select at lease an option then tap Next."),
+ "check_option_select_token" : m3,
+ "checkout" : MessageLookupByLibrary.simpleMessage("Check out"),
+ "checkout_no_deliver" : MessageLookupByLibrary.simpleMessage("We don\'t deliver at this time."),
+ "chinese_simplified" : MessageLookupByLibrary.simpleMessage("Chinese simplified"),
+ "chinese_traditional" : MessageLookupByLibrary.simpleMessage("Chinese tranditional"),
+ "choose_a_shipping_rate" : MessageLookupByLibrary.simpleMessage("Choose a shipping rate"),
+ "city" : MessageLookupByLibrary.simpleMessage("City"),
+ "city_is_required" : MessageLookupByLibrary.simpleMessage("City is required"),
+ "close" : MessageLookupByLibrary.simpleMessage("Close"),
+ "closed" : MessageLookupByLibrary.simpleMessage("Closed"),
+ "comment" : MessageLookupByLibrary.simpleMessage("Comment"),
+ "comment_empty" : MessageLookupByLibrary.simpleMessage("Please type your comment."),
+ "comments" : MessageLookupByLibrary.simpleMessage("Comments"),
+ "confirm_order" : MessageLookupByLibrary.simpleMessage("Order confirmation"),
+ "confirmation" : MessageLookupByLibrary.simpleMessage("Confirmation"),
+ "contact_name" : MessageLookupByLibrary.simpleMessage("Contact name"),
+ "contact_name_is_required" : MessageLookupByLibrary.simpleMessage("Contact name is required"),
"contact_us" : MessageLookupByLibrary.simpleMessage("Contact us"),
+ "copy" : MessageLookupByLibrary.simpleMessage("Copy"),
+ "coupons" : MessageLookupByLibrary.simpleMessage("Coupons"),
+ "credit_card" : MessageLookupByLibrary.simpleMessage("Credit card"),
+ "credit_coupon" : MessageLookupByLibrary.simpleMessage("Credit/Coupon"),
+ "credit_debit_card" : MessageLookupByLibrary.simpleMessage("Credit or debit card"),
+ "current_password_is_required" : MessageLookupByLibrary.simpleMessage("Current password is required."),
+ "current_plan" : MessageLookupByLibrary.simpleMessage("Current plan"),
+ "customer" : MessageLookupByLibrary.simpleMessage("Customer"),
+ "delete" : MessageLookupByLibrary.simpleMessage("Delete"),
+ "delivery" : MessageLookupByLibrary.simpleMessage("Delivery"),
+ "delivery_address" : MessageLookupByLibrary.simpleMessage("Delivery address"),
+ "delivery_distance_token" : m4,
+ "delivery_fee" : m5,
+ "delivery_guy" : MessageLookupByLibrary.simpleMessage("Delivery guy"),
+ "delivery_info" : MessageLookupByLibrary.simpleMessage("Delivery Info."),
+ "delivery_method" : MessageLookupByLibrary.simpleMessage("Delivery method"),
+ "delivery_now" : MessageLookupByLibrary.simpleMessage("Delivery ASAP"),
+ "delivery_unavailable" : MessageLookupByLibrary.simpleMessage("Delivery time"),
+ "detail" : MessageLookupByLibrary.simpleMessage("Detail"),
"developer_of" : MessageLookupByLibrary.simpleMessage("Developers of"),
+ "dimentions_token" : m6,
+ "discount_amount_token" : m7,
+ "document_langage" : MessageLookupByLibrary.simpleMessage("Document language"),
+ "document_type" : MessageLookupByLibrary.simpleMessage("Document type"),
+ "dont_use" : MessageLookupByLibrary.simpleMessage("Do not redeem"),
"download" : MessageLookupByLibrary.simpleMessage("Download"),
- "download_with_token" : m0,
+ "download_with_token" : m8,
+ "downloads" : MessageLookupByLibrary.simpleMessage("Downloads"),
+ "edit_address" : MessageLookupByLibrary.simpleMessage("Edit address"),
+ "email" : MessageLookupByLibrary.simpleMessage("Email"),
+ "email_is_not_valid" : MessageLookupByLibrary.simpleMessage("Email is not valid"),
+ "email_is_required" : MessageLookupByLibrary.simpleMessage("Email is required"),
+ "email_needed" : MessageLookupByLibrary.simpleMessage("Email needed"),
+ "empty_address_change_keyword" : MessageLookupByLibrary.simpleMessage("No address found. Tap here to skip address lookup."),
+ "empty_basket" : MessageLookupByLibrary.simpleMessage("Empty basket"),
+ "empty_result_change_keyword" : MessageLookupByLibrary.simpleMessage("No data found, please change keyword and try again."),
+ "end_of_the_list" : MessageLookupByLibrary.simpleMessage("End of the list"),
+ "english" : MessageLookupByLibrary.simpleMessage("English"),
+ "enter_coupon_code" : MessageLookupByLibrary.simpleMessage("Enter coupon code"),
+ "enter_delivery_address" : MessageLookupByLibrary.simpleMessage("Enter delivery address"),
+ "enter_mobile_or_email" : MessageLookupByLibrary.simpleMessage("Enter mobile or email"),
+ "enter_new_nickname" : MessageLookupByLibrary.simpleMessage("Enter new nickname"),
+ "enter_product_keyword" : MessageLookupByLibrary.simpleMessage("Enter product keyword"),
+ "error" : MessageLookupByLibrary.simpleMessage("Error"),
+ "error_read_file" : MessageLookupByLibrary.simpleMessage("Error occurred while reading the file."),
+ "expiration_date" : MessageLookupByLibrary.simpleMessage("Expiration date"),
+ "expiration_date_token" : m9,
+ "expire_token" : m10,
+ "expired_at" : MessageLookupByLibrary.simpleMessage("Expired at"),
+ "extra_fee_token" : m11,
+ "fax" : MessageLookupByLibrary.simpleMessage("Fax"),
+ "feature_not_available_web" : MessageLookupByLibrary.simpleMessage("This feature is not available on the web. Please install the App version."),
+ "featured_product" : MessageLookupByLibrary.simpleMessage("Featured"),
+ "finish" : MessageLookupByLibrary.simpleMessage("Finish"),
+ "follow_ups" : MessageLookupByLibrary.simpleMessage("Follow ups"),
+ "followups_token" : m12,
+ "forgot_password" : MessageLookupByLibrary.simpleMessage("Forgot password"),
+ "forgot_password_description" : MessageLookupByLibrary.simpleMessage("Enter the Email or mobile number you used when registering, and then click the \'Get code\' button to get the validation code."),
+ "forgot_password_question" : MessageLookupByLibrary.simpleMessage("Forgot password?"),
+ "fri" : MessageLookupByLibrary.simpleMessage("Fri"),
+ "friday" : MessageLookupByLibrary.simpleMessage("Friday"),
+ "from_camera" : MessageLookupByLibrary.simpleMessage("From camera"),
+ "from_gallery" : MessageLookupByLibrary.simpleMessage("From gallery"),
+ "gallery" : MessageLookupByLibrary.simpleMessage("Gallery"),
+ "general_coupon" : MessageLookupByLibrary.simpleMessage("General coupon"),
+ "get_code" : MessageLookupByLibrary.simpleMessage("Get code"),
+ "get_code_again" : MessageLookupByLibrary.simpleMessage("Get code again"),
+ "get_code_token" : m13,
+ "get_coupon" : MessageLookupByLibrary.simpleMessage("Get coupon"),
+ "get_picture" : MessageLookupByLibrary.simpleMessage("Get picture"),
+ "get_picture_from" : MessageLookupByLibrary.simpleMessage("Get picture from..."),
+ "group_license_renewal" : MessageLookupByLibrary.simpleMessage("Group Lisence Renewal"),
+ "group_number" : MessageLookupByLibrary.simpleMessage("Group number"),
+ "group_number_can_be_found" : MessageLookupByLibrary.simpleMessage("Group number can be found..."),
"home" : MessageLookupByLibrary.simpleMessage("Home"),
+ "hot_sale" : MessageLookupByLibrary.simpleMessage("Hot sale"),
+ "hour_token" : m14,
+ "igoshow" : MessageLookupByLibrary.simpleMessage("iGoShow"),
+ "includes" : MessageLookupByLibrary.simpleMessage("Includes"),
"information" : MessageLookupByLibrary.simpleMessage("Information"),
+ "input_your_comment" : MessageLookupByLibrary.simpleMessage("Input your comment"),
"install_in_store" : MessageLookupByLibrary.simpleMessage("Install in store"),
"learn_more" : MessageLookupByLibrary.simpleMessage("Learn more..."),
+ "learn_more_about_igoshow" : MessageLookupByLibrary.simpleMessage("Learn more about iGoShow"),
+ "learn_more_about_minipos" : MessageLookupByLibrary.simpleMessage("Learn more about MiniPOS"),
"license_agreement" : MessageLookupByLibrary.simpleMessage("License agreement"),
+ "light_tase" : MessageLookupByLibrary.simpleMessage("Light tase"),
+ "load_failed_retry" : MessageLookupByLibrary.simpleMessage("Load failed, please retry"),
+ "loading" : MessageLookupByLibrary.simpleMessage("Loading..."),
"loading_please_wait" : MessageLookupByLibrary.simpleMessage("Loading, please wait..."),
"login" : MessageLookupByLibrary.simpleMessage("Login"),
+ "login_instruction" : MessageLookupByLibrary.simpleMessage("If you have already registered an account, please use the following form to login.\nIf you are a MiniOffice user, you can directly enter your MiniOffice username and password to login."),
"logout" : MessageLookupByLibrary.simpleMessage("Logout"),
"main_content_1" : MessageLookupByLibrary.simpleMessage("Since 1999, we have been committed to developing a complete and powerful sales system, helping thousands of small businesses handle sales smoothly. Currently we have two main products."),
+ "me" : MessageLookupByLibrary.simpleMessage("Me"),
+ "min_order_amount_token" : m15,
+ "min_shipping_fee" : m16,
"minipos" : MessageLookupByLibrary.simpleMessage("MiniPOS"),
+ "minute_token" : m17,
+ "mobile_email_username" : MessageLookupByLibrary.simpleMessage("Mobile, Email or MiniOffice username"),
+ "mobile_is_required" : MessageLookupByLibrary.simpleMessage("Mobile is required"),
+ "mobile_number" : MessageLookupByLibrary.simpleMessage("Mobile number"),
+ "mobile_or_email" : MessageLookupByLibrary.simpleMessage("Mobile or email"),
+ "mobile_or_email_is_required" : MessageLookupByLibrary.simpleMessage("Mobile or email is required"),
+ "mobile_phone_number" : MessageLookupByLibrary.simpleMessage("Mobile number"),
+ "mobile_phone_number_is_required" : MessageLookupByLibrary.simpleMessage("Mobile number is required"),
+ "mon" : MessageLookupByLibrary.simpleMessage("Mon"),
+ "monday" : MessageLookupByLibrary.simpleMessage("Monday"),
+ "mr" : MessageLookupByLibrary.simpleMessage("Mr."),
+ "ms" : MessageLookupByLibrary.simpleMessage("Ms."),
+ "my_addresses" : MessageLookupByLibrary.simpleMessage("My addresses"),
+ "my_cards" : MessageLookupByLibrary.simpleMessage("My cards"),
+ "my_favorites" : MessageLookupByLibrary.simpleMessage("My favorites"),
+ "my_orders" : MessageLookupByLibrary.simpleMessage("My orders"),
+ "my_support" : MessageLookupByLibrary.simpleMessage("My support"),
"navigation" : MessageLookupByLibrary.simpleMessage("Navigation"),
+ "new_address" : MessageLookupByLibrary.simpleMessage("New address"),
+ "new_comment" : MessageLookupByLibrary.simpleMessage("New comment"),
+ "new_ticket" : MessageLookupByLibrary.simpleMessage("New ticket"),
+ "new_user_question" : MessageLookupByLibrary.simpleMessage("New user?"),
+ "next" : MessageLookupByLibrary.simpleMessage("Next"),
+ "nick_name" : MessageLookupByLibrary.simpleMessage("Nick name"),
+ "nickname_is_required" : MessageLookupByLibrary.simpleMessage("Nickname is required"),
+ "no" : MessageLookupByLibrary.simpleMessage("No"),
+ "no_address_yet" : MessageLookupByLibrary.simpleMessage("You have not entered any address."),
+ "no_blog_yet" : MessageLookupByLibrary.simpleMessage("There is no blog to show yet."),
+ "no_comments_yet" : MessageLookupByLibrary.simpleMessage("No comments yet"),
+ "no_coupon_available" : MessageLookupByLibrary.simpleMessage("No coupon available"),
+ "no_delivery_method" : MessageLookupByLibrary.simpleMessage("No shipping method available."),
+ "no_expiration" : MessageLookupByLibrary.simpleMessage("No expiration"),
+ "no_instance_delivery_desc" : MessageLookupByLibrary.simpleMessage("Tracking information will be provided when available."),
+ "no_more_record" : MessageLookupByLibrary.simpleMessage("No more record"),
+ "no_onion" : MessageLookupByLibrary.simpleMessage("No onion"),
+ "no_pickle" : MessageLookupByLibrary.simpleMessage("No pickle"),
+ "no_restriction" : MessageLookupByLibrary.simpleMessage("No restriction"),
+ "no_spicy" : MessageLookupByLibrary.simpleMessage("No spicy"),
+ "no_ticket_yet" : MessageLookupByLibrary.simpleMessage("There is no ticket yet. If you have any question/issue please tap the plus icon above to create a ticket."),
+ "not_binding" : MessageLookupByLibrary.simpleMessage("Not binding"),
+ "number_of_people" : MessageLookupByLibrary.simpleMessage("Number of people"),
+ "ocr_scan" : MessageLookupByLibrary.simpleMessage("OCR scan"),
+ "ok" : MessageLookupByLibrary.simpleMessage("OK"),
+ "old_password" : MessageLookupByLibrary.simpleMessage("Old password"),
+ "online_payment" : MessageLookupByLibrary.simpleMessage("Online payment"),
+ "optional_information" : MessageLookupByLibrary.simpleMessage("Optional Info."),
+ "order_acceipt" : MessageLookupByLibrary.simpleMessage("Accept"),
+ "order_again" : MessageLookupByLibrary.simpleMessage("Order again"),
+ "order_cancelled" : MessageLookupByLibrary.simpleMessage("Cancelled"),
+ "order_complete" : MessageLookupByLibrary.simpleMessage("Complete"),
+ "order_datetime" : MessageLookupByLibrary.simpleMessage("Order datetime"),
+ "order_detail" : MessageLookupByLibrary.simpleMessage("Order detail"),
+ "order_fulfillment" : MessageLookupByLibrary.simpleMessage("Order fulfillment"),
+ "order_info" : MessageLookupByLibrary.simpleMessage("Order info."),
+ "order_more" : m18,
+ "order_number" : MessageLookupByLibrary.simpleMessage("Order No."),
+ "order_number_copied_to_clipboard" : MessageLookupByLibrary.simpleMessage("Order number copied to clipboard"),
+ "order_processing" : MessageLookupByLibrary.simpleMessage("Processing"),
+ "order_remark" : MessageLookupByLibrary.simpleMessage("Order remark"),
+ "out_of_stock" : MessageLookupByLibrary.simpleMessage("Out of stock"),
+ "over_delivery_distance" : MessageLookupByLibrary.simpleMessage("The address is beyond the scope of delivery."),
+ "paid" : MessageLookupByLibrary.simpleMessage("Paid"),
+ "password" : MessageLookupByLibrary.simpleMessage("Password"),
+ "password_again" : MessageLookupByLibrary.simpleMessage("Password again"),
+ "password_has_been_changed" : MessageLookupByLibrary.simpleMessage("Password has been changed"),
+ "password_is_not_match_password_again" : MessageLookupByLibrary.simpleMessage("Password and confirm password does not match."),
+ "password_is_required" : MessageLookupByLibrary.simpleMessage("Password is required."),
+ "pay" : MessageLookupByLibrary.simpleMessage("Pay"),
+ "pay_after_meal" : MessageLookupByLibrary.simpleMessage("Pay after meal"),
+ "pay_amount_token" : m19,
+ "pay_later" : MessageLookupByLibrary.simpleMessage("Pay later"),
+ "pay_now" : MessageLookupByLibrary.simpleMessage("Pay now"),
+ "pay_on_deliery" : MessageLookupByLibrary.simpleMessage("Pay on delivery"),
+ "pay_on_deliery_pickup" : MessageLookupByLibrary.simpleMessage("Pay on delivery or pickup"),
+ "pay_with" : MessageLookupByLibrary.simpleMessage("Pay with"),
+ "pay_with_existing_cards" : MessageLookupByLibrary.simpleMessage("Pay with existing cards"),
+ "pay_with_token" : m20,
+ "payment_amount" : MessageLookupByLibrary.simpleMessage("Payment amount"),
+ "payment_method" : MessageLookupByLibrary.simpleMessage("Payment method"),
+ "payment_method_not_set" : MessageLookupByLibrary.simpleMessage("No payment method specified. Please pay on delivery or pickup."),
+ "payment_status" : MessageLookupByLibrary.simpleMessage("Payment status"),
+ "payment_verification" : MessageLookupByLibrary.simpleMessage("Payment verification"),
+ "payment_verification_sent" : m21,
+ "paypal" : MessageLookupByLibrary.simpleMessage("Paypal"),
+ "pending" : MessageLookupByLibrary.simpleMessage("Pending"),
+ "percent_discount" : MessageLookupByLibrary.simpleMessage("%OFF"),
+ "percentage_discount_token" : m22,
+ "percentage_discount_token2" : m23,
+ "pick_a_coupon" : MessageLookupByLibrary.simpleMessage("Pick a coupon"),
+ "pickup" : MessageLookupByLibrary.simpleMessage("Pickup"),
+ "pickup_address" : MessageLookupByLibrary.simpleMessage("Pickup address"),
+ "pickup_at" : MessageLookupByLibrary.simpleMessage("Please pickup at"),
+ "pickup_discount" : MessageLookupByLibrary.simpleMessage("Pickup discount"),
+ "please_enter_coupon_code" : MessageLookupByLibrary.simpleMessage("Please enter a coupon code."),
+ "please_enter_group_number" : MessageLookupByLibrary.simpleMessage("Please enter your group number."),
+ "please_login" : MessageLookupByLibrary.simpleMessage("Please login"),
+ "please_provide_shipping_address" : MessageLookupByLibrary.simpleMessage("Please provide shipping address."),
+ "please_select" : MessageLookupByLibrary.simpleMessage("Please select"),
+ "please_select_an_image" : MessageLookupByLibrary.simpleMessage("Please select an image"),
+ "point" : MessageLookupByLibrary.simpleMessage("Points"),
"point_of_sale_system_solution" : MessageLookupByLibrary.simpleMessage("Point of sale system solution"),
+ "postal_code" : MessageLookupByLibrary.simpleMessage("Postal code"),
+ "postal_code_is_required" : MessageLookupByLibrary.simpleMessage("Postal code is required"),
+ "previous" : MessageLookupByLibrary.simpleMessage("Previous"),
+ "price" : MessageLookupByLibrary.simpleMessage("Price"),
"privacy_policy" : MessageLookupByLibrary.simpleMessage("Privacy policy"),
+ "product_insufficient" : MessageLookupByLibrary.simpleMessage("The product quantity is insufficient."),
+ "products" : MessageLookupByLibrary.simpleMessage("Products"),
+ "profile" : MessageLookupByLibrary.simpleMessage("Profile"),
+ "promotions" : MessageLookupByLibrary.simpleMessage("Promotions"),
+ "province" : MessageLookupByLibrary.simpleMessage("Province"),
+ "pull_up_to_load_more" : MessageLookupByLibrary.simpleMessage("Pull up to load more"),
+ "purchase_renew_service" : MessageLookupByLibrary.simpleMessage("Purchase/Renew service"),
+ "quick_input" : MessageLookupByLibrary.simpleMessage("Quick input"),
+ "radio_option_is_optional" : MessageLookupByLibrary.simpleMessage("Optional. You can tap Next without selection."),
+ "radio_option_is_required" : MessageLookupByLibrary.simpleMessage("Option is required. Select an option then tap Next."),
+ "radio_option_select_token" : m24,
"recalculating" : MessageLookupByLibrary.simpleMessage("Recalculating..."),
+ "red_coupon" : MessageLookupByLibrary.simpleMessage("Coupon"),
+ "redeem_coupon" : MessageLookupByLibrary.simpleMessage("Redeem"),
+ "register" : MessageLookupByLibrary.simpleMessage("Register"),
+ "registration" : MessageLookupByLibrary.simpleMessage("Registration"),
+ "release_to_load_more" : MessageLookupByLibrary.simpleMessage("Release to load more"),
"renew_license" : MessageLookupByLibrary.simpleMessage("Renew license"),
+ "renewal_fee" : MessageLookupByLibrary.simpleMessage("Renewal fee"),
+ "reply" : MessageLookupByLibrary.simpleMessage("Reply"),
+ "reset_password" : MessageLookupByLibrary.simpleMessage("Reset password"),
+ "reset_password_desc" : MessageLookupByLibrary.simpleMessage("Enter the new password you desired twice."),
+ "reset_password_success" : MessageLookupByLibrary.simpleMessage("Reset password success"),
+ "response_from_store" : MessageLookupByLibrary.simpleMessage("Response from store"),
"return_policy" : MessageLookupByLibrary.simpleMessage("Return policy"),
+ "revise_user_profile" : MessageLookupByLibrary.simpleMessage("Revise user profile"),
+ "sat" : MessageLookupByLibrary.simpleMessage("Sat"),
+ "saturday" : MessageLookupByLibrary.simpleMessage("Saturday"),
+ "save" : MessageLookupByLibrary.simpleMessage("Save"),
+ "schedule_delivery" : MessageLookupByLibrary.simpleMessage("Schedule delivery"),
+ "search_place" : MessageLookupByLibrary.simpleMessage("Search place"),
+ "search_product" : MessageLookupByLibrary.simpleMessage("Search product"),
+ "search_products" : MessageLookupByLibrary.simpleMessage("Search products"),
+ "select" : MessageLookupByLibrary.simpleMessage("Select"),
+ "select_a_payment_method" : MessageLookupByLibrary.simpleMessage("Select a payment method"),
+ "select_a_plan" : MessageLookupByLibrary.simpleMessage("Select a plan"),
+ "select_canada_post_shipping_rate" : MessageLookupByLibrary.simpleMessage("Please select Canada Post shipping rate."),
+ "select_delivery_time" : MessageLookupByLibrary.simpleMessage("Select delivery time"),
+ "select_document_lanuage" : MessageLookupByLibrary.simpleMessage("Select a language"),
+ "select_document_type" : MessageLookupByLibrary.simpleMessage("Select a document type"),
+ "select_options" : MessageLookupByLibrary.simpleMessage("Select options"),
+ "service_descritpion" : MessageLookupByLibrary.simpleMessage("Service description"),
+ "service_fee" : MessageLookupByLibrary.simpleMessage("Service fee"),
"service_policy" : MessageLookupByLibrary.simpleMessage("Service policy"),
+ "set_password" : MessageLookupByLibrary.simpleMessage("Set password"),
+ "set_password_desc" : MessageLookupByLibrary.simpleMessage("Enter the password you desired twice."),
+ "shipping_time_will_schedule" : MessageLookupByLibrary.simpleMessage("Delivery time cannot be determined. Usually we will send it out as soon as possible. If you wish to deliver at a certain time, please state in the remarks."),
"shop" : MessageLookupByLibrary.simpleMessage("Shop"),
+ "show_less" : MessageLookupByLibrary.simpleMessage("Show less"),
+ "show_more" : MessageLookupByLibrary.simpleMessage("Show more"),
+ "sold_per_month_token" : m25,
+ "specification" : MessageLookupByLibrary.simpleMessage("Specification"),
+ "store" : MessageLookupByLibrary.simpleMessage("Store"),
+ "store_closed" : MessageLookupByLibrary.simpleMessage("Store closed"),
+ "store_delivery" : MessageLookupByLibrary.simpleMessage("Store delivery"),
+ "store_introduction" : MessageLookupByLibrary.simpleMessage("Store introduction"),
+ "store_policy" : MessageLookupByLibrary.simpleMessage("Store policy"),
+ "street_line_1" : MessageLookupByLibrary.simpleMessage("Street line 1"),
+ "street_line_1_is_required" : MessageLookupByLibrary.simpleMessage("Street line 1 is required"),
+ "street_line_2" : MessageLookupByLibrary.simpleMessage("Street line 2"),
+ "submit" : MessageLookupByLibrary.simpleMessage("Submit"),
+ "submit_to_change" : MessageLookupByLibrary.simpleMessage("Submit to change"),
+ "submit_to_generate" : MessageLookupByLibrary.simpleMessage("Submit to generate"),
"submitting" : MessageLookupByLibrary.simpleMessage("Submitting..."),
"submitting_please_wait" : MessageLookupByLibrary.simpleMessage("Submitting, please wait..."),
+ "subtotal" : MessageLookupByLibrary.simpleMessage("Subtotal"),
+ "subtotal_token" : m26,
+ "success" : MessageLookupByLibrary.simpleMessage("Success"),
+ "sun" : MessageLookupByLibrary.simpleMessage("Sun"),
+ "sunday" : MessageLookupByLibrary.simpleMessage("Sunday"),
"support" : MessageLookupByLibrary.simpleMessage("Support"),
"support_ticket" : MessageLookupByLibrary.simpleMessage("Support ticket"),
+ "table_token" : m27,
"tap_back_again_to_exit" : MessageLookupByLibrary.simpleMessage("Tap back again to exit"),
+ "tax" : MessageLookupByLibrary.simpleMessage("Tax"),
+ "thank_you_for_your_comment" : MessageLookupByLibrary.simpleMessage("Thank you for your comment."),
+ "the_address_has_been_deleted" : MessageLookupByLibrary.simpleMessage("The address has been deleted."),
+ "the_email_is_same_as_current" : MessageLookupByLibrary.simpleMessage("The email is the same as the current one."),
+ "the_mobile_number_is_same_as_current" : MessageLookupByLibrary.simpleMessage("The mobile number is the same as the current one."),
+ "the_ticket_is_closed_desc" : MessageLookupByLibrary.simpleMessage("The ticket has been closed. If you still have questions, please create a new ticket."),
+ "this_credit_card_is_invalid" : MessageLookupByLibrary.simpleMessage("This credit card is invalid"),
+ "this_field_is_required" : MessageLookupByLibrary.simpleMessage("This field is required."),
+ "thu" : MessageLookupByLibrary.simpleMessage("Thu"),
+ "thursday" : MessageLookupByLibrary.simpleMessage("Thursday"),
+ "ticket_created_success" : MessageLookupByLibrary.simpleMessage("Ticket has been created successfully."),
+ "ticket_number_token" : m28,
+ "today" : MessageLookupByLibrary.simpleMessage("Today"),
+ "today_with_time" : m29,
+ "toll_free" : MessageLookupByLibrary.simpleMessage("Toll free: "),
+ "tomorrow" : MessageLookupByLibrary.simpleMessage("Tomorrow"),
+ "tomorrow_with_time" : m30,
+ "total" : MessageLookupByLibrary.simpleMessage("Total"),
+ "tue" : MessageLookupByLibrary.simpleMessage("Tue"),
+ "tuesday" : MessageLookupByLibrary.simpleMessage("Tuesday"),
"tutorials" : MessageLookupByLibrary.simpleMessage("Tutorials"),
- "wiki" : MessageLookupByLibrary.simpleMessage("Wiki")
+ "type_your_order_remark" : MessageLookupByLibrary.simpleMessage("Type your order remark"),
+ "ubereats_receipt" : MessageLookupByLibrary.simpleMessage("UberEats receipt"),
+ "under_renovation" : MessageLookupByLibrary.simpleMessage("The store is under renovation"),
+ "unpaid" : MessageLookupByLibrary.simpleMessage("Unpaid"),
+ "update_success" : MessageLookupByLibrary.simpleMessage("Updated success"),
+ "user_account_created_success" : MessageLookupByLibrary.simpleMessage("User account created success"),
+ "user_registration" : MessageLookupByLibrary.simpleMessage("User registration"),
+ "user_registration_desc" : MessageLookupByLibrary.simpleMessage("Please enter your mobile phone number then click the \'Get code\' button to get the validation code."),
+ "verification_code" : MessageLookupByLibrary.simpleMessage("Verification code"),
+ "verification_code_is_required" : MessageLookupByLibrary.simpleMessage("Verification code is required"),
+ "verification_code_sent" : MessageLookupByLibrary.simpleMessage("Verification code has been sent."),
+ "verify" : MessageLookupByLibrary.simpleMessage("Verify"),
+ "view_blog" : MessageLookupByLibrary.simpleMessage("View blog"),
+ "view_on_google_map" : MessageLookupByLibrary.simpleMessage("View on Google maps"),
+ "view_ticket" : MessageLookupByLibrary.simpleMessage("View ticket"),
+ "wallet" : MessageLookupByLibrary.simpleMessage("Wallet"),
+ "warning" : MessageLookupByLibrary.simpleMessage("Warning"),
+ "wechatpay" : MessageLookupByLibrary.simpleMessage("Wechat pay"),
+ "wed" : MessageLookupByLibrary.simpleMessage("Wed"),
+ "wednesday" : MessageLookupByLibrary.simpleMessage("Wednesday"),
+ "weight_token" : m31,
+ "wiki" : MessageLookupByLibrary.simpleMessage("Wiki"),
+ "wrong_payment_verification_code" : MessageLookupByLibrary.simpleMessage("Wrong payment verification code. Please check and enter again."),
+ "yes" : MessageLookupByLibrary.simpleMessage("Yes"),
+ "yes_i_am_sure" : MessageLookupByLibrary.simpleMessage("Yes! I am sure."),
+ "you_have_no_orders_yet" : MessageLookupByLibrary.simpleMessage("You have no orders yet"),
+ "your_basket_is_empty" : MessageLookupByLibrary.simpleMessage("Your basket is empty."),
+ "your_group" : MessageLookupByLibrary.simpleMessage("Your group"),
+ "your_question_issue" : MessageLookupByLibrary.simpleMessage("Your question/issue"),
+ "your_reply" : MessageLookupByLibrary.simpleMessage("Your reply")
};
}
diff --git a/lib/generated/intl/messages_zh_CN.dart b/lib/generated/intl/messages_zh_CN.dart
index 721a261..b9e1e94 100644
--- a/lib/generated/intl/messages_zh_CN.dart
+++ b/lib/generated/intl/messages_zh_CN.dart
@@ -19,41 +19,461 @@ typedef String MessageIfAbsent(String messageStr, List args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'zh_CN';
- static m0(oss) => "在${oss}下载";
+ static m0(qty) => "等${qty}件";
+
+ static m1(value) => "订单满\$${value}可用";
+
+ static m2(hour) => "现在预定,${hour}:00后开始配送。";
+
+ static m3(optionName) => "多项选择${optionName}";
+
+ static m4(km, time) => "配送员离您${km},大概需时${time}送达。";
+
+ static m5(shippingfee) => "配送费${shippingfee}起";
+
+ static m6(length, width, height) => "尺寸:${length}(L)x${width}(W)x${height}(H)";
+
+ static m7(discount) => "-\$${discount}";
+
+ static m8(oss) => "在${oss}下载";
+
+ static m9(expirationDate) => "${expirationDate}到期";
+
+ static m10(mon, yer) => "到期:${mon}/${yer}";
+
+ static m11(name, rate) => "${name}(${rate}%)";
+
+ static m12(num) => "${num}条回复";
+
+ static m13(second) => "${second}秒后重试";
+
+ static m14(hours) => "${Intl.plural(hours, one: '1小时', other: '${hours}小时')}";
+
+ static m15(minamount) => "\$${minamount}起送";
+
+ static m16(shipfee) => "配送费\$${shipfee}起";
+
+ static m17(minutes) => "${Intl.plural(minutes, one: '1分钟', other: '${minutes}分钟')}";
+
+ static m18(minprice) => "还差${minprice}起送";
+
+ static m19(amount) => "马上付款 \$${amount}";
+
+ static m20(method) => "使用${method}付款";
+
+ static m21(mobile) => "付款码已经发送到您的手机${mobile}。请在下面输入付款码。";
+
+ static m22(discount) => "${discount}%折扣";
+
+ static m23(amount, discount) => "-\$${amount}(${discount}%折扣)";
+
+ static m24(optionName) => "请选择${optionName}";
+
+ static m25(sold_qty) => " 月售${sold_qty}单";
+
+ static m26(subtotal) => "小计:${subtotal}";
+
+ static m27(num) => "桌号:${num}";
+
+ static m28(num) => "票号 #${num}";
+
+ static m29(time) => "今天${time}";
+
+ static m30(time) => "明天${time}";
+
+ static m31(weight) => "重量:${weight}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => {
"about" : MessageLookupByLibrary.simpleMessage("关于"),
"about_us" : MessageLookupByLibrary.simpleMessage("关于我们"),
+ "account_binding" : MessageLookupByLibrary.simpleMessage("账号绑定"),
+ "add_new_address" : MessageLookupByLibrary.simpleMessage("添加新地址"),
+ "add_new_ticket" : MessageLookupByLibrary.simpleMessage("创建一个新的支持票"),
+ "add_new_ticket_desc" : MessageLookupByLibrary.simpleMessage("请输入您的问题。您还可以上传文件或图片来使您的提问更清楚。"),
+ "add_pictures" : MessageLookupByLibrary.simpleMessage("晒照片"),
+ "add_to_basket" : MessageLookupByLibrary.simpleMessage("放入购物篮"),
+ "address" : MessageLookupByLibrary.simpleMessage("地址"),
+ "after_renewed" : MessageLookupByLibrary.simpleMessage("续约后"),
+ "alipay" : MessageLookupByLibrary.simpleMessage("支付宝"),
+ "amount_not_meet" : MessageLookupByLibrary.simpleMessage("订单金额没有达到最低要求。"),
+ "and_more_item_token" : m0,
+ "are_you_sure_to_cancel_the_order" : MessageLookupByLibrary.simpleMessage("您确定要取消该订单吗?"),
+ "are_you_sure_to_delete_the_address" : MessageLookupByLibrary.simpleMessage("您确定要删除该地址吗?"),
+ "are_you_sure_to_empty_basket" : MessageLookupByLibrary.simpleMessage("您确定要清空购物篮吗?"),
+ "are_you_sure_to_logout" : MessageLookupByLibrary.simpleMessage("您确定要登出吗?"),
+ "are_you_sure_to_remove_the_card" : MessageLookupByLibrary.simpleMessage("您确定要移除该信用卡吗?"),
+ "are_you_sure_to_remove_the_item" : MessageLookupByLibrary.simpleMessage("您确定要移除该物品吗?"),
+ "are_you_sure_to_remove_the_picture" : MessageLookupByLibrary.simpleMessage("您确定要移除该图片吗?"),
+ "attach_pictures" : MessageLookupByLibrary.simpleMessage("图片附件"),
+ "attach_pictures_desc" : MessageLookupByLibrary.simpleMessage("建议附上图片(屏幕截图)让问题更清楚。"),
+ "available_for_order_over_token" : m1,
+ "avatar" : MessageLookupByLibrary.simpleMessage("头像"),
+ "back" : MessageLookupByLibrary.simpleMessage("返回"),
+ "basic_info" : MessageLookupByLibrary.simpleMessage("基本信息"),
"blog" : MessageLookupByLibrary.simpleMessage("博客"),
+ "book_now_delivery_later_token" : m2,
+ "business_card" : MessageLookupByLibrary.simpleMessage("名片"),
+ "business_cooperation" : MessageLookupByLibrary.simpleMessage("商业合作"),
+ "by_email" : MessageLookupByLibrary.simpleMessage("电子邮箱"),
+ "by_phone" : MessageLookupByLibrary.simpleMessage("联系电话"),
+ "camera" : MessageLookupByLibrary.simpleMessage("相机"),
+ "canada_post" : MessageLookupByLibrary.simpleMessage("加拿大邮政"),
+ "canada_post_delivery" : MessageLookupByLibrary.simpleMessage("加拿大邮政配送"),
+ "cancel" : MessageLookupByLibrary.simpleMessage("取消"),
+ "cancel_order" : MessageLookupByLibrary.simpleMessage("取消订单"),
+ "change_email" : MessageLookupByLibrary.simpleMessage("修改电子邮箱"),
+ "change_email_desc" : MessageLookupByLibrary.simpleMessage("输入新的Email,然后点击\'获取验证码\'按钮。"),
+ "change_mobile" : MessageLookupByLibrary.simpleMessage("修改手机号码"),
+ "change_mobile_desc" : MessageLookupByLibrary.simpleMessage("输入新的手机号码,然后点击\'获取验证码\'按钮。"),
+ "change_nickname" : MessageLookupByLibrary.simpleMessage("修改昵称"),
+ "change_password" : MessageLookupByLibrary.simpleMessage("修改密码"),
+ "change_password_desc" : MessageLookupByLibrary.simpleMessage("请输入旧密码和希望的新密码。"),
+ "check_option_is_optional" : MessageLookupByLibrary.simpleMessage("可选选项。如果不选择可以直接点下一步。"),
+ "check_option_is_required" : MessageLookupByLibrary.simpleMessage("选项必选。选择至少一项再点击下一步。"),
+ "check_option_select_token" : m3,
+ "checkout" : MessageLookupByLibrary.simpleMessage("去结算"),
+ "checkout_no_deliver" : MessageLookupByLibrary.simpleMessage("现在这时间我们不派送。"),
+ "chinese_simplified" : MessageLookupByLibrary.simpleMessage("简体中文"),
+ "chinese_traditional" : MessageLookupByLibrary.simpleMessage("繁体中文"),
+ "choose_a_shipping_rate" : MessageLookupByLibrary.simpleMessage("选择运费"),
+ "city" : MessageLookupByLibrary.simpleMessage("城市"),
+ "city_is_required" : MessageLookupByLibrary.simpleMessage("城市必填"),
+ "close" : MessageLookupByLibrary.simpleMessage("关闭"),
+ "comment" : MessageLookupByLibrary.simpleMessage("评价"),
+ "comment_empty" : MessageLookupByLibrary.simpleMessage("请输入您的评价。"),
+ "comments" : MessageLookupByLibrary.simpleMessage("评价"),
+ "confirm_order" : MessageLookupByLibrary.simpleMessage("订单确定"),
+ "confirmation" : MessageLookupByLibrary.simpleMessage("请确定"),
+ "contact_name" : MessageLookupByLibrary.simpleMessage("联系人姓名"),
+ "contact_name_is_required" : MessageLookupByLibrary.simpleMessage("联系人姓名必填"),
"contact_us" : MessageLookupByLibrary.simpleMessage("联系我们"),
+ "copy" : MessageLookupByLibrary.simpleMessage("复制"),
+ "coupons" : MessageLookupByLibrary.simpleMessage("优惠券"),
+ "credit_card" : MessageLookupByLibrary.simpleMessage("信用卡"),
+ "credit_coupon" : MessageLookupByLibrary.simpleMessage("红包/抵用券"),
+ "credit_debit_card" : MessageLookupByLibrary.simpleMessage("信用卡或银行卡"),
+ "current_password_is_required" : MessageLookupByLibrary.simpleMessage("需要当前密码"),
+ "current_plan" : MessageLookupByLibrary.simpleMessage("当前计划"),
+ "customer" : MessageLookupByLibrary.simpleMessage("客户"),
+ "delete" : MessageLookupByLibrary.simpleMessage("删除"),
+ "delivery" : MessageLookupByLibrary.simpleMessage("外卖配送"),
+ "delivery_address" : MessageLookupByLibrary.simpleMessage("收货地址"),
+ "delivery_distance_token" : m4,
+ "delivery_fee" : m5,
+ "delivery_guy" : MessageLookupByLibrary.simpleMessage("配送员"),
+ "delivery_info" : MessageLookupByLibrary.simpleMessage("配送信息"),
+ "delivery_method" : MessageLookupByLibrary.simpleMessage("配送方式"),
+ "delivery_now" : MessageLookupByLibrary.simpleMessage("立刻配送"),
+ "delivery_unavailable" : MessageLookupByLibrary.simpleMessage("配送时间"),
+ "detail" : MessageLookupByLibrary.simpleMessage("详细描述"),
"developer_of" : MessageLookupByLibrary.simpleMessage("开发者"),
+ "dimentions_token" : m6,
+ "discount_amount_token" : m7,
+ "document_langage" : MessageLookupByLibrary.simpleMessage("文档语言"),
+ "document_type" : MessageLookupByLibrary.simpleMessage("文件类型"),
+ "dont_use" : MessageLookupByLibrary.simpleMessage("不使用"),
"download" : MessageLookupByLibrary.simpleMessage("下载"),
- "download_with_token" : m0,
+ "download_with_token" : m8,
+ "downloads" : MessageLookupByLibrary.simpleMessage("下载"),
+ "edit_address" : MessageLookupByLibrary.simpleMessage("修改地址"),
+ "email" : MessageLookupByLibrary.simpleMessage("电子邮箱"),
+ "email_is_not_valid" : MessageLookupByLibrary.simpleMessage("电子邮箱无效"),
+ "email_is_required" : MessageLookupByLibrary.simpleMessage("电子邮箱必填"),
+ "email_needed" : MessageLookupByLibrary.simpleMessage("需要电子邮箱"),
+ "empty_address_change_keyword" : MessageLookupByLibrary.simpleMessage("找不到地址。点击这里跳过地址搜索。"),
+ "empty_basket" : MessageLookupByLibrary.simpleMessage("清空购物篮"),
+ "empty_result_change_keyword" : MessageLookupByLibrary.simpleMessage("找不到您需要的数据,请改变关键字再试。"),
+ "end_of_the_list" : MessageLookupByLibrary.simpleMessage("全部加载"),
+ "english" : MessageLookupByLibrary.simpleMessage("英文"),
+ "enter_coupon_code" : MessageLookupByLibrary.simpleMessage("输入红包号码"),
+ "enter_delivery_address" : MessageLookupByLibrary.simpleMessage("输入送货地址"),
+ "enter_mobile_or_email" : MessageLookupByLibrary.simpleMessage("输入手机号码或电子邮箱地址"),
+ "enter_new_nickname" : MessageLookupByLibrary.simpleMessage("输入新昵称"),
+ "enter_product_keyword" : MessageLookupByLibrary.simpleMessage("输入产品关键字"),
+ "error" : MessageLookupByLibrary.simpleMessage("错误"),
+ "error_read_file" : MessageLookupByLibrary.simpleMessage("读取文件过程中出错。"),
+ "expiration_date" : MessageLookupByLibrary.simpleMessage("到期日期"),
+ "expiration_date_token" : m9,
+ "expire_token" : m10,
+ "expired_at" : MessageLookupByLibrary.simpleMessage("到期日期"),
+ "extra_fee_token" : m11,
+ "fax" : MessageLookupByLibrary.simpleMessage("传真"),
+ "feature_not_available_web" : MessageLookupByLibrary.simpleMessage("该功能在网页版上不能用。请下载App版本。"),
+ "featured_product" : MessageLookupByLibrary.simpleMessage("特色产品"),
+ "finish" : MessageLookupByLibrary.simpleMessage("完成"),
+ "follow_ups" : MessageLookupByLibrary.simpleMessage("跟进"),
+ "followups_token" : m12,
+ "forgot_password" : MessageLookupByLibrary.simpleMessage("忘记密码"),
+ "forgot_password_description" : MessageLookupByLibrary.simpleMessage("输入您注册时用的Email或手机号码,然后点击‘获取验证码’ 按钮。"),
+ "forgot_password_question" : MessageLookupByLibrary.simpleMessage("忘记密码?"),
+ "fri" : MessageLookupByLibrary.simpleMessage("周五"),
+ "friday" : MessageLookupByLibrary.simpleMessage("星期五"),
+ "from_camera" : MessageLookupByLibrary.simpleMessage("手机照相机"),
+ "from_gallery" : MessageLookupByLibrary.simpleMessage("手机图库"),
+ "gallery" : MessageLookupByLibrary.simpleMessage("图库"),
+ "general_coupon" : MessageLookupByLibrary.simpleMessage("通用优惠券"),
+ "get_code" : MessageLookupByLibrary.simpleMessage("获取验证码"),
+ "get_code_again" : MessageLookupByLibrary.simpleMessage("重新获取验证码"),
+ "get_code_token" : m13,
+ "get_coupon" : MessageLookupByLibrary.simpleMessage("获取红包"),
+ "get_picture" : MessageLookupByLibrary.simpleMessage("获取图片"),
+ "get_picture_from" : MessageLookupByLibrary.simpleMessage("从...获取图片"),
+ "group_license_renewal" : MessageLookupByLibrary.simpleMessage("集团许可续订"),
+ "group_number" : MessageLookupByLibrary.simpleMessage("集团号码"),
+ "group_number_can_be_found" : MessageLookupByLibrary.simpleMessage("按如下图找到集团号码..."),
"home" : MessageLookupByLibrary.simpleMessage("首页"),
+ "hot_sale" : MessageLookupByLibrary.simpleMessage("热卖"),
+ "hour_token" : m14,
+ "igoshow" : MessageLookupByLibrary.simpleMessage("iGoShow"),
+ "includes" : MessageLookupByLibrary.simpleMessage("包含"),
"information" : MessageLookupByLibrary.simpleMessage("信息"),
+ "input_your_comment" : MessageLookupByLibrary.simpleMessage("写下您的评价"),
"install_in_store" : MessageLookupByLibrary.simpleMessage("店内安装"),
"learn_more" : MessageLookupByLibrary.simpleMessage("了解更多..."),
+ "learn_more_about_igoshow" : MessageLookupByLibrary.simpleMessage("详细了解iGoShow"),
+ "learn_more_about_minipos" : MessageLookupByLibrary.simpleMessage("详细了解MiniPOS"),
"license_agreement" : MessageLookupByLibrary.simpleMessage("许可协议"),
+ "light_tase" : MessageLookupByLibrary.simpleMessage("清淡口味"),
+ "load_failed_retry" : MessageLookupByLibrary.simpleMessage("载入失败,请重试。"),
+ "loading" : MessageLookupByLibrary.simpleMessage("装载中..."),
"loading_please_wait" : MessageLookupByLibrary.simpleMessage("装载中,清稍候..."),
"login" : MessageLookupByLibrary.simpleMessage("登入"),
+ "login_instruction" : MessageLookupByLibrary.simpleMessage("如果您已经注册了账号,请使用如下表单登陆。\n如果您是MiniOffice的用户,您可直接输入您的MiniOffice用户名和密码登陆。"),
"logout" : MessageLookupByLibrary.simpleMessage("登出"),
"main_content_1" : MessageLookupByLibrary.simpleMessage("自从1999年来,我们一直致力于开发完整的强大的销售系统,帮助了上千小企业平滑的处理销售业务。当前我们有两个主要的产品。"),
+ "me" : MessageLookupByLibrary.simpleMessage("我的"),
+ "min_order_amount_token" : m15,
+ "min_shipping_fee" : m16,
"minipos" : MessageLookupByLibrary.simpleMessage("MiniPOS"),
+ "minute_token" : m17,
+ "mobile_email_username" : MessageLookupByLibrary.simpleMessage("手机号码,Email或MiniOffice用户名"),
+ "mobile_is_required" : MessageLookupByLibrary.simpleMessage("手机号码必填"),
+ "mobile_number" : MessageLookupByLibrary.simpleMessage("手机号码"),
+ "mobile_or_email" : MessageLookupByLibrary.simpleMessage("手机号码或电子邮箱"),
+ "mobile_or_email_is_required" : MessageLookupByLibrary.simpleMessage("必须输入手机号码或电子邮箱地址"),
+ "mobile_phone_number" : MessageLookupByLibrary.simpleMessage("手机号码"),
+ "mobile_phone_number_is_required" : MessageLookupByLibrary.simpleMessage("手机号码必填"),
+ "mon" : MessageLookupByLibrary.simpleMessage("周一"),
+ "monday" : MessageLookupByLibrary.simpleMessage("星期一"),
+ "mr" : MessageLookupByLibrary.simpleMessage("先生"),
+ "ms" : MessageLookupByLibrary.simpleMessage("女士"),
+ "my_addresses" : MessageLookupByLibrary.simpleMessage("我的地址"),
+ "my_cards" : MessageLookupByLibrary.simpleMessage("我的卡"),
+ "my_favorites" : MessageLookupByLibrary.simpleMessage("我的收藏"),
+ "my_orders" : MessageLookupByLibrary.simpleMessage("我的订单"),
+ "my_support" : MessageLookupByLibrary.simpleMessage("支持"),
"navigation" : MessageLookupByLibrary.simpleMessage("导航"),
+ "new_address" : MessageLookupByLibrary.simpleMessage("添加新地址"),
+ "new_comment" : MessageLookupByLibrary.simpleMessage("新的评价"),
+ "new_ticket" : MessageLookupByLibrary.simpleMessage("新的支持票"),
+ "new_user_question" : MessageLookupByLibrary.simpleMessage("新用户?"),
+ "next" : MessageLookupByLibrary.simpleMessage("下一步"),
+ "nick_name" : MessageLookupByLibrary.simpleMessage("昵称"),
+ "nickname_is_required" : MessageLookupByLibrary.simpleMessage("昵称不能为空"),
+ "no" : MessageLookupByLibrary.simpleMessage("不是"),
+ "no_address_yet" : MessageLookupByLibrary.simpleMessage("您还没有输入任何地址。"),
+ "no_blog_yet" : MessageLookupByLibrary.simpleMessage("尚无要显示的博客。"),
+ "no_comments_yet" : MessageLookupByLibrary.simpleMessage("还没评价"),
+ "no_coupon_available" : MessageLookupByLibrary.simpleMessage("无可用红包"),
+ "no_delivery_method" : MessageLookupByLibrary.simpleMessage("没有可用的送货方式"),
+ "no_instance_delivery_desc" : MessageLookupByLibrary.simpleMessage("跟踪信息将在可用时提供。"),
+ "no_more_record" : MessageLookupByLibrary.simpleMessage("没有更多记录了"),
+ "no_onion" : MessageLookupByLibrary.simpleMessage("不要洋葱"),
+ "no_pickle" : MessageLookupByLibrary.simpleMessage("不要泡菜"),
+ "no_restriction" : MessageLookupByLibrary.simpleMessage("无门槛"),
+ "no_spicy" : MessageLookupByLibrary.simpleMessage("不要辣"),
+ "no_ticket_yet" : MessageLookupByLibrary.simpleMessage("还没有支持票。 如果您有任何疑问/问题,请点击上方的加号图标以创建支持票。"),
+ "not_binding" : MessageLookupByLibrary.simpleMessage("未绑定"),
+ "number_of_people" : MessageLookupByLibrary.simpleMessage("人数"),
+ "ocr_scan" : MessageLookupByLibrary.simpleMessage("OCR扫描"),
+ "ok" : MessageLookupByLibrary.simpleMessage("确定"),
+ "old_password" : MessageLookupByLibrary.simpleMessage("旧密码"),
+ "online_payment" : MessageLookupByLibrary.simpleMessage("在线付款"),
+ "optional_information" : MessageLookupByLibrary.simpleMessage("可选填信息"),
+ "order_acceipt" : MessageLookupByLibrary.simpleMessage("已接单"),
+ "order_again" : MessageLookupByLibrary.simpleMessage("再来一单"),
+ "order_cancelled" : MessageLookupByLibrary.simpleMessage("已取消"),
+ "order_complete" : MessageLookupByLibrary.simpleMessage("已完成"),
+ "order_datetime" : MessageLookupByLibrary.simpleMessage("下单时间"),
+ "order_detail" : MessageLookupByLibrary.simpleMessage("订单详情"),
+ "order_fulfillment" : MessageLookupByLibrary.simpleMessage("订单完成度"),
+ "order_info" : MessageLookupByLibrary.simpleMessage("订单信息"),
+ "order_more" : m18,
+ "order_number" : MessageLookupByLibrary.simpleMessage("订单号码"),
+ "order_number_copied_to_clipboard" : MessageLookupByLibrary.simpleMessage("订单号码复制到剪切板"),
+ "order_processing" : MessageLookupByLibrary.simpleMessage("准备中"),
+ "order_remark" : MessageLookupByLibrary.simpleMessage("订单备注"),
+ "out_of_stock" : MessageLookupByLibrary.simpleMessage("脱销"),
+ "over_delivery_distance" : MessageLookupByLibrary.simpleMessage("地址超出配送范围"),
+ "paid" : MessageLookupByLibrary.simpleMessage("已付款"),
+ "password" : MessageLookupByLibrary.simpleMessage("密码"),
+ "password_again" : MessageLookupByLibrary.simpleMessage("再输入密码"),
+ "password_has_been_changed" : MessageLookupByLibrary.simpleMessage("密码修改成功"),
+ "password_is_not_match_password_again" : MessageLookupByLibrary.simpleMessage("两次输入密码不一致。"),
+ "password_is_required" : MessageLookupByLibrary.simpleMessage("密码必填。"),
+ "pay" : MessageLookupByLibrary.simpleMessage("付款"),
+ "pay_after_meal" : MessageLookupByLibrary.simpleMessage("餐后付款"),
+ "pay_amount_token" : m19,
+ "pay_later" : MessageLookupByLibrary.simpleMessage("稍后付款"),
+ "pay_now" : MessageLookupByLibrary.simpleMessage("去支付"),
+ "pay_on_deliery" : MessageLookupByLibrary.simpleMessage("到货付款"),
+ "pay_on_deliery_pickup" : MessageLookupByLibrary.simpleMessage("自提或到货付款"),
+ "pay_with" : MessageLookupByLibrary.simpleMessage("使用"),
+ "pay_with_existing_cards" : MessageLookupByLibrary.simpleMessage("用现有的卡付款"),
+ "pay_with_token" : m20,
+ "payment_amount" : MessageLookupByLibrary.simpleMessage("付款金额"),
+ "payment_method" : MessageLookupByLibrary.simpleMessage("付款方式"),
+ "payment_method_not_set" : MessageLookupByLibrary.simpleMessage("没有指定付款方式,请货到付款或自提付款。"),
+ "payment_status" : MessageLookupByLibrary.simpleMessage("付款状态"),
+ "payment_verification" : MessageLookupByLibrary.simpleMessage("付款验证"),
+ "payment_verification_sent" : m21,
+ "paypal" : MessageLookupByLibrary.simpleMessage("Paypal"),
+ "pending" : MessageLookupByLibrary.simpleMessage("待接单"),
+ "percent_discount" : MessageLookupByLibrary.simpleMessage("%折扣"),
+ "percentage_discount_token" : m22,
+ "percentage_discount_token2" : m23,
+ "pick_a_coupon" : MessageLookupByLibrary.simpleMessage("使用红包"),
+ "pickup" : MessageLookupByLibrary.simpleMessage("到店自提"),
+ "pickup_address" : MessageLookupByLibrary.simpleMessage("自提地址"),
+ "pickup_at" : MessageLookupByLibrary.simpleMessage("自提地址"),
+ "pickup_discount" : MessageLookupByLibrary.simpleMessage("自提折扣"),
+ "please_enter_coupon_code" : MessageLookupByLibrary.simpleMessage("请输入红包号码。"),
+ "please_enter_group_number" : MessageLookupByLibrary.simpleMessage("请输入您的集团号码。"),
+ "please_login" : MessageLookupByLibrary.simpleMessage("请登陆"),
+ "please_provide_shipping_address" : MessageLookupByLibrary.simpleMessage("请提供收货地址"),
+ "please_select" : MessageLookupByLibrary.simpleMessage("请选取"),
+ "please_select_an_image" : MessageLookupByLibrary.simpleMessage("请选取一张图片"),
+ "point" : MessageLookupByLibrary.simpleMessage("积分"),
"point_of_sale_system_solution" : MessageLookupByLibrary.simpleMessage("收款系统方案"),
+ "postal_code" : MessageLookupByLibrary.simpleMessage("邮政编码"),
+ "postal_code_is_required" : MessageLookupByLibrary.simpleMessage("邮政编码必填"),
+ "previous" : MessageLookupByLibrary.simpleMessage("上一步"),
+ "price" : MessageLookupByLibrary.simpleMessage("价格"),
"privacy_policy" : MessageLookupByLibrary.simpleMessage("私隐条款"),
+ "product_insufficient" : MessageLookupByLibrary.simpleMessage("该产品数量不足。"),
+ "products" : MessageLookupByLibrary.simpleMessage("产品"),
+ "profile" : MessageLookupByLibrary.simpleMessage("个人资料"),
+ "promotions" : MessageLookupByLibrary.simpleMessage("推广"),
+ "province" : MessageLookupByLibrary.simpleMessage("省份"),
+ "pull_up_to_load_more" : MessageLookupByLibrary.simpleMessage("上拉加载更多"),
+ "purchase_renew_service" : MessageLookupByLibrary.simpleMessage("购买/续期服务"),
+ "quick_input" : MessageLookupByLibrary.simpleMessage("快速输入"),
+ "radio_option_is_optional" : MessageLookupByLibrary.simpleMessage("可选选项。如果不选择可以直接点下一步。"),
+ "radio_option_is_required" : MessageLookupByLibrary.simpleMessage("选项必选。选择一个选项后点下一步。"),
+ "radio_option_select_token" : m24,
"recalculating" : MessageLookupByLibrary.simpleMessage("运算中..."),
+ "red_coupon" : MessageLookupByLibrary.simpleMessage("红包"),
+ "redeem_coupon" : MessageLookupByLibrary.simpleMessage("去使用"),
+ "register" : MessageLookupByLibrary.simpleMessage("注册"),
+ "registration" : MessageLookupByLibrary.simpleMessage("注册"),
+ "release_to_load_more" : MessageLookupByLibrary.simpleMessage("松开载入"),
"renew_license" : MessageLookupByLibrary.simpleMessage("证书续期"),
+ "renewal_fee" : MessageLookupByLibrary.simpleMessage("续订费用"),
+ "reply" : MessageLookupByLibrary.simpleMessage("回复"),
+ "reset_password" : MessageLookupByLibrary.simpleMessage("重置密码"),
+ "reset_password_desc" : MessageLookupByLibrary.simpleMessage("输入您想要的新密码两次。"),
+ "reset_password_success" : MessageLookupByLibrary.simpleMessage("重置密码成功"),
+ "response_from_store" : MessageLookupByLibrary.simpleMessage("店家回复"),
"return_policy" : MessageLookupByLibrary.simpleMessage("退货条款"),
+ "revise_user_profile" : MessageLookupByLibrary.simpleMessage("修改用户信息"),
+ "sat" : MessageLookupByLibrary.simpleMessage("周六"),
+ "saturday" : MessageLookupByLibrary.simpleMessage("星期六"),
+ "save" : MessageLookupByLibrary.simpleMessage("保存"),
+ "schedule_delivery" : MessageLookupByLibrary.simpleMessage("预约送货时间"),
+ "search_place" : MessageLookupByLibrary.simpleMessage("搜索地址"),
+ "search_product" : MessageLookupByLibrary.simpleMessage("搜索产品"),
+ "search_products" : MessageLookupByLibrary.simpleMessage("搜索产品"),
+ "select" : MessageLookupByLibrary.simpleMessage("选取"),
+ "select_a_payment_method" : MessageLookupByLibrary.simpleMessage("选择付款方式"),
+ "select_a_plan" : MessageLookupByLibrary.simpleMessage("选择一个计划"),
+ "select_canada_post_shipping_rate" : MessageLookupByLibrary.simpleMessage("请选择加拿大邮政运费。"),
+ "select_delivery_time" : MessageLookupByLibrary.simpleMessage("选择配送时间"),
+ "select_document_lanuage" : MessageLookupByLibrary.simpleMessage("选择一种语言"),
+ "select_document_type" : MessageLookupByLibrary.simpleMessage("选择一种文件类型"),
+ "select_options" : MessageLookupByLibrary.simpleMessage("选择选项"),
+ "service_descritpion" : MessageLookupByLibrary.simpleMessage("服务描述"),
+ "service_fee" : MessageLookupByLibrary.simpleMessage("服务费"),
"service_policy" : MessageLookupByLibrary.simpleMessage("服务条款"),
+ "set_password" : MessageLookupByLibrary.simpleMessage("设置密码"),
+ "set_password_desc" : MessageLookupByLibrary.simpleMessage("输入您想要的密码两次。"),
+ "shipping_time_will_schedule" : MessageLookupByLibrary.simpleMessage("配送时间无法确定。通常我们会尽快送出。如果您希望在某时配送,请在备注里注明。"),
"shop" : MessageLookupByLibrary.simpleMessage("线上购买"),
+ "show_less" : MessageLookupByLibrary.simpleMessage("显示更少"),
+ "show_more" : MessageLookupByLibrary.simpleMessage("显示更多"),
+ "sold_per_month_token" : m25,
+ "specification" : MessageLookupByLibrary.simpleMessage("规格"),
+ "store" : MessageLookupByLibrary.simpleMessage("店家"),
+ "store_closed" : MessageLookupByLibrary.simpleMessage("商店已关"),
+ "store_delivery" : MessageLookupByLibrary.simpleMessage("商家配送"),
+ "store_introduction" : MessageLookupByLibrary.simpleMessage("店家简介"),
+ "store_policy" : MessageLookupByLibrary.simpleMessage("商家政策"),
+ "street_line_1" : MessageLookupByLibrary.simpleMessage("街道名称第一行"),
+ "street_line_1_is_required" : MessageLookupByLibrary.simpleMessage("街道名称第一行必填"),
+ "street_line_2" : MessageLookupByLibrary.simpleMessage("街道名称第二行"),
+ "submit" : MessageLookupByLibrary.simpleMessage("提交"),
+ "submit_to_change" : MessageLookupByLibrary.simpleMessage("提交修改"),
+ "submit_to_generate" : MessageLookupByLibrary.simpleMessage("提交生成"),
"submitting" : MessageLookupByLibrary.simpleMessage("提交中..."),
"submitting_please_wait" : MessageLookupByLibrary.simpleMessage("提交中,清稍候..."),
+ "subtotal" : MessageLookupByLibrary.simpleMessage("小计"),
+ "subtotal_token" : m26,
+ "success" : MessageLookupByLibrary.simpleMessage("成功"),
+ "sun" : MessageLookupByLibrary.simpleMessage("周日"),
+ "sunday" : MessageLookupByLibrary.simpleMessage("星期日"),
"support" : MessageLookupByLibrary.simpleMessage("技术支持"),
"support_ticket" : MessageLookupByLibrary.simpleMessage("客户提问"),
+ "table_token" : m27,
"tap_back_again_to_exit" : MessageLookupByLibrary.simpleMessage("再次点击返回退出"),
+ "tax" : MessageLookupByLibrary.simpleMessage("税费"),
+ "thank_you_for_your_comment" : MessageLookupByLibrary.simpleMessage("谢谢您的评价。"),
+ "the_address_has_been_deleted" : MessageLookupByLibrary.simpleMessage("地址成功删除"),
+ "the_email_is_same_as_current" : MessageLookupByLibrary.simpleMessage("电子邮箱和当前的是一样的。"),
+ "the_mobile_number_is_same_as_current" : MessageLookupByLibrary.simpleMessage("手机号码和当前的是一样的。"),
+ "the_ticket_is_closed_desc" : MessageLookupByLibrary.simpleMessage("该支持票已经关闭。如果您还有问题,请创建新的支持票。"),
+ "this_field_is_required" : MessageLookupByLibrary.simpleMessage("该字段必填。"),
+ "thu" : MessageLookupByLibrary.simpleMessage("周四"),
+ "thursday" : MessageLookupByLibrary.simpleMessage("星期四"),
+ "ticket_created_success" : MessageLookupByLibrary.simpleMessage("支持票成功创建。"),
+ "ticket_number_token" : m28,
+ "today" : MessageLookupByLibrary.simpleMessage("今天"),
+ "today_with_time" : m29,
+ "toll_free" : MessageLookupByLibrary.simpleMessage("无费号码:"),
+ "tomorrow" : MessageLookupByLibrary.simpleMessage("明天"),
+ "tomorrow_with_time" : m30,
+ "total" : MessageLookupByLibrary.simpleMessage("总计"),
+ "tue" : MessageLookupByLibrary.simpleMessage("周二"),
+ "tuesday" : MessageLookupByLibrary.simpleMessage("星期二"),
"tutorials" : MessageLookupByLibrary.simpleMessage("教程"),
- "wiki" : MessageLookupByLibrary.simpleMessage("维基")
+ "type_your_order_remark" : MessageLookupByLibrary.simpleMessage("输入订单备注"),
+ "ubereats_receipt" : MessageLookupByLibrary.simpleMessage("UberEats收据"),
+ "under_renovation" : MessageLookupByLibrary.simpleMessage("本店还在装修"),
+ "unpaid" : MessageLookupByLibrary.simpleMessage("未付款"),
+ "update_success" : MessageLookupByLibrary.simpleMessage("更新成功"),
+ "user_account_created_success" : MessageLookupByLibrary.simpleMessage("用户账号成功创建"),
+ "user_registration" : MessageLookupByLibrary.simpleMessage("用户注册"),
+ "user_registration_desc" : MessageLookupByLibrary.simpleMessage("请输入您的手机号码,然后单击“获取验证码”按钮。"),
+ "verification_code" : MessageLookupByLibrary.simpleMessage("验证码"),
+ "verification_code_is_required" : MessageLookupByLibrary.simpleMessage("必须输入验证码"),
+ "verification_code_sent" : MessageLookupByLibrary.simpleMessage("验证码已经发送。"),
+ "verify" : MessageLookupByLibrary.simpleMessage("验证"),
+ "view_blog" : MessageLookupByLibrary.simpleMessage("查看博客"),
+ "view_on_google_map" : MessageLookupByLibrary.simpleMessage("在谷歌地图打开"),
+ "view_ticket" : MessageLookupByLibrary.simpleMessage("查看支持票"),
+ "wallet" : MessageLookupByLibrary.simpleMessage("钱包"),
+ "warning" : MessageLookupByLibrary.simpleMessage("注意"),
+ "wechatpay" : MessageLookupByLibrary.simpleMessage("微信支付"),
+ "wed" : MessageLookupByLibrary.simpleMessage("周三"),
+ "wednesday" : MessageLookupByLibrary.simpleMessage("星期三"),
+ "weight_token" : m31,
+ "wiki" : MessageLookupByLibrary.simpleMessage("维基"),
+ "wrong_payment_verification_code" : MessageLookupByLibrary.simpleMessage("错误的付款码,请查证后再输入。"),
+ "yes" : MessageLookupByLibrary.simpleMessage("是的"),
+ "yes_i_am_sure" : MessageLookupByLibrary.simpleMessage("是的!我确定。"),
+ "you_have_no_orders_yet" : MessageLookupByLibrary.simpleMessage("您还没有订单"),
+ "your_basket_is_empty" : MessageLookupByLibrary.simpleMessage("您的购物篮是空的"),
+ "your_group" : MessageLookupByLibrary.simpleMessage("您的集团"),
+ "your_question_issue" : MessageLookupByLibrary.simpleMessage("您的问题"),
+ "your_reply" : MessageLookupByLibrary.simpleMessage("您的回复")
};
}
diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart
index d47c366..f328a0b 100644
--- a/lib/generated/l10n.dart
+++ b/lib/generated/l10n.dart
@@ -354,6 +354,3630 @@ class S {
args: [],
);
}
+
+ /// `iGoShow`
+ String get igoshow {
+ return Intl.message(
+ 'iGoShow',
+ name: 'igoshow',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile, Email or MiniOffice username`
+ String get mobile_email_username {
+ return Intl.message(
+ 'Mobile, Email or MiniOffice username',
+ name: 'mobile_email_username',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `This field is required.`
+ String get this_field_is_required {
+ return Intl.message(
+ 'This field is required.',
+ name: 'this_field_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Password`
+ String get password {
+ return Intl.message(
+ 'Password',
+ name: 'password',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Password is required.`
+ String get password_is_required {
+ return Intl.message(
+ 'Password is required.',
+ name: 'password_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `New user?`
+ String get new_user_question {
+ return Intl.message(
+ 'New user?',
+ name: 'new_user_question',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Forgot password?`
+ String get forgot_password_question {
+ return Intl.message(
+ 'Forgot password?',
+ name: 'forgot_password_question',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Error`
+ String get error {
+ return Intl.message(
+ 'Error',
+ name: 'error',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `OK`
+ String get ok {
+ return Intl.message(
+ 'OK',
+ name: 'ok',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please login`
+ String get please_login {
+ return Intl.message(
+ 'Please login',
+ name: 'please_login',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `If you have already registered an account, please use the following form to login.\nIf you are a MiniOffice user, you can directly enter your MiniOffice username and password to login.`
+ String get login_instruction {
+ return Intl.message(
+ 'If you have already registered an account, please use the following form to login.\nIf you are a MiniOffice user, you can directly enter your MiniOffice username and password to login.',
+ name: 'login_instruction',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Me`
+ String get me {
+ return Intl.message(
+ 'Me',
+ name: 'me',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Wallet`
+ String get wallet {
+ return Intl.message(
+ 'Wallet',
+ name: 'wallet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Coupon`
+ String get red_coupon {
+ return Intl.message(
+ 'Coupon',
+ name: 'red_coupon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Points`
+ String get point {
+ return Intl.message(
+ 'Points',
+ name: 'point',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `My favorites`
+ String get my_favorites {
+ return Intl.message(
+ 'My favorites',
+ name: 'my_favorites',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `My addresses`
+ String get my_addresses {
+ return Intl.message(
+ 'My addresses',
+ name: 'my_addresses',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `My cards`
+ String get my_cards {
+ return Intl.message(
+ 'My cards',
+ name: 'my_cards',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `My support`
+ String get my_support {
+ return Intl.message(
+ 'My support',
+ name: 'my_support',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Warning`
+ String get warning {
+ return Intl.message(
+ 'Warning',
+ name: 'warning',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Email needed`
+ String get email_needed {
+ return Intl.message(
+ 'Email needed',
+ name: 'email_needed',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Cancel`
+ String get cancel {
+ return Intl.message(
+ 'Cancel',
+ name: 'cancel',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Business cooperation`
+ String get business_cooperation {
+ return Intl.message(
+ 'Business cooperation',
+ name: 'business_cooperation',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Change password`
+ String get change_password {
+ return Intl.message(
+ 'Change password',
+ name: 'change_password',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Old password`
+ String get old_password {
+ return Intl.message(
+ 'Old password',
+ name: 'old_password',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Current password is required.`
+ String get current_password_is_required {
+ return Intl.message(
+ 'Current password is required.',
+ name: 'current_password_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Password again`
+ String get password_again {
+ return Intl.message(
+ 'Password again',
+ name: 'password_again',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Password and confirm password does not match.`
+ String get password_is_not_match_password_again {
+ return Intl.message(
+ 'Password and confirm password does not match.',
+ name: 'password_is_not_match_password_again',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Submit`
+ String get submit {
+ return Intl.message(
+ 'Submit',
+ name: 'submit',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Success`
+ String get success {
+ return Intl.message(
+ 'Success',
+ name: 'success',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Password has been changed`
+ String get password_has_been_changed {
+ return Intl.message(
+ 'Password has been changed',
+ name: 'password_has_been_changed',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Profile`
+ String get profile {
+ return Intl.message(
+ 'Profile',
+ name: 'profile',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Basic info.`
+ String get basic_info {
+ return Intl.message(
+ 'Basic info.',
+ name: 'basic_info',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Avatar`
+ String get avatar {
+ return Intl.message(
+ 'Avatar',
+ name: 'avatar',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Nick name`
+ String get nick_name {
+ return Intl.message(
+ 'Nick name',
+ name: 'nick_name',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Account binding`
+ String get account_binding {
+ return Intl.message(
+ 'Account binding',
+ name: 'account_binding',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile number`
+ String get mobile_number {
+ return Intl.message(
+ 'Mobile number',
+ name: 'mobile_number',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Not binding`
+ String get not_binding {
+ return Intl.message(
+ 'Not binding',
+ name: 'not_binding',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Email`
+ String get email {
+ return Intl.message(
+ 'Email',
+ name: 'email',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Get picture`
+ String get get_picture {
+ return Intl.message(
+ 'Get picture',
+ name: 'get_picture',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Get picture from...`
+ String get get_picture_from {
+ return Intl.message(
+ 'Get picture from...',
+ name: 'get_picture_from',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Gallery`
+ String get gallery {
+ return Intl.message(
+ 'Gallery',
+ name: 'gallery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Camera`
+ String get camera {
+ return Intl.message(
+ 'Camera',
+ name: 'camera',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please select`
+ String get please_select {
+ return Intl.message(
+ 'Please select',
+ name: 'please_select',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please select an image`
+ String get please_select_an_image {
+ return Intl.message(
+ 'Please select an image',
+ name: 'please_select_an_image',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Select`
+ String get select {
+ return Intl.message(
+ 'Select',
+ name: 'select',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Error occurred while reading the file.`
+ String get error_read_file {
+ return Intl.message(
+ 'Error occurred while reading the file.',
+ name: 'error_read_file',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Change nickname`
+ String get change_nickname {
+ return Intl.message(
+ 'Change nickname',
+ name: 'change_nickname',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter new nickname`
+ String get enter_new_nickname {
+ return Intl.message(
+ 'Enter new nickname',
+ name: 'enter_new_nickname',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Nickname is required`
+ String get nickname_is_required {
+ return Intl.message(
+ 'Nickname is required',
+ name: 'nickname_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Submit to change`
+ String get submit_to_change {
+ return Intl.message(
+ 'Submit to change',
+ name: 'submit_to_change',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Are you sure you want to logout?`
+ String get are_you_sure_to_logout {
+ return Intl.message(
+ 'Are you sure you want to logout?',
+ name: 'are_you_sure_to_logout',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Yes! I am sure.`
+ String get yes_i_am_sure {
+ return Intl.message(
+ 'Yes! I am sure.',
+ name: 'yes_i_am_sure',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Registration`
+ String get registration {
+ return Intl.message(
+ 'Registration',
+ name: 'registration',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `User registration`
+ String get user_registration {
+ return Intl.message(
+ 'User registration',
+ name: 'user_registration',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile or email`
+ String get mobile_or_email {
+ return Intl.message(
+ 'Mobile or email',
+ name: 'mobile_or_email',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile or email is required`
+ String get mobile_or_email_is_required {
+ return Intl.message(
+ 'Mobile or email is required',
+ name: 'mobile_or_email_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Verification code`
+ String get verification_code {
+ return Intl.message(
+ 'Verification code',
+ name: 'verification_code',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Verification code is required`
+ String get verification_code_is_required {
+ return Intl.message(
+ 'Verification code is required',
+ name: 'verification_code_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Register`
+ String get register {
+ return Intl.message(
+ 'Register',
+ name: 'register',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Get code`
+ String get get_code {
+ return Intl.message(
+ 'Get code',
+ name: 'get_code',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Verification code has been sent.`
+ String get verification_code_sent {
+ return Intl.message(
+ 'Verification code has been sent.',
+ name: 'verification_code_sent',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter mobile or email`
+ String get enter_mobile_or_email {
+ return Intl.message(
+ 'Enter mobile or email',
+ name: 'enter_mobile_or_email',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Retry after {second}s`
+ String get_code_token(Object second) {
+ return Intl.message(
+ 'Retry after ${second}s',
+ name: 'get_code_token',
+ desc: '',
+ args: [second],
+ );
+ }
+
+ /// `Get code again`
+ String get get_code_again {
+ return Intl.message(
+ 'Get code again',
+ name: 'get_code_again',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Credit or debit card`
+ String get credit_debit_card {
+ return Intl.message(
+ 'Credit or debit card',
+ name: 'credit_debit_card',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Credit card`
+ String get credit_card {
+ return Intl.message(
+ 'Credit card',
+ name: 'credit_card',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Alipay`
+ String get alipay {
+ return Intl.message(
+ 'Alipay',
+ name: 'alipay',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Wechat pay`
+ String get wechatpay {
+ return Intl.message(
+ 'Wechat pay',
+ name: 'wechatpay',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Paypal`
+ String get paypal {
+ return Intl.message(
+ 'Paypal',
+ name: 'paypal',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay on delivery or pickup`
+ String get pay_on_deliery_pickup {
+ return Intl.message(
+ 'Pay on delivery or pickup',
+ name: 'pay_on_deliery_pickup',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay on delivery`
+ String get pay_on_deliery {
+ return Intl.message(
+ 'Pay on delivery',
+ name: 'pay_on_deliery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Set password`
+ String get set_password {
+ return Intl.message(
+ 'Set password',
+ name: 'set_password',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `User account created success`
+ String get user_account_created_success {
+ return Intl.message(
+ 'User account created success',
+ name: 'user_account_created_success',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Forgot password`
+ String get forgot_password {
+ return Intl.message(
+ 'Forgot password',
+ name: 'forgot_password',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Reset password`
+ String get reset_password {
+ return Intl.message(
+ 'Reset password',
+ name: 'reset_password',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Verify`
+ String get verify {
+ return Intl.message(
+ 'Verify',
+ name: 'verify',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Reset password success`
+ String get reset_password_success {
+ return Intl.message(
+ 'Reset password success',
+ name: 'reset_password_success',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Change mobile number`
+ String get change_mobile {
+ return Intl.message(
+ 'Change mobile number',
+ name: 'change_mobile',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Change email address`
+ String get change_email {
+ return Intl.message(
+ 'Change email address',
+ name: 'change_email',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile is required`
+ String get mobile_is_required {
+ return Intl.message(
+ 'Mobile is required',
+ name: 'mobile_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Email is required`
+ String get email_is_required {
+ return Intl.message(
+ 'Email is required',
+ name: 'email_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The mobile number is the same as the current one.`
+ String get the_mobile_number_is_same_as_current {
+ return Intl.message(
+ 'The mobile number is the same as the current one.',
+ name: 'the_mobile_number_is_same_as_current',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The email is the same as the current one.`
+ String get the_email_is_same_as_current {
+ return Intl.message(
+ 'The email is the same as the current one.',
+ name: 'the_email_is_same_as_current',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Updated success`
+ String get update_success {
+ return Intl.message(
+ 'Updated success',
+ name: 'update_success',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Edit address`
+ String get edit_address {
+ return Intl.message(
+ 'Edit address',
+ name: 'edit_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `You have not entered any address.`
+ String get no_address_yet {
+ return Intl.message(
+ 'You have not entered any address.',
+ name: 'no_address_yet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Contact name`
+ String get contact_name {
+ return Intl.message(
+ 'Contact name',
+ name: 'contact_name',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Contact name is required`
+ String get contact_name_is_required {
+ return Intl.message(
+ 'Contact name is required',
+ name: 'contact_name_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mr.`
+ String get mr {
+ return Intl.message(
+ 'Mr.',
+ name: 'mr',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Ms.`
+ String get ms {
+ return Intl.message(
+ 'Ms.',
+ name: 'ms',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile number`
+ String get mobile_phone_number {
+ return Intl.message(
+ 'Mobile number',
+ name: 'mobile_phone_number',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mobile number is required`
+ String get mobile_phone_number_is_required {
+ return Intl.message(
+ 'Mobile number is required',
+ name: 'mobile_phone_number_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Street line 1`
+ String get street_line_1 {
+ return Intl.message(
+ 'Street line 1',
+ name: 'street_line_1',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Street line 1 is required`
+ String get street_line_1_is_required {
+ return Intl.message(
+ 'Street line 1 is required',
+ name: 'street_line_1_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Street line 2`
+ String get street_line_2 {
+ return Intl.message(
+ 'Street line 2',
+ name: 'street_line_2',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `City`
+ String get city {
+ return Intl.message(
+ 'City',
+ name: 'city',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `City is required`
+ String get city_is_required {
+ return Intl.message(
+ 'City is required',
+ name: 'city_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Province`
+ String get province {
+ return Intl.message(
+ 'Province',
+ name: 'province',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Postal code`
+ String get postal_code {
+ return Intl.message(
+ 'Postal code',
+ name: 'postal_code',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Postal code is required`
+ String get postal_code_is_required {
+ return Intl.message(
+ 'Postal code is required',
+ name: 'postal_code_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Optional Info.`
+ String get optional_information {
+ return Intl.message(
+ 'Optional Info.',
+ name: 'optional_information',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Email is not valid`
+ String get email_is_not_valid {
+ return Intl.message(
+ 'Email is not valid',
+ name: 'email_is_not_valid',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Fax`
+ String get fax {
+ return Intl.message(
+ 'Fax',
+ name: 'fax',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delete`
+ String get delete {
+ return Intl.message(
+ 'Delete',
+ name: 'delete',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Are you sure you want to delete the address?`
+ String get are_you_sure_to_delete_the_address {
+ return Intl.message(
+ 'Are you sure you want to delete the address?',
+ name: 'are_you_sure_to_delete_the_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Save`
+ String get save {
+ return Intl.message(
+ 'Save',
+ name: 'save',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The address has been deleted.`
+ String get the_address_has_been_deleted {
+ return Intl.message(
+ 'The address has been deleted.',
+ name: 'the_address_has_been_deleted',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Search place`
+ String get search_place {
+ return Intl.message(
+ 'Search place',
+ name: 'search_place',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter delivery address`
+ String get enter_delivery_address {
+ return Intl.message(
+ 'Enter delivery address',
+ name: 'enter_delivery_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No address found. Tap here to skip address lookup.`
+ String get empty_address_change_keyword {
+ return Intl.message(
+ 'No address found. Tap here to skip address lookup.',
+ name: 'empty_address_change_keyword',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No data found, please change keyword and try again.`
+ String get empty_result_change_keyword {
+ return Intl.message(
+ 'No data found, please change keyword and try again.',
+ name: 'empty_result_change_keyword',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `New address`
+ String get new_address {
+ return Intl.message(
+ 'New address',
+ name: 'new_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please enter the old password and your desired new password.`
+ String get change_password_desc {
+ return Intl.message(
+ 'Please enter the old password and your desired new password.',
+ name: 'change_password_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Back`
+ String get back {
+ return Intl.message(
+ 'Back',
+ name: 'back',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Revise user profile`
+ String get revise_user_profile {
+ return Intl.message(
+ 'Revise user profile',
+ name: 'revise_user_profile',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Learn more about MiniPOS`
+ String get learn_more_about_minipos {
+ return Intl.message(
+ 'Learn more about MiniPOS',
+ name: 'learn_more_about_minipos',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Learn more about iGoShow`
+ String get learn_more_about_igoshow {
+ return Intl.message(
+ 'Learn more about iGoShow',
+ name: 'learn_more_about_igoshow',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Downloads`
+ String get downloads {
+ return Intl.message(
+ 'Downloads',
+ name: 'downloads',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please enter your mobile phone number then click the 'Get code' button to get the validation code.`
+ String get user_registration_desc {
+ return Intl.message(
+ 'Please enter your mobile phone number then click the \'Get code\' button to get the validation code.',
+ name: 'user_registration_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter the Email or mobile number you used when registering, and then click the 'Get code' button to get the validation code.`
+ String get forgot_password_description {
+ return Intl.message(
+ 'Enter the Email or mobile number you used when registering, and then click the \'Get code\' button to get the validation code.',
+ name: 'forgot_password_description',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter your new mobile number, and then click 'Get code' button to get the validation code.`
+ String get change_mobile_desc {
+ return Intl.message(
+ 'Enter your new mobile number, and then click \'Get code\' button to get the validation code.',
+ name: 'change_mobile_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter your new Email, and then click 'Get code' button to get the validation code.`
+ String get change_email_desc {
+ return Intl.message(
+ 'Enter your new Email, and then click \'Get code\' button to get the validation code.',
+ name: 'change_email_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Add new address`
+ String get add_new_address {
+ return Intl.message(
+ 'Add new address',
+ name: 'add_new_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `There is no ticket yet. If you have any question/issue please tap the plus icon above to create a ticket.`
+ String get no_ticket_yet {
+ return Intl.message(
+ 'There is no ticket yet. If you have any question/issue please tap the plus icon above to create a ticket.',
+ name: 'no_ticket_yet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Today {time}`
+ String today_with_time(Object time) {
+ return Intl.message(
+ 'Today $time',
+ name: 'today_with_time',
+ desc: '',
+ args: [time],
+ );
+ }
+
+ /// `Tomorrow {time}`
+ String tomorrow_with_time(Object time) {
+ return Intl.message(
+ 'Tomorrow $time',
+ name: 'tomorrow_with_time',
+ desc: '',
+ args: [time],
+ );
+ }
+
+ /// `{num} follow-ups`
+ String followups_token(Object num) {
+ return Intl.message(
+ '$num follow-ups',
+ name: 'followups_token',
+ desc: '',
+ args: [num],
+ );
+ }
+
+ /// `Pull up to load more`
+ String get pull_up_to_load_more {
+ return Intl.message(
+ 'Pull up to load more',
+ name: 'pull_up_to_load_more',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Load failed, please retry`
+ String get load_failed_retry {
+ return Intl.message(
+ 'Load failed, please retry',
+ name: 'load_failed_retry',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Release to load more`
+ String get release_to_load_more {
+ return Intl.message(
+ 'Release to load more',
+ name: 'release_to_load_more',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No more record`
+ String get no_more_record {
+ return Intl.message(
+ 'No more record',
+ name: 'no_more_record',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Create a new ticket`
+ String get add_new_ticket {
+ return Intl.message(
+ 'Create a new ticket',
+ name: 'add_new_ticket',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `New ticket`
+ String get new_ticket {
+ return Intl.message(
+ 'New ticket',
+ name: 'new_ticket',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please enter your question.`
+ String get add_new_ticket_desc {
+ return Intl.message(
+ 'Please enter your question.',
+ name: 'add_new_ticket_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Your question/issue`
+ String get your_question_issue {
+ return Intl.message(
+ 'Your question/issue',
+ name: 'your_question_issue',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Are you sure you want to remove the picture?`
+ String get are_you_sure_to_remove_the_picture {
+ return Intl.message(
+ 'Are you sure you want to remove the picture?',
+ name: 'are_you_sure_to_remove_the_picture',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Attach pictures`
+ String get attach_pictures {
+ return Intl.message(
+ 'Attach pictures',
+ name: 'attach_pictures',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Upload pictures(screen shot) to make your question clearer.`
+ String get attach_pictures_desc {
+ return Intl.message(
+ 'Upload pictures(screen shot) to make your question clearer.',
+ name: 'attach_pictures_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Ticket has been created successfully.`
+ String get ticket_created_success {
+ return Intl.message(
+ 'Ticket has been created successfully.',
+ name: 'ticket_created_success',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `View ticket`
+ String get view_ticket {
+ return Intl.message(
+ 'View ticket',
+ name: 'view_ticket',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Ticket #{num}`
+ String ticket_number_token(Object num) {
+ return Intl.message(
+ 'Ticket #$num',
+ name: 'ticket_number_token',
+ desc: '',
+ args: [num],
+ );
+ }
+
+ /// `Close`
+ String get close {
+ return Intl.message(
+ 'Close',
+ name: 'close',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Follow ups`
+ String get follow_ups {
+ return Intl.message(
+ 'Follow ups',
+ name: 'follow_ups',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Reply`
+ String get reply {
+ return Intl.message(
+ 'Reply',
+ name: 'reply',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The ticket has been closed. If you still have questions, please create a new ticket.`
+ String get the_ticket_is_closed_desc {
+ return Intl.message(
+ 'The ticket has been closed. If you still have questions, please create a new ticket.',
+ name: 'the_ticket_is_closed_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Your reply`
+ String get your_reply {
+ return Intl.message(
+ 'Your reply',
+ name: 'your_reply',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `There is no blog to show yet.`
+ String get no_blog_yet {
+ return Intl.message(
+ 'There is no blog to show yet.',
+ name: 'no_blog_yet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `View blog`
+ String get view_blog {
+ return Intl.message(
+ 'View blog',
+ name: 'view_blog',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter the new password you desired twice.`
+ String get reset_password_desc {
+ return Intl.message(
+ 'Enter the new password you desired twice.',
+ name: 'reset_password_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter the password you desired twice.`
+ String get set_password_desc {
+ return Intl.message(
+ 'Enter the password you desired twice.',
+ name: 'set_password_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `{minprice} more`
+ String order_more(Object minprice) {
+ return Intl.message(
+ '$minprice more',
+ name: 'order_more',
+ desc: '',
+ args: [minprice],
+ );
+ }
+
+ /// `Select options`
+ String get select_options {
+ return Intl.message(
+ 'Select options',
+ name: 'select_options',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Previous`
+ String get previous {
+ return Intl.message(
+ 'Previous',
+ name: 'previous',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Next`
+ String get next {
+ return Intl.message(
+ 'Next',
+ name: 'next',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Finish`
+ String get finish {
+ return Intl.message(
+ 'Finish',
+ name: 'finish',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please choice {optionName}.`
+ String radio_option_select_token(Object optionName) {
+ return Intl.message(
+ 'Please choice $optionName.',
+ name: 'radio_option_select_token',
+ desc: '',
+ args: [optionName],
+ );
+ }
+
+ /// `Option is required. Select an option then tap Next.`
+ String get radio_option_is_required {
+ return Intl.message(
+ 'Option is required. Select an option then tap Next.',
+ name: 'radio_option_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Optional. You can tap Next without selection.`
+ String get radio_option_is_optional {
+ return Intl.message(
+ 'Optional. You can tap Next without selection.',
+ name: 'radio_option_is_optional',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Multiple choice {optionName}`
+ String check_option_select_token(Object optionName) {
+ return Intl.message(
+ 'Multiple choice $optionName',
+ name: 'check_option_select_token',
+ desc: '',
+ args: [optionName],
+ );
+ }
+
+ /// `Option is required. Select at lease an option then tap Next.`
+ String get check_option_is_required {
+ return Intl.message(
+ 'Option is required. Select at lease an option then tap Next.',
+ name: 'check_option_is_required',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Optional. You can tap Next without selection.`
+ String get check_option_is_optional {
+ return Intl.message(
+ 'Optional. You can tap Next without selection.',
+ name: 'check_option_is_optional',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Check out`
+ String get checkout {
+ return Intl.message(
+ 'Check out',
+ name: 'checkout',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Are you sure you want to remove the item?`
+ String get are_you_sure_to_remove_the_item {
+ return Intl.message(
+ 'Are you sure you want to remove the item?',
+ name: 'are_you_sure_to_remove_the_item',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Out of stock`
+ String get out_of_stock {
+ return Intl.message(
+ 'Out of stock',
+ name: 'out_of_stock',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The product quantity is insufficient.`
+ String get product_insufficient {
+ return Intl.message(
+ 'The product quantity is insufficient.',
+ name: 'product_insufficient',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Your basket is empty.`
+ String get your_basket_is_empty {
+ return Intl.message(
+ 'Your basket is empty.',
+ name: 'your_basket_is_empty',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Empty basket`
+ String get empty_basket {
+ return Intl.message(
+ 'Empty basket',
+ name: 'empty_basket',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery fee {shippingfee}+`
+ String delivery_fee(Object shippingfee) {
+ return Intl.message(
+ 'Delivery fee $shippingfee+',
+ name: 'delivery_fee',
+ desc: '',
+ args: [shippingfee],
+ );
+ }
+
+ /// `Are you sure you want to empty the basket?`
+ String get are_you_sure_to_empty_basket {
+ return Intl.message(
+ 'Are you sure you want to empty the basket?',
+ name: 'are_you_sure_to_empty_basket',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Search product`
+ String get search_product {
+ return Intl.message(
+ 'Search product',
+ name: 'search_product',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Search products`
+ String get search_products {
+ return Intl.message(
+ 'Search products',
+ name: 'search_products',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter product keyword`
+ String get enter_product_keyword {
+ return Intl.message(
+ 'Enter product keyword',
+ name: 'enter_product_keyword',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Promotions`
+ String get promotions {
+ return Intl.message(
+ 'Promotions',
+ name: 'promotions',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Products`
+ String get products {
+ return Intl.message(
+ 'Products',
+ name: 'products',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Comments`
+ String get comments {
+ return Intl.message(
+ 'Comments',
+ name: 'comments',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No comments yet`
+ String get no_comments_yet {
+ return Intl.message(
+ 'No comments yet',
+ name: 'no_comments_yet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Response from store`
+ String get response_from_store {
+ return Intl.message(
+ 'Response from store',
+ name: 'response_from_store',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Show more`
+ String get show_more {
+ return Intl.message(
+ 'Show more',
+ name: 'show_more',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Show less`
+ String get show_less {
+ return Intl.message(
+ 'Show less',
+ name: 'show_less',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `{hours, plural, one{1 hr} other{{hours} hrs}}`
+ String hour_token(num hours) {
+ return Intl.plural(
+ hours,
+ one: '1 hr',
+ other: '$hours hrs',
+ name: 'hour_token',
+ desc: '',
+ args: [hours],
+ );
+ }
+
+ /// `{minutes, plural, one{1 min} other{{minutes} mins}}`
+ String minute_token(num minutes) {
+ return Intl.plural(
+ minutes,
+ one: '1 min',
+ other: '$minutes mins',
+ name: 'minute_token',
+ desc: '',
+ args: [minutes],
+ );
+ }
+
+ /// `${minamount}+`
+ String min_order_amount_token(Object minamount) {
+ return Intl.message(
+ '\$$minamount+',
+ name: 'min_order_amount_token',
+ desc: '',
+ args: [minamount],
+ );
+ }
+
+ /// `Delivery ${shipfee}+`
+ String min_shipping_fee(Object shipfee) {
+ return Intl.message(
+ 'Delivery \$$shipfee+',
+ name: 'min_shipping_fee',
+ desc: '',
+ args: [shipfee],
+ );
+ }
+
+ /// `Store introduction`
+ String get store_introduction {
+ return Intl.message(
+ 'Store introduction',
+ name: 'store_introduction',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Store policy`
+ String get store_policy {
+ return Intl.message(
+ 'Store policy',
+ name: 'store_policy',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// ` {sold_qty} sold/mo`
+ String sold_per_month_token(Object sold_qty) {
+ return Intl.message(
+ ' $sold_qty sold/mo',
+ name: 'sold_per_month_token',
+ desc: '',
+ args: [sold_qty],
+ );
+ }
+
+ /// `Detail`
+ String get detail {
+ return Intl.message(
+ 'Detail',
+ name: 'detail',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Specification`
+ String get specification {
+ return Intl.message(
+ 'Specification',
+ name: 'specification',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Weight: {weight}`
+ String weight_token(Object weight) {
+ return Intl.message(
+ 'Weight: $weight',
+ name: 'weight_token',
+ desc: '',
+ args: [weight],
+ );
+ }
+
+ /// `Dimentions: {length}(L)x{width}(W)x{height}(H)`
+ String dimentions_token(Object length, Object width, Object height) {
+ return Intl.message(
+ 'Dimentions: $length(L)x$width(W)x$height(H)',
+ name: 'dimentions_token',
+ desc: '',
+ args: [length, width, height],
+ );
+ }
+
+ /// `Loading...`
+ String get loading {
+ return Intl.message(
+ 'Loading...',
+ name: 'loading',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Store closed`
+ String get store_closed {
+ return Intl.message(
+ 'Store closed',
+ name: 'store_closed',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Closed`
+ String get closed {
+ return Intl.message(
+ 'Closed',
+ name: 'closed',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order now and delivery start at {hour}:00.`
+ String book_now_delivery_later_token(Object hour) {
+ return Intl.message(
+ 'Order now and delivery start at $hour:00.',
+ name: 'book_now_delivery_later_token',
+ desc: '',
+ args: [hour],
+ );
+ }
+
+ /// `Order confirmation`
+ String get confirm_order {
+ return Intl.message(
+ 'Order confirmation',
+ name: 'confirm_order',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery`
+ String get delivery {
+ return Intl.message(
+ 'Delivery',
+ name: 'delivery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pickup`
+ String get pickup {
+ return Intl.message(
+ 'Pickup',
+ name: 'pickup',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery ASAP`
+ String get delivery_now {
+ return Intl.message(
+ 'Delivery ASAP',
+ name: 'delivery_now',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `End of the list`
+ String get end_of_the_list {
+ return Intl.message(
+ 'End of the list',
+ name: 'end_of_the_list',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Hot sale`
+ String get hot_sale {
+ return Intl.message(
+ 'Hot sale',
+ name: 'hot_sale',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Featured`
+ String get featured_product {
+ return Intl.message(
+ 'Featured',
+ name: 'featured_product',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `OCR scan`
+ String get ocr_scan {
+ return Intl.message(
+ 'OCR scan',
+ name: 'ocr_scan',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `From camera`
+ String get from_camera {
+ return Intl.message(
+ 'From camera',
+ name: 'from_camera',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `From gallery`
+ String get from_gallery {
+ return Intl.message(
+ 'From gallery',
+ name: 'from_gallery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `This feature is not available on the web. Please install the App version.`
+ String get feature_not_available_web {
+ return Intl.message(
+ 'This feature is not available on the web. Please install the App version.',
+ name: 'feature_not_available_web',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Document type`
+ String get document_type {
+ return Intl.message(
+ 'Document type',
+ name: 'document_type',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `UberEats receipt`
+ String get ubereats_receipt {
+ return Intl.message(
+ 'UberEats receipt',
+ name: 'ubereats_receipt',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Business card`
+ String get business_card {
+ return Intl.message(
+ 'Business card',
+ name: 'business_card',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Select a document type`
+ String get select_document_type {
+ return Intl.message(
+ 'Select a document type',
+ name: 'select_document_type',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `English`
+ String get english {
+ return Intl.message(
+ 'English',
+ name: 'english',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Chinese simplified`
+ String get chinese_simplified {
+ return Intl.message(
+ 'Chinese simplified',
+ name: 'chinese_simplified',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Chinese tranditional`
+ String get chinese_traditional {
+ return Intl.message(
+ 'Chinese tranditional',
+ name: 'chinese_traditional',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Document language`
+ String get document_langage {
+ return Intl.message(
+ 'Document language',
+ name: 'document_langage',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Select a language`
+ String get select_document_lanuage {
+ return Intl.message(
+ 'Select a language',
+ name: 'select_document_lanuage',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Submit to generate`
+ String get submit_to_generate {
+ return Intl.message(
+ 'Submit to generate',
+ name: 'submit_to_generate',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Add to basket`
+ String get add_to_basket {
+ return Intl.message(
+ 'Add to basket',
+ name: 'add_to_basket',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No shipping method available.`
+ String get no_delivery_method {
+ return Intl.message(
+ 'No shipping method available.',
+ name: 'no_delivery_method',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The store is under renovation`
+ String get under_renovation {
+ return Intl.message(
+ 'The store is under renovation',
+ name: 'under_renovation',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay now`
+ String get pay_now {
+ return Intl.message(
+ 'Pay now',
+ name: 'pay_now',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Canada Post`
+ String get canada_post {
+ return Intl.message(
+ 'Canada Post',
+ name: 'canada_post',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Canada Post delivery`
+ String get canada_post_delivery {
+ return Intl.message(
+ 'Canada Post delivery',
+ name: 'canada_post_delivery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Table#: {num}`
+ String table_token(Object num) {
+ return Intl.message(
+ 'Table#: $num',
+ name: 'table_token',
+ desc: '',
+ args: [num],
+ );
+ }
+
+ /// `Number of people`
+ String get number_of_people {
+ return Intl.message(
+ 'Number of people',
+ name: 'number_of_people',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please pickup at`
+ String get pickup_at {
+ return Intl.message(
+ 'Please pickup at',
+ name: 'pickup_at',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery time`
+ String get delivery_unavailable {
+ return Intl.message(
+ 'Delivery time',
+ name: 'delivery_unavailable',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Select delivery time`
+ String get select_delivery_time {
+ return Intl.message(
+ 'Select delivery time',
+ name: 'select_delivery_time',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Credit/Coupon`
+ String get credit_coupon {
+ return Intl.message(
+ 'Credit/Coupon',
+ name: 'credit_coupon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Subtotal: {subtotal}`
+ String subtotal_token(Object subtotal) {
+ return Intl.message(
+ 'Subtotal: $subtotal',
+ name: 'subtotal_token',
+ desc: '',
+ args: [subtotal],
+ );
+ }
+
+ /// `Subtotal`
+ String get subtotal {
+ return Intl.message(
+ 'Subtotal',
+ name: 'subtotal',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `{name}({rate}%)`
+ String extra_fee_token(Object name, Object rate) {
+ return Intl.message(
+ '$name($rate%)',
+ name: 'extra_fee_token',
+ desc: '',
+ args: [name, rate],
+ );
+ }
+
+ /// `Total`
+ String get total {
+ return Intl.message(
+ 'Total',
+ name: 'total',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `We don't deliver at this time.`
+ String get checkout_no_deliver {
+ return Intl.message(
+ 'We don\'t deliver at this time.',
+ name: 'checkout_no_deliver',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Payment method`
+ String get payment_method {
+ return Intl.message(
+ 'Payment method',
+ name: 'payment_method',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order remark`
+ String get order_remark {
+ return Intl.message(
+ 'Order remark',
+ name: 'order_remark',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please provide shipping address.`
+ String get please_provide_shipping_address {
+ return Intl.message(
+ 'Please provide shipping address.',
+ name: 'please_provide_shipping_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The address is beyond the scope of delivery.`
+ String get over_delivery_distance {
+ return Intl.message(
+ 'The address is beyond the scope of delivery.',
+ name: 'over_delivery_distance',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pickup discount`
+ String get pickup_discount {
+ return Intl.message(
+ 'Pickup discount',
+ name: 'pickup_discount',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Service fee`
+ String get service_fee {
+ return Intl.message(
+ 'Service fee',
+ name: 'service_fee',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pending`
+ String get pending {
+ return Intl.message(
+ 'Pending',
+ name: 'pending',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Accept`
+ String get order_acceipt {
+ return Intl.message(
+ 'Accept',
+ name: 'order_acceipt',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Processing`
+ String get order_processing {
+ return Intl.message(
+ 'Processing',
+ name: 'order_processing',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Complete`
+ String get order_complete {
+ return Intl.message(
+ 'Complete',
+ name: 'order_complete',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Cancelled`
+ String get order_cancelled {
+ return Intl.message(
+ 'Cancelled',
+ name: 'order_cancelled',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `My orders`
+ String get my_orders {
+ return Intl.message(
+ 'My orders',
+ name: 'my_orders',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `and {qty} items more`
+ String and_more_item_token(Object qty) {
+ return Intl.message(
+ 'and $qty items more',
+ name: 'and_more_item_token',
+ desc: '',
+ args: [qty],
+ );
+ }
+
+ /// `Order again`
+ String get order_again {
+ return Intl.message(
+ 'Order again',
+ name: 'order_again',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order detail`
+ String get order_detail {
+ return Intl.message(
+ 'Order detail',
+ name: 'order_detail',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery Info.`
+ String get delivery_info {
+ return Intl.message(
+ 'Delivery Info.',
+ name: 'delivery_info',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery address`
+ String get delivery_address {
+ return Intl.message(
+ 'Delivery address',
+ name: 'delivery_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pickup address`
+ String get pickup_address {
+ return Intl.message(
+ 'Pickup address',
+ name: 'pickup_address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Schedule delivery`
+ String get schedule_delivery {
+ return Intl.message(
+ 'Schedule delivery',
+ name: 'schedule_delivery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery method`
+ String get delivery_method {
+ return Intl.message(
+ 'Delivery method',
+ name: 'delivery_method',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Store delivery`
+ String get store_delivery {
+ return Intl.message(
+ 'Store delivery',
+ name: 'store_delivery',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order info.`
+ String get order_info {
+ return Intl.message(
+ 'Order info.',
+ name: 'order_info',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order No.`
+ String get order_number {
+ return Intl.message(
+ 'Order No.',
+ name: 'order_number',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The order amount does not meet the minimum requirements.`
+ String get amount_not_meet {
+ return Intl.message(
+ 'The order amount does not meet the minimum requirements.',
+ name: 'amount_not_meet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please select Canada Post shipping rate.`
+ String get select_canada_post_shipping_rate {
+ return Intl.message(
+ 'Please select Canada Post shipping rate.',
+ name: 'select_canada_post_shipping_rate',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Mon`
+ String get mon {
+ return Intl.message(
+ 'Mon',
+ name: 'mon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Monday`
+ String get monday {
+ return Intl.message(
+ 'Monday',
+ name: 'monday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Tue`
+ String get tue {
+ return Intl.message(
+ 'Tue',
+ name: 'tue',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Tuesday`
+ String get tuesday {
+ return Intl.message(
+ 'Tuesday',
+ name: 'tuesday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Wed`
+ String get wed {
+ return Intl.message(
+ 'Wed',
+ name: 'wed',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Wednesday`
+ String get wednesday {
+ return Intl.message(
+ 'Wednesday',
+ name: 'wednesday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Thu`
+ String get thu {
+ return Intl.message(
+ 'Thu',
+ name: 'thu',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Thursday`
+ String get thursday {
+ return Intl.message(
+ 'Thursday',
+ name: 'thursday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Fri`
+ String get fri {
+ return Intl.message(
+ 'Fri',
+ name: 'fri',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Friday`
+ String get friday {
+ return Intl.message(
+ 'Friday',
+ name: 'friday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Sat`
+ String get sat {
+ return Intl.message(
+ 'Sat',
+ name: 'sat',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Saturday`
+ String get saturday {
+ return Intl.message(
+ 'Saturday',
+ name: 'saturday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Sun`
+ String get sun {
+ return Intl.message(
+ 'Sun',
+ name: 'sun',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Sunday`
+ String get sunday {
+ return Intl.message(
+ 'Sunday',
+ name: 'sunday',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Today`
+ String get today {
+ return Intl.message(
+ 'Today',
+ name: 'today',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Tomorrow`
+ String get tomorrow {
+ return Intl.message(
+ 'Tomorrow',
+ name: 'tomorrow',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery time cannot be determined. Usually we will send it out as soon as possible. If you wish to deliver at a certain time, please state in the remarks.`
+ String get shipping_time_will_schedule {
+ return Intl.message(
+ 'Delivery time cannot be determined. Usually we will send it out as soon as possible. If you wish to deliver at a certain time, please state in the remarks.',
+ name: 'shipping_time_will_schedule',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Select a payment method`
+ String get select_a_payment_method {
+ return Intl.message(
+ 'Select a payment method',
+ name: 'select_a_payment_method',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No payment method specified. Please pay on delivery or pickup.`
+ String get payment_method_not_set {
+ return Intl.message(
+ 'No payment method specified. Please pay on delivery or pickup.',
+ name: 'payment_method_not_set',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No coupon available`
+ String get no_coupon_available {
+ return Intl.message(
+ 'No coupon available',
+ name: 'no_coupon_available',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `{discount}%off`
+ String percentage_discount_token(Object discount) {
+ return Intl.message(
+ '$discount%off',
+ name: 'percentage_discount_token',
+ desc: '',
+ args: [discount],
+ );
+ }
+
+ /// `-${discount}`
+ String discount_amount_token(Object discount) {
+ return Intl.message(
+ '-\$$discount',
+ name: 'discount_amount_token',
+ desc: '',
+ args: [discount],
+ );
+ }
+
+ /// `Pick a coupon`
+ String get pick_a_coupon {
+ return Intl.message(
+ 'Pick a coupon',
+ name: 'pick_a_coupon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Do not redeem`
+ String get dont_use {
+ return Intl.message(
+ 'Do not redeem',
+ name: 'dont_use',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `-${amount}({discount}%off)`
+ String percentage_discount_token2(Object amount, Object discount) {
+ return Intl.message(
+ '-\$$amount($discount%off)',
+ name: 'percentage_discount_token2',
+ desc: '',
+ args: [amount, discount],
+ );
+ }
+
+ /// `Type your order remark`
+ String get type_your_order_remark {
+ return Intl.message(
+ 'Type your order remark',
+ name: 'type_your_order_remark',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Quick input`
+ String get quick_input {
+ return Intl.message(
+ 'Quick input',
+ name: 'quick_input',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Light tase`
+ String get light_tase {
+ return Intl.message(
+ 'Light tase',
+ name: 'light_tase',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No spicy`
+ String get no_spicy {
+ return Intl.message(
+ 'No spicy',
+ name: 'no_spicy',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No onion`
+ String get no_onion {
+ return Intl.message(
+ 'No onion',
+ name: 'no_onion',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No pickle`
+ String get no_pickle {
+ return Intl.message(
+ 'No pickle',
+ name: 'no_pickle',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Enter coupon code`
+ String get enter_coupon_code {
+ return Intl.message(
+ 'Enter coupon code',
+ name: 'enter_coupon_code',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please enter a coupon code.`
+ String get please_enter_coupon_code {
+ return Intl.message(
+ 'Please enter a coupon code.',
+ name: 'please_enter_coupon_code',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Get coupon`
+ String get get_coupon {
+ return Intl.message(
+ 'Get coupon',
+ name: 'get_coupon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `%OFF`
+ String get percent_discount {
+ return Intl.message(
+ '%OFF',
+ name: 'percent_discount',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Expires on {expirationDate}`
+ String expiration_date_token(Object expirationDate) {
+ return Intl.message(
+ 'Expires on $expirationDate',
+ name: 'expiration_date_token',
+ desc: '',
+ args: [expirationDate],
+ );
+ }
+
+ /// `No restriction`
+ String get no_restriction {
+ return Intl.message(
+ 'No restriction',
+ name: 'no_restriction',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No expiration`
+ String get no_expiration {
+ return Intl.message(
+ 'No expiration',
+ name: 'no_expiration',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Redeem`
+ String get redeem_coupon {
+ return Intl.message(
+ 'Redeem',
+ name: 'redeem_coupon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Choose a shipping rate`
+ String get choose_a_shipping_rate {
+ return Intl.message(
+ 'Choose a shipping rate',
+ name: 'choose_a_shipping_rate',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Payment amount`
+ String get payment_amount {
+ return Intl.message(
+ 'Payment amount',
+ name: 'payment_amount',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay later`
+ String get pay_later {
+ return Intl.message(
+ 'Pay later',
+ name: 'pay_later',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay after meal`
+ String get pay_after_meal {
+ return Intl.message(
+ 'Pay after meal',
+ name: 'pay_after_meal',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay with existing cards`
+ String get pay_with_existing_cards {
+ return Intl.message(
+ 'Pay with existing cards',
+ name: 'pay_with_existing_cards',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Add credit card`
+ String get add_credit_card {
+ return Intl.message(
+ 'Add credit card',
+ name: 'add_credit_card',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `This credit card is invalid`
+ String get this_credit_card_is_invalid {
+ return Intl.message(
+ 'This credit card is invalid',
+ name: 'this_credit_card_is_invalid',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Exp: {mon}/{yer}`
+ String expire_token(Object mon, Object yer) {
+ return Intl.message(
+ 'Exp: $mon/$yer',
+ name: 'expire_token',
+ desc: '',
+ args: [mon, yer],
+ );
+ }
+
+ /// `Confirmation`
+ String get confirmation {
+ return Intl.message(
+ 'Confirmation',
+ name: 'confirmation',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Are you srue you want to remove the credit card?`
+ String get are_you_sure_to_remove_the_card {
+ return Intl.message(
+ 'Are you srue you want to remove the credit card?',
+ name: 'are_you_sure_to_remove_the_card',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Payment verification`
+ String get payment_verification {
+ return Intl.message(
+ 'Payment verification',
+ name: 'payment_verification',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Payment verification code has been sent to your mobile phone {mobile}. Please enter the verification code below.`
+ String payment_verification_sent(Object mobile) {
+ return Intl.message(
+ 'Payment verification code has been sent to your mobile phone $mobile. Please enter the verification code below.',
+ name: 'payment_verification_sent',
+ desc: '',
+ args: [mobile],
+ );
+ }
+
+ /// `Wrong payment verification code. Please check and enter again.`
+ String get wrong_payment_verification_code {
+ return Intl.message(
+ 'Wrong payment verification code. Please check and enter again.',
+ name: 'wrong_payment_verification_code',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay with`
+ String get pay_with {
+ return Intl.message(
+ 'Pay with',
+ name: 'pay_with',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay with {method}`
+ String pay_with_token(Object method) {
+ return Intl.message(
+ 'Pay with $method',
+ name: 'pay_with_token',
+ desc: '',
+ args: [method],
+ );
+ }
+
+ /// `You have no orders yet`
+ String get you_have_no_orders_yet {
+ return Intl.message(
+ 'You have no orders yet',
+ name: 'you_have_no_orders_yet',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Comment`
+ String get comment {
+ return Intl.message(
+ 'Comment',
+ name: 'comment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Delivery guy`
+ String get delivery_guy {
+ return Intl.message(
+ 'Delivery guy',
+ name: 'delivery_guy',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `The delivery guy are {km} away from the customer, and it will take about {time} to deliver.`
+ String delivery_distance_token(Object km, Object time) {
+ return Intl.message(
+ 'The delivery guy are $km away from the customer, and it will take about $time to deliver.',
+ name: 'delivery_distance_token',
+ desc: '',
+ args: [km, time],
+ );
+ }
+
+ /// `Copy`
+ String get copy {
+ return Intl.message(
+ 'Copy',
+ name: 'copy',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order number copied to clipboard`
+ String get order_number_copied_to_clipboard {
+ return Intl.message(
+ 'Order number copied to clipboard',
+ name: 'order_number_copied_to_clipboard',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Online payment`
+ String get online_payment {
+ return Intl.message(
+ 'Online payment',
+ name: 'online_payment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order datetime`
+ String get order_datetime {
+ return Intl.message(
+ 'Order datetime',
+ name: 'order_datetime',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Payment status`
+ String get payment_status {
+ return Intl.message(
+ 'Payment status',
+ name: 'payment_status',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Paid`
+ String get paid {
+ return Intl.message(
+ 'Paid',
+ name: 'paid',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Unpaid`
+ String get unpaid {
+ return Intl.message(
+ 'Unpaid',
+ name: 'unpaid',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Order fulfillment`
+ String get order_fulfillment {
+ return Intl.message(
+ 'Order fulfillment',
+ name: 'order_fulfillment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Cancel order`
+ String get cancel_order {
+ return Intl.message(
+ 'Cancel order',
+ name: 'cancel_order',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Store`
+ String get store {
+ return Intl.message(
+ 'Store',
+ name: 'store',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Customer`
+ String get customer {
+ return Intl.message(
+ 'Customer',
+ name: 'customer',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Are you sure you want to cancel the order?`
+ String get are_you_sure_to_cancel_the_order {
+ return Intl.message(
+ 'Are you sure you want to cancel the order?',
+ name: 'are_you_sure_to_cancel_the_order',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `No`
+ String get no {
+ return Intl.message(
+ 'No',
+ name: 'no',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Yes`
+ String get yes {
+ return Intl.message(
+ 'Yes',
+ name: 'yes',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay`
+ String get pay {
+ return Intl.message(
+ 'Pay',
+ name: 'pay',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Tracking information will be provided when available.`
+ String get no_instance_delivery_desc {
+ return Intl.message(
+ 'Tracking information will be provided when available.',
+ name: 'no_instance_delivery_desc',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please type your comment.`
+ String get comment_empty {
+ return Intl.message(
+ 'Please type your comment.',
+ name: 'comment_empty',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Thank you for your comment.`
+ String get thank_you_for_your_comment {
+ return Intl.message(
+ 'Thank you for your comment.',
+ name: 'thank_you_for_your_comment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Add pictures`
+ String get add_pictures {
+ return Intl.message(
+ 'Add pictures',
+ name: 'add_pictures',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Input your comment`
+ String get input_your_comment {
+ return Intl.message(
+ 'Input your comment',
+ name: 'input_your_comment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `New comment`
+ String get new_comment {
+ return Intl.message(
+ 'New comment',
+ name: 'new_comment',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Coupons`
+ String get coupons {
+ return Intl.message(
+ 'Coupons',
+ name: 'coupons',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `General coupon`
+ String get general_coupon {
+ return Intl.message(
+ 'General coupon',
+ name: 'general_coupon',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Available for order over ${value}`
+ String available_for_order_over_token(Object value) {
+ return Intl.message(
+ 'Available for order over \$$value',
+ name: 'available_for_order_over_token',
+ desc: '',
+ args: [value],
+ );
+ }
+
+ /// `Includes`
+ String get includes {
+ return Intl.message(
+ 'Includes',
+ name: 'includes',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `By Emails`
+ String get by_email {
+ return Intl.message(
+ 'By Emails',
+ name: 'by_email',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `By phone`
+ String get by_phone {
+ return Intl.message(
+ 'By phone',
+ name: 'by_phone',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Address`
+ String get address {
+ return Intl.message(
+ 'Address',
+ name: 'address',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `View on Google maps`
+ String get view_on_google_map {
+ return Intl.message(
+ 'View on Google maps',
+ name: 'view_on_google_map',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Toll free: `
+ String get toll_free {
+ return Intl.message(
+ 'Toll free: ',
+ name: 'toll_free',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Group number can be found...`
+ String get group_number_can_be_found {
+ return Intl.message(
+ 'Group number can be found...',
+ name: 'group_number_can_be_found',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Group number`
+ String get group_number {
+ return Intl.message(
+ 'Group number',
+ name: 'group_number',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Please enter your group number.`
+ String get please_enter_group_number {
+ return Intl.message(
+ 'Please enter your group number.',
+ name: 'please_enter_group_number',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Group Lisence Renewal`
+ String get group_license_renewal {
+ return Intl.message(
+ 'Group Lisence Renewal',
+ name: 'group_license_renewal',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Renewal fee`
+ String get renewal_fee {
+ return Intl.message(
+ 'Renewal fee',
+ name: 'renewal_fee',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Tax`
+ String get tax {
+ return Intl.message(
+ 'Tax',
+ name: 'tax',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Pay ${amount} now`
+ String pay_amount_token(Object amount) {
+ return Intl.message(
+ 'Pay \$$amount now',
+ name: 'pay_amount_token',
+ desc: '',
+ args: [amount],
+ );
+ }
+
+ /// `Expired at`
+ String get expired_at {
+ return Intl.message(
+ 'Expired at',
+ name: 'expired_at',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `After renewal`
+ String get after_renewed {
+ return Intl.message(
+ 'After renewal',
+ name: 'after_renewed',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Expiration date`
+ String get expiration_date {
+ return Intl.message(
+ 'Expiration date',
+ name: 'expiration_date',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Purchase/Renew service`
+ String get purchase_renew_service {
+ return Intl.message(
+ 'Purchase/Renew service',
+ name: 'purchase_renew_service',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Service description`
+ String get service_descritpion {
+ return Intl.message(
+ 'Service description',
+ name: 'service_descritpion',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Your group`
+ String get your_group {
+ return Intl.message(
+ 'Your group',
+ name: 'your_group',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Current plan`
+ String get current_plan {
+ return Intl.message(
+ 'Current plan',
+ name: 'current_plan',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Select a plan`
+ String get select_a_plan {
+ return Intl.message(
+ 'Select a plan',
+ name: 'select_a_plan',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Price`
+ String get price {
+ return Intl.message(
+ 'Price',
+ name: 'price',
+ desc: '',
+ args: [],
+ );
+ }
}
class AppLocalizationDelegate extends LocalizationsDelegate {
diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb
index d915650..d21b2ac 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -30,5 +30,367 @@
"login": "Login",
"logout": "Logout",
"download_with_token": "Download at {oss}",
- "install_in_store": "Install in store"
+ "install_in_store": "Install in store",
+ "igoshow": "iGoShow",
+ "mobile_email_username": "Mobile, Email or MiniOffice username",
+ "this_field_is_required": "This field is required.",
+ "password": "Password",
+ "password_is_required": "Password is required.",
+ "new_user_question": "New user?",
+ "forgot_password_question": "Forgot password?",
+ "error": "Error",
+ "ok": "OK",
+ "please_login": "Please login",
+ "login_instruction": "If you have already registered an account, please use the following form to login.\nIf you are a MiniOffice user, you can directly enter your MiniOffice username and password to login.",
+ "me": "Me",
+ "wallet": "Wallet",
+ "red_coupon": "Coupon",
+ "point": "Points",
+ "my_favorites": "My favorites",
+ "my_addresses": "My addresses",
+ "my_cards": "My cards",
+ "my_support": "My support",
+ "warning": "Warning",
+ "email_needed": "Email needed",
+ "cancel": "Cancel",
+ "business_cooperation": "Business cooperation",
+ "change_password": "Change password",
+ "old_password": "Old password",
+ "current_password_is_required": "Current password is required.",
+ "password_again": "Password again",
+ "password_is_not_match_password_again": "Password and confirm password does not match.",
+ "submit": "Submit",
+ "success": "Success",
+ "password_has_been_changed": "Password has been changed",
+ "profile": "Profile",
+ "basic_info": "Basic info.",
+ "avatar": "Avatar",
+ "nick_name": "Nick name",
+ "account_binding": "Account binding",
+ "mobile_number": "Mobile number",
+ "not_binding": "Not binding",
+ "email": "Email",
+ "get_picture": "Get picture",
+ "get_picture_from": "Get picture from...",
+ "gallery": "Gallery",
+ "camera": "Camera",
+ "please_select": "Please select",
+ "please_select_an_image": "Please select an image",
+ "select": "Select",
+ "error_read_file": "Error occurred while reading the file.",
+ "change_nickname": "Change nickname",
+ "enter_new_nickname": "Enter new nickname",
+ "nickname_is_required": "Nickname is required",
+ "submit_to_change": "Submit to change",
+ "are_you_sure_to_logout": "Are you sure you want to logout?",
+ "yes_i_am_sure": "Yes! I am sure.",
+ "registration": "Registration",
+ "user_registration": "User registration",
+ "mobile_or_email": "Mobile or email",
+ "mobile_or_email_is_required": "Mobile or email is required",
+ "verification_code": "Verification code",
+ "verification_code_is_required": "Verification code is required",
+ "register": "Register",
+ "get_code": "Get code",
+ "verification_code_sent": "Verification code has been sent.",
+ "enter_mobile_or_email": "Enter mobile or email",
+ "get_code_token": "Retry after {second}s",
+ "get_code_again": "Get code again",
+ "credit_debit_card": "Credit or debit card",
+ "credit_card": "Credit card",
+ "alipay": "Alipay",
+ "wechatpay": "Wechat pay",
+ "paypal": "Paypal",
+ "pay_on_deliery_pickup": "Pay on delivery or pickup",
+ "pay_on_deliery": "Pay on delivery",
+ "set_password": "Set password",
+ "user_account_created_success": "User account created success",
+ "forgot_password": "Forgot password",
+ "reset_password": "Reset password",
+ "verify": "Verify",
+ "reset_password_success": "Reset password success",
+ "change_mobile": "Change mobile number",
+ "change_email": "Change email address",
+ "mobile_is_required": "Mobile is required",
+ "email_is_required": "Email is required",
+ "the_mobile_number_is_same_as_current": "The mobile number is the same as the current one.",
+ "the_email_is_same_as_current": "The email is the same as the current one.",
+ "update_success": "Updated success",
+ "edit_address": "Edit address",
+ "no_address_yet": "You have not entered any address.",
+ "contact_name": "Contact name",
+ "contact_name_is_required": "Contact name is required",
+ "mr": "Mr.",
+ "ms": "Ms.",
+ "mobile_phone_number": "Mobile number",
+ "mobile_phone_number_is_required": "Mobile number is required",
+ "street_line_1": "Street line 1",
+ "street_line_1_is_required": "Street line 1 is required",
+ "street_line_2": "Street line 2",
+ "city": "City",
+ "city_is_required": "City is required",
+ "province": "Province",
+ "postal_code": "Postal code",
+ "postal_code_is_required": "Postal code is required",
+ "optional_information": "Optional Info.",
+ "email_is_not_valid": "Email is not valid",
+ "fax": "Fax",
+ "delete": "Delete",
+ "are_you_sure_to_delete_the_address": "Are you sure you want to delete the address?",
+ "save": "Save",
+ "the_address_has_been_deleted": "The address has been deleted.",
+ "search_place": "Search place",
+ "enter_delivery_address": "Enter delivery address",
+ "empty_address_change_keyword": "No address found. Tap here to skip address lookup.",
+ "empty_result_change_keyword": "No data found, please change keyword and try again.",
+ "new_address": "New address",
+ "change_password_desc": "Please enter the old password and your desired new password.",
+ "back": "Back",
+ "revise_user_profile": "Revise user profile",
+ "learn_more_about_minipos": "Learn more about MiniPOS",
+ "learn_more_about_igoshow": "Learn more about iGoShow",
+ "downloads": "Downloads",
+ "user_registration_desc": "Please enter your mobile phone number then click the 'Get code' button to get the validation code.",
+ "forgot_password_description": "Enter the Email or mobile number you used when registering, and then click the 'Get code' button to get the validation code.",
+ "change_mobile_desc": "Enter your new mobile number, and then click 'Get code' button to get the validation code.",
+ "change_email_desc": "Enter your new Email, and then click 'Get code' button to get the validation code.",
+ "add_new_address": "Add new address",
+ "no_ticket_yet": "There is no ticket yet. If you have any question/issue please tap the plus icon above to create a ticket.",
+ "today_with_time": "Today {time}",
+ "tomorrow_with_time": "Tomorrow {time}",
+ "followups_token": "{num} follow-ups",
+ "pull_up_to_load_more": "Pull up to load more",
+ "load_failed_retry": "Load failed, please retry",
+ "release_to_load_more": "Release to load more",
+ "no_more_record": "No more record",
+ "add_new_ticket": "Create a new ticket",
+ "new_ticket": "New ticket",
+ "add_new_ticket_desc": "Please enter your question.",
+ "your_question_issue": "Your question/issue",
+ "are_you_sure_to_remove_the_picture": "Are you sure you want to remove the picture?",
+ "attach_pictures": "Attach pictures",
+ "attach_pictures_desc": "Upload pictures(screen shot) to make your question clearer.",
+ "ticket_created_success": "Ticket has been created successfully.",
+ "view_ticket": "View ticket",
+ "ticket_number_token": "Ticket #{num}",
+ "close": "Close",
+ "follow_ups": "Follow ups",
+ "reply": "Reply",
+ "the_ticket_is_closed_desc": "The ticket has been closed. If you still have questions, please create a new ticket.",
+ "your_reply": "Your reply",
+ "no_blog_yet": "There is no blog to show yet.",
+ "view_blog": "View blog",
+ "reset_password_desc": "Enter the new password you desired twice.",
+ "set_password_desc": "Enter the password you desired twice.",
+ "order_more": "{minprice} more",
+ "select_options": "Select options",
+ "previous": "Previous",
+ "next": "Next",
+ "finish": "Finish",
+ "radio_option_select_token": "Please choice {optionName}.",
+ "radio_option_is_required": "Option is required. Select an option then tap Next.",
+ "radio_option_is_optional": "Optional. You can tap Next without selection.",
+ "check_option_select_token": "Multiple choice {optionName}",
+ "check_option_is_required": "Option is required. Select at lease an option then tap Next.",
+ "check_option_is_optional": "Optional. You can tap Next without selection.",
+ "checkout": "Check out",
+ "are_you_sure_to_remove_the_item": "Are you sure you want to remove the item?",
+ "out_of_stock": "Out of stock",
+ "product_insufficient": "The product quantity is insufficient.",
+ "your_basket_is_empty": "Your basket is empty.",
+ "empty_basket": "Empty basket",
+ "delivery_fee": "Delivery fee {shippingfee}+",
+ "are_you_sure_to_empty_basket": "Are you sure you want to empty the basket?",
+ "search_product": "Search product",
+ "search_products": "Search products",
+ "enter_product_keyword": "Enter product keyword",
+ "promotions": "Promotions",
+ "products": "Products",
+ "comments": "Comments",
+ "no_comments_yet": "No comments yet",
+ "response_from_store": "Response from store",
+ "show_more": "Show more",
+ "show_less": "Show less",
+ "hour_token": "{hours, plural, one{1 hr} other{{hours} hrs}}",
+ "minute_token": "{minutes, plural, one{1 min} other{{minutes} mins}}",
+ "min_order_amount_token": "${minamount}+",
+ "min_shipping_fee": "Delivery ${shipfee}+",
+ "store_introduction": "Store introduction",
+ "store_policy": "Store policy",
+ "sold_per_month_token": " {sold_qty} sold/mo",
+ "detail": "Detail",
+ "specification": "Specification",
+ "weight_token": "Weight: {weight}",
+ "dimentions_token": "Dimentions: {length}(L)x{width}(W)x{height}(H)",
+ "loading": "Loading...",
+ "store_closed": "Store closed",
+ "closed": "Closed",
+ "book_now_delivery_later_token": "Order now and delivery start at {hour}:00.",
+ "confirm_order": "Order confirmation",
+ "delivery": "Delivery",
+ "pickup": "Pickup",
+ "delivery_now": "Delivery ASAP",
+ "end_of_the_list": "End of the list",
+ "hot_sale": "Hot sale",
+ "featured_product": "Featured",
+ "ocr_scan": "OCR scan",
+ "from_camera": "From camera",
+ "from_gallery": "From gallery",
+ "feature_not_available_web": "This feature is not available on the web. Please install the App version.",
+ "document_type": "Document type",
+ "ubereats_receipt": "UberEats receipt",
+ "business_card": "Business card",
+ "select_document_type": "Select a document type",
+ "english": "English",
+ "chinese_simplified": "Chinese simplified",
+ "chinese_traditional": "Chinese tranditional",
+ "document_langage": "Document language",
+ "select_document_lanuage": "Select a language",
+ "submit_to_generate": "Submit to generate",
+ "add_to_basket": "Add to basket",
+ "no_delivery_method": "No shipping method available.",
+ "under_renovation": "The store is under renovation",
+ "pay_now": "Pay now",
+ "canada_post": "Canada Post",
+ "canada_post_delivery": "Canada Post delivery",
+ "table_token": "Table#: {num}",
+ "number_of_people": "Number of people",
+ "pickup_at": "Please pickup at",
+ "delivery_unavailable": "Delivery time",
+ "select_delivery_time": "Select delivery time",
+ "credit_coupon": "Credit/Coupon",
+ "subtotal_token": "Subtotal: {subtotal}",
+ "subtotal": "Subtotal",
+ "extra_fee_token": "{name}({rate}%)",
+ "total": "Total",
+ "checkout_no_deliver": "We don't deliver at this time.",
+ "payment_method": "Payment method",
+ "order_remark": "Order remark",
+ "please_provide_shipping_address": "Please provide shipping address.",
+ "over_delivery_distance": "The address is beyond the scope of delivery.",
+ "pickup_discount": "Pickup discount",
+ "service_fee": "Service fee",
+ "pending": "Pending",
+ "order_acceipt": "Accept",
+ "order_processing": "Processing",
+ "order_complete": "Complete",
+ "order_cancelled": "Cancelled",
+ "my_orders": "My orders",
+ "and_more_item_token": "and {qty} items more",
+ "order_again": "Order again",
+ "order_detail": "Order detail",
+ "delivery_info": "Delivery Info.",
+ "delivery_address": "Delivery address",
+ "pickup_address": "Pickup address",
+ "schedule_delivery": "Schedule delivery",
+ "delivery_method": "Delivery method",
+ "store_delivery": "Store delivery",
+ "order_info": "Order info.",
+ "order_number": "Order No.",
+ "amount_not_meet": "The order amount does not meet the minimum requirements.",
+ "select_canada_post_shipping_rate": "Please select Canada Post shipping rate.",
+ "mon": "Mon",
+ "monday": "Monday",
+ "tue": "Tue",
+ "tuesday": "Tuesday",
+ "wed": "Wed",
+ "wednesday": "Wednesday",
+ "thu": "Thu",
+ "thursday": "Thursday",
+ "fri": "Fri",
+ "friday": "Friday",
+ "sat": "Sat",
+ "saturday": "Saturday",
+ "sun": "Sun",
+ "sunday": "Sunday",
+ "today": "Today",
+ "tomorrow": "Tomorrow",
+ "shipping_time_will_schedule": "Delivery time cannot be determined. Usually we will send it out as soon as possible. If you wish to deliver at a certain time, please state in the remarks.",
+ "select_a_payment_method": "Select a payment method",
+ "payment_method_not_set": "No payment method specified. Please pay on delivery or pickup.",
+ "no_coupon_available": "No coupon available",
+ "percentage_discount_token": "{discount}%off",
+ "discount_amount_token": "-${discount}",
+ "pick_a_coupon": "Pick a coupon",
+ "dont_use": "Do not redeem",
+ "percentage_discount_token2": "-${amount}({discount}%off)",
+ "type_your_order_remark": "Type your order remark",
+ "quick_input": "Quick input",
+ "light_tase": "Light tase",
+ "no_spicy": "No spicy",
+ "no_onion": "No onion",
+ "no_pickle": "No pickle",
+ "enter_coupon_code": "Enter coupon code",
+ "please_enter_coupon_code": "Please enter a coupon code.",
+ "get_coupon": "Get coupon",
+ "percent_discount": "%OFF",
+ "expiration_date_token": "Expires on {expirationDate}",
+ "no_restriction": "No restriction",
+ "no_expiration": "No expiration",
+ "redeem_coupon": "Redeem",
+ "choose_a_shipping_rate": "Choose a shipping rate",
+ "payment_amount": "Payment amount",
+ "pay_later": "Pay later",
+ "pay_after_meal": "Pay after meal",
+ "pay_with_existing_cards": "Pay with existing cards",
+ "add_credit_card": "Add credit card",
+ "this_credit_card_is_invalid": "This credit card is invalid",
+ "expire_token": "Exp: {mon}/{yer}",
+ "confirmation": "Confirmation",
+ "are_you_sure_to_remove_the_card": "Are you srue you want to remove the credit card?",
+ "payment_verification": "Payment verification",
+ "payment_verification_sent": "Payment verification code has been sent to your mobile phone {mobile}. Please enter the verification code below.",
+ "wrong_payment_verification_code": "Wrong payment verification code. Please check and enter again.",
+ "pay_with": "Pay with",
+ "pay_with_token": "Pay with {method}",
+ "you_have_no_orders_yet": "You have no orders yet",
+ "comment": "Comment",
+ "delivery_guy": "Delivery guy",
+ "delivery_distance_token": "The delivery guy are {km} away from the customer, and it will take about {time} to deliver.",
+ "copy": "Copy",
+ "order_number_copied_to_clipboard": "Order number copied to clipboard",
+ "online_payment": "Online payment",
+ "order_datetime": "Order datetime",
+ "payment_status": "Payment status",
+ "paid": "Paid",
+ "unpaid": "Unpaid",
+ "order_fulfillment": "Order fulfillment",
+ "cancel_order": "Cancel order",
+ "store": "Store",
+ "customer": "Customer",
+ "are_you_sure_to_cancel_the_order": "Are you sure you want to cancel the order?",
+ "no": "No",
+ "yes": "Yes",
+ "pay": "Pay",
+ "no_instance_delivery_desc": "Tracking information will be provided when available.",
+ "comment_empty": "Please type your comment.",
+ "thank_you_for_your_comment": "Thank you for your comment.",
+ "add_pictures": "Add pictures",
+ "input_your_comment": "Input your comment",
+ "new_comment": "New comment",
+ "coupons": "Coupons",
+ "general_coupon": "General coupon",
+ "available_for_order_over_token": "Available for order over ${value}",
+ "includes": "Includes",
+ "by_email": "By Emails",
+ "by_phone": "By phone",
+ "address": "Address",
+ "view_on_google_map": "View on Google maps",
+ "toll_free": "Toll free: ",
+ "group_number_can_be_found": "Group number can be found...",
+ "group_number": "Group number",
+ "please_enter_group_number": "Please enter your group number.",
+ "group_license_renewal": "Group Lisence Renewal",
+ "renewal_fee": "Renewal fee",
+ "tax": "Tax",
+ "pay_amount_token": "Pay ${amount} now",
+ "expired_at": "Expired at",
+ "after_renewed": "After renewal",
+ "expiration_date": "Expiration date",
+ "purchase_renew_service": "Purchase/Renew service",
+ "service_descritpion": "Service description",
+ "your_group": "Your group",
+ "current_plan": "Current plan",
+ "select_a_plan": "Select a plan",
+ "price": "Price"
}
\ No newline at end of file
diff --git a/lib/l10n/intl_zh_CN.arb b/lib/l10n/intl_zh_CN.arb
index d1854b8..597bcee 100644
--- a/lib/l10n/intl_zh_CN.arb
+++ b/lib/l10n/intl_zh_CN.arb
@@ -30,5 +30,363 @@
"login": "登入",
"logout": "登出",
"download_with_token": "在{oss}下载",
- "install_in_store": "店内安装"
+ "install_in_store": "店内安装",
+ "igoshow": "iGoShow",
+ "mobile_email_username": "手机号码,Email或MiniOffice用户名",
+ "this_field_is_required": "该字段必填。",
+ "password": "密码",
+ "password_is_required": "密码必填。",
+ "new_user_question": "新用户?",
+ "forgot_password_question": "忘记密码?",
+ "error": "错误",
+ "ok": "确定",
+ "please_login": "请登陆",
+ "login_instruction": "如果您已经注册了账号,请使用如下表单登陆。\n如果您是MiniOffice的用户,您可直接输入您的MiniOffice用户名和密码登陆。",
+ "me": "我的",
+ "wallet": "钱包",
+ "red_coupon": "红包",
+ "point": "积分",
+ "my_favorites": "我的收藏",
+ "my_addresses": "我的地址",
+ "my_cards": "我的卡",
+ "my_support": "支持",
+ "warning": "注意",
+ "email_needed": "需要电子邮箱",
+ "cancel": "取消",
+ "business_cooperation": "商业合作",
+ "change_password": "修改密码",
+ "old_password": "旧密码",
+ "current_password_is_required": "需要当前密码",
+ "password_again": "再输入密码",
+ "password_is_not_match_password_again": "两次输入密码不一致。",
+ "submit": "提交",
+ "success": "成功",
+ "password_has_been_changed": "密码修改成功",
+ "profile": "个人资料",
+ "basic_info": "基本信息",
+ "avatar": "头像",
+ "nick_name": "昵称",
+ "account_binding": "账号绑定",
+ "mobile_number": "手机号码",
+ "not_binding": "未绑定",
+ "email": "电子邮箱",
+ "get_picture": "获取图片",
+ "get_picture_from": "从...获取图片",
+ "gallery": "图库",
+ "camera": "相机",
+ "please_select": "请选取",
+ "please_select_an_image": "请选取一张图片",
+ "select": "选取",
+ "error_read_file": "读取文件过程中出错。",
+ "change_nickname": "修改昵称",
+ "enter_new_nickname": "输入新昵称",
+ "nickname_is_required": "昵称不能为空",
+ "submit_to_change": "提交修改",
+ "are_you_sure_to_logout": "您确定要登出吗?",
+ "yes_i_am_sure": "是的!我确定。",
+ "registration": "注册",
+ "user_registration": "用户注册",
+ "mobile_or_email": "手机号码或电子邮箱",
+ "mobile_or_email_is_required": "必须输入手机号码或电子邮箱地址",
+ "verification_code": "验证码",
+ "verification_code_is_required": "必须输入验证码",
+ "register": "注册",
+ "get_code": "获取验证码",
+ "verification_code_sent": "验证码已经发送。",
+ "enter_mobile_or_email": "输入手机号码或电子邮箱地址",
+ "get_code_token": "{second}秒后重试",
+ "get_code_again": "重新获取验证码",
+ "credit_debit_card": "信用卡或银行卡",
+ "credit_card": "信用卡",
+ "alipay": "支付宝",
+ "wechatpay": "微信支付",
+ "paypal": "Paypal",
+ "pay_on_deliery_pickup": "自提或到货付款",
+ "pay_on_deliery": "到货付款",
+ "set_password": "设置密码",
+ "user_account_created_success": "用户账号成功创建",
+ "forgot_password": "忘记密码",
+ "reset_password": "重置密码",
+ "verify": "验证",
+ "reset_password_success": "重置密码成功",
+ "change_mobile": "修改手机号码",
+ "change_email": "修改电子邮箱",
+ "mobile_is_required": "手机号码必填",
+ "email_is_required": "电子邮箱必填",
+ "the_mobile_number_is_same_as_current": "手机号码和当前的是一样的。",
+ "the_email_is_same_as_current": "电子邮箱和当前的是一样的。",
+ "update_success": "更新成功",
+ "edit_address": "修改地址",
+ "no_address_yet": "您还没有输入任何地址。",
+ "contact_name": "联系人姓名",
+ "contact_name_is_required": "联系人姓名必填",
+ "mr": "先生",
+ "ms": "女士",
+ "mobile_phone_number": "手机号码",
+ "mobile_phone_number_is_required": "手机号码必填",
+ "street_line_1": "街道名称第一行",
+ "street_line_1_is_required": "街道名称第一行必填",
+ "street_line_2": "街道名称第二行",
+ "city": "城市",
+ "city_is_required": "城市必填",
+ "province": "省份",
+ "postal_code": "邮政编码",
+ "postal_code_is_required": "邮政编码必填",
+ "optional_information": "可选填信息",
+ "email_is_not_valid": "电子邮箱无效",
+ "fax": "传真",
+ "delete": "删除",
+ "are_you_sure_to_delete_the_address": "您确定要删除该地址吗?",
+ "save": "保存",
+ "the_address_has_been_deleted": "地址成功删除",
+ "search_place": "搜索地址",
+ "enter_delivery_address": "输入送货地址",
+ "empty_address_change_keyword": "找不到地址。点击这里跳过地址搜索。",
+ "empty_result_change_keyword": "找不到您需要的数据,请改变关键字再试。",
+ "new_address": "添加新地址",
+ "change_password_desc": "请输入旧密码和希望的新密码。",
+ "back": "返回",
+ "revise_user_profile": "修改用户信息",
+ "learn_more_about_minipos": "详细了解MiniPOS",
+ "learn_more_about_igoshow": "详细了解iGoShow",
+ "downloads": "下载",
+ "user_registration_desc": "请输入您的手机号码,然后单击“获取验证码”按钮。",
+ "forgot_password_description": "输入您注册时用的Email或手机号码,然后点击‘获取验证码’ 按钮。",
+ "change_mobile_desc": "输入新的手机号码,然后点击'获取验证码'按钮。",
+ "change_email_desc": "输入新的Email,然后点击'获取验证码'按钮。",
+ "add_new_address": "添加新地址",
+ "today_with_time": "今天{time}",
+ "tomorrow_with_time": "明天{time}",
+ "followups_token": "{num}条回复",
+ "pull_up_to_load_more": "上拉加载更多",
+ "load_failed_retry": "载入失败,请重试。",
+ "release_to_load_more": "松开载入",
+ "no_more_record": "没有更多记录了",
+ "add_new_ticket": "创建一个新的支持票",
+ "new_ticket": "新的支持票",
+ "add_new_ticket_desc": "请输入您的问题。您还可以上传文件或图片来使您的提问更清楚。",
+ "your_question_issue": "您的问题",
+ "are_you_sure_to_remove_the_picture": "您确定要移除该图片吗?",
+ "attach_pictures": "图片附件",
+ "attach_pictures_desc": "建议附上图片(屏幕截图)让问题更清楚。",
+ "ticket_created_success": "支持票成功创建。",
+ "view_ticket": "查看支持票",
+ "ticket_number_token": "票号 #{num}",
+ "close": "关闭",
+ "follow_ups": "跟进",
+ "reply": "回复",
+ "the_ticket_is_closed_desc": "该支持票已经关闭。如果您还有问题,请创建新的支持票。",
+ "your_reply": "您的回复",
+ "no_blog_yet": "尚无要显示的博客。",
+ "view_blog": "查看博客",
+ "reset_password_desc": "输入您想要的新密码两次。",
+ "set_password_desc": "输入您想要的密码两次。",
+ "order_more": "还差{minprice}起送",
+ "select_options": "选择选项",
+ "previous": "上一步",
+ "next": "下一步",
+ "finish": "完成",
+ "radio_option_select_token": "请选择{optionName}",
+ "radio_option_is_required": "选项必选。选择一个选项后点下一步。",
+ "radio_option_is_optional": "可选选项。如果不选择可以直接点下一步。",
+ "check_option_select_token": "多项选择{optionName}",
+ "check_option_is_required": "选项必选。选择至少一项再点击下一步。",
+ "check_option_is_optional": "可选选项。如果不选择可以直接点下一步。",
+ "checkout": "去结算",
+ "are_you_sure_to_remove_the_item": "您确定要移除该物品吗?",
+ "out_of_stock": "脱销",
+ "product_insufficient": "该产品数量不足。",
+ "your_basket_is_empty": "您的购物篮是空的",
+ "empty_basket": "清空购物篮",
+ "delivery_fee": "配送费{shippingfee}起",
+ "are_you_sure_to_empty_basket": "您确定要清空购物篮吗?",
+ "search_product": "搜索产品",
+ "search_products": "搜索产品",
+ "enter_product_keyword": "输入产品关键字",
+ "promotions": "推广",
+ "products": "产品",
+ "comments": "评价",
+ "no_comments_yet": "还没评价",
+ "response_from_store": "店家回复",
+ "show_more": "显示更多",
+ "show_less": "显示更少",
+ "hour_token": "{hours, plural, one{1小时} other{{hours}小时}}",
+ "minute_token": "{minutes, plural, one{1分钟} other{{minutes}分钟}}",
+ "min_order_amount_token": "${minamount}起送",
+ "min_shipping_fee": "配送费${shipfee}起",
+ "store_introduction": "店家简介",
+ "store_policy": "商家政策",
+ "sold_per_month_token": " 月售{sold_qty}单",
+ "detail": "详细描述",
+ "specification": "规格",
+ "weight_token": "重量:{weight}",
+ "dimentions_token": "尺寸:{length}(L)x{width}(W)x{height}(H)",
+ "loading": "装载中...",
+ "store_closed": "商店已关",
+ "book_now_delivery_later_token": "现在预定,{hour}:00后开始配送。",
+ "confirm_order": "订单确定",
+ "delivery": "外卖配送",
+ "pickup": "到店自提",
+ "delivery_now": "立刻配送",
+ "end_of_the_list": "全部加载",
+ "hot_sale": "热卖",
+ "featured_product": "特色产品",
+ "ocr_scan": "OCR扫描",
+ "from_camera": "手机照相机",
+ "from_gallery": "手机图库",
+ "feature_not_available_web": "该功能在网页版上不能用。请下载App版本。",
+ "document_type": "文件类型",
+ "ubereats_receipt": "UberEats收据",
+ "business_card": "名片",
+ "select_document_type": "选择一种文件类型",
+ "english": "英文",
+ "chinese_simplified": "简体中文",
+ "chinese_traditional": "繁体中文",
+ "document_langage": "文档语言",
+ "select_document_lanuage": "选择一种语言",
+ "submit_to_generate": "提交生成",
+ "add_to_basket": "放入购物篮",
+ "no_delivery_method": "没有可用的送货方式",
+ "under_renovation": "本店还在装修",
+ "pay_now": "去支付",
+ "canada_post": "加拿大邮政",
+ "canada_post_delivery": "加拿大邮政配送",
+ "table_token": "桌号:{num}",
+ "number_of_people": "人数",
+ "pickup_at": "自提地址",
+ "delivery_unavailable": "配送时间",
+ "select_delivery_time": "选择配送时间",
+ "credit_coupon": "红包/抵用券",
+ "subtotal_token": "小计:{subtotal}",
+ "subtotal": "小计",
+ "extra_fee_token": "{name}({rate}%)",
+ "total": "总计",
+ "checkout_no_deliver": "现在这时间我们不派送。",
+ "payment_method": "付款方式",
+ "order_remark": "订单备注",
+ "please_provide_shipping_address": "请提供收货地址",
+ "over_delivery_distance": "地址超出配送范围",
+ "pickup_discount": "自提折扣",
+ "service_fee": "服务费",
+ "pending": "待接单",
+ "order_acceipt": "已接单",
+ "order_processing": "准备中",
+ "order_complete": "已完成",
+ "order_cancelled": "已取消",
+ "my_orders": "我的订单",
+ "and_more_item_token": "等{qty}件",
+ "order_again": "再来一单",
+ "order_detail": "订单详情",
+ "delivery_info": "配送信息",
+ "delivery_address": "收货地址",
+ "pickup_address": "自提地址",
+ "schedule_delivery": "预约送货时间",
+ "delivery_method": "配送方式",
+ "store_delivery": "商家配送",
+ "order_info": "订单信息",
+ "order_number": "订单号码",
+ "amount_not_meet": "订单金额没有达到最低要求。",
+ "select_canada_post_shipping_rate": "请选择加拿大邮政运费。",
+ "mon": "周一",
+ "monday": "星期一",
+ "tue": "周二",
+ "tuesday": "星期二",
+ "wed": "周三",
+ "wednesday": "星期三",
+ "thu": "周四",
+ "thursday": "星期四",
+ "fri": "周五",
+ "friday": "星期五",
+ "sat": "周六",
+ "saturday": "星期六",
+ "sun": "周日",
+ "sunday": "星期日",
+ "today": "今天",
+ "tomorrow": "明天",
+ "shipping_time_will_schedule": "配送时间无法确定。通常我们会尽快送出。如果您希望在某时配送,请在备注里注明。",
+ "select_a_payment_method": "选择付款方式",
+ "payment_method_not_set": "没有指定付款方式,请货到付款或自提付款。",
+ "no_coupon_available": "无可用红包",
+ "percentage_discount_token": "{discount}%折扣",
+ "discount_amount_token": "-${discount}",
+ "pick_a_coupon": "使用红包",
+ "dont_use": "不使用",
+ "percentage_discount_token2": "-${amount}({discount}%折扣)",
+ "type_your_order_remark": "输入订单备注",
+ "quick_input": "快速输入",
+ "light_tase": "清淡口味",
+ "no_spicy": "不要辣",
+ "no_onion": "不要洋葱",
+ "no_pickle": "不要泡菜",
+ "enter_coupon_code": "输入红包号码",
+ "please_enter_coupon_code": "请输入红包号码。",
+ "get_coupon": "获取红包",
+ "percent_discount": "%折扣",
+ "expiration_date_token": "{expirationDate}到期",
+ "no_restriction": "无门槛",
+ "redeem_coupon": "去使用",
+ "choose_a_shipping_rate": "选择运费",
+ "payment_amount": "付款金额",
+ "pay_later": "稍后付款",
+ "pay_after_meal": "餐后付款",
+ "pay_with_existing_cards": "用现有的卡付款",
+ "expire_token": "到期:{mon}/{yer}",
+ "confirmation": "请确定",
+ "are_you_sure_to_remove_the_card": "您确定要移除该信用卡吗?",
+ "payment_verification": "付款验证",
+ "payment_verification_sent": "付款码已经发送到您的手机{mobile}。请在下面输入付款码。",
+ "wrong_payment_verification_code": "错误的付款码,请查证后再输入。",
+ "pay_with": "使用",
+ "pay_with_token": "使用{method}付款",
+ "you_have_no_orders_yet": "您还没有订单",
+ "comment": "评价",
+ "delivery_guy": "配送员",
+ "delivery_distance_token": "配送员离您{km},大概需时{time}送达。",
+ "copy": "复制",
+ "order_number_copied_to_clipboard": "订单号码复制到剪切板",
+ "online_payment": "在线付款",
+ "order_datetime": "下单时间",
+ "payment_status": "付款状态",
+ "paid": "已付款",
+ "unpaid": "未付款",
+ "order_fulfillment": "订单完成度",
+ "cancel_order": "取消订单",
+ "store": "店家",
+ "customer": "客户",
+ "are_you_sure_to_cancel_the_order": "您确定要取消该订单吗?",
+ "no": "不是",
+ "yes": "是的",
+ "pay": "付款",
+ "no_instance_delivery_desc": "跟踪信息将在可用时提供。",
+ "comment_empty": "请输入您的评价。",
+ "thank_you_for_your_comment": "谢谢您的评价。",
+ "add_pictures": "晒照片",
+ "input_your_comment": "写下您的评价",
+ "new_comment": "新的评价",
+ "coupons": "优惠券",
+ "general_coupon": "通用优惠券",
+ "available_for_order_over_token": "订单满${value}可用",
+ "includes": "包含",
+ "by_email": "电子邮箱",
+ "by_phone": "联系电话",
+ "address": "地址",
+ "view_on_google_map": "在谷歌地图打开",
+ "toll_free": "无费号码:",
+ "group_number_can_be_found": "按如下图找到集团号码...",
+ "group_number": "集团号码",
+ "please_enter_group_number": "请输入您的集团号码。",
+ "group_license_renewal": "集团许可续订",
+ "renewal_fee": "续订费用",
+ "tax": "税费",
+ "pay_amount_token": "马上付款 ${amount}",
+ "expired_at": "到期日期",
+ "after_renewed": "续约后",
+ "expiration_date": "到期日期",
+ "purchase_renew_service": "购买/续期服务",
+ "service_descritpion": "服务描述",
+ "your_group": "您的集团",
+ "current_plan": "当前计划",
+ "select_a_plan": "选择一个计划",
+ "price": "价格",
+ "no_ticket_yet": "还没有支持票。 如果您有任何疑问/问题,请点击上方的加号图标以创建支持票。"
}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index 453caa8..b31778f 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,48 +1,106 @@
+import 'dart:async';
+
import 'package:catcher/catcher.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_device_locale/flutter_device_locale.dart';
+import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_redux/flutter_redux.dart';
+import 'package:flutter_wisetronic/pages/buy_service.dart';
+import 'package:geolocator/geolocator.dart' as geolocator;
+import 'package:url_strategy/url_strategy.dart';
+import 'models/located_address.dart';
+import 'pages/me.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:splashscreen/splashscreen.dart';
+// import 'package:uni_links/uni_links.dart';
import 'constants.dart';
+import 'events/eventbus.dart';
+import 'events/events.dart';
import 'generated/l10n.dart';
import 'pages/home.dart';
+import 'pages/plain_page.dart';
+import 'pages/renew_minioffice.dart';
import 'routes.dart';
import 'store/actions.dart';
import 'store/store.dart';
+import 'utils/configure_nonweb.dart' if (dart.library.html) 'utils/configure_web.dart';
+import 'utils/http_util.dart';
+import 'utils/util_io.dart' if (dart.library.html) 'utils/util_web.dart';
-void main() async {
+void main() {
WidgetsFlutterBinding.ensureInitialized();
- Locale locale = await DeviceLocale.getCurrentLocale();
-
- runApp(MyApp(locale));
+ // Enable configureApp will cause route problem.
+ // configureApp();
+ setPathUrlStrategy();
+ runApp(MyApp());
}
class MyApp extends StatelessWidget {
- final Locale localLocate;
+ String _to = '/';
- MyApp(this.localLocate) {
+ MyApp() {
Routes.configure();
- store.dispatch(UpdateLocale(localLocate));
+ Util().init();
+ // getCurrentPosition();
+ }
+
+ static getCurrentPosition() async {
+ bool serviceEnabled;
+ geolocator.LocationPermission permission;
+
+ serviceEnabled = await geolocator.Geolocator.isLocationServiceEnabled();
+ if (!serviceEnabled) {
+ print('Location services are disabled');
+ return;
+ }
+
+ permission = await geolocator.Geolocator.checkPermission();
+ if (permission == geolocator.LocationPermission.deniedForever) {
+ print(
+ 'Location permissions are permantly denied, we cannot request permissions.');
+ return;
+ }
+
+ if (permission == geolocator.LocationPermission.denied) {
+ permission = await geolocator.Geolocator.requestPermission();
+ if (permission != geolocator.LocationPermission.whileInUse &&
+ permission != geolocator.LocationPermission.always) {
+ print(
+ 'Location permissions are denied (actual value: $permission).');
+ return;
+ }
+ geolocator.Position geoPosition = await geolocator.Geolocator.getCurrentPosition(
+ desiredAccuracy: geolocator.LocationAccuracy.high);
+ HttpUtil.httpGet('v1/getposition',
+ queryParameters: {
+ 'latitude': geoPosition.latitude.toString(),
+ 'longitude': geoPosition.longitude.toString(),
+ },
+ ).then((value) {
+ print('value: $value');
+ store.dispatch(UpdateLocatedAddress(LocatedAddress.fromJson(value)));
+ }).catchError((error) {
+ print('error get address: $error');
+ });
+ }
}
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
+
Widget _buildBody() {
return SplashScreen(
seconds: 5,
- routeName: '/',
- navigateAfterSeconds: Home(localLocate, title: 'Welcome',),
+ routeName: _to,
+ navigateAfterSeconds: Home(title: Constants.APP_TITLE,),
styleTextUnderTheLoader: new TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20.0,
),
- // imageBackground: (Image.network(Constants.BASE_API_URL + 'gallery/get-wisetronic-slpash')).image,
- imageBackground: (new Image.network(Constants.BASE_API_URL + 'gallery/get-minimanager-splash/')).image,
+ imageBackground: (Image.network(Constants.BASE_API_URL + 'gallery/get-minimanager-splash/')).image,
backgroundColor: Colors.white,
onClick: () {
@@ -63,21 +121,59 @@ class MyApp extends StatelessWidget {
],
supportedLocales: S.delegate.supportedLocales,
localeResolutionCallback: (Locale locale, Iterable supportedLocales) {
- print('Language code: ${localLocate.languageCode}');
+ print('Language code: ${locale.languageCode}, Country code: ${locale.countryCode}');
for (final supportedLocale in supportedLocales) {
- if (supportedLocale.languageCode == localLocate.languageCode) {
+ if (supportedLocale.languageCode == locale.languageCode) {
+ store.dispatch(UpdateLocale(locale));
return supportedLocale;
}
}
+ store.dispatch(UpdateLocale(supportedLocales.first));
return supportedLocales.first;
},
+ onGenerateRoute: (RouteSettings settings) {
+ final List pathElements = settings.name.split('/');
+ print('path elements: $pathElements');
+ if (pathElements[0] != '') {
+ return null;
+ }
+ if (pathElements[1] == 'me') {
+ return MaterialPageRoute(
+ builder: (BuildContext context) => Me()
+ );
+ }
+ if (pathElements[1] == 'privacy-policy') {
+ return MaterialPageRoute(
+ builder: (BuildContext context) =>
+ PlainPage(
+ 'privacy-policy',
+ // businessId: Constants.BUSINESS_ID,
+ businessId: 310,
+ ),
+ );
+ }
+ if (pathElements[1] == 'renew-minioffice') {
+ return MaterialPageRoute(builder: (BuildContext context) =>
+ RenewMiniOffice(int.parse(pathElements[2]))
+ );
+ }
+ if (pathElements[1] == 'buy-service') {
+ return MaterialPageRoute(builder: (BuildContext context) =>
+ BuyService(int.parse(pathElements[2]), pathElements[3])
+ );
+ }
+ return MaterialPageRoute(
+ builder: (BuildContext context) =>
+ Home(title: Constants.APP_TITLE,),
+ );
+ },
title: 'Wisetronic Inc.',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: StoreProvider(
store: store,
- child: _buildBody(),
+ child: Home(title: Constants.APP_TITLE,),
),
);
}
diff --git a/lib/models/Subproduct.dart b/lib/models/Subproduct.dart
new file mode 100644
index 0000000..fcbdab7
--- /dev/null
+++ b/lib/models/Subproduct.dart
@@ -0,0 +1,66 @@
+
+import 'dart:convert';
+
+import 'package:flutter_wisetronic/models/product_attribute.dart';
+
+class Subproduct {
+ int id;
+ SimpleProduct product;
+ double quantity;
+
+ Subproduct.fromJson(Map json) :
+ id = json['id'],
+ product = SimpleProduct.fromJson(json['product']),
+ quantity = double.parse(json['quantity'].toString());
+
+ Map toJson() => {
+ 'id': id,
+ 'product': product,
+ 'quantity': quantity,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
+
+class SimpleProduct {
+ int id;
+ String name;
+ String sku;
+ double price;
+ String description;
+ String image;
+ List productAttributes;
+ double customerLastPrice;
+ String extraData;
+
+ SimpleProduct.fromJson(Map json) :
+ id = json['id'],
+ name = json['name'],
+ sku = json['sku'],
+ price = double.parse(json['price'].toString()),
+ description = json['description'],
+ image = json['image'],
+ productAttributes = (json['productattributes'] as List).map((i) => ProductAttribute.fromJson(i)).toList(),
+ customerLastPrice = double.parse(json['customer_last_price'].toString()),
+ extraData = json['extra_data'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'sku': sku,
+ 'price': price,
+ 'description': description,
+ 'image': image,
+ 'productattributes': productAttributes,
+ 'customer_last_price': customerLastPrice,
+ 'extra_data': extraData,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/address.dart b/lib/models/address.dart
new file mode 100644
index 0000000..ffd7ec3
--- /dev/null
+++ b/lib/models/address.dart
@@ -0,0 +1,59 @@
+import 'dart:convert';
+
+class Address {
+ int id;
+ String addressLine1;
+ String addressLine2;
+ String city;
+ String state;
+ String country;
+ String zip;
+ String phone;
+ String fax;
+ String email;
+ String contactName;
+ int gender;
+ String lat;
+ String lng;
+ String fullAddress;
+
+ Address.fromJson(Map json)
+ : id = json['id'],
+ addressLine1 = json['address_line1'],
+ addressLine2 = json['address_line2'],
+ city = json['city'],
+ state = json['state'],
+ country = json['country'],
+ zip = json['zip'],
+ phone = json['phone'],
+ fax = json['fax'],
+ email = json['email'],
+ contactName = json['name'],
+ gender = json['gender'],
+ lat = json['lat'],
+ lng = json['lng'],
+ fullAddress = json['full_address'];
+
+ Map toJson() => {
+ 'id': id,
+ 'address_line1': addressLine1,
+ 'address_line2': addressLine2,
+ 'city': city,
+ 'state': state,
+ 'country': country,
+ 'zip': zip,
+ 'phone': phone,
+ 'fax': fax,
+ 'email': email,
+ 'name': contactName,
+ 'gender': gender,
+ 'lat': lat,
+ 'lng': lng,
+ 'full_address': fullAddress,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/blog.dart b/lib/models/blog.dart
new file mode 100644
index 0000000..538a5fb
--- /dev/null
+++ b/lib/models/blog.dart
@@ -0,0 +1,58 @@
+
+import 'dart:convert';
+
+class Section {
+ int id;
+ String name;
+
+ Section.fromJson(Map json) :
+ id = json['id'],
+ name = json['name'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
+
+class Blog {
+ int id;
+ String title;
+ String body;
+ String createdAt;
+ String thumbUrl;
+ String imageUrl;
+ String videoUrl;
+ Section section;
+
+ Blog.fromJson(Map json) :
+ id = json['id'],
+ title = json['title'],
+ body = json['body'],
+ createdAt = json['created_at'],
+ thumbUrl = json['thumb_url'],
+ imageUrl = json['image_url'],
+ videoUrl = json['video_url'],
+ section = Section.fromJson(json['section']);
+
+ Map toJson() => {
+ 'id': id,
+ 'title': title,
+ 'body': body,
+ 'created_at': createdAt,
+ 'thumb_url': thumbUrl,
+ 'image_url': imageUrl,
+ 'video_url': videoUrl,
+ 'section': section,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/booking_date_time.dart b/lib/models/booking_date_time.dart
new file mode 100644
index 0000000..f9cb071
--- /dev/null
+++ b/lib/models/booking_date_time.dart
@@ -0,0 +1,32 @@
+
+import 'dart:convert';
+
+import 'booking_time.dart';
+
+class BookingDateTime {
+ String viewDate;
+ int unixTime;
+ String sendTimeTip;
+ List bookTimes;
+
+ BookingDateTime(this.viewDate, this.unixTime, this.sendTimeTip, this.bookTimes);
+
+ BookingDateTime.fromJson(Map json)
+ : viewDate = json['view_date'],
+ unixTime = int.parse(json['unix_time'].toString()),
+ sendTimeTip = json['send_time_tip'],
+ bookTimes = (json['book_times'] as List).map((e) => BookingTime.fromJson(e)).toList();
+
+ Map toJson() => {
+ 'view_date': viewDate,
+ 'unix_time': unixTime,
+ 'send_time_tip': sendTimeTip,
+ 'book_times': bookTimes,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+}
\ No newline at end of file
diff --git a/lib/models/booking_time.dart b/lib/models/booking_time.dart
new file mode 100644
index 0000000..9f4c055
--- /dev/null
+++ b/lib/models/booking_time.dart
@@ -0,0 +1,27 @@
+
+import 'dart:convert';
+
+class BookingTime {
+ String viewTime;
+ int unixTime;
+ String sendTimeTip;
+
+ BookingTime(this.viewTime, this.unixTime, this.sendTimeTip);
+
+ BookingTime.fromJson(Map json)
+ : viewTime = json['view_time'],
+ unixTime = int.parse(json['unix_time'].toString()),
+ sendTimeTip = json['send_time_tip'];
+
+ Map toJson() => {
+ 'view_time': viewTime,
+ 'unix_time': unixTime,
+ 'send_time_tip': sendTimeTip,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+}
\ No newline at end of file
diff --git a/lib/models/business.dart b/lib/models/business.dart
new file mode 100644
index 0000000..d6e1bd0
--- /dev/null
+++ b/lib/models/business.dart
@@ -0,0 +1,164 @@
+import 'dart:convert';
+
+import 'address.dart';
+import 'business_time.dart';
+import 'distance_info.dart';
+import 'image_url.dart';
+import 'product.dart';
+import 'waiting_line.dart';
+
+class QuickInput {
+ String value;
+ QuickInput.fromJson(Map json)
+ : value = json['value'];
+
+ Map toJson() => {
+ 'value': value
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
+
+class Business {
+ int id;
+ String name;
+ String phone;
+ Address address;
+ String fullAddress;
+ String picUrl;
+ int status;
+ List openingTime;
+ double shippingFee;
+ double packageFee;
+ double minPrice;
+ int shippingTime;
+ int monthSales;
+ String bulletin;
+ int category;
+ bool isLike;
+ String description;
+ String policy;
+ String bannerImageUrl;
+ int todayOpen;
+ int todayClose;
+ bool showMonthlySold;
+ List slideImages;
+ List promoProducts;
+ String paypalEmail;
+ bool deliveryCanadaPost;
+ bool deliveryStoreDelivery;
+ bool deliveryPickup;
+ String currency;
+ List waitingLine;
+ bool enableWaitingLine;
+ double pointsToCreditsConversionRate;
+ String chaseXLogin;
+ String chaseTransactionKey;
+ String chaseResponseKey;
+ DistanceInfo distanceInfo;
+ int commentsCount;
+ bool forceClose;
+ bool isPublic;
+ double referrerCoupon;
+ bool instanceDelivery;
+ List quickInputs;
+
+ Business.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ phone = json['phone'],
+ address = Address.fromJson(json['address']),
+ fullAddress = json['full_address'],
+ picUrl = json['pic_url'],
+ status = json['status'],
+ openingTime = (json['opening_time'] as List).map((i) => BusinessTime.fromJson(i)).toList(),
+ shippingFee = double.parse(json['shipping_fee'].toString()),
+ packageFee = double.parse(json['package_fee'].toString()),
+ minPrice = double.parse(json['min_price'].toString()),
+ shippingTime = json['shipping_time'],
+ monthSales = json['month_sales'],
+ bulletin = json['bulletin'],
+ category = json['category'],
+ isLike = json['is_like'],
+ description = json['description'],
+ policy = json['policy'],
+ bannerImageUrl = json['banner_image_url'],
+ todayOpen = json['today_open'],
+ todayClose = json['today_close'],
+ showMonthlySold = json['show_monthly_sold'],
+ slideImages = (json['slide_images'] as List).map((i) => ImageUrl.fromJson(i)).toList(),
+ promoProducts = (json['promo_products'] as List).map((i) => Product.fromJson(i)).toList(),
+ paypalEmail = json['paypal_email'],
+ deliveryCanadaPost = json['delivery_canada_post'],
+ deliveryStoreDelivery = json['delivery_store_delivery'],
+ deliveryPickup = json['delivery_pickup'],
+ currency = json['currency'],
+
+ waitingLine = (json['waiting_line'] as List).map((i) => WaitingLine.fromJson(i)).toList(),
+
+ enableWaitingLine = json['enable_waiting_line'],
+ pointsToCreditsConversionRate = double.parse(json['points_to_credits_conversion_rate'].toString()),
+ chaseXLogin = json['chase_x_login'],
+ chaseTransactionKey = json['chase_transaction_key'],
+ chaseResponseKey = json['chase_response_key'],
+ distanceInfo = json['distance_info'] != null ? DistanceInfo.fromJson(json['distance_info']) : null,
+ commentsCount = json['comments_count'],
+ forceClose = json['force_close'],
+ isPublic = json['is_public'],
+ referrerCoupon = double.parse(json['customer_referrer_coupon_amount'].toString()),
+ instanceDelivery = json['instance_delivery'],
+ quickInputs = (json['quick_inputs'] as List).map((i) => QuickInput.fromJson(i)).toList();
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'phone': phone,
+ 'address': address,
+ 'full_address': fullAddress,
+ 'pic_url': picUrl,
+ 'status': status,
+ 'opening_time': openingTime,
+ 'shipping_fee': shippingFee,
+ 'package_fee': packageFee,
+ 'min_price': minPrice,
+ 'shipping_time': shippingTime,
+ 'month_sales': monthSales,
+ 'bulletin': bulletin,
+ 'category': category,
+ 'is_like': isLike,
+ 'description': description,
+ 'policy': policy,
+ 'banner_image_url': bannerImageUrl,
+ 'today_open': todayOpen,
+ 'today_close': todayClose,
+ 'show_monthly_sold': showMonthlySold,
+ 'slide_images': slideImages,
+ 'promo_products': promoProducts,
+ 'paypal_email': paypalEmail,
+ 'delivery_canada_post': deliveryCanadaPost,
+ 'delivery_store_delivery': deliveryStoreDelivery,
+ 'delivery_pickup': deliveryPickup,
+ 'currency': currency,
+ 'waiting_line': waitingLine,
+ 'enable_waiting_line': enableWaitingLine,
+ 'points_to_credits_conversion_rate': pointsToCreditsConversionRate,
+ 'chase_x_login': chaseXLogin,
+ 'chase_transaction_key': chaseTransactionKey,
+ 'chase_response_key': chaseResponseKey,
+ 'distance_info': distanceInfo,
+ 'comments_count': commentsCount,
+ 'force_close': forceClose,
+ 'is_public': isPublic,
+ 'customer_referrer_coupon_amount': referrerCoupon,
+ 'instance_delivery': instanceDelivery,
+ 'quick_inputs': quickInputs
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/business_time.dart b/lib/models/business_time.dart
new file mode 100644
index 0000000..3247474
--- /dev/null
+++ b/lib/models/business_time.dart
@@ -0,0 +1,20 @@
+import 'dart:convert';
+
+class BusinessTime {
+ String openTime;
+ String closeTime;
+
+ BusinessTime.fromJson(Map json)
+ : openTime = json['open_time'],
+ closeTime = json['close_time'];
+
+ Map toJson() => {
+ 'open_time': openTime,
+ 'close_time': closeTime
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/cart_info.dart b/lib/models/cart_info.dart
new file mode 100644
index 0000000..4516a53
--- /dev/null
+++ b/lib/models/cart_info.dart
@@ -0,0 +1,94 @@
+
+
+import 'dart:convert';
+
+import 'business.dart';
+import 'cart_line_item.dart';
+import 'extra_fee.dart';
+
+class CartInfo {
+ int id;
+ double originPrice;
+ double discountPrice;
+ double totalPrice;
+ Business businessInfo;
+ List productList;
+ List extraFeeList;
+ List discountList;
+ int deliveryMethod;
+ String shippingMethod;
+ double amountPaid;
+ String extraData;
+
+ CartInfo.fromJson(Map json)
+ : id = json['id'],
+ originPrice = json['origin_price'] != null ? double.parse(json['origin_price'].toString()) : 0.0,
+ discountPrice = json['discount_price'] != null ? double.parse(json['discount_price'].toString()) : 0.0,
+ totalPrice = json['total_price'] != null ? double.parse(json['total_price'].toString()) : 0.0,
+ businessInfo = json['business_info'] != null ? Business.fromJson(json['business_info']) : null,
+ productList = (json['product_list'] as List).map((i) => CartLineItem.fromJson(i)).toList(),
+ extraFeeList = (json['extra_fee_list'] as List).map((i) => ExtraFee.fromJson(i)).toList(),
+ discountList = (json['discount_list'] as List).map((e) => ExtraFee.fromJson(e)).toList(),
+ deliveryMethod = json['delivery_method'],
+ shippingMethod = json['shipping_method'],
+ amountPaid = double.parse(json['amount_paid'].toString()),
+ extraData = json['extra_data'];
+
+ Map toJson() => {
+ 'id': id,
+ 'origin_price': originPrice,
+ 'discount_price': discountPrice,
+ 'total_price': totalPrice,
+ 'business_info': businessInfo,
+ 'product_list': productList,
+ 'extra_fee_list': extraFeeList,
+ 'discount_list': discountList,
+ 'delivery_method': deliveryMethod,
+ 'shipping_method': shippingMethod,
+ 'amount_paid': amountPaid,
+ 'extra_data': extraData,
+ };
+
+ addToCart(CartLineItem item) {
+ if (productList == null) {
+ productList = [item];
+ } else {
+ productList.add(item);
+ }
+
+ }
+
+ removeFromCart() {
+
+ }
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+ CartInfo();
+
+ double getTotalPrice() {
+ double newTotal = 0.0;
+ originPrice = 0.0;
+ discountPrice = 0.0;
+ totalPrice = 0.0;
+ for (var i = 0; i < productList.length; i++) {
+ newTotal += productList[i].getTotalPrice();
+ }
+ originPrice = newTotal;
+ totalPrice = newTotal;
+ return totalPrice;
+ }
+
+ int getProductListTotalQuantity() {
+ int qty = 0;
+ if (productList != null && productList.length > 0) {
+ for (var i = 0; i < productList.length; i++) {
+ qty += productList[i].quantity.round();
+ }
+ }
+ return qty;
+ }
+}
\ No newline at end of file
diff --git a/lib/models/cart_line_item.dart b/lib/models/cart_line_item.dart
new file mode 100644
index 0000000..5adb0ec
--- /dev/null
+++ b/lib/models/cart_line_item.dart
@@ -0,0 +1,54 @@
+
+
+import 'dart:convert';
+import 'package:uuid/uuid.dart';
+
+import 'product.dart';
+
+class CartLineItem {
+ int id;
+ double unitPrice;
+ double totalPrice;
+ Product product;
+ String name;
+ String description;
+ double quantity;
+ String uuid;
+ String parentUuid;
+
+ CartLineItem() {
+ uuid = Uuid().v4();
+ }
+
+ CartLineItem.fromJson(Map json)
+ : id = json['id'],
+ unitPrice = double.parse(json['unit_price'].toString()),
+ totalPrice = json['total_price'] != null ? double.parse(json['total_price'].toString()) : double.parse(json['unit_price'].toString()) * double.parse(json['quantity'].toString()),
+ product = json['product'] != null ? Product.fromJson(json['product']) : null,
+ name = json['name'],
+ description = json['description'],
+ quantity = double.parse(json['quantity'].toString()),
+ uuid = Uuid().v4();
+
+ Map toJson() => {
+ 'id': id,
+ 'unit_price': unitPrice,
+ 'total_price': totalPrice,
+ 'product': product,
+ 'name': name,
+ 'description': description,
+ 'quantity': quantity,
+ 'uuid': uuid,
+ 'parentUuid': parentUuid
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+ double getTotalPrice() {
+ totalPrice = unitPrice * quantity;
+ return totalPrice;
+ }
+}
\ No newline at end of file
diff --git a/lib/models/category.dart b/lib/models/category.dart
new file mode 100644
index 0000000..9f41558
--- /dev/null
+++ b/lib/models/category.dart
@@ -0,0 +1,21 @@
+
+import 'dart:convert';
+
+class Category {
+ int id;
+ String name;
+
+ Category.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/category_products.dart b/lib/models/category_products.dart
new file mode 100644
index 0000000..f740278
--- /dev/null
+++ b/lib/models/category_products.dart
@@ -0,0 +1,38 @@
+
+import 'dart:convert';
+
+import 'product.dart';
+
+class CategoryProducts {
+ int id;
+ int businessId;
+ String name;
+ String description;
+ String iconUrl;
+ List products;
+
+ CategoryProducts.fromJson(Map json)
+ : id = json['id'],
+ businessId = json['business_id'],
+ name = json['name'],
+ description = json['description'],
+ iconUrl = json['icon_url'],
+ products = (json['products'] as List).map((i) => Product.fromJson(i)).toList();
+
+ Map toJson() => {
+ 'id': id,
+ 'business_id': businessId,
+ 'name': name,
+ 'description': description,
+ 'icon_url': iconUrl,
+ 'products': products
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+ CategoryProducts(this.id, this.businessId, this.name, this.description,
+ this.iconUrl, this.products);
+}
\ No newline at end of file
diff --git a/lib/models/comment.dart b/lib/models/comment.dart
new file mode 100644
index 0000000..780dd27
--- /dev/null
+++ b/lib/models/comment.dart
@@ -0,0 +1,44 @@
+
+import 'dart:convert';
+
+import 'product_image.dart';
+
+class Comment {
+ int id;
+ String contact;
+ String content;
+ int rating;
+ List images;
+ String createdAt;
+ int thumbUp;
+ int thumbDown;
+ String replyFromStore;
+
+ Comment.fromJson(Map json) :
+ id = json['id'],
+ contact = json['contact'],
+ content = json['content'],
+ rating = json['rating'],
+ images = (json['images'] as List).map((e) => ProductImage.fromJson(e)).toList(),
+ createdAt = json['created_at'],
+ thumbUp = json['thumb_up'],
+ thumbDown = json['thumb_down'],
+ replyFromStore = json['reply_from_store'];
+
+ Map toJson() => {
+ 'id': id,
+ 'contact': contact,
+ 'content': content,
+ 'rating': rating,
+ 'images': images,
+ 'created_at': createdAt,
+ 'thumb_up': thumbUp,
+ 'thumb_down': thumbDown,
+ 'reply_from_store': replyFromStore,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/coupon.dart b/lib/models/coupon.dart
new file mode 100644
index 0000000..45ac37b
--- /dev/null
+++ b/lib/models/coupon.dart
@@ -0,0 +1,41 @@
+
+import 'dart:convert';
+
+import 'business.dart';
+
+class Coupon {
+ int id;
+ String code;
+ String description;
+ String expirationDate;
+ double minAmount;
+ Business store;
+ double valueAmount;
+ bool isPercentage;
+
+ Coupon.fromJson(Map json)
+ : id = json['id'],
+ code = json['code'].toString(),
+ description = json['description'],
+ expirationDate = json['expiration_date'],
+ minAmount = double.parse(json['min_amount'].toString()),
+ store = json['store'] != null ? Business.fromJson(json['store']) : null,
+ valueAmount = double.parse(json['value_amount'].toString()),
+ isPercentage = json['is_percentage'];
+
+ Map toJson() => {
+ 'id': id,
+ 'code': code,
+ 'description': description,
+ 'expiration_date': expirationDate,
+ 'min_amount': minAmount,
+ 'store': store,
+ 'value_amount': valueAmount,
+ 'is_percentage': isPercentage,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/distance_info.dart b/lib/models/distance_info.dart
new file mode 100644
index 0000000..96cad60
--- /dev/null
+++ b/lib/models/distance_info.dart
@@ -0,0 +1,26 @@
+
+import 'dart:convert';
+
+import 'text_value.dart';
+
+class DistanceInfo {
+ TextValue duration;
+ TextValue distance;
+ String status;
+
+ DistanceInfo.fromJson(Map json)
+ : duration = json['duration'] != null ? TextValue.fromJson(json['duration']) : null,
+ distance = json['distance'] != null ? TextValue.fromJson(json['distance']) : null,
+ status = json['status'];
+
+ Map toJson() => {
+ 'duration': duration,
+ 'distance': distance,
+ 'status': status
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/error_message.dart b/lib/models/error_message.dart
new file mode 100644
index 0000000..e99e64e
--- /dev/null
+++ b/lib/models/error_message.dart
@@ -0,0 +1,21 @@
+
+import 'dart:convert';
+
+class ErrorMessage {
+ String code;
+ String string;
+
+ ErrorMessage.fromJson(Map json)
+ : code = json['code'],
+ string = json['string'];
+
+ Map toJson() => {
+ 'code': code,
+ 'string': string,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/extra_fee.dart b/lib/models/extra_fee.dart
new file mode 100644
index 0000000..65f85df
--- /dev/null
+++ b/lib/models/extra_fee.dart
@@ -0,0 +1,31 @@
+
+
+import 'dart:convert';
+
+class ExtraFee {
+ int id;
+ String name;
+ String description;
+ double rate;
+ double price;
+
+ ExtraFee.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ description = json['description'],
+ rate = double.parse(json['rate'].toString()),
+ price = double.parse(json['price'].toString());
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'description': description,
+ 'rate': rate,
+ 'price': price,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/fulfillment.dart b/lib/models/fulfillment.dart
new file mode 100644
index 0000000..5d94fac
--- /dev/null
+++ b/lib/models/fulfillment.dart
@@ -0,0 +1,30 @@
+
+import 'dart:convert';
+
+class Fulfillment {
+ int id;
+ String shippingMethod;
+ String trackingNumber;
+ String note;
+ String createdAt;
+
+ Fulfillment.fromJson(Map json) :
+ id = json['id'],
+ shippingMethod = json['shipping_method'],
+ trackingNumber = json['tracking_number'],
+ note = json['note'],
+ createdAt = json['created_at'];
+
+ Map toJson() => {
+ 'id': id,
+ 'shipping_method': shippingMethod,
+ 'tracking_number': trackingNumber,
+ 'note': note,
+ 'created_at': createdAt,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/image_url.dart b/lib/models/image_url.dart
new file mode 100644
index 0000000..62599c1
--- /dev/null
+++ b/lib/models/image_url.dart
@@ -0,0 +1,20 @@
+import 'dart:convert';
+
+class ImageUrl {
+ int id;
+ String imageUrl;
+
+ ImageUrl.fromJson(Map json)
+ : id = json['id'],
+ imageUrl = json['image_url'];
+
+ Map toJson() => {
+ 'id': id,
+ 'image_url': imageUrl
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/key_value.dart b/lib/models/key_value.dart
new file mode 100644
index 0000000..333271c
--- /dev/null
+++ b/lib/models/key_value.dart
@@ -0,0 +1,12 @@
+
+class KeyValue {
+ String name;
+ dynamic value;
+
+ KeyValue(this.name, this.value);
+
+ @override
+ String toString() {
+ return '$name: $value';
+ }
+}
\ No newline at end of file
diff --git a/lib/models/located_address.dart b/lib/models/located_address.dart
new file mode 100644
index 0000000..1f9dd24
--- /dev/null
+++ b/lib/models/located_address.dart
@@ -0,0 +1,47 @@
+import 'dart:convert';
+
+class LocatedAddress {
+ int storeId;
+ double latitude;
+ double longitude;
+ String streetNumber;
+ String streetName;
+ String city;
+ String locality;
+ String province;
+ String country;
+ String postalCode;
+ String formattedAddress;
+
+ LocatedAddress.fromJson(Map json)
+ : storeId = json['store_id'],
+ latitude = json['latitude'],
+ longitude = json['longitude'],
+ streetNumber = json['street_number'],
+ streetName = json['street_name'],
+ city = json['city'],
+ locality = json['locality'],
+ province = json['province'],
+ country = json['country'],
+ postalCode = json['postal_code'],
+ formattedAddress = json['formatted_address'];
+
+ Map toJson() => {
+ 'store_id': storeId,
+ 'latitude': latitude,
+ 'longitude': longitude,
+ 'street_number': streetNumber,
+ 'street_name': streetName,
+ 'city': city,
+ 'locality': locality,
+ 'province': province,
+ 'country': country,
+ 'postal_code': postalCode,
+ 'formatted_address': formattedAddress
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/order.dart b/lib/models/order.dart
new file mode 100644
index 0000000..9528d3b
--- /dev/null
+++ b/lib/models/order.dart
@@ -0,0 +1,113 @@
+
+
+import 'dart:convert';
+
+import 'address.dart';
+import 'business.dart';
+import 'cart_info.dart';
+import 'cart_line_item.dart';
+import 'distance_info.dart';
+import 'fulfillment.dart';
+import 'user_position.dart';
+
+class Order {
+ int id;
+ int userId;
+ int businessId;
+ Business businessInfo;
+ CartInfo cartInfo;
+ int status;
+ double originPrice;
+ double discountPrice;
+ double totalPrice;
+ String consignee;
+ String phone;
+ String address;
+ Address shippingAddress;
+ int payMethod;
+ String remark;
+ String orderNum;
+ int bookedAt;
+ int createdAt;
+ String shippingMethod;
+ String paymentStatus; // UNPAID, PAID, PARTIALPAID
+ double amountPaid;
+ List fulfillments;
+ String extraData;
+ bool hasComment;
+ double fee;
+ UserPosition shipperPosition;
+ DistanceInfo deliveryDistance;
+
+ Order.fromJson(Map json)
+ : id = json['id'],
+ userId = json['user_id'],
+ businessId = json['business_id'],
+ businessInfo = json['business_info'] != null ? Business.fromJson(json['business_info']) : null,
+ cartInfo = json['cart_info'] != null ? CartInfo.fromJson(json['cart_info']) : null,
+ status = json['status'],
+ originPrice = double.parse(json['origin_price'].toString()),
+ discountPrice = double.parse(json['discount_price'].toString()),
+ totalPrice = double.parse(json['total_price'].toString()),
+ consignee = json['consignee'],
+ phone = json['phone'],
+ address = json['address'],
+ shippingAddress = (json['shipping_address'] != null) ? Address.fromJson(json['shipping_address']) : null,
+ payMethod = json['pay_method'],
+ remark = json['remark'],
+ orderNum = json['order_num'],
+ bookedAt = int.parse(json['booked_at'].toString()),
+ createdAt = int.parse(json['created_at'].toString()),
+ shippingMethod = json['shipping_method'],
+ paymentStatus = json['payment_status'],
+ amountPaid = double.parse(json['amount_paid'].toString()),
+ fulfillments = (json['fulfillments'] as List).map((e) => Fulfillment.fromJson(e)).toList(),
+ extraData = json['extra_data'],
+ hasComment = json['has_comment'],
+ fee = double.parse(json['fee'].toString()),
+ shipperPosition = UserPosition.fromJson(json['shipper_position']),
+ deliveryDistance = DistanceInfo.fromJson(json['delivery_distance']);
+
+ Map toJson() => {
+ 'id': id,
+ 'user_id': userId,
+ 'business_id': businessId,
+ 'business_info': businessInfo,
+ 'cart_info': cartInfo,
+ 'status': status,
+ 'origin_price': originPrice,
+ 'discount_price': discountPrice,
+ 'total_price': totalPrice,
+ 'consignee': consignee,
+ 'phone': phone,
+ 'address': address,
+ 'shipping_address': shippingAddress,
+ 'pay_method': payMethod,
+ 'remark': remark,
+ 'order_num': orderNum,
+ 'booked_at': bookedAt,
+ 'created_at': createdAt,
+ 'shipping_method': shippingMethod,
+ 'payment_status': paymentStatus,
+ 'amount_paid': amountPaid,
+ 'fulfillments': fulfillments,
+ 'extra_data': extraData,
+ 'has_comment': hasComment,
+ 'fee': fee,
+ 'shipper_position': shipperPosition,
+ 'delivery_distance': deliveryDistance,
+ };
+
+ double getSubtotal() {
+ double subtotal = 0.0;
+ for (CartLineItem lineItem in cartInfo.productList) {
+ subtotal += lineItem.getTotalPrice();
+ }
+ return subtotal;
+ }
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/order_status.dart b/lib/models/order_status.dart
new file mode 100644
index 0000000..a18930c
--- /dev/null
+++ b/lib/models/order_status.dart
@@ -0,0 +1,10 @@
+
+enum OrderStatus {
+ WAIT_FOR_SUBMISSION, // -1
+ WAIT_FOR_PAYMENT, // 0
+ WAIT_FOR_APPROVAL, // 1
+ WAIT_FOR_DELIVERY, // 2
+ WAIT_FOR_ARRIVAL, // 3
+ RECEIVED_CONFIRMATION, // 4
+ DONE // 5
+}
\ No newline at end of file
diff --git a/lib/models/payment_method.dart b/lib/models/payment_method.dart
new file mode 100644
index 0000000..fca7d24
--- /dev/null
+++ b/lib/models/payment_method.dart
@@ -0,0 +1,5 @@
+
+enum PaymentMethod {
+ ONLINE, // 1
+ OFFLINE // 0
+}
\ No newline at end of file
diff --git a/lib/models/payment_platform.dart b/lib/models/payment_platform.dart
new file mode 100644
index 0000000..5395030
--- /dev/null
+++ b/lib/models/payment_platform.dart
@@ -0,0 +1,85 @@
+
+
+import 'dart:convert';
+
+import 'package:flutter/cupertino.dart';
+import '../generated/l10n.dart';
+
+class PaymentPlatform {
+ int id;
+ String name;
+ String code;
+ String method;
+ String icon;
+ String xLogin;
+ String transactionKey;
+ String responseKey;
+ String squareAppId;
+ String squareAccessToken;
+ String squareLocationId;
+ String publishableKey;
+ String merchantId;
+
+ PaymentPlatform(this.code);
+
+ PaymentPlatform.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ code = json['code'],
+ method = json['method'],
+ icon = json['icon'],
+ xLogin = json['x_login'],
+ transactionKey = json['transaction_key'],
+ responseKey = json['response_key'],
+ squareAppId = json['square_app_id'],
+ squareAccessToken = json['square_access_token'],
+ squareLocationId = json['square_location_id'],
+ publishableKey = json['publishable_key'],
+ merchantId = json['merchant_id'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'code': code,
+ 'method': method,
+ 'icon': icon,
+ 'x_login': xLogin,
+ 'transaction_key': transactionKey,
+ 'response_key': responseKey,
+ 'square_app_id': squareAppId,
+ 'square_access_token': squareAccessToken,
+ 'square_location_id': squareLocationId,
+ 'publishable_key': publishableKey,
+ 'merchant_id': merchantId,
+ };
+
+ static String getPaymentPlatformName(BuildContext context, String code) {
+ switch(code) {
+ case 'chase':
+ return S.of(context).credit_debit_card;
+ break;
+ case 'web-credit-card':
+ return S.of(context).credit_card;
+ break;
+ case 'ALIPAY':
+ return S.of(context).alipay;
+ break;
+ case 'WECHATPAY':
+ return S.of(context).wechatpay;
+ break;
+ case 'paypal':
+ return S.of(context).paypal;
+ case 'payondeliverypickup':
+ return S.of(context).pay_on_deliery_pickup;
+ case 'stripe':
+ return S.of(context).credit_card;
+ default:
+ return S.of(context).pay_on_deliery;
+ }
+ }
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/position.dart b/lib/models/position.dart
new file mode 100644
index 0000000..96a202e
--- /dev/null
+++ b/lib/models/position.dart
@@ -0,0 +1,34 @@
+
+class Position {
+ final double latitude;
+ final double longitude;
+
+ Position({this.latitude, this.longitude});
+
+ @override
+ bool operator ==(other) {
+ var areEqual = other is Position &&
+ other.latitude == latitude &&
+ other.longitude == longitude;
+
+ return areEqual;
+ }
+
+ @override
+ int get hashCode => latitude.hashCode ^
+ longitude.hashCode;
+
+ @override
+ String toString() {
+ return 'Lat $latitude, Lng $longitude';
+ }
+
+ Position.fromJson(Map json) :
+ latitude = double.parse(json['latitude'].toString()),
+ longitude = double.parse(json['longitude'].toString());
+
+ Map toJson() => {
+ 'latitude': latitude,
+ 'longitude': longitude
+ };
+}
\ No newline at end of file
diff --git a/lib/models/product.dart b/lib/models/product.dart
new file mode 100644
index 0000000..f143476
--- /dev/null
+++ b/lib/models/product.dart
@@ -0,0 +1,77 @@
+
+import 'dart:convert';
+
+import 'Subproduct.dart';
+import 'product_attribute.dart';
+
+class Product {
+ int id;
+ int businessId;
+ int categoryId;
+ String name;
+ double price;
+ double regularPrice;
+ String description;
+ String detailDescription;
+ String imagePath;
+ double monthSales;
+ int rate;
+ double leftNum;
+ List productAttributes;
+ bool nonInventory;
+ String extraData;
+ List subproducts;
+
+ Product(int id, int businessId, String name, double price, String description,
+ String imagePath, List productAttributes) {
+ this.id = id;
+ this.businessId = businessId;
+ this.name = name;
+ this.price = price;
+ this.description = description;
+ this.imagePath = imagePath;
+ this.productAttributes = productAttributes;
+ }
+
+ Product.fromJson(Map json)
+ : id = json['id'],
+ businessId = json['business_id'],
+ categoryId = json['category_id'],
+ name = json['name'],
+ price = double.parse(json['price'].toString()),
+ regularPrice = double.parse(json['regular_price'].toString()),
+ description = json['description'],
+ detailDescription = json['detail_description'],
+ imagePath = json['image_path'],
+ monthSales = json['month_sales'] != null ? double.parse(json['month_sales'].toString()) : 0.0,
+ rate = json['rate'],
+ leftNum = json['left_num'] != null ? double.parse(json['left_num'].toString()) : 0.0,
+ productAttributes = json['productattributes'] != null ? (json['productattributes'] as List).map((i) => ProductAttribute.fromJson(i)).toList() : [],
+ nonInventory = json['non_inventory'],
+ extraData = json['extra_data'],
+ subproducts = json['subproducts'] != null ? (json['subproducts'] as List).map((e) => Subproduct.fromJson(e)).toList() : [];
+
+ Map toJson() => {
+ 'id': id,
+ 'business_id': businessId,
+ 'category_id': categoryId,
+ 'name': name,
+ 'price': price,
+ 'regular_price': regularPrice,
+ 'description': description,
+ 'detail_description': detailDescription,
+ 'image_path': imagePath,
+ 'month_sales': monthSales,
+ 'rate': rate,
+ 'left_num': leftNum,
+ 'productattributes': productAttributes,
+ 'non_inventory': nonInventory,
+ 'extra_data': extraData,
+ 'subproducts': subproducts,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/product_attribute.dart b/lib/models/product_attribute.dart
new file mode 100644
index 0000000..e519a4d
--- /dev/null
+++ b/lib/models/product_attribute.dart
@@ -0,0 +1,41 @@
+
+import 'dart:convert';
+
+import 'product_option.dart';
+
+class ProductAttribute {
+ int id;
+ String name;
+ List productOptions;
+ bool singleSelection;
+ bool byQuantity;
+ bool required;
+ String extra;
+ bool disabled;
+
+ ProductAttribute.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ productOptions = (json['productoptions'] as List).map((i) => ProductOption.fromJson(i)).toList(),
+ singleSelection = json['single_selection'],
+ byQuantity = json['by_quantity'],
+ required = json['required'],
+ extra = json['extra'],
+ disabled = json['disabled'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'productoptions': productOptions,
+ 'single_selection': singleSelection,
+ 'by_quantity': byQuantity,
+ 'required': required,
+ 'extra': extra,
+ 'disabled': disabled
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/product_detail.dart b/lib/models/product_detail.dart
new file mode 100644
index 0000000..2d6f529
--- /dev/null
+++ b/lib/models/product_detail.dart
@@ -0,0 +1,93 @@
+
+import 'dart:convert';
+
+import 'package:flutter_wisetronic/models/Subproduct.dart';
+
+import 'category.dart';
+import 'product_attribute.dart';
+import 'product_image.dart';
+
+class ProductDetail {
+ int id;
+ String image;
+ List images;
+ String sku;
+ String name;
+ double price;
+ double regularPrice;
+ String description;
+ String description2;
+ String detailDescription;
+ double monthSales;
+ int rate;
+ double leftNum;
+ List productAttributes;
+ bool nonInventory;
+ String extraData;
+ String purchaseNote;
+ double weight;
+ double dimentionsLength;
+ double dimentionsWidth;
+ double dimentionsHeight;
+ bool reviewsAllowed;
+ List categories;
+ List subproducts;
+
+ ProductDetail.fromJson(Map json)
+ : id = json['id'],
+ image = json['image'],
+ images = (json['images'] as List).map((e) => ProductImage.fromJson(e)).toList(),
+ sku = json['sku'],
+ name = json['name'],
+ price = double.parse(json['price'].toString()),
+ regularPrice = double.parse(json['regular_price'].toString()),
+ description = json['description'],
+ description2 = json['description2'],
+ detailDescription = json['detail_description'],
+ reviewsAllowed = json['reviews_allowed'],
+ monthSales = double.parse(json['month_sales'].toString()),
+ rate = json['rate'],
+ leftNum = double.parse(json['left_num'].toString()),
+ productAttributes = (json['productattributes'] as List).map((i) => ProductAttribute.fromJson(i)).toList(),
+ nonInventory = json['non_inventory'],
+ extraData = json['extra_data'],
+ purchaseNote = json['purchase_note'],
+ weight = double.parse(json['weight'].toString()),
+ dimentionsLength = double.parse(json['dimentions_length'].toString()),
+ dimentionsWidth = double.parse(json['dimentions_width'].toString()),
+ dimentionsHeight = double.parse(json['dimentions_height'].toString()),
+ categories = (json['categories'] as List).map((e) => Category.fromJson(e)).toList(),
+ subproducts = (json['subproducts'] as List).map((e) => Subproduct.fromJson(e)).toList();
+
+ Map toJson() => {
+ 'id': id,
+ 'image': image,
+ 'images': images,
+ 'sku': sku,
+ 'name': name,
+ 'price': price,
+ 'regular_price': regularPrice,
+ 'description': description,
+ 'description2': description2,
+ 'detail_description': detailDescription,
+ 'month_sales': monthSales,
+ 'rate': rate,
+ 'left_num': leftNum,
+ 'productattributes': productAttributes,
+ 'non_inventory': nonInventory,
+ 'extra_data': extraData,
+ 'purchase_note': purchaseNote,
+ 'weight': weight,
+ 'dimentions_length': dimentionsLength,
+ 'dimentions_width': dimentionsWidth,
+ 'dimentions_height': dimentionsHeight,
+ 'reviews_allowed': reviewsAllowed,
+ 'categories': categories,
+ 'subproducts': subproducts,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/product_image.dart b/lib/models/product_image.dart
new file mode 100644
index 0000000..5275d57
--- /dev/null
+++ b/lib/models/product_image.dart
@@ -0,0 +1,20 @@
+import 'dart:convert';
+
+class ProductImage {
+ int id;
+ String image;
+
+ ProductImage.fromJson(Map json)
+ : id = json['id'],
+ image = json['image'];
+
+ Map toJson() => {
+ 'id': id,
+ 'image': image
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/product_option.dart b/lib/models/product_option.dart
new file mode 100644
index 0000000..6e50e96
--- /dev/null
+++ b/lib/models/product_option.dart
@@ -0,0 +1,30 @@
+
+import 'dart:convert';
+
+class ProductOption {
+ int id;
+ String name;
+ double adjustAmount;
+ String extra;
+ bool disabled;
+
+ ProductOption.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ adjustAmount = double.parse(json['adjust_amount'].toString()),
+ extra = json['extra'],
+ disabled = json['disabled'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'adjust_amount': adjustAmount,
+ 'extra': extra,
+ 'disabled': disabled
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/shipping_rate.dart b/lib/models/shipping_rate.dart
new file mode 100644
index 0000000..08f811e
--- /dev/null
+++ b/lib/models/shipping_rate.dart
@@ -0,0 +1,73 @@
+
+import 'dart:convert';
+
+import 'package:flutter/foundation.dart';
+
+class ShippingRate {
+ String name;
+ double price;
+ List rates;
+
+ ShippingRate.fromJson(Map json)
+ : name = json['name'],
+ price = double.parse(json['price'].toString()),
+ rates = (json['rates'] as List).map((e) => Rate.fromJson(e)).toList();
+
+ Map toJson() => {
+ 'name': name,
+ 'price': price,
+ 'rates': rates,
+ };
+
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ other is ShippingRate &&
+ runtimeType == other.runtimeType &&
+ name == other.name &&
+ price.toStringAsFixed(2) == other.price.toStringAsFixed(2) &&
+ listEquals(rates, other.rates);
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+ @override
+ int get hashCode =>
+ name.hashCode ^
+ price.hashCode ^
+ rates.hashCode;
+}
+
+class Rate {
+ String name;
+ double rate;
+
+ Rate.fromJson(Map json)
+ : name = json['name'],
+ rate = double.parse(json['rate'].toString());
+
+ Map toJson() => {
+ 'name': name,
+ 'rate': rate,
+ };
+
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ other is Rate &&
+ runtimeType == other.runtimeType &&
+ name == other.name &&
+ rate.toStringAsFixed(2) == other.rate.toStringAsFixed(2);
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+
+ @override
+ int get hashCode =>
+ name.hashCode ^
+ rate.hashCode;
+}
\ No newline at end of file
diff --git a/lib/models/simple_business.dart b/lib/models/simple_business.dart
new file mode 100644
index 0000000..cfcab03
--- /dev/null
+++ b/lib/models/simple_business.dart
@@ -0,0 +1,26 @@
+
+import 'dart:convert';
+
+import 'address.dart';
+
+class Store {
+ int id;
+ String name;
+ Address address;
+
+ Store.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ address = Address.fromJson(json['address']);
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'address': address,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/simple_product.dart b/lib/models/simple_product.dart
new file mode 100644
index 0000000..206745f
--- /dev/null
+++ b/lib/models/simple_product.dart
@@ -0,0 +1,32 @@
+import 'dart:convert';
+
+class SimpleProduct {
+ int id;
+ String name;
+ double price;
+ double regularPrice;
+ String description;
+ String imagePath;
+
+ SimpleProduct.fromJson(Map json)
+ : id = json['id'],
+ name = json['name'],
+ price = double.parse(json['price'].toString()),
+ regularPrice = double.parse(json['regular_price'].toString()),
+ description = json['description'],
+ imagePath = json['image_path'];
+
+ Map toJson() => {
+ 'id': id,
+ 'name': name,
+ 'price': price,
+ 'regular_price': regularPrice,
+ 'description': description,
+ 'image_path': imagePath
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/text_value.dart b/lib/models/text_value.dart
new file mode 100644
index 0000000..57d5c90
--- /dev/null
+++ b/lib/models/text_value.dart
@@ -0,0 +1,21 @@
+
+import 'dart:convert';
+
+class TextValue {
+ String text;
+ int value;
+
+ TextValue.fromJson(Map json)
+ : text = json['text'],
+ value = int.parse(json['value'].toString());
+
+ Map toJson() => {
+ 'text': text,
+ 'value': value
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/ticket.dart b/lib/models/ticket.dart
new file mode 100644
index 0000000..4226a3a
--- /dev/null
+++ b/lib/models/ticket.dart
@@ -0,0 +1,110 @@
+
+import 'dart:convert';
+
+import 'simple_business.dart';
+
+class TicketFile {
+ int id;
+ String url;
+ String fileName;
+ String fileType;
+
+ TicketFile.fromJson(Map json)
+ : id = json['id'],
+ url = json['url'],
+ fileName = json['file_name'],
+ fileType = json['file_type'];
+
+ Map toJson() => {
+ 'id': id,
+ 'url': url,
+ 'file_name': fileName,
+ 'file_type': fileType,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
+
+class Issue {
+ int id;
+ String msg;
+ List files;
+
+ Issue.fromJson(Map json)
+ : id = json['id'],
+ msg = json['msg'],
+ files = (json['files'] as List).map((e) => TicketFile.fromJson(e)).toList();
+
+ Map toJson() => {
+ 'id': id,
+ 'msg': msg,
+ 'files': files,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
+
+class FollowUp {
+ int id;
+ String msg;
+ String poster;
+ String createdAt;
+ List files;
+
+ FollowUp.fromJson(Map json)
+ : id = json['id'],
+ msg = json['msg'],
+ poster = json['poster'],
+ createdAt = json['created_at'],
+ files = (json['files'] as List).map((e) => TicketFile.fromJson(e)).toList();
+
+ Map toJson() => {
+ 'id': id,
+ 'msg': msg,
+ 'poster': poster,
+ 'created_at': createdAt,
+ 'files': files
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
+
+class Ticket {
+ int id;
+ Issue issue;
+ Store store;
+ List followUps;
+ bool isClosed;
+ String createdAt;
+
+ Ticket.fromJson(Map json)
+ : id = json['id'],
+ issue = Issue.fromJson(json['issue']),
+ store = Store.fromJson(json['store']),
+ followUps = (json['follow_ups'] as List).map((e) => FollowUp.fromJson(e)).toList(),
+ isClosed = json['is_closed'],
+ createdAt = json['created_at'];
+
+ Map toJson() => {
+ 'id': id,
+ 'issue': issue,
+ 'store': store,
+ 'follow_ups': followUps,
+ 'is_closed': isClosed,
+ 'created_at': createdAt,
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/user_position.dart b/lib/models/user_position.dart
new file mode 100644
index 0000000..dbe9f56
--- /dev/null
+++ b/lib/models/user_position.dart
@@ -0,0 +1,21 @@
+
+import 'dart:convert';
+
+class UserPosition {
+ double lat;
+ double lng;
+
+ UserPosition.fromJson(Map json) :
+ lat = double.parse(json['lat'].toString()),
+ lng = double.parse(json['lng'].toString());
+
+ Map toJson() => {
+ 'lat': lat,
+ 'lng': lng
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/waiting_line.dart b/lib/models/waiting_line.dart
new file mode 100644
index 0000000..dc1dffa
--- /dev/null
+++ b/lib/models/waiting_line.dart
@@ -0,0 +1,23 @@
+
+import 'dart:convert';
+
+import 'waiting_line_item.dart';
+
+class WaitingLine {
+ List waitingLines;
+ String storeSn;
+
+ WaitingLine.fromJson(Map json)
+ : waitingLines = (json['waiting_lines'] as List).map((i) => WaitingLineItem.fromJson(i)).toList(),
+ storeSn = json['store_sn'];
+
+ Map toJson() => {
+ 'waiting_lines': waitingLines,
+ 'store_sn': storeSn
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/models/waiting_line_item.dart b/lib/models/waiting_line_item.dart
new file mode 100644
index 0000000..ce1127f
--- /dev/null
+++ b/lib/models/waiting_line_item.dart
@@ -0,0 +1,29 @@
+import 'dart:convert';
+
+class WaitingLineItem {
+ String deviceId;
+ String phone;
+ String createdAt;
+ int peopleCount;
+ int waitingNumber;
+
+ WaitingLineItem.fromJson(Map json)
+ : deviceId = json['device_id'],
+ phone = json['phone'],
+ createdAt = json['created_at'],
+ peopleCount = json['people_count'],
+ waitingNumber = json['waiting_number'];
+
+ Map toJson() => {
+ 'device_id': deviceId,
+ 'phone': phone,
+ 'created_at': createdAt,
+ 'people_count': peopleCount,
+ 'waiting_number': waitingNumber
+ };
+
+ @override
+ String toString() {
+ return json.encode(this);
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/attribute_selection.dart b/lib/pages/attribute_selection.dart
new file mode 100644
index 0000000..a977d1a
--- /dev/null
+++ b/lib/pages/attribute_selection.dart
@@ -0,0 +1,27 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_attribute_selection.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+import '../models/business.dart';
+import '../models/product.dart';
+
+class AttributeSelection extends StatelessWidget {
+ final Product product;
+ final Business business;
+ final GlobalKey startKey;
+
+ const AttributeSelection({Key key, this.product, this.business, this.startKey}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileAttributeSelection(product: product, business: business, startKey: startKey,),
+ tablet: MobileAttributeSelection(product: product, business: business, startKey: startKey,),
+ desktop: MobileAttributeSelection(product: product, business: business, startKey: startKey,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/blog.dart b/lib/pages/blog.dart
new file mode 100644
index 0000000..8ef70ef
--- /dev/null
+++ b/lib/pages/blog.dart
@@ -0,0 +1,32 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../widgets/desktop/desktop_blog.dart';
+import '../widgets/mobile/mobile_blog.dart';
+
+class Blog extends StatelessWidget {
+ final Key key;
+ final int businessId;
+
+ const Blog({this.key, int businessId}) :
+ businessId = businessId ?? Constants.BUSINESS_ID;
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileBlog(businessId: businessId,),
+ tablet: DesktopBlog(businessId: businessId,),
+ desktop: Scrollbar(
+ isAlwaysShown: true,
+ child: DesktopBlog(businessId: businessId,),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/buy_service.dart b/lib/pages/buy_service.dart
new file mode 100644
index 0000000..25f1f9b
--- /dev/null
+++ b/lib/pages/buy_service.dart
@@ -0,0 +1,76 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:flutter_wisetronic/utils/http_util.dart';
+import 'package:flutter_wisetronic/utils/utils.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_buy_service.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_renew_minioffice.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_buy_service.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_renew_minioffice.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../models/business.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_renew_license.dart';
+import '../widgets/mobile/mobile_renew_license.dart';
+
+class BuyService extends StatefulWidget {
+ final int gid;
+ final String serviceName;
+
+ const BuyService(this.gid, this.serviceName, {Key key}) :
+ super(key: key);
+
+ @override
+ State createState() => BuyServiceState();
+}
+
+class BuyServiceState extends State {
+ Map data;
+
+ @override
+ Widget build(BuildContext context) {
+
+ store.dispatch(UpdateContext(context));
+
+ if (data == null ) {
+ return new Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileBuyService(data),
+ tablet: DesktopBuyService(data),
+ desktop: DesktopBuyService(data),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _loadData();
+ }
+
+ void _loadData() {
+ HttpUtil.httpGet(
+ 'v1/get-buy-service-info/${widget.serviceName}/${widget.gid}',
+ businessId: Constants.BUSINESS_ID,
+ ).then((value) {
+ data = value;
+ setState(() {});
+ }).onError((error, stackTrace) {
+ Utils.showMessageDialog(context, error);
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/change_mobile_or_email.dart b/lib/pages/change_mobile_or_email.dart
new file mode 100644
index 0000000..ea85924
--- /dev/null
+++ b/lib/pages/change_mobile_or_email.dart
@@ -0,0 +1,48 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_change_mobile_or_email.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_change_mobile_or_email.dart';
+
+class ChangeMobileOrEmail extends StatelessWidget {
+ final bool isMobile;
+
+ const ChangeMobileOrEmail(this.isMobile, {Key key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: isMobile ? S.of(context).change_mobile : S.of(context).change_email,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(isMobile ? S.of(context).change_mobile : S.of(context).change_email, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileChangeMobileOrEmail(isMobile),
+ tablet: DesktopChangeMobileOrEmail(isMobile),
+ desktop: DesktopChangeMobileOrEmail(isMobile),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/change_password.dart b/lib/pages/change_password.dart
new file mode 100644
index 0000000..6fca5b3
--- /dev/null
+++ b/lib/pages/change_password.dart
@@ -0,0 +1,46 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_change_password.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_change_password.dart';
+
+class ChangePassword extends StatelessWidget {
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).change_password,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).change_password, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileChangePassword(),
+ tablet: DesktopChangePassword(),
+ desktop: DesktopChangePassword(),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/checkout.dart b/lib/pages/checkout.dart
new file mode 100644
index 0000000..da5f521
--- /dev/null
+++ b/lib/pages/checkout.dart
@@ -0,0 +1,31 @@
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_checkout.dart';
+import '../widgets/mobile/mobile_checkout.dart';
+
+class Checkout extends StatelessWidget {
+ final int businessId;
+
+ const Checkout(this.businessId, {Key key}) :
+ super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileCheckout(businessId),
+ tablet: DesktopCheckout(businessId),
+ desktop: DesktopCheckout(businessId),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/contact_us.dart b/lib/pages/contact_us.dart
new file mode 100644
index 0000000..1d67451
--- /dev/null
+++ b/lib/pages/contact_us.dart
@@ -0,0 +1,70 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../models/business.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../utils/http_util.dart';
+import '../utils/utils.dart';
+import '../widgets/desktop/desktop_contact_us.dart';
+import '../widgets/mobile/mobile_contact_us.dart';
+
+class ContactUs extends StatefulWidget {
+ final int businessId;
+
+ const ContactUs({this.businessId, Key key}) :
+ super(key: key);
+
+ @override
+ State createState() => ContactUsState();
+}
+
+class ContactUsState extends State {
+ Business business;
+
+ @override
+ Widget build(BuildContext context) {
+
+ store.dispatch(UpdateContext(context));
+
+ if (business == null) {
+ return new Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileContactUs(business),
+ tablet: DesktopContactUs(business),
+ desktop: DesktopContactUs(business),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ loadData();
+ }
+
+ void loadData() {
+ HttpUtil.httpGet(
+ 'v1/get-business',
+ businessId: widget.businessId,
+ ).then((value) {
+ business = Business.fromJson(value);
+ setState(() {});
+ }).onError((error, stackTrace) {
+ Utils.showMessageDialog(context, error);
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/coupons.dart b/lib/pages/coupons.dart
new file mode 100644
index 0000000..666cb4d
--- /dev/null
+++ b/lib/pages/coupons.dart
@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_coupons.dart';
+import '../widgets/mobile/mobile_coupons.dart';
+
+class Coupons extends StatelessWidget {
+ final int contactId;
+
+ const Coupons(this.contactId, {Key key}) :
+ super(key: key);
+
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileCoupons(contactId,),
+ tablet: DesktopCoupons(contactId,),
+ desktop: DesktopCoupons(contactId,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/download.dart b/lib/pages/download.dart
index 468aac6..2ed2128 100644
--- a/lib/pages/download.dart
+++ b/lib/pages/download.dart
@@ -1,14 +1,23 @@
import 'package:flutter/material.dart';
-import 'package:flutter_wisetronic/widgets/general/download_apps.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_download_apps.dart';
+import 'package:flutter_wisetronic/widgets/general/breadcrumbs.dart';
+import 'package:flutter_wisetronic/widgets/general/double_back_to_close_app_wrapper.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_download_apps.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
import '../events/eventbus.dart';
import '../events/events.dart';
import '../generated/l10n.dart';
-import '../utils/double_back_to_close_app.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../utils/http_util.dart';
import '../widgets/general/bottom_nav.dart';
-import '../widgets/mobile/mobile_navigation_drawer.dart';
import '../widgets/general/navigationbar.dart';
-import 'package:responsive_builder/responsive_builder.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_navigation_drawer.dart';
class Download extends StatefulWidget {
@@ -21,25 +30,46 @@ class Download extends StatefulWidget {
class DownloadState extends State {
final _scaffoldKey = GlobalKey();
+ Map data;
@override
Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+ if (data == null) {
+ return Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
return ResponsiveBuilder(
builder: (context, sizingInformation) =>
Scaffold(
key: _scaffoldKey,
- appBar: NavigationBar(title: S.of(context).download,),
+ appBar: NavigationBar(
+ title: S.of(context).download,
+ back: true,
+ breadCrumbs: [BreadCrumb(S.of(context).downloads, null)],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
drawer: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? MobileNavigationDrawer() : null,
- body: SingleChildScrollView(
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- DownloadApps(),
- ],
+ body: ScreenTypeLayout(
+ mobile: MobileDownloadApps(data),
+ tablet: DesktopDownloadApps(data),
+ desktop: Scrollbar(
+ isAlwaysShown: true,
+ child: DesktopDownloadApps(data),
),
),
- bottomNavigationBar: BottomNav(),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
),
);
}
@@ -52,6 +82,18 @@ class DownloadState extends State {
_scaffoldKey.currentState.openDrawer();
}
});
+ _loadData();
+ }
+ void _loadData() {
+ HttpUtil.httpGet('v1/get-wisetronic-download-page')
+ .then((value) {
+ print('$value');
+ if (mounted) {
+ setState(() {
+ data = value;
+ });
+ }
+ });
}
}
\ No newline at end of file
diff --git a/lib/pages/edit_address.dart b/lib/pages/edit_address.dart
new file mode 100644
index 0000000..3324ae9
--- /dev/null
+++ b/lib/pages/edit_address.dart
@@ -0,0 +1,34 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_edit_address.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_edit_address.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../models/address.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+
+class EditAddress extends StatelessWidget {
+ final Key key;
+ final Address address;
+ final int businessId;
+ const EditAddress(this.address, {this.key, int businessId}) :
+ businessId = businessId ?? Constants.BUSINESS_ID;
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileEditAddress(address, businessId: businessId,),
+ tablet: DesktopEditAddress(address, businessId: businessId,),
+ desktop: DesktopEditAddress(address, businessId: businessId,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/forgot_password.dart b/lib/pages/forgot_password.dart
new file mode 100644
index 0000000..0140f73
--- /dev/null
+++ b/lib/pages/forgot_password.dart
@@ -0,0 +1,45 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_forgot_password.dart';
+import 'package:flutter_wisetronic/widgets/general/breadcrumbs.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_forgot_password.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+
+class ForgotPassword extends StatelessWidget {
+ const ForgotPassword({Key key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: S.of(context).forgot_password,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).forgot_password, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileForgotPassword(),
+ tablet: DesktopForgotPassword(),
+ desktop: DesktopForgotPassword(),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/home.dart b/lib/pages/home.dart
index 0258bb4..3cd5e61 100644
--- a/lib/pages/home.dart
+++ b/lib/pages/home.dart
@@ -1,29 +1,39 @@
+import 'dart:async';
+
+import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_wisetronic/models/gallery.dart';
-import '../widgets/general/bottom_nav.dart';
-import '../widgets/general/index_carousel.dart';
-import '../widgets/general/index_main_content_1.dart';
-import '../widgets/general/index_main_content_2.dart';
-import '../widgets/general/index_main_content_3.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+// import 'package:uni_links/uni_links.dart';
+
import '../events/eventbus.dart';
import '../events/events.dart';
-import '../generated/l10n.dart';
+import '../models/gallery.dart';
import '../store/actions.dart';
import '../store/store.dart';
import '../utils/http_util.dart';
-import '../utils/double_back_to_close_app.dart';
+import '../utils/utils.dart';
+import '../widgets/desktop/desktop_Index_carousel.dart';
+import '../widgets/desktop/desktop_index_main_content_1.dart';
+import '../widgets/desktop/desktop_index_main_content_2.dart';
+import '../widgets/desktop/desktop_index_main_content_3.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/double_back_to_close_app_wrapper.dart';
import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_index_carousel.dart';
+import '../widgets/mobile/mobile_index_main_content_1.dart';
+import '../widgets/mobile/mobile_index_main_content_2.dart';
+import '../widgets/mobile/mobile_index_main_content_3.dart';
import '../widgets/mobile/mobile_navigation_drawer.dart';
-import 'package:responsive_builder/responsive_builder.dart';
class Home extends StatefulWidget {
- Locale locale;
final String title;
- Home(Locale locale, {Key key, this.title}) :
- locale = locale ?? store.state.locale;
+ Home({Key key, this.title = ''}) : super(key: key);
@override
State createState() {
@@ -35,36 +45,78 @@ class Home extends StatefulWidget {
class HomeState extends State {
final _scaffoldKey = GlobalKey();
List galleries = [];
- String content1Message = '';
+ String content1Message;
Map content2;
+ StreamSubscription _sub;
+ Uri _latestUri;
+
@override
Widget build(BuildContext context) {
store.dispatch(UpdateContext(context));
+ if (content1Message == null) {
+ return Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
return ResponsiveBuilder(
builder: (context, sizingInformation) =>
Scaffold(
key: _scaffoldKey,
appBar: NavigationBar(),
drawer: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? MobileNavigationDrawer() : null,
- body: DoubleBackToCloseApp(
- snackBar: SnackBar(
- content: Text(S.of(context).tap_back_again_to_exit),
- ),
- child: SingleChildScrollView(
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- IndexCarousel(galleries),
- IndexMainContent1(content1Message),
- IndexMainContent2(content2),
- IndexMainContent3(content2),
- ],
+ body: DoubleBackToCloseAppWrapper(
+ child: ScreenTypeLayout(
+ mobile: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ MobileIndexCarousel(galleries),
+ MobileIndexMainContent1(content1Message),
+ MobileIndexMainContent2(content2),
+ MobileIndexMainContent3(content2),
+ ],
+ ),
+ ),
+ tablet: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ DesktopIndexCarousel(galleries),
+ DesktopIndexMainContent1(content1Message),
+ DesktopIndexMainContent2(content2),
+ DesktopIndexMainContent3(content2),
+ ],
+ ),
+ ),
+ desktop: Scrollbar(
+ isAlwaysShown: true,
+ child: SingleChildScrollView(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ DesktopIndexCarousel(galleries),
+ DesktopIndexMainContent1(content1Message),
+ DesktopIndexMainContent2(content2),
+ DesktopIndexMainContent3(content2),
+ ],
+ ),
+ ),
),
),
),
- bottomNavigationBar: BottomNav(),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
),
);
}
@@ -72,13 +124,21 @@ class HomeState extends State {
@override
void initState() {
super.initState();
+ eventBus.on().listen((event) {
+ if (mounted) {
+ print('got latest Uri $_latestUri');
+ }
+ });
+ initPlatformStateForUri();
_loadData();
eventBus.on().listen((event) {
if (mounted) {
_scaffoldKey.currentState.openDrawer();
}
});
-
+ WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
+ Utils.getCurrentUser();
+ });
}
void _loadData() {
@@ -94,4 +154,39 @@ class HomeState extends State {
}
});
}
+
+ initPlatformStateForUri() async {
+ if (kIsWeb) {
+ if (!mounted) return;
+ _latestUri = Uri.base;
+ print('uri base $_latestUri');
+ eventBus.fire(OnGotDeepLinkUri(_latestUri));
+ } else {
+// _sub = getUriLinksStream().listen((Uri uri) {
+// print('_sub should get uri $uri');
+// // if (!mounted) return;
+// _latestUri = uri;
+// eventBus.fire(OnGotDeepLinkUri(uri));
+// }, onError: (err) {
+// if (!mounted) return;
+// _latestUri = null;
+// });
+//
+// Uri initialUri;
+//
+// try {
+// initialUri = await getInitialUri();
+// print('initial uri: ${initialUri?.path} ${initialUri
+// ?.queryParametersAll}');
+// } on PlatformException {
+// initialUri = null;
+// } on FormatException {
+// initialUri = null;
+// }
+//
+// if (!mounted) return;
+// _latestUri = initialUri;
+// eventBus.fire(OnGotDeepLinkUri(_latestUri));
+ }
+ }
}
\ No newline at end of file
diff --git a/lib/pages/igoshow_learn_more.dart b/lib/pages/igoshow_learn_more.dart
new file mode 100644
index 0000000..c6d2a26
--- /dev/null
+++ b/lib/pages/igoshow_learn_more.dart
@@ -0,0 +1,89 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../utils/http_util.dart';
+import '../widgets/desktop/desktop_igoshow_learn_more.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_igoshow_learn_more.dart';
+
+class IGoShowLearnMore extends StatefulWidget {
+ const IGoShowLearnMore({Key key}) : super(key: key);
+
+ @override
+ State createState() {
+ return IGoShowLearnMoreState();
+ }
+}
+
+class IGoShowLearnMoreState extends State {
+ final _scaffoldKey = GlobalKey();
+ Map data;
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+ if (data == null) {
+ return Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).igoshow,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).igoshow, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileiGoShowLearnMore(data),
+ tablet: DesktopiGoShowLearnMore(data),
+ desktop: DesktopiGoShowLearnMore(data),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _loadData();
+ }
+
+ void _loadData() {
+ HttpUtil.httpGet('v1/get-igoshow-learn-more-page')
+ .then((value) {
+ print('$value');
+ if (mounted) {
+ setState(() {
+ data = value;
+ });
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/login.dart b/lib/pages/login.dart
new file mode 100644
index 0000000..1f4e5f7
--- /dev/null
+++ b/lib/pages/login.dart
@@ -0,0 +1,66 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_login.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_login.dart';
+
+class Login extends StatefulWidget {
+ final Key key;
+
+ const Login({this.key}) : super(key: key);
+
+ @override
+ State createState() {
+ return LoginState();
+ }
+}
+
+class LoginState extends State {
+
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).login,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).login, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileLogin(),
+ tablet: DesktopLogin(),
+ desktop: DesktopLogin(),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/me.dart b/lib/pages/me.dart
new file mode 100644
index 0000000..da065dd
--- /dev/null
+++ b/lib/pages/me.dart
@@ -0,0 +1,69 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_me.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/double_back_to_close_app_wrapper.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_me.dart';
+
+class Me extends StatefulWidget {
+ final Key key;
+
+ const Me({this.key}) : super(key: key);
+
+ @override
+ State createState() {
+ return MeState();
+ }
+}
+
+class MeState extends State {
+
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: sizingInformation.isMobile? null : NavigationBar(
+ title: S.of(context).me,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).me, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: DoubleBackToCloseAppWrapper(
+ child: ScreenTypeLayout(
+ mobile: MobileMe(),
+ tablet: DesktopMe(),
+ desktop: DesktopMe(),
+ ),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 3,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/minipos_learn_more.dart b/lib/pages/minipos_learn_more.dart
new file mode 100644
index 0000000..536a100
--- /dev/null
+++ b/lib/pages/minipos_learn_more.dart
@@ -0,0 +1,94 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../utils/http_util.dart';
+import '../widgets/desktop/desktop_minipos_learn_more.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_minipos_learn_more.dart';
+
+class MiniPosLearnMore extends StatefulWidget {
+ const MiniPosLearnMore({Key key}) : super(key: key);
+
+ @override
+ State createState() {
+ return MiniPosLearnMoreState();
+ }
+}
+
+class MiniPosLearnMoreState extends State {
+ final _scaffoldKey = GlobalKey();
+ Map data;
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+ if (data == null) {
+ return Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
+ return WillPopScope(
+ child: ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).minipos,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).minipos, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileMiniPosLearnMore(data),
+ tablet: DesktopMiniPosLearnMore(data),
+ desktop: DesktopMiniPosLearnMore(data),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ ),
+ onWillPop: () async {
+ return true;
+ },
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _loadData();
+ }
+
+ void _loadData() {
+ HttpUtil.httpGet('v1/get-minipos-learn-more-page')
+ .then((value) {
+ print('$value');
+ if (mounted) {
+ setState(() {
+ data = value;
+ });
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/my_addresses.dart b/lib/pages/my_addresses.dart
new file mode 100644
index 0000000..70967de
--- /dev/null
+++ b/lib/pages/my_addresses.dart
@@ -0,0 +1,29 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../widgets/desktop/desktop_my_addresses.dart';
+import '../widgets/mobile/mobile_my_addresses.dart';
+
+class MyAddresses extends StatelessWidget {
+ final Key key;
+ final int businessId;
+
+ const MyAddresses({this.key, int businessId}) :
+ businessId = businessId ?? Constants.BUSINESS_ID;
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileMyAddresses(businessId: businessId,),
+ tablet: DesktopMyAddresses(businessId: businessId,),
+ desktop: DesktopMyAddresses(businessId: businessId,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/my_cards.dart b/lib/pages/my_cards.dart
new file mode 100644
index 0000000..6fe1405
--- /dev/null
+++ b/lib/pages/my_cards.dart
@@ -0,0 +1,46 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../routes.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_my_cards.dart';
+import '../widgets/mobile/mobile_my_cards.dart';
+
+class MyCards extends StatelessWidget {
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
+ if (store.state.user == null) {
+ store.dispatch(UpdateRedirectRoute('/my-cards'));
+ Routes.router.navigateTo(context, '/login', replace: true);
+ return;
+ }
+ });
+
+ if (store.state.user == null) {
+ return Center(
+ child: Image.asset(
+ 'assets/images/denied.png',
+ width: 48,
+ height: 48,
+ fit: BoxFit.fill,
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileMyCards(),
+ tablet: DesktopMyCards(),
+ desktop: DesktopMyCards(),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/my_support.dart b/lib/pages/my_support.dart
new file mode 100644
index 0000000..908b3d2
--- /dev/null
+++ b/lib/pages/my_support.dart
@@ -0,0 +1,29 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../widgets/desktop/desktop_my_support.dart';
+import '../widgets/mobile/mobile_my_support.dart';
+
+class MySupport extends StatelessWidget {
+ final Key key;
+ final int businessId;
+
+ const MySupport({this.key, int businessId}) :
+ businessId = businessId ?? Constants.BUSINESS_ID;
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileMySupport(businessId: businessId,),
+ tablet: DesktopMySupport(businessId: businessId,),
+ desktop: DesktopMySupport(businessId: businessId,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/new_address.dart b/lib/pages/new_address.dart
new file mode 100644
index 0000000..08044cf
--- /dev/null
+++ b/lib/pages/new_address.dart
@@ -0,0 +1,36 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../models/located_address.dart';
+import '../widgets/desktop/desktop_new_address.dart';
+import '../widgets/mobile/mobile_new_address.dart';
+
+class NewAddress extends StatelessWidget {
+ final Key key;
+ final LocatedAddress locatedAddress;
+ final int businessId;
+ const NewAddress({this.key, this.locatedAddress, this.businessId}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileNewAddress(
+ locatedAddress: locatedAddress,
+ businessId: businessId,
+ ),
+ tablet: DesktopNewAddress(
+ locatedAddress: locatedAddress,
+ businessId: businessId,
+ ),
+ desktop: DesktopNewAddress(
+ locatedAddress: locatedAddress,
+ businessId: businessId,
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/new_comment.dart b/lib/pages/new_comment.dart
new file mode 100644
index 0000000..1770d87
--- /dev/null
+++ b/lib/pages/new_comment.dart
@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_new_comment.dart';
+import '../widgets/mobile/mobile_new_comment.dart';
+
+class NewComment extends StatelessWidget {
+ final int orderId;
+
+ const NewComment(this.orderId, {Key key}) :
+ super(key: key);
+
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileNewComment(orderId,),
+ tablet: DesktopNewComment(orderId,),
+ desktop: DesktopNewComment(orderId,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/new_ticket.dart b/lib/pages/new_ticket.dart
new file mode 100644
index 0000000..ca5fb96
--- /dev/null
+++ b/lib/pages/new_ticket.dart
@@ -0,0 +1,68 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_new_ticket.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_new_ticket.dart';
+
+class NewTicket extends StatefulWidget {
+ final Key key;
+ final int businessId;
+
+ const NewTicket({this.key, int businessId}) :
+ businessId = businessId ?? Constants.BUSINESS_ID;
+
+ @override
+ State createState() {
+ return NewTicketState();
+ }
+}
+
+class NewTicketState extends State {
+
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).new_ticket,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).new_ticket, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileNewTicket(businessId: widget.businessId,),
+ tablet: DesktopNewTicket(businessId: widget.businessId,),
+ desktop: DesktopNewTicket(businessId: widget.businessId,),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/new_user.dart b/lib/pages/new_user.dart
new file mode 100644
index 0000000..b11a2e3
--- /dev/null
+++ b/lib/pages/new_user.dart
@@ -0,0 +1,45 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_new_user.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_new_user.dart';
+
+class NewUser extends StatelessWidget {
+ const NewUser({Key key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: S.of(context).registration,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).registration, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileNewUser(),
+ tablet: DesktopNewUser(),
+ desktop: DesktopNewUser(),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/order_detail.dart b/lib/pages/order_detail.dart
new file mode 100644
index 0000000..40d9a6a
--- /dev/null
+++ b/lib/pages/order_detail.dart
@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_order_detail.dart';
+import '../widgets/mobile/mobile_order_detail.dart';
+
+class OrderDetail extends StatelessWidget {
+ final int orderId;
+ final bool fromOrders;
+
+ const OrderDetail(this.orderId, {this.fromOrders = false, Key key}) :
+ super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileOrderDetail(orderId, fromOrders: fromOrders,),
+ tablet: DesktopOrderDetail(orderId, fromOrders: fromOrders,),
+ desktop: DesktopOrderDetail(orderId, fromOrders: fromOrders,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/orders.dart b/lib/pages/orders.dart
new file mode 100644
index 0000000..cda2983
--- /dev/null
+++ b/lib/pages/orders.dart
@@ -0,0 +1,46 @@
+
+import 'package:flutter/material.dart';
+import '../routes.dart';
+import '../widgets/desktop/desktop_orders.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/mobile/mobile_orders.dart';
+
+class Orders extends StatelessWidget {
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
+ if (store.state.user == null) {
+ store.dispatch(UpdateRedirectRoute('/orders'));
+ Routes.router.navigateTo(context, '/login', replace: true);
+ return;
+ }
+ });
+
+ if (store.state.user == null) {
+ return Center(
+ child: Image.asset(
+ 'assets/images/denied.png',
+ width: 48,
+ height: 48,
+ fit: BoxFit.fill,
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileOrders(),
+ tablet: DesktopOrders(),
+ desktop: DesktopOrders(),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/pay_now.dart b/lib/pages/pay_now.dart
new file mode 100644
index 0000000..6096f33
--- /dev/null
+++ b/lib/pages/pay_now.dart
@@ -0,0 +1,31 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_pay_now.dart';
+import '../widgets/mobile/mobile_pay_now.dart';
+
+class PayNow extends StatelessWidget {
+ final int orderId;
+
+ const PayNow(this.orderId, {Key key}) :
+ super(key: key);
+
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobilePayNow(orderId,),
+ tablet: DesktopPayNow(orderId,),
+ desktop: DesktopPayNow(orderId,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/plain_page.dart b/lib/pages/plain_page.dart
new file mode 100644
index 0000000..5fc2a1b
--- /dev/null
+++ b/lib/pages/plain_page.dart
@@ -0,0 +1,74 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_plain_page.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_plain_page.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../models/blog.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../utils/http_util.dart';
+import '../utils/utils.dart';
+
+class PlainPage extends StatefulWidget {
+ final int businessId;
+ final String slug;
+
+ const PlainPage(this.slug, {this.businessId, Key key}) :
+ super(key: key);
+
+ @override
+ State createState() => PlainPageState();
+}
+
+class PlainPageState extends State {
+ Blog blog;
+
+ @override
+ Widget build(BuildContext context) {
+
+ store.dispatch(UpdateContext(context));
+
+ if (blog == null) {
+ return new Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobilePlainPage(blog),
+ tablet: DesktopPlainPage(blog),
+ desktop: DesktopPlainPage(blog),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ loadData();
+ }
+
+ void loadData() {
+ HttpUtil.httpGet(
+ 'v1/special-page',
+ businessId: widget.businessId,
+ queryParameters: {
+ 'bid': widget.slug,
+ }
+ ).then((value) {
+ blog = Blog.fromJson(value);
+ setState(() {});
+ }).onError((error, stackTrace) {
+ Utils.showMessageDialog(context, error);
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/product_detail_page.dart b/lib/pages/product_detail_page.dart
new file mode 100644
index 0000000..995b755
--- /dev/null
+++ b/lib/pages/product_detail_page.dart
@@ -0,0 +1,34 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../models/business.dart';
+import '../models/product.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_product_detail_page.dart';
+import '../widgets/mobile/mobile_product_detail_page.dart';
+
+class ProductDetailPage extends StatelessWidget {
+ final Business business;
+ final Product product;
+
+ const ProductDetailPage({this.business, this.product, Key key}) :
+ super(key: key);
+
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileProductDetailPage(business: business, product: product,),
+ tablet: DesktopProductDetailPage(business: business, product: product,),
+ desktop: DesktopProductDetailPage(business: business, product: product,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/renew_license.dart b/lib/pages/renew_license.dart
new file mode 100644
index 0000000..0a7d395
--- /dev/null
+++ b/lib/pages/renew_license.dart
@@ -0,0 +1,43 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../models/business.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_renew_license.dart';
+import '../widgets/mobile/mobile_renew_license.dart';
+
+class RenewLicense extends StatefulWidget {
+
+ const RenewLicense({Key key}) :
+ super(key: key);
+
+ @override
+ State createState() => RenewLicenseState();
+}
+
+class RenewLicenseState extends State {
+
+ @override
+ Widget build(BuildContext context) {
+
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileRenewLicense(Constants.BUSINESS_ID),
+ tablet: DesktopRenewLicense(Constants.BUSINESS_ID),
+ desktop: DesktopRenewLicense(Constants.BUSINESS_ID),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/renew_minioffice.dart b/lib/pages/renew_minioffice.dart
new file mode 100644
index 0000000..c9b4c34
--- /dev/null
+++ b/lib/pages/renew_minioffice.dart
@@ -0,0 +1,73 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+import 'package:flutter_wisetronic/utils/http_util.dart';
+import 'package:flutter_wisetronic/utils/utils.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_renew_minioffice.dart';
+import 'package:flutter_wisetronic/widgets/mobile/mobile_renew_minioffice.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../models/business.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_renew_license.dart';
+import '../widgets/mobile/mobile_renew_license.dart';
+
+class RenewMiniOffice extends StatefulWidget {
+ final int gid;
+
+ const RenewMiniOffice(this.gid, {Key key}) :
+ super(key: key);
+
+ @override
+ State createState() => RenewMiniOfficeState();
+}
+
+class RenewMiniOfficeState extends State {
+ Map data;
+
+ @override
+ Widget build(BuildContext context) {
+
+ store.dispatch(UpdateContext(context));
+
+ if (data == null ) {
+ return new Scaffold(
+ body: Center(
+ child: SpinKitWave(
+ color: Colors.lightBlueAccent,
+ size: 40.0,
+ ),
+ ),
+ );
+ }
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileRenewMiniOffice(data),
+ tablet: DesktopRenewMiniOffice(data),
+ desktop: DesktopRenewMiniOffice(data),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _loadData();
+ }
+
+ void _loadData() {
+ HttpUtil.httpGet(
+ 'v1/renew-minioffice/${widget.gid}',
+ businessId: Constants.BUSINESS_ID,
+ ).then((value) {
+ data = value;
+ setState(() {});
+ }).onError((error, stackTrace) {
+ Utils.showMessageDialog(context, error);
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/reset_password.dart b/lib/pages/reset_password.dart
new file mode 100644
index 0000000..b9b1113
--- /dev/null
+++ b/lib/pages/reset_password.dart
@@ -0,0 +1,47 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_reset_password.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_reset_password.dart';
+
+class ResetPassword extends StatelessWidget {
+ final String mobile;
+ final String code;
+ const ResetPassword(this.mobile, {Key key, this.code}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: S.of(context).reset_password,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).reset_password, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileResetPassword(mobile, code: code,),
+ tablet: DesktopResetPassword(mobile, code: code,),
+ desktop: DesktopResetPassword(mobile, code: code,),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/search_place.dart b/lib/pages/search_place.dart
new file mode 100644
index 0000000..158e68f
--- /dev/null
+++ b/lib/pages/search_place.dart
@@ -0,0 +1,24 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_search_place.dart';
+import '../widgets/mobile/mobile_search_place.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+class SearchPlace extends StatelessWidget {
+ final Key key;
+ final int businessId;
+ const SearchPlace(this.businessId, {this.key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileSearchPlace(businessId),
+ tablet: DesktopSearchPlace(businessId),
+ desktop: DesktopSearchPlace(businessId),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/set_password.dart b/lib/pages/set_password.dart
new file mode 100644
index 0000000..2a56823
--- /dev/null
+++ b/lib/pages/set_password.dart
@@ -0,0 +1,47 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_set_password.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_set_password.dart';
+
+class SetPassword extends StatelessWidget {
+ final String mobile;
+ final String code;
+ const SetPassword(this.mobile, {Key key, this.code}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: S.of(context).set_password,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).set_password, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileSetPassword(mobile, code: code,),
+ tablet: DesktopSetPassword(mobile, code: code,),
+ desktop: DesktopSetPassword(mobile, code: code,),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/shop.dart b/lib/pages/shop.dart
new file mode 100644
index 0000000..bc82894
--- /dev/null
+++ b/lib/pages/shop.dart
@@ -0,0 +1,193 @@
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/events/eventbus.dart';
+import 'package:flutter_wisetronic/events/events.dart';
+import 'package:flutter_wisetronic/generated/l10n.dart';
+import 'package:flutter_wisetronic/models/cart_info.dart';
+import 'package:flutter_wisetronic/models/cart_line_item.dart';
+import 'package:flutter_wisetronic/models/product.dart';
+import 'package:flutter_wisetronic/utils/utils.dart';
+import 'package:fluttertoast/fluttertoast.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_shop.dart';
+import '../widgets/mobile/mobile_shop.dart';
+
+class Shop extends StatefulWidget {
+ final int businessId;
+
+ const Shop({this.businessId = Constants.BUSINESS_ID, Key key}) :
+ super(key: key);
+
+ @override
+ State createState() => ShopState();
+}
+
+class ShopState extends State {
+ StreamSubscription onProductWillAddToCartSubscription;
+ StreamSubscription onProductWillRemoveFromCartSubscription;
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileShop(businessId: widget.businessId,),
+ tablet: DesktopShop(businessId: widget.businessId,),
+ desktop: DesktopShop(businessId: widget.businessId,),
+ ),
+ );
+ }
+
+ @override
+ void dispose() {
+ onProductWillAddToCartSubscription?.cancel();
+ onProductWillRemoveFromCartSubscription?.cancel();
+ super.dispose();
+ print("shop parent dispose");
+ }
+
+ @override
+ void initState() {
+ super.initState();
+
+ onProductWillAddToCartSubscription =
+ eventBus.on().listen((event) {
+ if (mounted) {
+
+ CartInfo cartInfo =
+ Utils.getCartInfoByBusiness(store.state.cartInfos, event.business);
+
+ if (cartInfo == null || cartInfo.productList.length == 0) {
+ cartInfo = CartInfo();
+ cartInfo.id = 0;
+ cartInfo.amountPaid = 0.0;
+ cartInfo.businessInfo = event.business;
+ cartInfo.extraFeeList = [];
+ cartInfo.discountList = [];
+ CartLineItem lineItem = Utils.newCartLineItem(
+ id: 0,
+ price: event.price,
+ product: event.product,
+ name: event.product.name,
+ description: event.description,
+ quantity: 1.0);
+ cartInfo.productList = [lineItem];
+ Utils.addSubproductToCard(cartInfo, lineItem);
+ store.dispatch(new UpdateCartInfo(Utils.addCartInfoToCartInfoList(
+ store.state.cartInfos, cartInfo)));
+ eventBus.fire(new OnCartInfoUpdated());
+ } else {
+ if (event.product.productAttributes.length > 0) {
+ CartLineItem lineItem = Utils.newCartLineItem(
+ id: 0,
+ price: event.price,
+ product: event.product,
+ name: event.product.name,
+ description: event.description,
+ quantity: 1.0);
+ cartInfo.productList.add(lineItem);
+ Utils.addSubproductToCard(cartInfo, lineItem);
+ store.dispatch(new UpdateCartInfo(Utils.addCartInfoToCartInfoList(
+ store.state.cartInfos, cartInfo)));
+ eventBus.fire(new OnCartInfoUpdated());
+ } else {
+ int found = -1;
+ for (var i = 0; i < cartInfo.productList.length; i++) {
+ if (event.product.id == cartInfo.productList[i].product.id) {
+ found = i;
+ break;
+ }
+ }
+ if (found == -1) {
+ CartLineItem lineItem = Utils.newCartLineItem(
+ id: 0,
+ price: event.price,
+ product: event.product,
+ name: event.product.name,
+ description: event.description,
+ quantity: 1.0);
+ cartInfo.productList.add(lineItem);
+ Utils.addSubproductToCard(cartInfo, lineItem);
+ store.dispatch(new UpdateCartInfo(Utils.addCartInfoToCartInfoList(
+ store.state.cartInfos, cartInfo)));
+ eventBus.fire(new OnCartInfoUpdated());
+ } else {
+ if (cartInfo.productList[found].quantity + 1.0 >
+ event.product.leftNum) {
+ Fluttertoast.showToast(
+ msg: S.of(context).product_insufficient,
+ toastLength: Toast.LENGTH_SHORT,
+ gravity: ToastGravity.CENTER,
+ backgroundColor: Colors.red,
+ textColor: Colors.white);
+ } else {
+ cartInfo.productList[found].quantity += 1;
+ Utils.addSubproductQty(cartInfo, cartInfo.productList[found]);
+ store.dispatch(new UpdateCartInfo(
+ Utils.addCartInfoToCartInfoList(
+ store.state.cartInfos, cartInfo)));
+ eventBus.fire(new OnCartInfoUpdated());
+ }
+ }
+ }
+ }
+ }
+ });
+ onProductWillRemoveFromCartSubscription =
+ eventBus.on().listen((event) {
+ if (mounted) {
+ CartInfo cartInfo =
+ Utils.getCartInfoByBusiness(store.state.cartInfos, event.business);
+ if (cartInfo != null) {
+ if (cartInfo.productList.length > 0) {
+ if (event.productListIndex != -1) {
+ if (cartInfo.productList[event.productListIndex].quantity <= 1) {
+ String uuid = cartInfo.productList[event.productListIndex].uuid;
+ cartInfo.productList.removeAt(event.productListIndex);
+ Utils.removeSubproduct(cartInfo, uuid);
+ } else {
+ cartInfo.productList[event.productListIndex].quantity -= 1;
+ Utils.addSubproductQty(cartInfo, cartInfo.productList[event.productListIndex], remove: true);
+ }
+ } else {
+ int productListIndex = -1;
+ for (var i = 0; i < cartInfo.productList.length; i++) {
+ if (cartInfo.productList[i].product.id == event.product.id) {
+ productListIndex = i;
+ break;
+ }
+ }
+ if (productListIndex != -1) {
+ if (cartInfo.productList[productListIndex].quantity <= 1) {
+ String uuid = cartInfo.productList[productListIndex].uuid;
+ cartInfo.productList.removeAt(productListIndex);
+ Utils.removeSubproduct(cartInfo, uuid);
+ } else {
+ cartInfo.productList[productListIndex].quantity -= 1;
+ Utils.addSubproductQty(cartInfo, cartInfo.productList[productListIndex], remove: true);
+ }
+ }
+ }
+ }
+
+ if (cartInfo.productList.length <= 0) {
+ store.dispatch(UpdateCartInfo(Utils.removeCartInfoFromCartInfoList(
+ store.state.cartInfos, cartInfo)));
+ } else {
+ store.dispatch(UpdateCartInfo(Utils.addCartInfoToCartInfoList(
+ store.state.cartInfos, cartInfo)));
+ }
+ eventBus.fire(new OnCartInfoUpdated());
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/store_product_search.dart b/lib/pages/store_product_search.dart
new file mode 100644
index 0000000..2749668
--- /dev/null
+++ b/lib/pages/store_product_search.dart
@@ -0,0 +1,48 @@
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/widgets/desktop/desktop_store_product_search.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../models/business.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_store_product_search.dart';
+
+class StoreProductSearch extends StatelessWidget {
+ final Business business;
+
+ const StoreProductSearch(this.business, {Key key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: S.of(context).search_product,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).search_product, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileStoreProductSearch(business,),
+ tablet: DesktopStoreProductSearch(business),
+ desktop: DesktopStoreProductSearch(business),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 1,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/stripe_pay_web.dart b/lib/pages/stripe_pay_web.dart
new file mode 100644
index 0000000..9d4c2d8
--- /dev/null
+++ b/lib/pages/stripe_pay_web.dart
@@ -0,0 +1,34 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../models/order.dart';
+import '../models/payment_platform.dart';
+import '../models/stripe_payment_method.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_stripe_pay_web.dart';
+import '../widgets/mobile/mobile_stripe_pay_web.dart';
+
+class StripePayWeb extends StatelessWidget {
+ final Order order;
+ final PaymentPlatform paymentPlatform;
+ final StripePaymentMethod stripePaymentMethod;
+
+ const StripePayWeb(this.order, this.paymentPlatform, {this.stripePaymentMethod});
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ ScreenTypeLayout(
+ mobile: MobileStripePayWeb(order, paymentPlatform, stripePaymentMethod: stripePaymentMethod,),
+ tablet: DesktopStripePayWeb(order, paymentPlatform, stripePaymentMethod: stripePaymentMethod,),
+ desktop: DesktopStripePayWeb(order, paymentPlatform, stripePaymentMethod: stripePaymentMethod,),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/tutorials.dart b/lib/pages/tutorials.dart
new file mode 100644
index 0000000..d72ff80
--- /dev/null
+++ b/lib/pages/tutorials.dart
@@ -0,0 +1,66 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../events/eventbus.dart';
+import '../events/events.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_tutorials.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_navigation_drawer.dart';
+import '../widgets/mobile/mobile_tutorials.dart';
+
+class Tutorials extends StatefulWidget {
+ const Tutorials({Key key}) : super(key: key);
+
+ @override
+ State createState() {
+ return TutorialsState();
+ }
+
+}
+
+class TutorialsState extends State {
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).tutorials,
+ back: true,
+ breadCrumbs: [BreadCrumb(S.of(context).tutorials, null)],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileTutorials(),
+ tablet: DesktopTutorials(),
+ desktop: DesktopTutorials(),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ eventBus.on().listen((event) {
+ if (mounted) {
+ _scaffoldKey.currentState.openDrawer();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/user_profile.dart b/lib/pages/user_profile.dart
new file mode 100644
index 0000000..5c2eb02
--- /dev/null
+++ b/lib/pages/user_profile.dart
@@ -0,0 +1,46 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/widgets/general/breadcrumbs.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../widgets/desktop/desktop_user_profile.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_user_profile.dart';
+
+class UserProfile extends StatelessWidget {
+ const UserProfile({Key key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ appBar: NavigationBar(
+ title: S.of(context).profile,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).profile, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileUserProfile(),
+ tablet: DesktopUserProfile(),
+ desktop: DesktopUserProfile(),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/pages/view_blog.dart b/lib/pages/view_blog.dart
new file mode 100644
index 0000000..762c30d
--- /dev/null
+++ b/lib/pages/view_blog.dart
@@ -0,0 +1,67 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_view_blog.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_view_blog.dart';
+
+class ViewBlog extends StatefulWidget {
+ final Key key;
+ final int bid;
+
+ const ViewBlog(this.bid, {this.key}) : super(key: key);
+
+ @override
+ State createState() {
+ return ViewBlogState();
+ }
+}
+
+class ViewBlogState extends State {
+
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).view_blog,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).view_blog, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileViewBlog(widget.bid),
+ tablet: DesktopViewBlog(widget.bid),
+ desktop: DesktopViewBlog(widget.bid),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/pages/view_ticket.dart b/lib/pages/view_ticket.dart
new file mode 100644
index 0000000..b89a5e7
--- /dev/null
+++ b/lib/pages/view_ticket.dart
@@ -0,0 +1,67 @@
+
+import 'package:flutter/material.dart';
+import 'package:responsive_builder/responsive_builder.dart';
+
+import '../constants.dart';
+import '../generated/l10n.dart';
+import '../store/actions.dart';
+import '../store/store.dart';
+import '../widgets/desktop/desktop_view_ticket.dart';
+import '../widgets/general/bottom_nav.dart';
+import '../widgets/general/breadcrumbs.dart';
+import '../widgets/general/navigationbar.dart';
+import '../widgets/mobile/MobileBottomNav.dart';
+import '../widgets/mobile/mobile_view_ticket.dart';
+
+class ViewTicket extends StatefulWidget {
+ final Key key;
+ final int ticketId;
+
+ const ViewTicket(this.ticketId, {this.key}) : super(key: key);
+
+ @override
+ State createState() {
+ return ViewTicketState();
+ }
+}
+
+class ViewTicketState extends State {
+
+ final _scaffoldKey = GlobalKey();
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ store.dispatch(UpdateContext(context));
+
+ return ResponsiveBuilder(
+ builder: (context, sizingInformation) =>
+ Scaffold(
+ key: _scaffoldKey,
+ appBar: NavigationBar(
+ title: S.of(context).view_ticket,
+ back: true,
+ breadCrumbs: [
+ BreadCrumb(S.of(context).view_ticket, null),
+ ],
+ breadCrumbHeight: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? null : Constants.BREADCRUMB_HEIGHT,
+ ),
+ drawer: null,
+ body: ScreenTypeLayout(
+ mobile: MobileViewTicket(widget.ticketId),
+ tablet: DesktopViewTicket(widget.ticketId),
+ desktop: DesktopViewTicket(widget.ticketId),
+ ),
+ bottomNavigationBar: ScreenTypeLayout(
+ mobile: MobileBottomNav(currentIndex: 0,),
+ tablet: BottomNav(),
+ desktop: BottomNav(),
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/routes.dart b/lib/routes.dart
index ebbab7f..a5a32d0 100644
--- a/lib/routes.dart
+++ b/lib/routes.dart
@@ -1,9 +1,44 @@
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_wisetronic/pages/buy_service.dart';
+import 'package:flutter_wisetronic/pages/contact_us.dart';
+import 'package:flutter_wisetronic/pages/plain_page.dart';
+import 'package:flutter_wisetronic/pages/renew_license.dart';
+import 'package:flutter_wisetronic/pages/renew_minioffice.dart';
+import 'package:flutter_wisetronic/store/store.dart';
+
+import 'constants.dart';
+import 'pages/blog.dart';
+import 'pages/change_mobile_or_email.dart';
+import 'pages/change_password.dart';
+import 'pages/checkout.dart';
+import 'pages/coupons.dart';
import 'pages/download.dart';
-import 'store/store.dart';
+import 'pages/forgot_password.dart';
import 'pages/home.dart';
+import 'pages/igoshow_learn_more.dart';
+import 'pages/login.dart';
+import 'pages/me.dart';
+import 'pages/minipos_learn_more.dart';
+import 'pages/my_addresses.dart';
+import 'pages/my_cards.dart';
+import 'pages/my_support.dart';
+import 'pages/new_comment.dart';
+import 'pages/new_ticket.dart';
+import 'pages/new_user.dart';
+import 'pages/order_detail.dart';
+import 'pages/orders.dart';
+import 'pages/pay_now.dart';
+import 'pages/reset_password.dart';
+import 'pages/search_place.dart';
+import 'pages/set_password.dart';
+import 'pages/shop.dart';
+import 'pages/tutorials.dart';
+import 'pages/user_profile.dart';
+import 'pages/view_blog.dart';
+import 'pages/view_ticket.dart';
+// import 'widgets/mobile/ocr_scan.dart';
class Routes {
static final router = FluroRouter();
@@ -11,7 +46,7 @@ class Routes {
static void configure() {
router.define('/', handler: new Handler(
handlerFunc: (BuildContext context, Map> params) {
- return Home(null);
+ return Home(title: Constants.APP_TITLE,);
}),
transitionType: TransitionType.fadeIn
);
@@ -21,5 +56,228 @@ class Routes {
}),
transitionType: TransitionType.inFromRight
);
+ router.define('/minipos-learn-more', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return MiniPosLearnMore();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/igoshow-learn-more', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return IGoShowLearnMore();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/tutorials', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Tutorials();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/login', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Login();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/me', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Me();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/change-password', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return ChangePassword();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/user-profile', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return UserProfile();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/new-user', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return NewUser();
+ }),
+ transitionType: TransitionType.inFromRight
+ );
+ router.define('/set-password/:mobile/:code', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return SetPassword(params['mobile'][0], code: params['code'][0]);
+ }
+ ));
+ router.define('/forgot-password', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return ForgotPassword();
+ }
+ ));
+ router.define('/reset-password/:mobile/:code', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return ResetPassword(params['mobile'][0], code: params['code'][0]);
+ }
+ ));
+ router.define('/change-mobile-email/:ismobile', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ if (params['ismobile'][0] == '1') {
+ return ChangeMobileOrEmail(true);
+ }
+ return ChangeMobileOrEmail(false);
+ }
+ ));
+ router.define('/my-addresses/:business_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return MyAddresses(businessId: int.parse(params['business_id'][0]),);
+ }
+ ));
+ router.define('/my-support/:business_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return MySupport(businessId: int.parse(params['business_id'][0]),);
+ }
+ ));
+ router.define('/new-ticket/:business_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return NewTicket(businessId: int.parse(params['business_id'][0]),);
+ }
+ ));
+ router.define('/search-place/:business_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return SearchPlace(int.parse(params['business_id'][0]));
+ }
+ ));
+ router.define('/view-ticket/:ticket_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return ViewTicket(int.parse(params['ticket_id'][0]),);
+ }
+ ));
+ router.define('/blog/:business_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Blog(businessId: int.parse(params['business_id'][0]),);
+ }
+ ));
+ router.define('/view-blog/:bid', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return ViewBlog(int.parse(params['bid'][0]),);
+ }
+ ));
+ router.define('/shop/:business_id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Shop(businessId: int.parse(params['business_id'][0]),);
+ }
+ ));
+ router.define('/shop', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Shop();
+ }
+ ));
+ // router.define('/ocr-scan', handler: new Handler(
+ // handlerFunc: (BuildContext context, Map> params) {
+ // return OCRScan();
+ // }
+ // ));
+ router.define('/checkout/:id', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Checkout(int.parse(params['id'][0]));
+ }),
+ );
+ router.define('/paynow/:orderId', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return PayNow(int.parse(params['orderId'][0]));
+ }),
+ );
+ router.define('/orders', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Orders();
+ }
+ ));
+ router.define('/my-cards', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return MyCards();
+ }
+ ));
+ router.define('/orderdetail/:orderId', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return OrderDetail(int.parse(params['orderId'][0]));
+ }),
+ );
+ router.define('/new-comment/:orderId', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return NewComment(int.parse(params['orderId'][0]));
+ }),
+ );
+ router.define('/coupons/:contactId', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return Coupons(int.parse(params['contactId'][0]));
+ }),
+ );
+ router.define('/service-policy', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return PlainPage(
+ 'service-policy',
+ // businessId: Constants.BUSINESS_ID,
+ businessId: 310,
+ );
+ }),
+ );
+ router.define('/return-policy', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return PlainPage(
+ 'return-policy',
+ // businessId: Constants.BUSINESS_ID,
+ businessId: 310,
+ );
+ }),
+ );
+ router.define('/privacy-policy', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return PlainPage(
+ 'privacy-policy',
+ // businessId: Constants.BUSINESS_ID,
+ businessId: 310,
+ );
+ }),
+ );
+ router.define('/end-user-license-agreement', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return PlainPage(
+ 'end-user-license-agreement',
+ // businessId: Constants.BUSINESS_ID,
+ businessId: 310,
+ );
+ }),
+ );
+ router.define('/about-us', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return PlainPage(
+ 'about-us',
+ // businessId: Constants.BUSINESS_ID,
+ businessId: 310,
+ );
+ }),
+ );
+ router.define('/contact-us', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return ContactUs(
+ businessId: Constants.BUSINESS_ID,
+ );
+ }),
+ );
+ router.define('/renew-license', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return RenewLicense();
+ }
+ ));
+ router.define('/renew-minioffice/:gid', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return RenewMiniOffice(int.parse(params['gid'][0]));
+ }
+ ));
+ router.define('/buy-service/:gid/:servicename', handler: new Handler(
+ handlerFunc: (BuildContext context, Map> params) {
+ return BuyService(int.parse(params['gid'][0]), params['servicename'][0]);
+ }
+ ));
}
}
\ No newline at end of file
diff --git a/lib/store/actions.dart b/lib/store/actions.dart
index 9716b02..2b96ca6 100644
--- a/lib/store/actions.dart
+++ b/lib/store/actions.dart
@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
-import 'package:flutter_wisetronic/models/user.dart';
+import '../models/located_address.dart';
+import '../models/cart_info.dart';
+import '../models/user.dart';
class UpdateContext {
final BuildContext context;
@@ -15,4 +17,39 @@ class UpdateLocale {
class UpdateCurrentUser {
final User user;
UpdateCurrentUser(this.user);
+}
+
+class UpdateRedirectRoute {
+ final String route;
+ UpdateRedirectRoute(this.route);
+}
+
+class UpdateCartInfo {
+ final List cartInfos;
+ UpdateCartInfo(this.cartInfos);
+}
+
+class UpdateLocatedAddress {
+ final LocatedAddress locatedAddress;
+ UpdateLocatedAddress(this.locatedAddress);
+}
+
+class UpdateFcmToken {
+ final String token;
+ UpdateFcmToken(this.token);
+}
+
+class UpdateLastVisit {
+ final List lastVisit;
+ UpdateLastVisit(this.lastVisit);
+}
+
+class UpdateDeviceId {
+ final String deviceId;
+ UpdateDeviceId(this.deviceId);
+}
+
+class UpdateTableNumber {
+ final String tableNumber;
+ UpdateTableNumber(this.tableNumber);
}
\ No newline at end of file
diff --git a/lib/store/reducer/app_reducer.dart b/lib/store/reducer/app_reducer.dart
index deec659..ed0c269 100644
--- a/lib/store/reducer/app_reducer.dart
+++ b/lib/store/reducer/app_reducer.dart
@@ -1,13 +1,27 @@
-import 'package:flutter_wisetronic/store/reducer/context_reducer.dart';
-import 'package:flutter_wisetronic/store/reducer/locale_reducer.dart';
-import 'package:flutter_wisetronic/store/reducer/user_reducer.dart';
-import 'package:flutter_wisetronic/store/state/app_state.dart';
+import '../../store/reducer/cart_info_reducer.dart';
+import '../../store/reducer/context_reducer.dart';
+import '../../store/reducer/device_id_reducer.dart';
+import '../../store/reducer/fcmtoken_reducer.dart';
+import '../../store/reducer/last_visit_reducer.dart';
+import '../../store/reducer/locale_reducer.dart';
+import '../../store/reducer/locate_address_reducer.dart';
+import '../../store/reducer/redirect_route_reducer.dart';
+import '../../store/reducer/table_number_reducer.dart';
+import '../../store/reducer/user_reducer.dart';
+import '../../store/state/app_state.dart';
AppState appReducer(AppState state, action) {
return AppState(
context: contextReducer(state.context, action),
locale: localeReducer(state.locale, action),
user: userReducer(state.user, action),
+ redirectRoute: redirectRouteReducer(state.redirectRoute, action),
+ locatedAddress: locatedAddressReducer(state.locatedAddress, action),
+ fcmToken: fcmtokenReducer(state.fcmToken, action),
+ lastVisit: lastVisitReducer(state.lastVisit, action),
+ cartInfos: cartInfoReducer(state.cartInfos, action),
+ deviceId: deviceIdReducer(state.deviceId, action),
+ tableNumber: tableNumberReducer(state.tableNumber, action)
);
}
\ No newline at end of file
diff --git a/lib/store/reducer/cart_info_reducer.dart b/lib/store/reducer/cart_info_reducer.dart
new file mode 100644
index 0000000..4f2db10
--- /dev/null
+++ b/lib/store/reducer/cart_info_reducer.dart
@@ -0,0 +1,13 @@
+
+import '../../models/cart_info.dart';
+import 'package:redux/redux.dart';
+
+import '../actions.dart';
+
+final cartInfoReducer = combineReducers>([
+ TypedReducer, UpdateCartInfo>(_updateCartInfo)
+]);
+
+List _updateCartInfo(List cartInfos, action) {
+ return action.cartInfos;
+}
\ No newline at end of file
diff --git a/lib/store/reducer/device_id_reducer.dart b/lib/store/reducer/device_id_reducer.dart
new file mode 100644
index 0000000..b7942ab
--- /dev/null
+++ b/lib/store/reducer/device_id_reducer.dart
@@ -0,0 +1,11 @@
+import 'package:redux/redux.dart';
+
+import '../actions.dart';
+
+final deviceIdReducer = combineReducers([
+ TypedReducer(_updateDeviceId)
+]);
+
+String _updateDeviceId(String deviceId, action) {
+ return action.deviceId;
+}
\ No newline at end of file
diff --git a/lib/store/reducer/fcmtoken_reducer.dart b/lib/store/reducer/fcmtoken_reducer.dart
new file mode 100644
index 0000000..6a4c228
--- /dev/null
+++ b/lib/store/reducer/fcmtoken_reducer.dart
@@ -0,0 +1,11 @@
+import 'package:redux/redux.dart';
+
+import '../actions.dart';
+
+final fcmtokenReducer = combineReducers([
+ TypedReducer(_updateFcmToken)
+]);
+
+String _updateFcmToken(String token, action) {
+ return action.token;
+}
\ No newline at end of file
diff --git a/lib/store/reducer/last_visit_reducer.dart b/lib/store/reducer/last_visit_reducer.dart
new file mode 100644
index 0000000..5531bfa
--- /dev/null
+++ b/lib/store/reducer/last_visit_reducer.dart
@@ -0,0 +1,11 @@
+import 'package:redux/redux.dart';
+
+import '../actions.dart';
+
+final lastVisitReducer = combineReducers>([
+ TypedReducer, UpdateLastVisit>(_updateLastVisit)
+]);
+
+List _updateLastVisit(List lastVisit, action) {
+ return action.lastVisit;
+}
\ No newline at end of file
diff --git a/lib/store/reducer/locate_address_reducer.dart b/lib/store/reducer/locate_address_reducer.dart
new file mode 100644
index 0000000..1004a56
--- /dev/null
+++ b/lib/store/reducer/locate_address_reducer.dart
@@ -0,0 +1,12 @@
+import 'package:redux/redux.dart';
+
+import '../../models/located_address.dart';
+import '../actions.dart';
+
+final locatedAddressReducer = combineReducers([
+ TypedReducer(_updateLocatedAddress)
+]);
+
+LocatedAddress _updateLocatedAddress(LocatedAddress locatedAddress, action) {
+ return action.locatedAddress;
+}
\ No newline at end of file
diff --git a/lib/store/reducer/redirect_route_reducer.dart b/lib/store/reducer/redirect_route_reducer.dart
new file mode 100644
index 0000000..14c57ec
--- /dev/null
+++ b/lib/store/reducer/redirect_route_reducer.dart
@@ -0,0 +1,11 @@
+
+import 'package:redux/redux.dart';
+import '../actions.dart';
+
+final redirectRouteReducer = combineReducers([
+ TypedReducer(_updateRedirectRoute)
+]);
+
+String _updateRedirectRoute(String route, action) {
+ return action.route;
+}
\ No newline at end of file
diff --git a/lib/store/reducer/table_number_reducer.dart b/lib/store/reducer/table_number_reducer.dart
new file mode 100644
index 0000000..6653ad8
--- /dev/null
+++ b/lib/store/reducer/table_number_reducer.dart
@@ -0,0 +1,11 @@
+import 'package:redux/redux.dart';
+
+import '../actions.dart';
+
+final tableNumberReducer = combineReducers([
+ TypedReducer(_updateTableNumber)
+]);
+
+String _updateTableNumber(String tableNumber, action) {
+ return action.tableNumber;
+}
\ No newline at end of file
diff --git a/lib/store/state/app_state.dart b/lib/store/state/app_state.dart
index f9c1e61..44e9d57 100644
--- a/lib/store/state/app_state.dart
+++ b/lib/store/state/app_state.dart
@@ -1,14 +1,25 @@
import 'package:flutter/material.dart';
-import 'package:flutter_wisetronic/models/user.dart';
+import '../../models/located_address.dart';
+import '../../models/cart_info.dart';
+import '../../models/user.dart';
@immutable
class AppState {
final BuildContext context;
final Locale locale;
final User user;
+ final String redirectRoute;
+ final List cartInfos;
+ final LocatedAddress locatedAddress;
+ final String fcmToken;
+ final List lastVisit;
+ final String deviceId;
+ final String tableNumber;
- AppState({this.context, this.locale, this.user});
+ AppState({this.context, this.locale, this.user, this.redirectRoute,
+ this.cartInfos, this.locatedAddress, this.fcmToken, this.lastVisit,
+ this.deviceId, this.tableNumber});
factory AppState.init() => AppState();
@@ -19,6 +30,13 @@ class AppState {
context: context ?? this.context,
locale: locale ?? this.locale,
user: user ?? this.user,
+ redirectRoute: redirectRoute ?? this.redirectRoute,
+ cartInfos: cartInfos ?? this.cartInfos,
+ locatedAddress: locatedAddress ?? this.locatedAddress,
+ fcmToken: fcmToken ?? this.fcmToken,
+ lastVisit: lastVisit ?? this.lastVisit,
+ deviceId: deviceId ?? this.deviceId,
+ tableNumber: tableNumber ?? this.tableNumber
);
}
@@ -26,7 +44,15 @@ class AppState {
int get hashCode =>
context.hashCode ^
locale.hashCode ^
- user.hashCode;
+ user.hashCode ^
+ redirectRoute.hashCode ^
+ cartInfos.hashCode ^
+ locatedAddress.hashCode ^
+ fcmToken.hashCode ^
+ lastVisit.hashCode ^
+ deviceId.hashCode ^
+ tableNumber.hashCode;
+
@override
bool operator ==(Object other) =>
@@ -34,9 +60,20 @@ class AppState {
other is AppState &&
context == other.context &&
locale == other.locale &&
- user == other.user;
+ user == other.user &&
+ redirectRoute == other.redirectRoute &&
+ cartInfos == other.cartInfos &&
+ locatedAddress == other.locatedAddress &&
+ fcmToken == other.fcmToken &&
+ lastVisit == other.lastVisit &&
+ deviceId == other.deviceId &&
+ tableNumber == other.tableNumber;
@override
String toString() =>
- 'AppState(context: $context, locale: $locale), user: $user';
+ 'AppState(context: $context, locale: $locale), user: $user, '
+ 'redirectRoute: $redirectRoute, cart info: $cartInfos, '
+ 'locate address: $locatedAddress, fcm: $fcmToken, '
+ 'last visit: $lastVisit, deviceId: $deviceId, '
+ 'tableNumber: $tableNumber';
}
\ No newline at end of file
diff --git a/lib/utils/configure_nonweb.dart b/lib/utils/configure_nonweb.dart
new file mode 100644
index 0000000..2e137c6
--- /dev/null
+++ b/lib/utils/configure_nonweb.dart
@@ -0,0 +1,4 @@
+
+void configureApp() {
+
+}
\ No newline at end of file
diff --git a/lib/utils/configure_web.dart b/lib/utils/configure_web.dart
new file mode 100644
index 0000000..8ecbb99
--- /dev/null
+++ b/lib/utils/configure_web.dart
@@ -0,0 +1,6 @@
+
+import 'package:flutter_web_plugins/flutter_web_plugins.dart';
+
+void configureApp() {
+ setUrlStrategy(PathUrlStrategy());
+}
\ No newline at end of file
diff --git a/lib/utils/fake_iframe_web.dart b/lib/utils/fake_iframe_web.dart
new file mode 100644
index 0000000..a3a26b3
--- /dev/null
+++ b/lib/utils/fake_iframe_web.dart
@@ -0,0 +1,24 @@
+
+import 'package:flutter/material.dart';
+
+class IFrameWeb extends StatefulWidget {
+ final String width;
+ final String height;
+ final String src;
+
+ const IFrameWeb({this.width, this.height, this.src});
+
+ @override
+ State createState() {
+ return IFrameWebState();
+ }
+}
+
+class IFrameWebState extends State {
+
+ @override
+ Widget build(BuildContext context) {
+ return Container();
+ }
+
+}
\ No newline at end of file
diff --git a/lib/utils/http_util.dart b/lib/utils/http_util.dart
index a119f97..6fe26ad 100644
--- a/lib/utils/http_util.dart
+++ b/lib/utils/http_util.dart
@@ -81,14 +81,13 @@ class HttpUtil {
onReceiveProgress: receiveProgress,
).timeout(const Duration(seconds: 30));
- print('HttpGet success. Request: $requestUrl, Response: ${response.statusCode}, Headers: ${response.request.headers}');
// print(response.data);
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
return response.data;
} on DioError catch(e) {
- print('error $e');
+ print('HttpGet failed, request: $requestUrl, headers: $localHeaders, error ${e.response}');
if (returnError) {
return e;
}
@@ -103,6 +102,7 @@ class HttpUtil {
bool isFormData = false,
Map additionalHeaders,
Map body,
+ FormData formData,
Function(int, int) sendProgress,
Function(int, int) receiveProgress,
bool returnError = false,
@@ -121,6 +121,9 @@ class HttpUtil {
localHeaders['Http-App-Key'] = platformName;
localHeaders['Http-Device-Type'] = platformName;
+ // Add the line below will not work.
+ //localHeaders['Content-Type'] = isFormData ? Headers.formUrlEncodedContentType : Headers.jsonContentType;
+
String requestUrl = Constants.BASE_API_URL + url;
if (url.startsWith('http')) {
requestUrl = url;
@@ -135,16 +138,15 @@ class HttpUtil {
Response response = await dio.post(
requestUrl,
queryParameters: queryParameters == null ? {} : queryParameters,
- data: isFormData ? FormData.fromMap(body) : json.encode(body),
+ data: isFormData ? ((formData != null)?formData:FormData.fromMap(body)) : json.encode(body),
options: Options(
headers: localHeaders,
-// contentType: isFormData ? Headers.formUrlEncodedContentType : Headers.jsonContentType,
+ contentType: isFormData ? Headers.formUrlEncodedContentType : Headers.jsonContentType,
),
onSendProgress: sendProgress,
onReceiveProgress: receiveProgress,
).timeout(Duration(seconds: 30));
- print('HttpPost Success. Request: ${response.request.uri}, Response: ${response.statusCode}, Headers: ${response.request.headers}');
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
@@ -152,9 +154,8 @@ class HttpUtil {
callback(response);
}
return response.data;
- } on DioError catch(e) {
+ } on DioError catch(e, stacktrace) {
if (e.response != null) {
- print('HttpPost failed. Request: ${e.request.uri}, Headers: ${e.response.request.headers}');
try {
Utils.jsonPrettyPrint(e.response.data);
} catch (err) {
@@ -215,7 +216,6 @@ class HttpUtil {
onReceiveProgress: receiveProgress,
).timeout(Duration(seconds: 30));
- print('HttpPost Success. Request: ${response.request.uri}, Response: ${response.statusCode}, Headers: ${response.request.headers}');
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
@@ -224,7 +224,6 @@ class HttpUtil {
}
return response.data;
} on DioError catch(e) {
- print('HttpPost failed. Request: ${e.request.uri}');
if (e.response != null) {
Utils.jsonPrettyPrint(e.response.data);
}
@@ -284,7 +283,6 @@ class HttpUtil {
onReceiveProgress: receiveProgress,
).timeout(Duration(seconds: 30));
- print('HttpPost Success. Request: ${response.request.uri}, Response: ${response.statusCode}, Headers: ${response.request.headers}');
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
@@ -293,7 +291,6 @@ class HttpUtil {
}
return response.data;
} on DioError catch(e) {
- print('HttpPost failed. Request: ${e.request.uri}');
if (e.response != null) {
Utils.jsonPrettyPrint(e.response.data);
}
@@ -349,7 +346,6 @@ class HttpUtil {
),
).timeout(Duration(seconds: 30));
- print('HttpPost Success. Request: ${response.request.uri}, Response: ${response.statusCode}, Headers: ${response.request.headers}');
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
@@ -358,7 +354,6 @@ class HttpUtil {
}
return response.data;
} on DioError catch(e) {
- print('HttpPost failed. Request: ${e.request.uri}');
if (e.response != null) {
Utils.jsonPrettyPrint(e.response.data);
}
diff --git a/lib/utils/iframe_web.dart b/lib/utils/iframe_web.dart
new file mode 100644
index 0000000..50f3f04
--- /dev/null
+++ b/lib/utils/iframe_web.dart
@@ -0,0 +1,39 @@
+
+import 'dart:html';
+
+import 'dart:ui' as ui;
+import 'package:flutter/material.dart';
+
+class IFrameWeb extends StatefulWidget {
+ final String width;
+ final String height;
+ final String src;
+
+ const IFrameWeb({this.width, this.height, this.src});
+
+ @override
+ State createState() {
+ return IFrameWebState();
+ }
+}
+
+class IFrameWebState extends State {
+ final IFrameElement _iframeElement = IFrameElement();
+
+ @override
+ Widget build(BuildContext context) {
+ _iframeElement.height = widget.height;
+ _iframeElement.width = widget.width;
+ _iframeElement.src = widget.src;
+ _iframeElement.style.border = 'none';
+ ui.platformViewRegistry.registerViewFactory(
+ 'iframeElement',
+ (int viewId) => _iframeElement,
+ );
+ return HtmlElementView(
+ key: UniqueKey(),
+ viewType: 'iframeElement',
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/lib/utils/shop_scroll_controller.dart b/lib/utils/shop_scroll_controller.dart
new file mode 100644
index 0000000..f987c38
--- /dev/null
+++ b/lib/utils/shop_scroll_controller.dart
@@ -0,0 +1,191 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/widgets.dart';
+
+import 'shop_scroll_coordinator.dart';
+import 'shop_scroll_position.dart';
+
+/// 滑动控制器
+class ShopScrollController extends ScrollController {
+ final ShopScrollCoordinator coordinator;
+
+ /// 为可滚动小部件创建一个控制器。
+ /// `initialScrollOffset`和`keepScrollOffset`的值不能为null。
+ ShopScrollController(
+ this.coordinator, {
+ double initialScrollOffset = 0.0,
+ this.keepScrollOffset = true,
+ this.debugLabel,
+ }) : assert(initialScrollOffset != null),
+ assert(keepScrollOffset != null),
+ _initialScrollOffset = initialScrollOffset;
+
+ /// 用于[offset]的初始值。
+ /// 如果[keepScrollOffset]为false或尚未保存滚动偏移量,
+ /// 则创建并附加到此控制器的新[ScrollPosition]对象的偏移量将初始化为该值。
+ /// 默认为0.0。
+ double get initialScrollOffset => _initialScrollOffset;
+ final double _initialScrollOffset;
+
+ /// 每次滚动完成时,请使用[PageStorage]保存当前滚动[offset],如果重新创建了此控制器的可滚动内容,则将其还原。
+ ///
+ /// 如果将此属性设置为false,则永远不会保存滚动偏移量,并且始终使用[initialScrollOffset]
+ /// 来初始化滚动偏移量。 如果为true(默认值),则第一次创建控制器的可滚动对象时将使用初始
+ /// 滚动偏移量,因为尚无要还原的滚动偏移量。 随后,将恢复保存的偏移,并且忽略[initialScrollOffset]。
+ ///
+ /// 也可以看看:
+ /// * [PageStorageKey],当同一路径中出现多个滚动条时,应使用[PageStorageKey]
+ /// 来区分用于保存滚动偏移量的[PageStorage]位置。
+ final bool keepScrollOffset;
+
+ /// [toString]输出中使用的标签。 旨在帮助在调试输出中标识滚动控制器实例。
+ final String debugLabel;
+
+ /// The currently attached positions. 当前附加的 [positions]。
+ /// 这不应直接突变。 可以使用[attach]和[detach]添加和删除[ScrollPosition]对象。
+ @protected
+ Iterable get positions => _positions;
+ final List _positions = [];
+
+ /// 是否有任何[ScrollPosition]对象已使用[attach]方法将自身附加到[ScrollController]。
+ ///
+ /// 如果为false,则不得调用与[ScrollPosition]交互的成员,
+ /// 例如[position],[offset],[animateTo]和[jumpTo]。
+ bool get hasClients => _positions.isNotEmpty;
+
+ /// 返回附加的[ScrollPosition],可以从中获取[ScrollView]的实际滚动偏移量。
+ ///
+ /// Calling this is only valid when only a single position is attached.
+ /// 仅在仅连接一个[position]时调用此选项才有效。
+ ShopScrollPosition get position {
+ assert(_positions.isNotEmpty,
+ 'ScrollController not attached to any scroll views.');
+ assert(_positions.length == 1,
+ 'ScrollController attached to multiple scroll views.');
+ return _positions.single;
+ }
+
+ /// 可滚动小部件的当前滚动偏移量
+ /// 可滚动小部件的当前滚动偏移量。要求控制器仅控制一个可滚动小部件。
+ double get offset => position.pixels;
+
+ /// 从当前位置到给定值的位置动画。
+ /// 任何活动的动画都将被取消。 如果用户当前正在滚动,则该操作将被取消。
+ /// 返回的[Future]将在动画结束时完成,无论它是否成功完成或是否被过早中断。
+ ///
+ /// 每当用户尝试手动滚动或启动其他活动,或者动画到达视口边缘并尝试过度滚动时,动画都会中断。
+ /// (如果[ScrollPosition]不会过度滚动,而是允许滚动超出范围,那么超出范围不会中断动画。)
+ ///
+ /// 动画对视口或内容尺寸的更改无动于衷。
+ ///
+ /// 一旦动画完成,如果滚动位置的值不稳定,则滚动位置将尝试开始弹道活动。
+ /// (例如,如果滚动超出范围,并且在这种情况下滚动位置通常会弹回)
+ ///
+ /// 持续时间不能为零。 要在没有动画的情况下跳至特定值,请使用[jumpTo]。
+ Future animateTo(
+ double offset, {
+ @required Duration duration,
+ @required Curve curve,
+ }) {
+ assert(_positions.isNotEmpty,
+ 'ScrollController not attached to any scroll views.');
+ final List> animations = List>(_positions.length);
+ for (int i = 0; i < _positions.length; i += 1)
+ animations[i] =
+ _positions[i].animateTo(offset, duration: duration, curve: curve);
+ return Future.wait(animations).then((List