backup. before shop update

This commit is contained in:
2021-08-31 13:28:33 -04:00
parent c378a6203c
commit 808ffa3211
292 changed files with 51551 additions and 695 deletions

View File

@@ -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';
}

View File

@@ -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<StatefulWidget> createState() {
return ImageViewState();
}
}
class ImageViewState extends State<ImageViewer> {
@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,
),
);
}
}

View File

@@ -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: <Widget>[
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);
});
},
)
],
);
}

View File

@@ -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<String, dynamic> selections;
OnAttributeSelectionsChanged(this.selections);
}
class OnProductWillAddToCart {
Product product;
Map<String, dynamic> 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);
}

View File

@@ -19,41 +19,465 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> 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(_) => <String, Function> {
"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")
};
}

View File

@@ -19,41 +19,461 @@ typedef String MessageIfAbsent(String messageStr, List<dynamic> 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(_) => <String, Function> {
"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("您的回复")
};
}

File diff suppressed because it is too large Load Diff

View File

@@ -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"
}

View File

@@ -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": "还没有支持票。 如果您有任何疑问/问题,请点击上方的加号图标以创建支持票。"
}

View File

@@ -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<Locale> 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<String> 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,),
),
);
}

View File

@@ -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<String, dynamic> json) :
id = json['id'],
product = SimpleProduct.fromJson(json['product']),
quantity = double.parse(json['quantity'].toString());
Map<String, dynamic> 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<ProductAttribute> productAttributes;
double customerLastPrice;
String extraData;
SimpleProduct.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}
}

59
lib/models/address.dart Normal file
View File

@@ -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<String, dynamic> 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<String, dynamic> 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);
}
}

58
lib/models/blog.dart Normal file
View File

@@ -0,0 +1,58 @@
import 'dart:convert';
class Section {
int id;
String name;
Section.fromJson(Map<String, dynamic> json) :
id = json['id'],
name = json['name'];
Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -0,0 +1,32 @@
import 'dart:convert';
import 'booking_time.dart';
class BookingDateTime {
String viewDate;
int unixTime;
String sendTimeTip;
List<BookingTime> bookTimes;
BookingDateTime(this.viewDate, this.unixTime, this.sendTimeTip, this.bookTimes);
BookingDateTime.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() => {
'view_date': viewDate,
'unix_time': unixTime,
'send_time_tip': sendTimeTip,
'book_times': bookTimes,
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -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<String, dynamic> json)
: viewTime = json['view_time'],
unixTime = int.parse(json['unix_time'].toString()),
sendTimeTip = json['send_time_tip'];
Map<String, dynamic> toJson() => {
'view_time': viewTime,
'unix_time': unixTime,
'send_time_tip': sendTimeTip,
};
@override
String toString() {
return json.encode(this);
}
}

164
lib/models/business.dart Normal file
View File

@@ -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<String, dynamic> json)
: value = json['value'];
Map<String, dynamic> 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<BusinessTime> 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<ImageUrl> slideImages;
List<Product> promoProducts;
String paypalEmail;
bool deliveryCanadaPost;
bool deliveryStoreDelivery;
bool deliveryPickup;
String currency;
List<WaitingLine> waitingLine;
bool enableWaitingLine;
double pointsToCreditsConversionRate;
String chaseXLogin;
String chaseTransactionKey;
String chaseResponseKey;
DistanceInfo distanceInfo;
int commentsCount;
bool forceClose;
bool isPublic;
double referrerCoupon;
bool instanceDelivery;
List<QuickInput> quickInputs;
Business.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -0,0 +1,20 @@
import 'dart:convert';
class BusinessTime {
String openTime;
String closeTime;
BusinessTime.fromJson(Map<String, dynamic> json)
: openTime = json['open_time'],
closeTime = json['close_time'];
Map<String, dynamic> toJson() => {
'open_time': openTime,
'close_time': closeTime
};
@override
String toString() {
return json.encode(this);
}
}

94
lib/models/cart_info.dart Normal file
View File

@@ -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<CartLineItem> productList;
List<ExtraFee> extraFeeList;
List<ExtraFee> discountList;
int deliveryMethod;
String shippingMethod;
double amountPaid;
String extraData;
CartInfo.fromJson(Map<String, dynamic> 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<String, dynamic> 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;
}
}

View File

@@ -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<String, dynamic> 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<String, dynamic> 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;
}
}

21
lib/models/category.dart Normal file
View File

@@ -0,0 +1,21 @@
import 'dart:convert';
class Category {
int id;
String name;
Category.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'];
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,38 @@
import 'dart:convert';
import 'product.dart';
class CategoryProducts {
int id;
int businessId;
String name;
String description;
String iconUrl;
List<Product> products;
CategoryProducts.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}

44
lib/models/comment.dart Normal file
View File

@@ -0,0 +1,44 @@
import 'dart:convert';
import 'product_image.dart';
class Comment {
int id;
String contact;
String content;
int rating;
List<ProductImage> images;
String createdAt;
int thumbUp;
int thumbDown;
String replyFromStore;
Comment.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}
}

41
lib/models/coupon.dart Normal file
View File

@@ -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<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -0,0 +1,26 @@
import 'dart:convert';
import 'text_value.dart';
class DistanceInfo {
TextValue duration;
TextValue distance;
String status;
DistanceInfo.fromJson(Map<String, dynamic> json)
: duration = json['duration'] != null ? TextValue.fromJson(json['duration']) : null,
distance = json['distance'] != null ? TextValue.fromJson(json['distance']) : null,
status = json['status'];
Map<String, dynamic> toJson() => {
'duration': duration,
'distance': distance,
'status': status
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,21 @@
import 'dart:convert';
class ErrorMessage {
String code;
String string;
ErrorMessage.fromJson(Map<String, dynamic> json)
: code = json['code'],
string = json['string'];
Map<String, dynamic> toJson() => {
'code': code,
'string': string,
};
@override
String toString() {
return json.encode(this);
}
}

31
lib/models/extra_fee.dart Normal file
View File

@@ -0,0 +1,31 @@
import 'dart:convert';
class ExtraFee {
int id;
String name;
String description;
double rate;
double price;
ExtraFee.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
description = json['description'],
rate = double.parse(json['rate'].toString()),
price = double.parse(json['price'].toString());
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'description': description,
'rate': rate,
'price': price,
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,30 @@
import 'dart:convert';
class Fulfillment {
int id;
String shippingMethod;
String trackingNumber;
String note;
String createdAt;
Fulfillment.fromJson(Map<String, dynamic> json) :
id = json['id'],
shippingMethod = json['shipping_method'],
trackingNumber = json['tracking_number'],
note = json['note'],
createdAt = json['created_at'];
Map<String, dynamic> toJson() => {
'id': id,
'shipping_method': shippingMethod,
'tracking_number': trackingNumber,
'note': note,
'created_at': createdAt,
};
@override
String toString() {
return json.encode(this);
}
}

20
lib/models/image_url.dart Normal file
View File

@@ -0,0 +1,20 @@
import 'dart:convert';
class ImageUrl {
int id;
String imageUrl;
ImageUrl.fromJson(Map<String, dynamic> json)
: id = json['id'],
imageUrl = json['image_url'];
Map<String, dynamic> toJson() => {
'id': id,
'image_url': imageUrl
};
@override
String toString() {
return json.encode(this);
}
}

12
lib/models/key_value.dart Normal file
View File

@@ -0,0 +1,12 @@
class KeyValue {
String name;
dynamic value;
KeyValue(this.name, this.value);
@override
String toString() {
return '$name: $value';
}
}

View File

@@ -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<String, dynamic> 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<String, dynamic> 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);
}
}

113
lib/models/order.dart Normal file
View File

@@ -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<Fulfillment> fulfillments;
String extraData;
bool hasComment;
double fee;
UserPosition shipperPosition;
DistanceInfo deliveryDistance;
Order.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -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
}

View File

@@ -0,0 +1,5 @@
enum PaymentMethod {
ONLINE, // 1
OFFLINE // 0
}

View File

@@ -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<String, dynamic> 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<String, dynamic> 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);
}
}

34
lib/models/position.dart Normal file
View File

@@ -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<String, dynamic> json) :
latitude = double.parse(json['latitude'].toString()),
longitude = double.parse(json['longitude'].toString());
Map<String, dynamic> toJson() => {
'latitude': latitude,
'longitude': longitude
};
}

77
lib/models/product.dart Normal file
View File

@@ -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<ProductAttribute> productAttributes;
bool nonInventory;
String extraData;
List<Subproduct> subproducts;
Product(int id, int businessId, String name, double price, String description,
String imagePath, List<ProductAttribute> 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<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -0,0 +1,41 @@
import 'dart:convert';
import 'product_option.dart';
class ProductAttribute {
int id;
String name;
List<ProductOption> productOptions;
bool singleSelection;
bool byQuantity;
bool required;
String extra;
bool disabled;
ProductAttribute.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -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<ProductImage> images;
String sku;
String name;
double price;
double regularPrice;
String description;
String description2;
String detailDescription;
double monthSales;
int rate;
double leftNum;
List<ProductAttribute> productAttributes;
bool nonInventory;
String extraData;
String purchaseNote;
double weight;
double dimentionsLength;
double dimentionsWidth;
double dimentionsHeight;
bool reviewsAllowed;
List<Category> categories;
List<Subproduct> subproducts;
ProductDetail.fromJson(Map<String, dynamic> 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<String, dynamic> 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);
}
}

View File

@@ -0,0 +1,20 @@
import 'dart:convert';
class ProductImage {
int id;
String image;
ProductImage.fromJson(Map<String, dynamic> json)
: id = json['id'],
image = json['image'];
Map<String, dynamic> toJson() => {
'id': id,
'image': image
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,30 @@
import 'dart:convert';
class ProductOption {
int id;
String name;
double adjustAmount;
String extra;
bool disabled;
ProductOption.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
adjustAmount = double.parse(json['adjust_amount'].toString()),
extra = json['extra'],
disabled = json['disabled'];
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'adjust_amount': adjustAmount,
'extra': extra,
'disabled': disabled
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,73 @@
import 'dart:convert';
import 'package:flutter/foundation.dart';
class ShippingRate {
String name;
double price;
List<Rate> rates;
ShippingRate.fromJson(Map<String, dynamic> json)
: name = json['name'],
price = double.parse(json['price'].toString()),
rates = (json['rates'] as List).map((e) => Rate.fromJson(e)).toList();
Map<String, dynamic> 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<String, dynamic> json)
: name = json['name'],
rate = double.parse(json['rate'].toString());
Map<String, dynamic> 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;
}

View File

@@ -0,0 +1,26 @@
import 'dart:convert';
import 'address.dart';
class Store {
int id;
String name;
Address address;
Store.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
address = Address.fromJson(json['address']);
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'address': address,
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,32 @@
import 'dart:convert';
class SimpleProduct {
int id;
String name;
double price;
double regularPrice;
String description;
String imagePath;
SimpleProduct.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() => {
'id': id,
'name': name,
'price': price,
'regular_price': regularPrice,
'description': description,
'image_path': imagePath
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,21 @@
import 'dart:convert';
class TextValue {
String text;
int value;
TextValue.fromJson(Map<String, dynamic> json)
: text = json['text'],
value = int.parse(json['value'].toString());
Map<String, dynamic> toJson() => {
'text': text,
'value': value
};
@override
String toString() {
return json.encode(this);
}
}

110
lib/models/ticket.dart Normal file
View File

@@ -0,0 +1,110 @@
import 'dart:convert';
import 'simple_business.dart';
class TicketFile {
int id;
String url;
String fileName;
String fileType;
TicketFile.fromJson(Map<String, dynamic> json)
: id = json['id'],
url = json['url'],
fileName = json['file_name'],
fileType = json['file_type'];
Map<String, dynamic> 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<TicketFile> files;
Issue.fromJson(Map<String, dynamic> json)
: id = json['id'],
msg = json['msg'],
files = (json['files'] as List).map((e) => TicketFile.fromJson(e)).toList();
Map<String, dynamic> 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<TicketFile> files;
FollowUp.fromJson(Map<String, dynamic> 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<String, dynamic> 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<FollowUp> followUps;
bool isClosed;
String createdAt;
Ticket.fromJson(Map<String, dynamic> 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<String, dynamic> toJson() => {
'id': id,
'issue': issue,
'store': store,
'follow_ups': followUps,
'is_closed': isClosed,
'created_at': createdAt,
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,21 @@
import 'dart:convert';
class UserPosition {
double lat;
double lng;
UserPosition.fromJson(Map<String, dynamic> json) :
lat = double.parse(json['lat'].toString()),
lng = double.parse(json['lng'].toString());
Map<String, dynamic> toJson() => {
'lat': lat,
'lng': lng
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,23 @@
import 'dart:convert';
import 'waiting_line_item.dart';
class WaitingLine {
List<WaitingLineItem> waitingLines;
String storeSn;
WaitingLine.fromJson(Map<String, dynamic> json)
: waitingLines = (json['waiting_lines'] as List).map((i) => WaitingLineItem.fromJson(i)).toList(),
storeSn = json['store_sn'];
Map<String, dynamic> toJson() => {
'waiting_lines': waitingLines,
'store_sn': storeSn
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -0,0 +1,29 @@
import 'dart:convert';
class WaitingLineItem {
String deviceId;
String phone;
String createdAt;
int peopleCount;
int waitingNumber;
WaitingLineItem.fromJson(Map<String, dynamic> json)
: deviceId = json['device_id'],
phone = json['phone'],
createdAt = json['created_at'],
peopleCount = json['people_count'],
waitingNumber = json['waiting_number'];
Map<String, dynamic> toJson() => {
'device_id': deviceId,
'phone': phone,
'created_at': createdAt,
'people_count': peopleCount,
'waiting_number': waitingNumber
};
@override
String toString() {
return json.encode(this);
}
}

View File

@@ -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,),
),
);
}
}

32
lib/pages/blog.dart Normal file
View File

@@ -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,),
),
),
);
}
}

View File

@@ -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<StatefulWidget> createState() => BuyServiceState();
}
class BuyServiceState extends State<BuyService> {
Map<String, dynamic> 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);
});
}
}

View File

@@ -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(),
),
),
);
}
}

View File

@@ -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<ScaffoldState>();
@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(),
),
),
);
}
}

31
lib/pages/checkout.dart Normal file
View File

@@ -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),
),
);
}
}

70
lib/pages/contact_us.dart Normal file
View File

@@ -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<StatefulWidget> createState() => ContactUsState();
}
class ContactUsState extends State<ContactUs> {
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);
});
}
}

31
lib/pages/coupons.dart Normal file
View File

@@ -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,),
),
);
}
}

View File

@@ -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<Download> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
Map<String, dynamic> 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<Download> {
_scaffoldKey.currentState.openDrawer();
}
});
_loadData();
}
void _loadData() {
HttpUtil.httpGet('v1/get-wisetronic-download-page')
.then((value) {
print('$value');
if (mounted) {
setState(() {
data = value;
});
}
});
}
}

View File

@@ -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,),
),
);
}
}

View File

@@ -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(),
),
),
);
}
}

View File

@@ -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<StatefulWidget> createState() {
@@ -35,36 +45,78 @@ class Home extends StatefulWidget {
class HomeState extends State<Home> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
List<Gallery> galleries = [];
String content1Message = '';
String content1Message;
Map<String, dynamic> 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<Home> {
@override
void initState() {
super.initState();
eventBus.on<OnGotDeepLinkUri>().listen((event) {
if (mounted) {
print('got latest Uri $_latestUri');
}
});
initPlatformStateForUri();
_loadData();
eventBus.on<OpenDrawer>().listen((event) {
if (mounted) {
_scaffoldKey.currentState.openDrawer();
}
});
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
Utils.getCurrentUser();
});
}
void _loadData() {
@@ -94,4 +154,39 @@ class HomeState extends State<Home> {
}
});
}
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));
}
}
}

View File

@@ -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<StatefulWidget> createState() {
return IGoShowLearnMoreState();
}
}
class IGoShowLearnMoreState extends State<IGoShowLearnMore> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
Map<String, dynamic> 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;
});
}
});
}
}

66
lib/pages/login.dart Normal file
View File

@@ -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<StatefulWidget> createState() {
return LoginState();
}
}
class LoginState extends State<Login> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
@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(),
),
),
);
}
}

69
lib/pages/me.dart Normal file
View File

@@ -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<StatefulWidget> createState() {
return MeState();
}
}
class MeState extends State<Me> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
@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(),
),
),
);
}
}

View File

@@ -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<StatefulWidget> createState() {
return MiniPosLearnMoreState();
}
}
class MiniPosLearnMoreState extends State<MiniPosLearnMore> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
Map<String, dynamic> 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;
});
}
});
}
}

View File

@@ -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,),
),
);
}
}

46
lib/pages/my_cards.dart Normal file
View File

@@ -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(),
),
);
}
}

29
lib/pages/my_support.dart Normal file
View File

@@ -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,),
),
);
}
}

View File

@@ -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,
),
),
);
}
}

View File

@@ -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,),
),
);
}
}

68
lib/pages/new_ticket.dart Normal file
View File

@@ -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<StatefulWidget> createState() {
return NewTicketState();
}
}
class NewTicketState extends State<NewTicket> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
@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(),
),
),
);
}
}

45
lib/pages/new_user.dart Normal file
View File

@@ -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(),
),
),
);
}
}

View File

@@ -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,),
),
);
}
}

46
lib/pages/orders.dart Normal file
View File

@@ -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(),
),
);
}
}

31
lib/pages/pay_now.dart Normal file
View File

@@ -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,),
),
);
}
}

74
lib/pages/plain_page.dart Normal file
View File

@@ -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<StatefulWidget> createState() => PlainPageState();
}
class PlainPageState extends State<PlainPage> {
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);
});
}
}

View File

@@ -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,),
),
);
}
}

View File

@@ -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<StatefulWidget> createState() => RenewLicenseState();
}
class RenewLicenseState extends State<RenewLicense> {
@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();
}
}

View File

@@ -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<StatefulWidget> createState() => RenewMiniOfficeState();
}
class RenewMiniOfficeState extends State<RenewMiniOffice> {
Map<String, dynamic> 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);
});
}
}

View File

@@ -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(),
),
),
);
}
}

View File

@@ -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),
),
);
}
}

View File

@@ -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(),
),
),
);
}
}

193
lib/pages/shop.dart Normal file
View File

@@ -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<StatefulWidget> createState() => ShopState();
}
class ShopState extends State<Shop> {
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<OnProductWillAddToCart>().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<OnProductWillRemoveFromCart>().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());
}
}
});
}
}

View File

@@ -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(),
),
),
);
}
}

View File

@@ -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,),
),
);
}
}

66
lib/pages/tutorials.dart Normal file
View File

@@ -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<StatefulWidget> createState() {
return TutorialsState();
}
}
class TutorialsState extends State<Tutorials> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
@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<OpenDrawer>().listen((event) {
if (mounted) {
_scaffoldKey.currentState.openDrawer();
}
});
}
}

View File

@@ -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(),
),
),
);
}
}

67
lib/pages/view_blog.dart Normal file
View File

@@ -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<StatefulWidget> createState() {
return ViewBlogState();
}
}
class ViewBlogState extends State<ViewBlog> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
@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(),
),
),
);
}
}

View File

@@ -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<StatefulWidget> createState() {
return ViewTicketState();
}
}
class ViewTicketState extends State<ViewTicket> {
final _scaffoldKey = GlobalKey<ScaffoldState>();
@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(),
),
),
);
}
}

View File

@@ -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<String, List<String>> 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<String, List<String>> params) {
return MiniPosLearnMore();
}),
transitionType: TransitionType.inFromRight
);
router.define('/igoshow-learn-more', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return IGoShowLearnMore();
}),
transitionType: TransitionType.inFromRight
);
router.define('/tutorials', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Tutorials();
}),
transitionType: TransitionType.inFromRight
);
router.define('/login', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Login();
}),
transitionType: TransitionType.inFromRight
);
router.define('/me', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Me();
}),
transitionType: TransitionType.inFromRight
);
router.define('/change-password', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return ChangePassword();
}),
transitionType: TransitionType.inFromRight
);
router.define('/user-profile', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return UserProfile();
}),
transitionType: TransitionType.inFromRight
);
router.define('/new-user', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return NewUser();
}),
transitionType: TransitionType.inFromRight
);
router.define('/set-password/:mobile/:code', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return SetPassword(params['mobile'][0], code: params['code'][0]);
}
));
router.define('/forgot-password', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return ForgotPassword();
}
));
router.define('/reset-password/:mobile/:code', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return ResetPassword(params['mobile'][0], code: params['code'][0]);
}
));
router.define('/change-mobile-email/:ismobile', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> 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<String, List<String>> params) {
return MyAddresses(businessId: int.parse(params['business_id'][0]),);
}
));
router.define('/my-support/:business_id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return MySupport(businessId: int.parse(params['business_id'][0]),);
}
));
router.define('/new-ticket/:business_id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return NewTicket(businessId: int.parse(params['business_id'][0]),);
}
));
router.define('/search-place/:business_id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return SearchPlace(int.parse(params['business_id'][0]));
}
));
router.define('/view-ticket/:ticket_id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return ViewTicket(int.parse(params['ticket_id'][0]),);
}
));
router.define('/blog/:business_id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Blog(businessId: int.parse(params['business_id'][0]),);
}
));
router.define('/view-blog/:bid', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return ViewBlog(int.parse(params['bid'][0]),);
}
));
router.define('/shop/:business_id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Shop(businessId: int.parse(params['business_id'][0]),);
}
));
router.define('/shop', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Shop();
}
));
// router.define('/ocr-scan', handler: new Handler(
// handlerFunc: (BuildContext context, Map<String, List<String>> params) {
// return OCRScan();
// }
// ));
router.define('/checkout/:id', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Checkout(int.parse(params['id'][0]));
}),
);
router.define('/paynow/:orderId', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return PayNow(int.parse(params['orderId'][0]));
}),
);
router.define('/orders', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Orders();
}
));
router.define('/my-cards', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return MyCards();
}
));
router.define('/orderdetail/:orderId', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return OrderDetail(int.parse(params['orderId'][0]));
}),
);
router.define('/new-comment/:orderId', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return NewComment(int.parse(params['orderId'][0]));
}),
);
router.define('/coupons/:contactId', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return Coupons(int.parse(params['contactId'][0]));
}),
);
router.define('/service-policy', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return PlainPage(
'service-policy',
// businessId: Constants.BUSINESS_ID,
businessId: 310,
);
}),
);
router.define('/return-policy', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return PlainPage(
'return-policy',
// businessId: Constants.BUSINESS_ID,
businessId: 310,
);
}),
);
router.define('/privacy-policy', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return PlainPage(
'privacy-policy',
// businessId: Constants.BUSINESS_ID,
businessId: 310,
);
}),
);
router.define('/end-user-license-agreement', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return PlainPage(
'end-user-license-agreement',
// businessId: Constants.BUSINESS_ID,
businessId: 310,
);
}),
);
router.define('/about-us', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return PlainPage(
'about-us',
// businessId: Constants.BUSINESS_ID,
businessId: 310,
);
}),
);
router.define('/contact-us', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return ContactUs(
businessId: Constants.BUSINESS_ID,
);
}),
);
router.define('/renew-license', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return RenewLicense();
}
));
router.define('/renew-minioffice/:gid', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return RenewMiniOffice(int.parse(params['gid'][0]));
}
));
router.define('/buy-service/:gid/:servicename', handler: new Handler(
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
return BuyService(int.parse(params['gid'][0]), params['servicename'][0]);
}
));
}
}

View File

@@ -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<CartInfo> cartInfos;
UpdateCartInfo(this.cartInfos);
}
class UpdateLocatedAddress {
final LocatedAddress locatedAddress;
UpdateLocatedAddress(this.locatedAddress);
}
class UpdateFcmToken {
final String token;
UpdateFcmToken(this.token);
}
class UpdateLastVisit {
final List<int> lastVisit;
UpdateLastVisit(this.lastVisit);
}
class UpdateDeviceId {
final String deviceId;
UpdateDeviceId(this.deviceId);
}
class UpdateTableNumber {
final String tableNumber;
UpdateTableNumber(this.tableNumber);
}

View File

@@ -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)
);
}

View File

@@ -0,0 +1,13 @@
import '../../models/cart_info.dart';
import 'package:redux/redux.dart';
import '../actions.dart';
final cartInfoReducer = combineReducers<List<CartInfo>>([
TypedReducer<List<CartInfo>, UpdateCartInfo>(_updateCartInfo)
]);
List<CartInfo> _updateCartInfo(List<CartInfo> cartInfos, action) {
return action.cartInfos;
}

View File

@@ -0,0 +1,11 @@
import 'package:redux/redux.dart';
import '../actions.dart';
final deviceIdReducer = combineReducers<String>([
TypedReducer<String, UpdateDeviceId>(_updateDeviceId)
]);
String _updateDeviceId(String deviceId, action) {
return action.deviceId;
}

View File

@@ -0,0 +1,11 @@
import 'package:redux/redux.dart';
import '../actions.dart';
final fcmtokenReducer = combineReducers<String>([
TypedReducer<String, UpdateFcmToken>(_updateFcmToken)
]);
String _updateFcmToken(String token, action) {
return action.token;
}

View File

@@ -0,0 +1,11 @@
import 'package:redux/redux.dart';
import '../actions.dart';
final lastVisitReducer = combineReducers<List<int>>([
TypedReducer<List<int>, UpdateLastVisit>(_updateLastVisit)
]);
List<int> _updateLastVisit(List<int> lastVisit, action) {
return action.lastVisit;
}

View File

@@ -0,0 +1,12 @@
import 'package:redux/redux.dart';
import '../../models/located_address.dart';
import '../actions.dart';
final locatedAddressReducer = combineReducers<LocatedAddress>([
TypedReducer<LocatedAddress, UpdateLocatedAddress>(_updateLocatedAddress)
]);
LocatedAddress _updateLocatedAddress(LocatedAddress locatedAddress, action) {
return action.locatedAddress;
}

View File

@@ -0,0 +1,11 @@
import 'package:redux/redux.dart';
import '../actions.dart';
final redirectRouteReducer = combineReducers<String>([
TypedReducer<String, UpdateRedirectRoute>(_updateRedirectRoute)
]);
String _updateRedirectRoute(String route, action) {
return action.route;
}

View File

@@ -0,0 +1,11 @@
import 'package:redux/redux.dart';
import '../actions.dart';
final tableNumberReducer = combineReducers<String>([
TypedReducer<String, UpdateTableNumber>(_updateTableNumber)
]);
String _updateTableNumber(String tableNumber, action) {
return action.tableNumber;
}

View File

@@ -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<CartInfo> cartInfos;
final LocatedAddress locatedAddress;
final String fcmToken;
final List<int> 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';
}

View File

@@ -0,0 +1,4 @@
void configureApp() {
}

Some files were not shown because too many files have changed in this diff Show More