diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 309d9df..59c7247 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -1,4 +1,49 @@ { + "contact.btn":"Contact Us", + "contact.title":"Contact Us", + "contact.phone.title":"Input Phone Number", + "contact.phone":"Phone Number", + "contact.phone.confim":"Call {0}?", + "contact.phone.empty":"Please enter phone number", + "contact.email":"Email", + "contact.email.configm":"Email to '{0}'?", + "contact.email.empty":"Please enter email", + "contact.facebook":"Facebook", + "contact.facebook.empty":"Please enter facebook url", + "contact.google":"Website", + "contact.google.empty":"Please enter website url", + "contact.confrim":"Confirm update contact?", + "contact.open.confrim":"Open '{0}'?", + "contact.bank.accounts":"Bank Accounts Info", + "contact.address":"Address", + "contact.usa.address":"USA Address", + "contact.mm.address":"Myanmar Address", + "contact.delivery.phone":"Delivery Phone", + "contact.fcs.email":"FCS Email", + "contact.callus":"Call Us", + "contact.findus":"Find Us", + "contact.emailus":"Email Us", + "contact.visitus":"Visit Us", + "contact.usa.phone": "USA Phone", + "contact.mm.phone": "Myanmar Phone", + + "contact.edit.title":"Edit Contact Us", + + "term":"Terms of service", + "term.btn":"Terms of service", + + "faq.btn":"FAQs", + "faq.title":"Frequently Asked Questions", + + "faq.add.title":"New FAQ", + "faq.edit.title":"Edit FAQ", + "faq.edit.eng":"English", + "faq.edit.mm":"Myanmar", + "faq.edit.question":"Question", + "faq.edit.answer":"Answer", + + + "btn.save": "Save", "btn.approve":"Approve", @@ -267,8 +312,6 @@ "buyer.delete.confirm":"Delete buyer request?", "buyer.allocate.quota.confirm":"Allocate Quota?", - "term.agree_btn":"Agree", - "term.iagree":"I agree on terms and condition.", "noti.title":"Notifications", "noti.list.title":"NOTIFICATIONS", @@ -279,34 +322,8 @@ "document.by":"By", "document.desc":"Description", - "contact.title":"Contact Us", - "contact.phone.title":"Input Phone Number", - "contact.phone":"Phone Number", - "contact.phone.confim":"Call {0}?", - "contact.phone.empty":"Please enter phone number", - "contact.email":"Email", - "contact.email.configm":"Email to '{0}'?", - "contact.email.empty":"Please enter email", - "contact.facebook":"Facebook", - "contact.facebook.empty":"Please enter facebook url", - "contact.google":"Website", - "contact.google.empty":"Please enter website url", - "contact.confrim":"Confirm update contact?", - "contact.open.confrim":"Open '{0}'?", - "contact.bank.accounts":"Bank Accounts Info", - "contact.address":"Address", - "contact.usa.address":"USA Address", - "contact.mm.address":"Myanmar Address", - "contact.delivery.phone":"Delivery Phone", - "contact.fcs.email":"FCS Email", - "contact.callus":"Call Us", - "contact.findus":"Find Us", - "contact.emailus":"Email Us", - "contact.visitus":"Visit Us", - "contact.edit.title":"Edit Contact Us", - - "term.title":"Terms", + "manual.title":"Manual", "myreg.title":"My\nRegistration", "storage.title":"Storages", @@ -574,20 +591,14 @@ "invoice.add_box":"Add Box", "invoice.add_package":"Add Package", - "term":"TERMS", - "term.btn":"Terms of service", "customer.list.title":"CUSTOMERS", "customer.form.title":"CUSTOMER", "customer.invite":"Invite", - "contact": "CONTACT US", - "fcs.btn": "FCS Profile", "fcs.profile": "FCS PROFILE", - "contact.usa.phone": "USA Phone", - "contact.mm.phone": "Myanmar Phone", "payment.title": "PAYMENT", "payment.date": "Date", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index 8546cf0..20e09f0 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -1,4 +1,48 @@ { + "contact.btn":"ဆက်သွယ်ရန်", + "contact.title":"ဆက်သွယ်ရန်", + "contact.phone.title":"ဖုန်းနံပါတ်ထည့်သွင်းရန်", + "contact.phone":"ဖုန်းနံပါတ်", + "contact.usa.phone": "အမေရိကား ဖုန်းနံပါတ်", + "contact.mm.phone": "မြန်မာ ဖုန်းနံပါတ်", + "contact.phone.confim":"ဖုန်းနံပါတ် '{0}' ကို ခေါ်မလား?", + "contact.phone.empty":"ကျေးဇူးပြု၍ ဖုန်းနံပါတ်ထည့်ပါ", + "contact.email":"အီးမေးလ်", + "contact.email.configm":"အီးမေးလ် '{0}' ကိုပို့ မလား?", + "contact.email.empty":"ကျေးဇူးပြု၍ အီးမေးလ်ထည့်ပါ", + "contact.facebook":"ဖေ့စ်ဘွတ်ခ်", + "contact.facebook.empty":"ကျေးဇူးပြုပြီး ဖေ့စ်ဘွတ်ခ် လင့်ခ် ကိုရိုက်ထည့်ပါ", + "contact.google":"ဝဘ်ဆိုက်", + "contact.google.empty":"ကျေးဇူးပြုပြီး ဝဘ်ဆိုက် လင့်ခ် ကိုရိုက်ထည့်ပါ", + "contact.confrim":"ဆက်သွယ်ခြင်း ကိုပြင်မည်လား?", + "contact.open.confrim":"'{0}' ကိုဖွင့် မလား?", + "contact.bank.accounts":"ဘဏ်အကောင့်အချက်အလက်", + "contact.address":"လိပ်စာ", + "contact.delivery.phone":"သီလဝါ ဆီထုတ် ဖုန်းနံပါတ်", + "contact.usa.address":"အမေရိကား လိပ်စာ", + "contact.mm.address":"မြန်မာ လိပ်စာ", + "contact.fcs.email":"FCS အီးမေးလ်", + "contact.callus":"ခေါ်ရန်", + "contact.findus":"တည်နေရာ", + "contact.emailus":"အီးမေးလ်", + "contact.visitus":"ကြည့်ပါ", + + "contact.edit.title":"ဆက်သွယ်ရန် ပြုပြင်ခြင်း", + + "term":"စည်းကမ်းချက်များ", + "term.btn":"စည်းကမ်းချက်များ", + + "faq.btn":"မေးလေ့ရှိသောမေးခွန်းများ", + "faq.title":"မေးလေ့ရှိသောမေးခွန်းများ", + + "faq.add.title":"မေးလေ့ရှိသောမေးခွန်း အသစ်", + "faq.edit.title":"မေးလေ့ရှိသောမေးခွန်း ပြုပြင်ခြင်း", + "faq.edit.eng":"အင်္ဂလိပ်", + "faq.edit.mm":"မြန်မာ", + "faq.edit.question":"မေးခွန်း", + "faq.edit.answer":"အဖြေ", + + "btn.save":"သိမ်းဆည်းရန်", "btn.approve":"အတည်ပြုရန်", @@ -262,9 +306,6 @@ "buyer.delete.confirm":"ဝယ်ယူသူပယ်ဖျက်မည်လား?", "buyer.allocate.quota.confirm":"ခွဲတမ်းသတ်မှတ်မည်လား?", - "term.agree_btn":"သဘောတူပါသည်", - "term.iagree":"ကျွန်တော် သဘောတူပါသည်", - "noti.title":"အသိပေးချက်များ", "noti.list.title":"NOTIFICATIONS", "log.title":"မှတ်တမ်းများ", @@ -274,36 +315,7 @@ "document.by":"အားဖြင့်", "document.desc":"ဖော်ပြချက်", - "contact.title":"ဆက်သွယ်ရန်", - "contact.phone.title":"ဖုန်းနံပါတ်ထည့်သွင်းရန်", - "contact.phone":"ဖုန်းနံပါတ်", - "contact.usa.phone": "အမေရိကား ဖုန်းနံပါတ်", - "contact.mm.phone": "မြန်မာ ဖုန်းနံပါတ်", - "contact.phone.confim":"ဖုန်းနံပါတ် '{0}' ကို ခေါ်မလား?", - "contact.phone.empty":"ကျေးဇူးပြု၍ ဖုန်းနံပါတ်ထည့်ပါ", - "contact.email":"အီးမေးလ်", - "contact.email.configm":"အီးမေးလ် '{0}' ကိုပို့ မလား?", - "contact.email.empty":"ကျေးဇူးပြု၍ အီးမေးလ်ထည့်ပါ", - "contact.facebook":"ဖေ့စ်ဘွတ်ခ်", - "contact.facebook.empty":"ကျေးဇူးပြုပြီး ဖေ့စ်ဘွတ်ခ် လင့်ခ် ကိုရိုက်ထည့်ပါ", - "contact.google":"ဝဘ်ဆိုက်", - "contact.google.empty":"ကျေးဇူးပြုပြီး ဝဘ်ဆိုက် လင့်ခ် ကိုရိုက်ထည့်ပါ", - "contact.confrim":"ဆက်သွယ်ခြင်း ကိုပြင်မည်လား?", - "contact.open.confrim":"'{0}' ကိုဖွင့် မလား?", - "contact.bank.accounts":"ဘဏ်အကောင့်အချက်အလက်", - "contact.address":"လိပ်စာ", - "contact.delivery.phone":"သီလဝါ ဆီထုတ် ဖုန်းနံပါတ်", - "contact.usa.address":"အမေရိကား လိပ်စာ", - "contact.mm.address":"မြန်မာ လိပ်စာ", - "contact.fcs.email":"FCS အီးမေးလ်", - "contact.callus":"ခေါ်ပါ", - "contact.findus":"တည်နေရာ", - "contact.emailus":"အီးမေးလ်", - "contact.visitus":"ကြည့်ပါ", - "contact.edit.title":"ဆက်သွယ်ရန် ပြုပြင်ခြင်း", - - "term.title":"စည်းကမ်းချက်များ", "manual.title":"လက်စွဲစာအုပ်", "myreg.title":"ကိုယ်ရေး\nအချက်အလက်", "storage.title":"သိုလှောင်ကန်များ", @@ -594,14 +606,10 @@ "invoice.add_package":"Add Package", "invoice.add_box":"Add Box", - "term":"စည်းကမ်းချက်များ", - "term.btn":"စည်းကမ်းချက်များ", "customer.list.title":"ဝယ်ယူသူများ", "customer.form.title":"ဝယ်ယူသူ", - "contact": "ဆက်သွယ်ရန်", - "fcs.profile": "ပရိုဖိုင်", diff --git a/lib/app.dart b/lib/app.dart index 7ab63a3..6c454a2 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,7 +3,9 @@ import 'dart:io'; import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/localization/app_translations_delegate.dart'; import 'package:fcs/fcs/common/localization/transalation.dart'; +import 'package:fcs/fcs/common/pages/contact/model/contact_model.dart'; import 'package:fcs/fcs/common/pages/model/language_model.dart'; +import 'package:fcs/fcs/common/pages/term/model/term_model.dart'; import 'package:fcs/fcs/common/services/services.dart'; import 'package:fcs/model/buyer_model.dart'; import 'package:fcs/model/delivery_model.dart'; @@ -55,8 +57,10 @@ class App extends StatefulWidget { class _AppState extends State { final fcs.MainModel mainModel2 = new fcs.MainModel(); - + final ContactModel contactModel =new ContactModel(); + final TermModel termModel=new TermModel(); final MainModel mainModel = new MainModel(); + final UserModel userModel = new UserModel(); final ProductModel productModel = new ProductModel(); final EmployeeModel employeeModel = new EmployeeModel(); @@ -243,27 +247,29 @@ class _AppState extends State { ChangeNotifierProvider.value(value: discountModel), ChangeNotifierProvider.value(value: testModel), ChangeNotifierProvider.value(value: mainModel2), + ChangeNotifierProvider.value(value: contactModel), + ChangeNotifierProvider.value(value: termModel), ], child: Consumer( builder: (context, value, child) { return CupertinoApp( debugShowCheckedModeBanner: false, title: 'FCS', - theme: CupertinoThemeData( - textTheme: CupertinoTextThemeData( - navActionTextStyle: TextStyle(color: Colors.white), - navTitleTextStyle: TextStyle( - color: Colors.white, - fontSize: value.isEng ? 20 : 18, - fontWeight: FontWeight.bold), - navLargeTitleTextStyle: TextStyle( - color: Colors.white, - fontSize: value.isEng ? 40 : 24, - fontWeight: FontWeight.bold), - primaryColor: primaryColor, - textStyle: TextStyle(color: Colors.white), - actionTextStyle: TextStyle(color: Colors.white), - )), + // theme: CupertinoThemeData( + // textTheme: CupertinoTextThemeData( + // navActionTextStyle: TextStyle(color: Colors.white), + // navTitleTextStyle: TextStyle( + // color: Colors.white, + // fontSize: value.isEng ? 20 : 18, + // fontWeight: FontWeight.w600), + // navLargeTitleTextStyle: TextStyle( + // color: Colors.white, + // fontSize: value.isEng ? 40 : 24, + // fontWeight: FontWeight.w600), + // primaryColor: primaryColor, + // textStyle: TextStyle(color: Colors.white), + // actionTextStyle: TextStyle(color: Colors.white), + // )), routes: route(context), localizationsDelegates: [ _newLocaleDelegate, diff --git a/lib/fcs/common/data/providers/auth_fb.dart b/lib/fcs/common/data/providers/auth_fb.dart index 2129b10..281ad5a 100644 --- a/lib/fcs/common/data/providers/auth_fb.dart +++ b/lib/fcs/common/data/providers/auth_fb.dart @@ -5,6 +5,7 @@ import 'package:fcs/fcs/common/domain/constants.dart'; import 'package:fcs/fcs/common/domain/entities/auth_result.dart' as fcs; import 'package:fcs/fcs/common/domain/entities/auth_status.dart'; import 'package:fcs/fcs/common/domain/entities/setting.dart'; +import 'package:fcs/fcs/common/domain/entities/setting.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/domain/exceiptions/signin_exception.dart'; import 'package:firebase_auth/firebase_auth.dart'; @@ -126,7 +127,7 @@ class AuthFb { return getUser(refreshIdToken: true); } - static Future getToken() async { + Future getToken() async { FirebaseUser firebaseUser = await _fb.currentUser(); IdTokenResult token = await firebaseUser.getIdToken(); return token.token; @@ -143,4 +144,16 @@ class AuthFb { // _listSetting(); return Setting.fromMap(snap.data); } + + Stream settings() async* { + Stream snapshot = Firestore.instance + .collection(config_collection) + .document(setting_doc_id) + .snapshots(); + + await for (var snap in snapshot) { + Setting setting = Setting.fromMap(snap.data); + yield setting; + } + } } diff --git a/lib/fcs/common/domain/entities/faq.dart b/lib/fcs/common/domain/entities/faq.dart new file mode 100644 index 0000000..4c694d7 --- /dev/null +++ b/lib/fcs/common/domain/entities/faq.dart @@ -0,0 +1,29 @@ +class FAQ { + String id; + String questionEng; + String questionMm; + String answerEng; + String answerMm; + + String question(bool isEng) => isEng?questionEng:questionMm; + String answer(bool isEng) => isEng?answerEng:answerMm; + + Map images; + FAQ({this.id,this.questionEng,this.questionMm,this.answerEng,this.answerMm,this.images}); + + + Map toMap() { + return { + 'question_eng': questionEng, + 'answer_eng': answerEng, + 'question_mm': questionMm, + 'answer_mm': answerMm, + 'images': images, + }; + } + + @override + String toString() { + return 'FAQ{id: $id, questionEng: $questionEng,questionMm:$questionMm}'; + } +} diff --git a/lib/fcs/common/domain/vo/contact.dart b/lib/fcs/common/domain/vo/contact.dart new file mode 100644 index 0000000..1135dcc --- /dev/null +++ b/lib/fcs/common/domain/vo/contact.dart @@ -0,0 +1,45 @@ +import 'package:fcs/fcs/common/domain/entities/setting.dart'; + +class Contact { + String usaAddress; + String mmAddress; + String usaContactNumber; + String mmContactNumber; + String emailAddress; + String facebookLink; + + Contact({ + this.usaAddress, + this.mmAddress, + this.usaContactNumber, + this.mmContactNumber, + this.emailAddress, + this.facebookLink, + }); + + factory Contact.fromSetting(Setting setting) { + return Contact( + usaContactNumber: setting.usaContactNumber, + mmContactNumber: setting.mmContactNumber, + usaAddress: setting.usaAddress, + mmAddress: setting.mmAddress, + emailAddress: setting.emailAddress, + facebookLink: setting.facebookLink); + } + + Map toMap() { + return { + 'usa_address': usaAddress, + 'mm_address': mmAddress, + 'usa_contact_number': usaContactNumber, + 'mm_contact_number': mmContactNumber, + 'email_address': emailAddress, + 'facebook_link': facebookLink, + }; + } + + @override + String toString() { + return 'Contact{usa_address:$usaAddress,mm_address:$mmAddress}'; + } +} diff --git a/lib/fcs/common/domain/vo/term.dart b/lib/fcs/common/domain/vo/term.dart new file mode 100644 index 0000000..30a5830 --- /dev/null +++ b/lib/fcs/common/domain/vo/term.dart @@ -0,0 +1,25 @@ +import 'package:fcs/fcs/common/domain/entities/setting.dart'; + +class Term { + String term; + + Term({ + this.term, + }); + + factory Term.fromSetting(Setting setting) { + return Term( + term: setting.terms,); + } + + Map toMap() { + return { + 'terms': term, + }; + } + + @override + String toString() { + return 'Contact{terms:$term}'; + } +} diff --git a/lib/fcs/common/helpers/firebase_helper.dart b/lib/fcs/common/helpers/firebase_helper.dart new file mode 100644 index 0000000..883cbf3 --- /dev/null +++ b/lib/fcs/common/helpers/firebase_helper.dart @@ -0,0 +1,12 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:logging/logging.dart'; + +final log = Logger('firebaseHelper'); + +final FirebaseAuth auth = FirebaseAuth.instance; + +Future getToken() async { + FirebaseUser firebaseUser = await auth.currentUser(); + IdTokenResult token = await firebaseUser.getIdToken(); + return token.token; +} diff --git a/lib/fcs/common/helpers/theme.dart b/lib/fcs/common/helpers/theme.dart index 1c84937..996cca8 100644 --- a/lib/fcs/common/helpers/theme.dart +++ b/lib/fcs/common/helpers/theme.dart @@ -11,22 +11,25 @@ const buttonBkColor = const Color(0xFF268944); const labelColor = const Color(0xFF757575); const TextStyle labelStyle = - TextStyle(fontSize: 13, color: Colors.grey, fontWeight: FontWeight.w500); + TextStyle(fontSize: 23, color: primaryColor, fontWeight: FontWeight.w500); +const TextStyle labelStyleMM = TextStyle( + fontSize: 23, + color: primaryColor, + fontWeight: FontWeight.w500, + fontFamily: "MyanmarUnicode"); +const TextStyle subMenuStyle = + TextStyle(fontSize: 14, color: Colors.white, fontWeight: FontWeight.w500); +const TextStyle subMenuStyleMM = + TextStyle(fontSize: 14, color: Colors.white, fontWeight: FontWeight.w500, + fontFamily: "MyanmarUnicode"); const TextStyle welcomeLabelStyle = TextStyle(fontSize: 23, color: primaryColor, fontWeight: FontWeight.w500); const TextStyle welcomeSubLabelStyle = TextStyle(fontSize: 18, color: primaryColor, fontWeight: FontWeight.w500); -const TextStyle subMenuStyle = - TextStyle(fontSize: 14, color: Colors.white, fontWeight: FontWeight.w500); const TextStyle siginButtonStyle = TextStyle(fontSize: 16, color: Colors.white, fontWeight: FontWeight.w500); -const TextStyle labelStyleMM = TextStyle( - fontSize: 13, - color: Colors.grey, - fontWeight: FontWeight.w500, - fontFamily: "MyanmarUnicode"); TextStyle newLabelStyle( {Color color, diff --git a/lib/fcs/common/pages/contact.dart b/lib/fcs/common/pages/contact.dart deleted file mode 100644 index 5da0215..0000000 --- a/lib/fcs/common/pages/contact.dart +++ /dev/null @@ -1,188 +0,0 @@ -import 'package:fcs/fcs/common/domain/entities/setting.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; -import 'package:fcs/fcs/common/pages/contact_editor.dart'; -import 'package:fcs/fcs/common/pages/model/language_model.dart'; -import 'package:fcs/fcs/common/pages/model/main_model.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/progress.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:package_info/package_info.dart'; -import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class Contact extends StatefulWidget { - @override - _ContactState createState() => _ContactState(); -} - -class _ContactState extends State { - bool _isLoading = false; - - @override - Widget build(BuildContext context) { - Setting setting = Provider.of(context).setting; - bool isEng = Provider.of(context).isEng; - return LocalProgress( - inAsyncCall: _isLoading, - child: CupertinoPageScaffold( - child: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { - return [ - CupertinoSliverNavigationBar( - backgroundColor: primaryColor, - actionsForegroundColor: Colors.white, - largeTitle: Text( - AppTranslations.of(context).text('contact.title'), - ), - trailing: GestureDetector( - onTap: () => - Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => ContactEditor( - setting: setting, - ), - )), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Icon( - CupertinoIcons.pen, - size: 23, - color: Colors.white, - ), - )), - ), - ]; - }, - body: ListView( - children: [ - itemTitle("contact.callus"), - link(setting.usaContactNumber, Icons.phone_forwarded, - onTap: () => _call(setting.usaContactNumber), - label: LocalText(context, "contact.usa.phone", - color: primaryColor, fontWeight: FontWeight.bold)), - link(setting.mmContactNumber, Icons.phone_forwarded, - onTap: () => _call( - setting.mmContactNumber, - ), - label: LocalText(context, "contact.mm.phone", - color: primaryColor, fontWeight: FontWeight.bold)), - itemTitle("contact.findus"), - link(setting.usaAddress, Icons.location_on, - label: LocalText(context, "contact.usa.address", - color: primaryColor, fontWeight: FontWeight.bold)), - link(setting.mmAddress, Icons.location_on, - label: LocalText(context, "contact.mm.address", - color: primaryColor, fontWeight: FontWeight.bold)), - itemTitle("contact.emailus"), - link(setting.emailAddress, Icons.email, - onTap: () => _email(setting.emailAddress), - label: LocalText(context, "contact.fcs.email", - color: primaryColor, fontWeight: FontWeight.bold)), - itemTitle("contact.visitus"), - link(setting.facebookLink, FontAwesomeIcons.facebook, - onTap: () => _openLink(setting.facebookLink), - label: LocalText(context, "contact.facebook", - color: primaryColor, fontWeight: FontWeight.bold)), - ], - ), - ), - ), - ); - } - - Widget link(String text, IconData iconData, - {Function() onTap, Widget label}) { - return Material( - child: Padding( - padding: const EdgeInsets.only(left: 18.0, bottom: 10, right: 18), - child: Container( - decoration: BoxDecoration( - border: Border.all(color: Colors.grey, width: 0.8), - borderRadius: BorderRadius.all( - Radius.circular(5.0) // <--- border radius here - ), - ), - child: InkWell( - onTap: () => onTap != null ? onTap() : null, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Icon( - iconData, - color: primaryColor, - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - label == null - ? Container() - : Padding( - padding: EdgeInsets.fromLTRB(10, 10, 10, 0), - child: label, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - text == null ? "" : text, - overflow: TextOverflow.ellipsis, - maxLines: 5, - style: TextStyle( - fontSize: 14.0, - ), - ), - ), - ], - ), - SizedBox( - width: 5, - ), - onTap == null - ? Container() - : Icon( - Icons.open_in_new, - color: Colors.grey, - size: 15, - ) - ], - ), - )), - ), - ), - ); - } - - Widget itemTitle(String textKey) { - return Padding( - padding: const EdgeInsets.only(left: 18.0, top: 15, bottom: 5), - child: Text( - AppTranslations.of(context).text(textKey), - style: TextStyle( - fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black54), - ), - ); - } - - Future getVersionNumber() async { - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - String version = packageInfo.version + "+" + packageInfo.buildNumber; - return version; - } - - _call(String phone) { - launch("tel:$phone"); - } - - _email(String email) { - launch("mailto:$email"); - } - - _openLink(String link) { - launch("$link"); - } -} diff --git a/lib/fcs/common/pages/contact/contact_editor.dart b/lib/fcs/common/pages/contact/contact_editor.dart new file mode 100644 index 0000000..0404bf8 --- /dev/null +++ b/lib/fcs/common/pages/contact/contact_editor.dart @@ -0,0 +1,164 @@ +import 'package:fcs/fcs/common/domain/entities/setting.dart'; +import 'package:fcs/fcs/common/domain/vo/contact.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/contact/model/contact_model.dart'; +import 'package:fcs/fcs/common/pages/model/language_model.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; + +import 'widgets.dart'; + +class ContactEditor extends StatefulWidget { + final Contact contact; + const ContactEditor({this.contact}); + @override + _ContactEditorState createState() => _ContactEditorState(); +} + +class _ContactEditorState extends State { + TextEditingController _usaPhone = new TextEditingController(); + TextEditingController _mmPhone = new TextEditingController(); + TextEditingController _usaAddress = new TextEditingController(); + TextEditingController _mmAddress = new TextEditingController(); + TextEditingController _email = new TextEditingController(); + TextEditingController _facebook = new TextEditingController(); + + final _formKey = GlobalKey(); + bool _isLoading = false; + + @override + void initState() { + super.initState(); + if (widget.contact != null) { + _usaPhone.text = widget.contact.usaContactNumber; + _mmPhone.text = widget.contact.mmContactNumber; + _usaAddress.text = widget.contact.usaAddress; + _mmAddress.text = widget.contact.mmAddress; + _email.text = widget.contact.emailAddress; + _facebook.text = widget.contact.facebookLink; + } + } + + @override + Widget build(BuildContext context) { + final usaPhoneBox = InputText( + labelTextKey: 'contact.usa.phone', + iconData: CupertinoIcons.phone, + controller: _usaPhone); + final mmPhoneBox = InputText( + labelTextKey: 'contact.mm.phone', + iconData: CupertinoIcons.phone, + controller: _mmPhone); + final usaAddreesBox = InputText( + labelTextKey: 'contact.usa.address', + iconData: CupertinoIcons.location, + controller: _usaAddress); + final mmAddressBox = InputText( + labelTextKey: 'contact.mm.address', + iconData: CupertinoIcons.location, + controller: _mmAddress); + final emailBox = InputText( + labelTextKey: 'contact.email', + iconData: CupertinoIcons.mail, + controller: _email); + final faceBookBox = InputText( + labelTextKey: 'contact.facebook', + iconData: FontAwesomeIcons.facebook, + controller: _facebook); + + return LocalProgress( + inAsyncCall: _isLoading, + child: CupertinoPageScaffold( + child: NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverAppBar( + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + expandedHeight: 150.0, + floating: true, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: Text( + AppTranslations.of(context) + .text('contact.edit.title'), + style: TextStyle( + color: Colors.white, + )), + ), + actions: [ + IconButton( + onPressed: () => _submit(), + icon: Icon( + Icons.save, + color: Colors.white, + )) + ], + ), + ]; + }, + body: Material( + child: Form( + key: _formKey, + child: ListView( + shrinkWrap: true, + padding: EdgeInsets.only(left: 24.0, right: 24.0), + children: [ + itemTitle(context, "contact.callus"), + usaPhoneBox, + mmPhoneBox, + Divider(), + itemTitle(context, "contact.findus"), + usaAddreesBox, + mmAddressBox, + Divider(), + itemTitle(context, "contact.emailus"), + emailBox, + Divider(), + itemTitle(context, "contact.visitus"), + faceBookBox + ], + ), + ), + )))); + } + + _submit() async { + setState(() { + _isLoading = true; + }); + try { + widget.contact.usaContactNumber = _usaPhone.text; + widget.contact.mmContactNumber = _mmPhone.text; + widget.contact.usaAddress = _usaAddress.text; + widget.contact.mmAddress = _mmAddress.text; + widget.contact.emailAddress = _email.text; + widget.contact.facebookLink = _facebook.text; + var contactModel = Provider.of(context, listen: false); + await contactModel.saveContact(widget.contact); + Navigator.pop(context); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } +} diff --git a/lib/fcs/common/pages/contact/contact_page.dart b/lib/fcs/common/pages/contact/contact_page.dart new file mode 100644 index 0000000..ab131c1 --- /dev/null +++ b/lib/fcs/common/pages/contact/contact_page.dart @@ -0,0 +1,132 @@ +import 'package:fcs/fcs/common/domain/entities/setting.dart'; +import 'package:fcs/fcs/common/domain/vo/contact.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/contact/contact_editor.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:package_info/package_info.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'widgets.dart'; + +class ContactPage extends StatefulWidget { + @override + _ContactPageState createState() => _ContactPageState(); +} + +class _ContactPageState extends State { + @override + Widget build(BuildContext context) { + Setting setting = Provider.of(context).setting; + return Scaffold( + body: NestedScrollView( + headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverAppBar( + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + expandedHeight: 150.0, + floating: true, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: Text(AppTranslations.of(context).text('contact.title'), + style: TextStyle( + color: Colors.white, + )), + ), + actions: [ + IconButton( + onPressed: () => + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => ContactEditor( + contact: Contact.fromSetting(setting), + ), + )), + icon: Icon( + CupertinoIcons.pen, + color: Colors.white, + )) + ], + ), + ]; + }, + body: ListView( + children: [ + itemTitle(context, "contact.callus"), + contactItem(context, setting.usaContactNumber, CupertinoIcons.phone, + onTap: () => _call(setting.usaContactNumber), + labelKey: "contact.usa.phone"), + contactItem( + context, + setting.mmContactNumber, + CupertinoIcons.phone, + onTap: () => _call( + setting.mmContactNumber, + ), + labelKey: "contact.mm.phone", + ), + itemTitle(context, "contact.findus"), + contactItem( + context, + setting.usaAddress, + CupertinoIcons.location, + labelKey: "contact.usa.address", + ), + contactItem( + context, + setting.mmAddress, + CupertinoIcons.location, + labelKey: "contact.mm.address", + ), + itemTitle(context, "contact.emailus"), + contactItem( + context, + setting.emailAddress, + CupertinoIcons.mail, + onTap: () => _email(setting.emailAddress), + labelKey: "contact.fcs.email", + ), + itemTitle(context, "contact.visitus"), + contactItem( + context, + setting.facebookLink, + FontAwesomeIcons.facebook, + onTap: () => _opencontactItem(setting.facebookLink), + labelKey: "contact.facebook", + ), + ], + ), + ), + ); + } + + Future getVersionNumber() async { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + String version = packageInfo.version + "+" + packageInfo.buildNumber; + return version; + } + + _call(String phone) { + launch("tel:$phone"); + } + + _email(String email) { + launch("mailto:$email"); + } + + _opencontactItem(String contactItem) { + launch("$contactItem"); + } +} diff --git a/lib/fcs/common/pages/contact/model/contact_model.dart b/lib/fcs/common/pages/contact/model/contact_model.dart new file mode 100644 index 0000000..70fbc48 --- /dev/null +++ b/lib/fcs/common/pages/contact/model/contact_model.dart @@ -0,0 +1,17 @@ +import 'dart:async'; + +import 'package:fcs/fcs/common/domain/vo/contact.dart'; +import 'package:fcs/fcs/common/pages/model/base_model.dart'; +import 'package:fcs/fcs/common/services/services.dart'; +import 'package:logging/logging.dart'; + +class ContactModel extends BaseModel { + final log = Logger('ContactModel'); + + Future saveContact(Contact contact) async { + await request("/contact", "PUT", + payload: contact.toMap(), token: await Services.instance.authService.getToken()); + notifyListeners(); + } + +} diff --git a/lib/fcs/common/pages/contact/widgets.dart b/lib/fcs/common/pages/contact/widgets.dart new file mode 100644 index 0000000..d9ebc32 --- /dev/null +++ b/lib/fcs/common/pages/contact/widgets.dart @@ -0,0 +1,92 @@ + import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:flutter/material.dart'; + +Widget itemTitle(BuildContext context, String textKey) { + return Padding( + padding: const EdgeInsets.only(left: 18.0, top: 25, bottom: 5), + child: Text( + AppTranslations.of(context).text(textKey), + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18, color: Colors.black), + ), + ); + } + +Widget subItemTitle(BuildContext context, String textKey) { + return Padding( + padding: const EdgeInsets.only(left: 38.0, top: 5, bottom: 0), + child: Text( + AppTranslations.of(context).text(textKey), + style: TextStyle( + fontWeight: FontWeight.w700, fontSize: 15, color: Colors.grey), + ), + ); + } + + Widget contactItem(BuildContext context, String text, IconData iconData, + {Function() onTap, String labelKey}) { + return Material( + child: Padding( + padding: const EdgeInsets.only(left: 18.0, bottom: 10, right: 18), + child: Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.grey, width: 0.8), + borderRadius: BorderRadius.all( + Radius.circular(5.0) // <--- border radius here + ), + ), + child: InkWell( + onTap: () => onTap != null ? onTap() : null, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + iconData, + color: primaryColor, + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + labelKey == null + ? Container() + : Padding( + padding: EdgeInsets.fromLTRB(10, 10, 10, 0), + child: LocalText(context, labelKey, + color: primaryColor, fontWeight: FontWeight.w500,fontSize: 18), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + text == null ? "" : text, + overflow: TextOverflow.ellipsis, + maxLines: 5, + style: TextStyle( + fontSize: 14.0, + ), + ), + ), + ], + ), + SizedBox( + width: 5, + ), + onTap == null + ? Container() + : Icon( + Icons.open_in_new, + color: Colors.grey, + size: 15, + ) + ], + ), + )), + ), + ), + ); + } \ No newline at end of file diff --git a/lib/fcs/common/pages/contact_editor.dart b/lib/fcs/common/pages/contact_editor.dart deleted file mode 100644 index ab56dae..0000000 --- a/lib/fcs/common/pages/contact_editor.dart +++ /dev/null @@ -1,297 +0,0 @@ -import 'package:fcs/fcs/common/domain/entities/setting.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; -import 'package:fcs/fcs/common/pages/model/language_model.dart'; -import 'package:fcs/fcs/common/pages/model/main_model.dart'; -import 'package:fcs/fcs/common/pages/util.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/progress.dart'; -import 'package:fcs/pages/phone_input.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; - -class ContactEditor extends StatefulWidget { - final Setting setting; - const ContactEditor({this.setting}); - @override - _ContactEditorState createState() => _ContactEditorState(); -} - -class _ContactEditorState extends State { - TextEditingController _email = new TextEditingController(); - TextEditingController _facebook = new TextEditingController(); - TextEditingController _website = new TextEditingController(); - TextEditingController _address = new TextEditingController(); - TextEditingController _deliveryPhone = new TextEditingController(); - - final _formKey = GlobalKey(); - bool _isLoading = false; - - List phones = new List(); - List _initPhones = new List(); - - @override - void initState() { - super.initState(); - if (widget.setting != null) { - this._initPhones = widget.setting.phones; - _email.text = widget.setting.emailAddress; - _facebook.text = widget.setting.facebookLink; - _website.text = widget.setting.website; - _deliveryPhone.text = widget.setting.deliveryPhone; - _address.text = widget.setting.address; - - phones.clear(); - // _initPhones.forEach((p) { - // phones.add(p); - // }); - } - } - - @override - Widget build(BuildContext context) { - var languageModel = Provider.of(context); - - final emailBox = TextFormField( - controller: _email, - autofocus: false, - cursorColor: primaryColor, - style: textStyle, - decoration: new InputDecoration( - labelText: AppTranslations.of(context).text('contact.email'), - labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, - icon: Icon( - Icons.email, - color: primaryColor, - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - ), - validator: (value) { - if (value.isEmpty) { - return AppTranslations.of(context).text('contact.email.empty'); - } - return null; - }, - ); - - final faceBookBox = TextFormField( - controller: _facebook, - autofocus: false, - cursorColor: primaryColor, - style: textStyle, - decoration: new InputDecoration( - labelText: AppTranslations.of(context).text('contact.facebook'), - labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, - icon: Icon( - FontAwesomeIcons.facebook, - color: primaryColor, - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - ), - validator: (value) { - if (value.isEmpty) { - return AppTranslations.of(context).text('contact.facebook.empty'); - } - return null; - }, - ); - - final googleBox = TextFormField( - controller: _website, - autofocus: false, - cursorColor: primaryColor, - style: textStyle, - decoration: new InputDecoration( - labelText: AppTranslations.of(context).text('contact.google'), - labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, - icon: Icon( - FontAwesomeIcons.chrome, - color: primaryColor, - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor, width: 1.0)), - ), - validator: (value) { - if (value.isEmpty) { - return AppTranslations.of(context).text('contact.google.empty'); - } - return null; - }, - ); - - final addPhoneNumber = ListTile( - contentPadding: EdgeInsets.only(top: 15), - title: ButtonTheme( - height: 45, - child: RaisedButton( - color: Colors.white, - onPressed: () async { - var phone = await showDialog( - context: context, builder: (_) => PhoneEditor()); - _save(phone); - }, - child: Text("Add Phone", - style: TextStyle( - fontSize: 18, - )), - ), - )); - - return LocalProgress( - inAsyncCall: _isLoading, - child: CupertinoPageScaffold( - navigationBar: CupertinoNavigationBar( - middle: Text( - AppTranslations.of(context).text('contact.edit.title'), - style: TextStyle(color: CupertinoColors.activeBlue), - ), - ), - // child: NestedScrollView( - // headerSliverBuilder: - // (BuildContext context, bool innerBoxIsScrolled) { - // return [ - // // CupertinoNavigationBar(), - // CupertinoSliverNavigationBar( - // largeTitle: Text( - // AppTranslations.of(context).text('contact.edit.title'), - // ), - // trailing: CupertinoButton( - // onPressed: () => {}, - // child: Icon( - // CupertinoIcons.pen, - // )), - // ) - // ]; - // }, - // body: Text("text"), - // appBar: AppBar( - // backgroundColor: primaryColor, - // title: LocalText( - // context, - // "contact.title", - // fontSize: 20, - // color: Colors.white, - // ), - // actions: [ - // IconButton( - // icon: Icon(Icons.send), - // onPressed: () { - // if (!_formKey.currentState.validate()) return; - // showConfirmDialog(context, "contact.confrim", () { - // _submit(); - // }); - // }) - // ], - // ), - child: Form( - key: _formKey, - child: ListView( - shrinkWrap: true, - padding: EdgeInsets.only(left: 24.0, right: 24.0), - children: [ - // this.phones.isNotEmpty - // ? ConstrainedBox( - // constraints: BoxConstraints(maxHeight: 1000), - // child: ListView.builder( - // shrinkWrap: true, - // itemBuilder: (context, index) { - // return Stack( - // alignment: const Alignment(1.0, 1.0), - // children: [ - // new TextField( - // controller: new TextEditingController( - // text: this.phones[index]), - // cursorColor: primaryColor, - // readOnly: true, - // decoration: new InputDecoration( - // border: InputBorder.none, - // focusedBorder: InputBorder.none, - // icon: Icon( - // Icons.phone, - // color: primaryColor, - // ), - // ), - // ), - // new FlatButton( - // onPressed: () { - // setState(() { - // this.phones.remove(this.phones[index]); - // }); - // }, - // child: new Icon( - // Icons.cancel, - // size: 25, - // )) - // ], - // ); - // }, - // itemCount: this.phones.length, - // ), - // ) - // : Container(), - // addPhoneNumber, - // LocalTextField( - // textEditingController: _deliveryPhone, - // icon: Icon( - // Icons.phone_forwarded, - // color: primaryColor, - // ), - // labelKey: "contact.delivery.phone", - // ), - // emailBox, - // faceBookBox, - // googleBox, - // LocalTextField( - // textEditingController: _address, - // icon: Icon( - // Icons.location_on, - // color: primaryColor, - // ), - // labelKey: "contact.address", - // maxLines: 3, - // ), - ], - ), - ))); - } - - _save(String phone) { - if (phone == null) return; - setState(() { - this.phones.add(phone); - }); - } - - _submit() async { - setState(() { - _isLoading = true; - }); - try { - widget.setting.emailAddress = _email.text; - widget.setting.facebookLink = _facebook.text; - widget.setting.website = _website.text; - widget.setting.phones = this.phones; - widget.setting.address = _address.text; - widget.setting.deliveryPhone = _deliveryPhone.text; - var mainModel = Provider.of(context); - // await mainModel.updateContact(widget.setting); - Navigator.pop(context); - } catch (e) { - showMsgDialog(context, "Error", e.toString()); - } finally { - setState(() { - _isLoading = false; - }); - } - } -} diff --git a/lib/fcs/common/pages/faq/faq_detail_page.dart b/lib/fcs/common/pages/faq/faq_detail_page.dart new file mode 100644 index 0000000..1a4ea58 --- /dev/null +++ b/lib/fcs/common/pages/faq/faq_detail_page.dart @@ -0,0 +1,105 @@ +import 'package:fcs/fcs/common/domain/entities/faq.dart'; +import 'package:fcs/fcs/common/domain/entities/setting.dart'; +import 'package:fcs/fcs/common/domain/vo/contact.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/contact/contact_editor.dart'; +import 'package:fcs/fcs/common/pages/model/language_model.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class FAQDetailPage extends StatelessWidget { + final FAQ faq; + + const FAQDetailPage({Key key, this.faq}) : super(key: key); + + @override + Widget build(BuildContext context) { + Setting setting = Provider.of(context).setting; + return Scaffold( + body: NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverAppBar( + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + expandedHeight: 150.0, + floating: true, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: Text(AppTranslations.of(context).text('faq.btn'), + style: TextStyle( + color: Colors.white, + )), + ), + actions: [ + IconButton( + onPressed: () => + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => ContactEditor( + contact: Contact.fromSetting(setting), + ), + )), + icon: Icon( + CupertinoIcons.delete, + color: Colors.white, + )), + IconButton( + onPressed: () => + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => ContactEditor( + contact: Contact.fromSetting(setting), + ), + )), + icon: Icon( + CupertinoIcons.pen, + color: Colors.white, + )) + ], + ), + ]; + }, + body: Padding( + padding: const EdgeInsets.only(left:20.0,right:20), + child: ListView( + children: [getQuestion(context, faq), + SizedBox(height: 30,), + getAnwser(context, faq)], + ), + ))); + } + + Widget getQuestion(BuildContext context, FAQ faq) { + bool isEng = Provider.of(context).isEng; + return TextLocalStyle( + context, + faq.question(isEng), + fontSize: 22, + fontWeight: FontWeight.bold, + ); + } + + + Widget getAnwser(BuildContext context, FAQ faq) { + bool isEng = Provider.of(context).isEng; + return TextLocalStyle( + context, + faq.answer(isEng), + fontSize: 16, + fontWeight: FontWeight.w200, + ); + } + +} diff --git a/lib/fcs/common/pages/faq/faq_edit_page.dart b/lib/fcs/common/pages/faq/faq_edit_page.dart new file mode 100644 index 0000000..4a21887 --- /dev/null +++ b/lib/fcs/common/pages/faq/faq_edit_page.dart @@ -0,0 +1,149 @@ +import 'package:fcs/fcs/common/domain/entities/faq.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/contact/widgets.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; + +class FAQEditor extends StatefulWidget { + final FAQ faq; + const FAQEditor({this.faq}); + @override + _FAQEditorState createState() => _FAQEditorState(); +} + +class _FAQEditorState extends State { + TextEditingController _engQ = new TextEditingController(); + TextEditingController _mmQ = new TextEditingController(); + TextEditingController _engA = new TextEditingController(); + TextEditingController _mmA = new TextEditingController(); + + final _formKey = GlobalKey(); + bool _isLoading = false; + bool _isNew = false; + + @override + void initState() { + super.initState(); + _isNew = widget.faq == null; + if (widget.faq != null) { + _engQ.text = widget.faq.questionEng; + _mmQ.text = widget.faq.questionMm; + _engA.text = widget.faq.answerEng; + _mmA.text = widget.faq.answerMm; + } + } + + @override + Widget build(BuildContext context) { + final usaPhoneBox = InputText( + iconData: SimpleLineIcons.question, + controller: _engQ, + maxLines: 2, + withBorder: true, + ); + final mmPhoneBox = InputText( + iconData: MaterialCommunityIcons.message_reply_text, + controller: _mmQ, + maxLines: 5, + withBorder: true, + ); + final usaAddreesBox = InputText( + iconData: SimpleLineIcons.question, + controller: _engA, + maxLines: 2, + withBorder: true, + ); + final mmAddressBox = InputText( + iconData: MaterialCommunityIcons.message_reply_text, + controller: _mmA, + maxLines: 5, + withBorder: true, + ); + + return LocalProgress( + inAsyncCall: _isLoading, + child: CupertinoPageScaffold( + child: NestedScrollView( + headerSliverBuilder: + (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverAppBar( + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + expandedHeight: 150.0, + floating: true, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: Text( + AppTranslations.of(context) + .text(_isNew?'faq.add.title':'faq.edit.title'), + style: TextStyle( + color: Colors.white, + )), + ), + actions: [ + IconButton( + onPressed: () => _submit(), + icon: Icon( + Icons.save, + color: Colors.white, + )) + ], + ), + ]; + }, + body: Material( + child: Form( + key: _formKey, + child: ListView( + shrinkWrap: true, + padding: EdgeInsets.only(left: 24.0, right: 24.0), + children: [ + itemTitle(context, "faq.edit.eng"), + subItemTitle(context, "faq.edit.question"), + usaPhoneBox, + subItemTitle(context, "faq.edit.answer"), + mmPhoneBox, + Divider(), + itemTitle(context, "faq.edit.mm"), + subItemTitle(context, "faq.edit.question"), + usaAddreesBox, + subItemTitle(context, "faq.edit.answer"), + mmAddressBox, + ], + ), + ), + )))); + } + + _submit() async { + setState(() { + _isLoading = true; + }); + try { + widget.faq.questionEng = _engQ.text; + // var contactModel = Provider.of(context, listen: false); + // await contactModel.saveContact(widget.contact); + Navigator.pop(context); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } +} diff --git a/lib/fcs/common/pages/faq/faq_page.dart b/lib/fcs/common/pages/faq/faq_page.dart new file mode 100644 index 0000000..7c898dd --- /dev/null +++ b/lib/fcs/common/pages/faq/faq_page.dart @@ -0,0 +1,124 @@ +import 'package:fcs/fcs/common/domain/entities/faq.dart'; +import 'package:fcs/fcs/common/domain/entities/setting.dart'; +import 'package:fcs/fcs/common/domain/vo/contact.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/contact/contact_editor.dart'; +import 'package:fcs/fcs/common/pages/contact/widgets.dart'; +import 'package:fcs/fcs/common/pages/faq/faq_detail_page.dart'; +import 'package:fcs/fcs/common/pages/faq/faq_edit_page.dart'; +import 'package:fcs/fcs/common/pages/model/language_model.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:fcs/widget/local_text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:package_info/package_info.dart'; +import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class FAQPage extends StatefulWidget { + @override + _FAQPageState createState() => _FAQPageState(); +} + +class _FAQPageState extends State { + List faqs = []; + @override + void initState() { + super.initState(); + faqs = [ + FAQ(questionEng: "Question 1?", answerEng: "Answer 1."), + FAQ(questionEng: "Question 2?", answerEng: "Answer 2."), + FAQ(questionEng: "Question 3?", answerEng: "Answer 3."), + FAQ(questionEng: "Question 4?", answerEng: "Answer 4."), + FAQ(questionEng: "Question 5?", answerEng: "Answer 5.") + ]; + } + + @override + Widget build(BuildContext context) { + Setting setting = Provider.of(context).setting; + return Scaffold( + body: NestedScrollView( + headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverAppBar( + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + expandedHeight: 150.0, + floating: true, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: Text(AppTranslations.of(context).text('faq.title'), + style: TextStyle( + color: Colors.white, + )), + ), + actions: [ + IconButton( + onPressed: () => + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => FAQEditor(), + )), + icon: Icon( + CupertinoIcons.add, + color: Colors.white, + size: 35, + )) + ], + ), + ]; + }, + body: Padding( + padding: const EdgeInsets.only(left: 18.0, right: 18), + child: ListView.separated( + separatorBuilder: (_, i) => Divider(), + itemCount: faqs.length, + itemBuilder: (BuildContext ctxt, int index) { + return _faqItem(context, faqs[index]); + }), + )), + ); + } + + Widget _faqItem(BuildContext context, FAQ faq) { + bool isEng = Provider.of(context).isEng; + return InkWell( + onTap: () { + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => FAQDetailPage( + faq: faq, + ), + )); + }, + child: Container( + padding: EdgeInsets.all(15), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextLocalStyle( + context, + faq.question(isEng), + fontSize: 16, + ), + Spacer(), + Icon( + CupertinoIcons.right_chevron, + color: primaryColor, + size: 22, + ) + ], + )), + ); + } +} diff --git a/lib/fcs/common/pages/faq/model/faq_model.dart b/lib/fcs/common/pages/faq/model/faq_model.dart new file mode 100644 index 0000000..d7082be --- /dev/null +++ b/lib/fcs/common/pages/faq/model/faq_model.dart @@ -0,0 +1,17 @@ +import 'dart:async'; + +import 'package:fcs/fcs/common/domain/entities/faq.dart'; +import 'package:fcs/fcs/common/pages/model/base_model.dart'; +import 'package:fcs/fcs/common/services/services.dart'; +import 'package:logging/logging.dart'; + +class FAQModel extends BaseModel { + final log = Logger('FAQModel'); + + Future addFAQ(FAQ faq) async { + await request("/faq", "POST", + payload: faq.toMap(), token: await Services.instance.authService.getToken()); + notifyListeners(); + } + +} diff --git a/lib/fcs/common/pages/home_page.dart b/lib/fcs/common/pages/home_page.dart index 27aca90..70db5b4 100644 --- a/lib/fcs/common/pages/home_page.dart +++ b/lib/fcs/common/pages/home_page.dart @@ -1,4 +1,5 @@ import 'package:fcs/fcs/common/localization/transalation.dart'; +import 'package:fcs/fcs/common/pages/faq/faq_page.dart'; import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/widgets/action_button.dart'; @@ -74,6 +75,12 @@ class _HomePageState extends State { var customer = Provider.of(context).isCustomer(); LanguageModel languageModel = Provider.of(context); + final faqBtn = _buildBtn("faq.btn", + icon: MaterialCommunityIcons.frequently_asked_questions, + btnCallback: () => Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => FAQPage(), + ))); + final packagesBtn = _buildBtn("package.name", icon: Octicons.package, btnCallback: () => @@ -161,6 +168,7 @@ class _HomePageState extends State { Navigator.of(context).push(BottomUpPageRoute(DeliverList()))); List widgets = []; + widgets.add(faqBtn); customer ? widgets.add(buyingBtn) : ""; customer || owner ? widgets.add(pickUpBtn) : ""; owner ? widgets.add(shipmentBtn) : ""; @@ -294,7 +302,7 @@ class _HomePageState extends State { ), ]), ), - BottomWidgets(), + BottomWidgets(), ], ))), ), @@ -302,7 +310,7 @@ class _HomePageState extends State { } _langChange(index) { - var languageModel = Provider.of(context,listen: false); + var languageModel = Provider.of(context, listen: false); languageModel.saveLanguage(Translation().supportedLanguages[index]); setState(() { isSelected.asMap().forEach((i, e) { @@ -314,6 +322,7 @@ class _HomePageState extends State { Widget _buildBtn(String title, {Image imgIcon, IconData icon, BtnCallback btnCallback}) { - return ActionButton(title: title,imgIcon: imgIcon,icon:icon,btnCallback: btnCallback); + return ActionButton( + title: title, imgIcon: imgIcon, icon: icon, btnCallback: btnCallback); } } diff --git a/lib/fcs/common/pages/model/base_model.dart b/lib/fcs/common/pages/model/base_model.dart index 916cd00..911f5cd 100644 --- a/lib/fcs/common/pages/model/base_model.dart +++ b/lib/fcs/common/pages/model/base_model.dart @@ -18,7 +18,9 @@ abstract class BaseModel extends ChangeNotifier { this.setting = setting; } - void logout(); + void logout(){ + + } // request makes http request // if token is null diff --git a/lib/fcs/common/pages/model/main_model.dart b/lib/fcs/common/pages/model/main_model.dart index 7fa9523..fc16bc5 100644 --- a/lib/fcs/common/pages/model/main_model.dart +++ b/lib/fcs/common/pages/model/main_model.dart @@ -113,7 +113,10 @@ class MainModel extends ChangeNotifier { Future _loadSetting() async { try { - this.setting = await Services.instance.authService.getSetting(); + Services.instance.authService.getSetting().listen((event) { + this.setting = event; + notifyListeners(); + }); } finally {} // _initSetting(setting); } diff --git a/lib/fcs/common/pages/term.dart b/lib/fcs/common/pages/term.dart deleted file mode 100644 index 34ee27a..0000000 --- a/lib/fcs/common/pages/term.dart +++ /dev/null @@ -1,173 +0,0 @@ -import 'dart:convert'; - -import 'package:fcs/fcs/common/pages/model/main_model.dart'; -import 'package:fcs/fcs/common/pages/term_edit.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/progress.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:fcs/fcs/common/pages/util.dart'; -import 'package:zefyr/zefyr.dart'; - - -typedef void ProfileCallback(); - -class Term extends StatefulWidget { - final bool agreePage; - - const Term({Key key, this.agreePage = false}) : super(key: key); - @override - _TermState createState() => _TermState(); -} - -class _TermState extends State { - ZefyrController _controller; - FocusNode _focusNode; - NotusDocument document = new NotusDocument(); - bool isLoading = false; - - @override - void initState() { - super.initState(); - _controller = ZefyrController(_loadDocument()); - print("controller terms => ${_controller.document}"); - _focusNode = FocusNode(); - } - - NotusDocument _loadDocument() { - MainModel mainModel = Provider.of(context, listen: false); - String term = mainModel.setting.terms; - print("terms => $term"); - NotusDocument doc; - try { - doc = NotusDocument.fromJson(jsonDecode(term)); - print('doc=> $doc'); - } catch (e) {} - if (doc == null) { - doc = NotusDocument(); - } - return doc; - } - - @override - Widget build(BuildContext context) { - MainModel mainModel = Provider.of(context); - - bool isOwnerAndAbove = - mainModel.user != null && mainModel.user.isOwnerAndAbove(); - bool hasAdmin = mainModel.user != null && mainModel.user.hasAdmin(); - - // bool aggreed = mainModel.user.agreeTerms; - bool aggreed = true; - - final agreeBtn = Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: Card( - elevation: 10, - child: Container( - height: 45.0, - child: ButtonTheme( - minWidth: 900.0, - height: 100.0, - child: FlatButton.icon( - onPressed: () { - showConfirmDialog(context, "term.iagree", () async { - _agree(); - }); - }, - label: LocalText(context, "term.agree_btn"), - icon: Icon( - Icons.check, - ), - ), - ), - ), - )); - - return LocalProgress( - inAsyncCall: isLoading, - child: Scaffold( - appBar: AppBar( - centerTitle: true, - leading: new IconButton( - icon: new Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(), - ), - // automaticallyImplyLeading: !widget.agreePage, - title: LocalText(context, 'term', color: Colors.white, fontSize: 20), - backgroundColor: primaryColor, - actions: [ - // isOwnerAndAbove || hasAdmin - // ? - IconButton( - icon: Icon(Icons.edit), - onPressed: () async { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => TermEdit((data) { - setState(() { - _controller = ZefyrController(data); - }); - })), - ); - // print('doc=> $doc'); - - // setState(() { - // document = doc; - // }); - // var document = await - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => TermEdit()), - // ); - }, - ) - // : Container() - ], - ), - body: Column( - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Card( - child: ZefyrTheme( - data: ZefyrThemeData().copyWith(), - child: ZefyrScaffold( - child: ZefyrEditor( - mode: ZefyrMode.view, - padding: EdgeInsets.all(16), - controller: _controller, - focusNode: _focusNode, - ), - ))), - )), - !aggreed ? agreeBtn : Container(), - ], - ), - ), - ); - } - - _agree() async { - setState(() { - isLoading = true; - }); - try { - // MainModel mainModel = Provider.of(context); - // await mainModel.agreeTerms(); - // if (widget.agreePage) { - // Future.delayed(const Duration(milliseconds: 3000), () { - // Navigator.pop(context); - // }); - // } - } catch (e) { - showMsgDialog(context, "Error", e.toString()); - setState(() { - isLoading = false; - }); - } - } -} diff --git a/lib/fcs/common/pages/term/model/term_model.dart b/lib/fcs/common/pages/term/model/term_model.dart new file mode 100644 index 0000000..52c6afd --- /dev/null +++ b/lib/fcs/common/pages/term/model/term_model.dart @@ -0,0 +1,17 @@ +import 'dart:async'; + +import 'package:fcs/fcs/common/domain/vo/term.dart'; +import 'package:fcs/fcs/common/pages/model/base_model.dart'; +import 'package:fcs/fcs/common/services/services.dart'; +import 'package:logging/logging.dart'; + +class TermModel extends BaseModel { + final log = Logger('TermModel'); + + Future saveTerm(Term term) async { + await request("/terms", "PUT", + payload: term.toMap(), token: await Services.instance.authService.getToken()); + notifyListeners(); + } + +} diff --git a/lib/fcs/common/pages/term_edit.dart b/lib/fcs/common/pages/term/term_edit.dart similarity index 69% rename from lib/fcs/common/pages/term_edit.dart rename to lib/fcs/common/pages/term/term_edit.dart index b00c5be..1811f35 100644 --- a/lib/fcs/common/pages/term_edit.dart +++ b/lib/fcs/common/pages/term/term_edit.dart @@ -1,20 +1,23 @@ import 'dart:convert'; +import 'package:fcs/fcs/common/domain/vo/term.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/term/model/term_model.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/model/main_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/widget/progress.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:provider/provider.dart'; import 'package:zefyr/zefyr.dart'; - typedef void ProfileCallback(); class TermEdit extends StatefulWidget { - final ValueChanged onChangedData; - TermEdit(this.onChangedData); + final Term term; + TermEdit({this.term}); @override _TermEditState createState() => _TermEditState(); } @@ -40,12 +43,9 @@ class _TermEditState extends State { /// Loads the document to be edited in Zefyr. NotusDocument _loadDocument() { - MainModel mainModel = Provider.of(context, listen: false); - String term = mainModel.setting.terms; - NotusDocument doc; try { - doc = NotusDocument.fromJson(jsonDecode(term)); + doc = NotusDocument.fromJson(jsonDecode(widget.term.term)); } catch (e) {} if (doc == null) { doc = NotusDocument(); @@ -55,31 +55,21 @@ class _TermEditState extends State { @override Widget build(BuildContext context) { - MainModel mainModel = Provider.of(context); - - var singleChildScrollView = SingleChildScrollView( - padding: EdgeInsets.only( - left: 25.0, - right: 25.0, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 300, - height: 300, - child: Card(child: Markdown(data: mainModel.setting.terms))), - ], - ), - ); - return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( - title: Text( - "Terms", + title: LocalLargeTitle( + context, + "term", + color: Colors.white, + ), + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, actions: [ @@ -105,16 +95,15 @@ class _TermEditState extends State { ); } - _save() { + _save() async { setState(() { _isLoading = true; }); try { final contents = jsonEncode(_controller.document); print('contents => $contents'); - widget.onChangedData(_controller.document); - // MainModel mainModel = Provider.of(context, listen: false); - // mainModel.updateTerms(contents); + TermModel termModel = Provider.of(context, listen: false); + await termModel.saveTerm(Term(term: contents)); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { diff --git a/lib/fcs/common/pages/term/term_page.dart b/lib/fcs/common/pages/term/term_page.dart new file mode 100644 index 0000000..af8e3e8 --- /dev/null +++ b/lib/fcs/common/pages/term/term_page.dart @@ -0,0 +1,107 @@ +import 'dart:convert'; + +import 'package:fcs/fcs/common/domain/entities/setting.dart'; +import 'package:fcs/fcs/common/domain/vo/term.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/term/term_edit.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:zefyr/zefyr.dart'; + +typedef void ProfileCallback(); + +class TermPage extends StatefulWidget { + const TermPage({ + Key key, + }) : super(key: key); + @override + _TermPageState createState() => _TermPageState(); +} + +class _TermPageState extends State { + ZefyrController _controller; + FocusNode _focusNode; + NotusDocument document = new NotusDocument(); + bool isLoading = false; + + @override + void initState() { + super.initState(); + _focusNode = FocusNode(); + } + + NotusDocument _loadDocument(Setting setting) { + String term = setting.terms; + NotusDocument doc; + try { + doc = NotusDocument.fromJson(jsonDecode(term)); + } catch (e) {} + if (doc == null) { + doc = NotusDocument(); + } + return doc; + } + + @override + Widget build(BuildContext context) { + Setting setting = Provider.of(context).setting; + return CupertinoPageScaffold( + child: NestedScrollView( + headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { + return [ + SliverAppBar( + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + expandedHeight: 150.0, + floating: true, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: LocalLargeTitle( + context, + "term", + color: Colors.white, + ), + ), + actions: [ + IconButton( + onPressed: () => + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => + TermEdit(term: Term.fromSetting(setting)), + )), + icon: Icon( + CupertinoIcons.pen, + color: Colors.white, + )) + ], + ), + ]; + }, + body: ZefyrTheme( + data: ZefyrThemeData().copyWith( + defaultLineTheme: LineTheme( + textStyle: TextStyle(color: Colors.black), + padding: EdgeInsets.all(0))), + child: ZefyrScaffold( + child: ZefyrEditor( + mode: ZefyrMode.view, + padding: EdgeInsets.all(16), + controller: ZefyrController(_loadDocument(setting)), + focusNode: _focusNode, + ), + ))), + ); + } +} diff --git a/lib/fcs/common/pages/util.dart b/lib/fcs/common/pages/util.dart index e64ea2b..edf5c67 100644 --- a/lib/fcs/common/pages/util.dart +++ b/lib/fcs/common/pages/util.dart @@ -1,3 +1,4 @@ +import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/widget/label_widgets.dart'; import 'package:flutter/material.dart'; import 'package:flutter_colorpicker/flutter_colorpicker.dart'; @@ -14,7 +15,6 @@ import 'package:fcs/model/user_model.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/vo/buyer.dart'; import 'package:fcs/widget/local_text.dart'; -import 'package:fcs/widget/localization/app_translations.dart'; import 'package:fcs/vo/notification.dart' as Noti; import '../../../pages/announcement.dart'; @@ -578,3 +578,8 @@ Widget fcsButton(BuildContext context, String text, {Function callack}) { ), ); } + + +String getLocalString(BuildContext context,String key){ + return AppTranslations.of(context).text(key); +} \ No newline at end of file diff --git a/lib/fcs/common/pages/widgets/bottom_widgets.dart b/lib/fcs/common/pages/widgets/bottom_widgets.dart index 486e0ef..e16cae0 100644 --- a/lib/fcs/common/pages/widgets/bottom_widgets.dart +++ b/lib/fcs/common/pages/widgets/bottom_widgets.dart @@ -1,7 +1,6 @@ -import 'package:fcs/fcs/common/pages/contact.dart'; -import 'package:fcs/fcs/common/pages/term.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/widget/bottom_up_page_route.dart'; +import 'package:fcs/fcs/common/pages/contact/contact_page.dart'; +import 'package:fcs/fcs/common/pages/term/term_page.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -16,25 +15,26 @@ class BottomWidgets extends StatelessWidget { InkWell( onTap: () { Navigator.of(context).push(CupertinoPageRoute( - fullscreenDialog: true, - builder: (context) => Contact(), + builder: (context) => ContactPage(), )); }, - child: _buildSmallButton("Contact Us", SimpleLineIcons.support), + child: _buildSmallButton( + context, "contact.btn", SimpleLineIcons.support), ), InkWell( onTap: () { Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => Term(), + builder: (context) => TermPage(), )); }, - child: _buildSmallButton("Terms of service", Icons.info_outline), + child: _buildSmallButton(context, "term.btn", Icons.info_outline), ), ], ); } - Widget _buildSmallButton(String text, IconData iconData) { + Widget _buildSmallButton( + BuildContext context, String textKey, IconData iconData) { return Padding( padding: const EdgeInsets.all(18.0), child: Row( @@ -44,10 +44,7 @@ class BottomWidgets extends StatelessWidget { padding: const EdgeInsets.only(right: 5), child: Icon(iconData, color: Colors.white70, size: 20), ), - Text( - text, - style: subMenuStyle, - ) + LocalText(context, textKey, color: Colors.white70) ], ), ); diff --git a/lib/fcs/common/pages/widgets/input_text.dart b/lib/fcs/common/pages/widgets/input_text.dart new file mode 100644 index 0000000..0b306cb --- /dev/null +++ b/lib/fcs/common/pages/widgets/input_text.dart @@ -0,0 +1,64 @@ +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/model/language_model.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class InputText extends StatelessWidget { + final String labelTextKey; + final IconData iconData; + final TextEditingController controller; + final FormFieldValidator validator; + final int maxLines; + final bool withBorder; + final Color borderColor; + + const InputText( + {Key key, + this.labelTextKey, + this.iconData, + this.controller, + this.validator, + this.maxLines = 1, + this.withBorder = false, + this.borderColor}) + : super(key: key); + @override + Widget build(BuildContext context) { + var languageModel = Provider.of(context); + + return Padding( + padding: const EdgeInsets.only(top: 15.0, bottom: 5), + child: TextFormField( + controller: controller, + autofocus: false, + cursorColor: primaryColor, + style: textStyle, + maxLines: maxLines, + decoration: new InputDecoration( + labelText:labelTextKey==null?null: AppTranslations.of(context).text(labelTextKey), + labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, + icon: iconData == null + ? null + : Icon( + iconData, + color: primaryColor, + ), + enabledBorder: withBorder + ? OutlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0), + ) + : UnderlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0)), + focusedBorder: withBorder + ? OutlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0), + ) + : UnderlineInputBorder( + borderSide: BorderSide(color: primaryColor, width: 1.0)), + ), + validator: validator), + ); + } +} diff --git a/lib/fcs/common/pages/widgets/local_text.dart b/lib/fcs/common/pages/widgets/local_text.dart index c26c488..a185ac7 100644 --- a/lib/fcs/common/pages/widgets/local_text.dart +++ b/lib/fcs/common/pages/widgets/local_text.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; - class LocalText extends Text { final BuildContext context; LocalText(this.context, String translationKey, @@ -28,3 +27,30 @@ class LocalText extends Text { fontWeight: fontWeight, underline: underline)); } + +class LocalLargeTitle extends Text { + final BuildContext context; + LocalLargeTitle( + this.context, + String translationKey, { + Color color, + List translationVariables, + }) : super( + AppTranslations.of(context).text(translationKey, + translationVariables: translationVariables), + style: Provider.of(context).isEng + ? TextStyle(color: color) + : TextStyle(color: color, fontFamily: "MyanmarUnicode")); +} + +class TextLocalStyle extends Text { + final BuildContext context; + TextLocalStyle(this.context, String text, {Color color, double fontSize,FontWeight fontWeight}) + : super(text, + style: Provider.of(context).isEng + ? TextStyle(color: color, fontSize: fontSize,fontWeight: fontWeight) + : TextStyle( + color: color, + fontFamily: "MyanmarUnicode", + fontSize: fontSize,fontWeight: fontWeight)); +} diff --git a/lib/fcs/common/services/auth_imp.dart b/lib/fcs/common/services/auth_imp.dart index 3fdda0f..8a078bd 100644 --- a/lib/fcs/common/services/auth_imp.dart +++ b/lib/fcs/common/services/auth_imp.dart @@ -43,8 +43,8 @@ class AuthServiceImp implements AuthService { } @override - Future getSetting() { - return authFb.getSetting(); + Stream getSetting() { + return authFb.settings(); } @override @@ -56,4 +56,9 @@ class AuthServiceImp implements AuthService { Stream onAuthStatus() { return authFb.onAuthStatus; } + + @override + Future getToken() { + return authFb.getToken(); + } } diff --git a/lib/fcs/common/services/auth_service.dart b/lib/fcs/common/services/auth_service.dart index bb9fb83..5344e28 100644 --- a/lib/fcs/common/services/auth_service.dart +++ b/lib/fcs/common/services/auth_service.dart @@ -8,6 +8,7 @@ abstract class AuthService { Future signout(); Future getUser({bool refreshIdToken = false}); Future signup(String userName); - Future getSetting(); + Stream getSetting(); Stream onAuthStatus(); + Future getToken(); } diff --git a/lib/main-local.dart b/lib/main-local.dart index 5d60521..2cf297f 100644 --- a/lib/main-local.dart +++ b/lib/main-local.dart @@ -9,7 +9,7 @@ void main() { Config( flavor: Flavor.DEV, color: Colors.blue, - apiURL: "http://192.168.100.11:7777", + apiURL: "http://192.168.1.155:7777", level: Level.ALL); runApp(App()); }