From 1ed6f4f00e4f98cb82ddeee718c08482940af05e Mon Sep 17 00:00:00 2001 From: Sai Naw Wun Date: Wed, 16 Sep 2020 02:29:50 +0630 Subject: [PATCH] add packages --- assets/local/localization_en.json | 8 +- assets/local/localization_mu.json | 9 +- lib/app.dart | 6 +- lib/fcs/common/data/providers/auth_fb.dart | 8 +- .../data/providers/package_data_provider.dart | 8 +- lib/fcs/common/domain/constants.dart | 2 + lib/fcs/common/domain/entities/market.dart | 28 +++ lib/fcs/common/domain/entities/package.dart | 42 +++- lib/fcs/common/domain/entities/setting.dart | 1 + .../pages/customers/model/customer_model.dart | 3 + lib/fcs/common/pages/home_page.dart | 6 +- .../common/pages/market/market_editor.dart | 192 +++++++++++++++++ .../pages/market/model/market_model.dart | 57 +++++ .../pages/package/barcode_screen_page.dart | 69 ------ .../pages/package/model/package_model.dart | 201 +++--------------- .../pages/package/package_creation.dart | 3 +- .../common/pages/package/package_list.dart | 124 +---------- .../pages/package/package_list_row.dart | 4 +- lib/fcs/common/pages/package/package_new.dart | 113 +++++----- .../pages/package/tracking_id_page.dart | 175 +++++++++++++++ lib/fcs/common/pages/package/user_serach.dart | 2 +- .../common/pages/profile/profile_page.dart | 4 +- .../common/pages/staff/model/staff_model.dart | 10 +- .../pages/widgets/bottom_up_page_route.dart | 2 +- .../common/pages/widgets/display_text.dart | 16 +- lib/fcs/common/pages/widgets/input_text.dart | 4 +- lib/fcs/common/pages/widgets/local_text.dart | 11 +- lib/fcs/common/services/package_imp.dart | 20 ++ lib/fcs/common/services/package_service.dart | 5 + lib/fcs/common/services/services.dart | 7 + 30 files changed, 684 insertions(+), 456 deletions(-) create mode 100644 lib/fcs/common/domain/entities/market.dart create mode 100644 lib/fcs/common/pages/market/market_editor.dart create mode 100644 lib/fcs/common/pages/market/model/market_model.dart delete mode 100644 lib/fcs/common/pages/package/barcode_screen_page.dart create mode 100644 lib/fcs/common/pages/package/tracking_id_page.dart create mode 100644 lib/fcs/common/services/package_imp.dart create mode 100644 lib/fcs/common/services/package_service.dart diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 68d6a52..7dd65ed 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -102,7 +102,8 @@ "package.create.name":"Customer Name", "package.create.phone":"Phone Number", "package.tracking.id":"Tracking ID", - "package.create.packages":"Create Packages", + "package.create.packages":"Complete receiving", + "package.create.market":"Market", "package.edit.title":"PACKAGE", "package.arrival.date":"Arrival Date", @@ -111,10 +112,15 @@ "package.weight":"Weight", "package.amount":"Amount", + "market.edit.title":"Markets", + "market.edit.name":"Market Name", + "market.remove.confirm":"Remove this market?", "btn.save": "Save", "btn.approve":"Approve", "btn.delete":"Delete", + "btn.select":"Select", + "btn.cancel":"Cancel", "================================================================":"", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index a1bad1a..bb1b6e4 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -103,7 +103,8 @@ "package.create.name":"နာမည်", "package.create.phone":"ဖုန်းနံပါတ်", "package.tracking.id":"Tracking ID", - "package.create.packages":"အထုပ် အသစ်များ သိမ်းဆည်းရန်", + "package.create.packages":"အထုပ် အသစ်များ လက်ခံမည်", + "package.create.market":"Market", "package.new":"New Package", "package.edit.title":"PACKAGE", @@ -113,10 +114,16 @@ "package.weight":"Weight", "package.amount":"Amount", + "market.edit.title":"Markets", + "market.edit.name":"Market Name", + "market.remove.confirm":"Remove this market?", "btn.save":"သိမ်းဆည်းရန်", "btn.approve":"အတည်ပြုရန်", "btn.delete":"ဖျက်ရန်", + "btn.select":"ရွေးချယ်ပါ", + "btn.cancel":"Cancel", + "================================================================":"", diff --git a/lib/app.dart b/lib/app.dart index b1cc72e..699cd9a 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -6,6 +6,7 @@ import 'package:fcs/fcs/common/pages/contact/model/contact_model.dart'; import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; import 'package:fcs/fcs/common/pages/faq/model/faq_model.dart'; import 'package:fcs/fcs/common/pages/initial_language_selection.dart'; +import 'package:fcs/fcs/common/pages/market/model/market_model.dart'; import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart' as fcs; import 'package:fcs/fcs/common/pages/package/model/package_model.dart'; @@ -93,6 +94,7 @@ class _AppState extends State { final StaffModel staffModel = new StaffModel(); final ShipmentModel shipmentModel = new ShipmentModel(); final PackageModel packageModel = new PackageModel(); + final MarketModel marketModel = new MarketModel(); AppTranslationsDelegate _newLocaleDelegate; static FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = @@ -105,7 +107,8 @@ class _AppState extends State { ..addModel(customerModel) ..addModel(staffModel) ..addModel(shipmentModel) - ..addModel(packageModel); + ..addModel(packageModel) + ..addModel(marketModel); mainModel2.init(); _newLocaleDelegate = AppTranslationsDelegate(newLocale: null); @@ -256,6 +259,7 @@ class _AppState extends State { ChangeNotifierProvider.value(value: contactModel), ChangeNotifierProvider.value(value: termModel), ChangeNotifierProvider.value(value: faqModel), + ChangeNotifierProvider.value(value: marketModel), ], child: Consumer( builder: (context, value, child) { diff --git a/lib/fcs/common/data/providers/auth_fb.dart b/lib/fcs/common/data/providers/auth_fb.dart index 2f357f3..26148ca 100644 --- a/lib/fcs/common/data/providers/auth_fb.dart +++ b/lib/fcs/common/data/providers/auth_fb.dart @@ -5,7 +5,6 @@ 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'; @@ -61,6 +60,7 @@ class AuthFb { _verificationId = verificationId; print("codeSent " + phoneNumber); codeSentCompleted = true; + completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT)); }; final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = @@ -136,8 +136,10 @@ class AuthFb { user.privileges = privileges.split(":").toList(); } User _user = await getUserFromFirestore(user.id); - user.fcsID = _user.fcsID; - user.name = _user.name; + if (_user != null) { + user.fcsID = _user.fcsID; + user.name = _user.name; + } return user; } diff --git a/lib/fcs/common/data/providers/package_data_provider.dart b/lib/fcs/common/data/providers/package_data_provider.dart index 3eddda3..90a7e01 100644 --- a/lib/fcs/common/data/providers/package_data_provider.dart +++ b/lib/fcs/common/data/providers/package_data_provider.dart @@ -1,5 +1,4 @@ import 'package:fcs/fcs/common/domain/entities/package.dart'; -import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/helpers/api_helper.dart'; import 'package:fcs/fcs/common/helpers/firebase_helper.dart'; import 'package:logging/logging.dart'; @@ -7,10 +6,9 @@ import 'package:logging/logging.dart'; class PackageDataProvider { final log = Logger('PackageDataProvider'); - Future createPackages(User user, List packages) async { - List strs = packages.map((e) => e.trackingID).toList(); + Future createPackages(List packages, String fcsID) async { + List> json = packages.map((e) => e.toJson()).toList(); return await requestAPI("/packages", "POST", - payload: {"fcs_id": user.fcsID, "tracking_ids": strs}, - token: await getToken()); + payload: {"packages": json, "fcs_id": fcsID}, token: await getToken()); } } diff --git a/lib/fcs/common/domain/constants.dart b/lib/fcs/common/domain/constants.dart index 0dd861b..b56cec0 100644 --- a/lib/fcs/common/domain/constants.dart +++ b/lib/fcs/common/domain/constants.dart @@ -3,6 +3,8 @@ const user_collection = "users"; const invitations_collection = "invitations"; const setting_doc_id = "setting"; const privilege_collection = "privileges"; +const markets_collection = "markets"; +const packages_collection = "packages"; const ok_doc_id = "ok"; diff --git a/lib/fcs/common/domain/entities/market.dart b/lib/fcs/common/domain/entities/market.dart new file mode 100644 index 0000000..0b7ebec --- /dev/null +++ b/lib/fcs/common/domain/entities/market.dart @@ -0,0 +1,28 @@ +class Market { + String id; + String name; + + Market({ + this.id, + this.name, + }); + + Map toMap() { + return { + 'id': id, + 'name': name, + }; + } + + factory Market.fromMap(Map map, String id) { + return Market( + id: id, + name: map['name'], + ); + } + + @override + String toString() { + return 'Market{id: $id, name: $name}'; + } +} diff --git a/lib/fcs/common/domain/entities/package.dart b/lib/fcs/common/domain/entities/package.dart index 4acfdb5..7c14a4c 100644 --- a/lib/fcs/common/domain/entities/package.dart +++ b/lib/fcs/common/domain/entities/package.dart @@ -1,13 +1,19 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/fcs/common/domain/vo/shipment_status.dart'; class Package { String id; String trackingID; String userID; + String fcsID; String userName; String phoneNumber; - String status; + String currentStatus; + DateTime currentStatusDate; + List> allStatus; + List photoUrls; + String status; String shipmentNumber; String senderFCSID; String senderName; @@ -39,6 +45,9 @@ class Package { this.id, this.trackingID, this.userID, + this.userName, + this.fcsID, + this.phoneNumber, this.shipmentNumber, this.senderFCSID, this.senderName, @@ -57,5 +66,36 @@ class Package { this.cargoDesc, this.market, this.shipmentHistory, + this.allStatus, + this.currentStatus, + this.currentStatusDate, + this.photoUrls, }); + + factory Package.fromMap(Map map, String docID) { + var _currentStatusDate = (map['current_status_date'] as Timestamp); + + List> _allStatus = List.from(map['all_status']) + .map((e) => Map.from(e)) + .toList(); + List _photoUrls = + map['photo_urls'] == null ? [] : map['photo_urls'].cast>(); + + return Package( + id: docID, + userID: map['user_id'], + fcsID: map['fcs_id'], + trackingID: map['tracking_id'], + market: map['market'], + userName: map['user_name'], + phoneNumber: map['phone_number'], + currentStatus: map['current_status'], + currentStatusDate: + _currentStatusDate != null ? _currentStatusDate.toDate() : null, + photoUrls: _photoUrls, + allStatus: _allStatus); + } + + Map toJson() => + {'id': id, 'tracking_id': trackingID, 'market': market, 'fcs_id': fcsID}; } diff --git a/lib/fcs/common/domain/entities/setting.dart b/lib/fcs/common/domain/entities/setting.dart index 0e0b1c4..41f5a32 100644 --- a/lib/fcs/common/domain/entities/setting.dart +++ b/lib/fcs/common/domain/entities/setting.dart @@ -116,6 +116,7 @@ class Setting { factory Setting.fromMap(Map map) { var ts = (map['price_last_update'] as Timestamp); var list = (map['bank_accounts'] as List); + List bankAccounts = []; if (list != null) { list.asMap().forEach((index, item) { diff --git a/lib/fcs/common/pages/customers/model/customer_model.dart b/lib/fcs/common/pages/customers/model/customer_model.dart index 1080db9..1cb943e 100644 --- a/lib/fcs/common/pages/customers/model/customer_model.dart +++ b/lib/fcs/common/pages/customers/model/customer_model.dart @@ -23,7 +23,10 @@ class CustomerModel extends BaseModel { @override logout() async { + if (customerListener != null) customerListener.cancel(); + if (invitationListener != null) invitationListener.cancel(); customers = []; + invitations = []; } Future inviteUser(String userName, String phoneNumber) { diff --git a/lib/fcs/common/pages/home_page.dart b/lib/fcs/common/pages/home_page.dart index 3f70748..40185e0 100644 --- a/lib/fcs/common/pages/home_page.dart +++ b/lib/fcs/common/pages/home_page.dart @@ -73,9 +73,11 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { User user = Provider.of(context).user; + if (user == null) { + return Container(); + } + login = Provider.of(context).isLogin(); - // var owner =true;// Provider.of(context).isOwner(); - var customer = Provider.of(context).isCustomer(); LanguageModel languageModel = Provider.of(context); final faqBtn = _buildBtn("faq.btn", diff --git a/lib/fcs/common/pages/market/market_editor.dart b/lib/fcs/common/pages/market/market_editor.dart new file mode 100644 index 0000000..72b16d0 --- /dev/null +++ b/lib/fcs/common/pages/market/market_editor.dart @@ -0,0 +1,192 @@ +import 'package:fcs/fcs/common/domain/entities/market.dart'; +import 'package:fcs/fcs/common/domain/entities/role.dart'; +import 'package:fcs/fcs/common/domain/entities/user.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/market/model/market_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/staff/model/staff_model.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/input_text.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'; + +typedef void FindCallBack(); + +class MarketEditor extends StatefulWidget { + const MarketEditor(); + @override + _MarketEditorState createState() => _MarketEditorState(); +} + +class _MarketEditorState extends State { + TextEditingController _marketNameCtl = new TextEditingController(); + + bool _isLoading = false; + List markets = []; + + @override + void initState() { + super.initState(); + } + + List showMarkets(BuildContext context, List markets) { + return markets.map((p) { + return new ListTile( + title: new Row( + children: [ + Expanded( + child: new Text( + p.name, + style: TextStyle( + fontSize: 15.0, + ), + ), + ), + Spacer(), + IconButton( + icon: Icon(Icons.remove, color: primaryColor), + onPressed: () => _remove(p), + ) + ], + )); + }).toList(); + } + + @override + Widget build(BuildContext context) { + List markets = Provider.of(context).markets; + + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(Icons.close, color: primaryColor, size: 30), + onPressed: () => Navigator.of(context).pop(), + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + title: LocalText( + context, + "market.edit.title", + fontSize: 20, + color: primaryColor, + ), + ), + body: Padding( + padding: const EdgeInsets.only(left: 12.0, right: 12), + child: ListView( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.only(right: 18.0), + child: IconButton( + icon: Icon(Icons.add, color: primaryColor), + onPressed: () => _showDialog(context), + ), + ), + ], + ), + Column( + children: showMarkets(context, markets), + ), + SizedBox( + height: 10, + ) + ], + ), + ), + )); + } + + _remove(Market market) { + if (market == null) { + showMsgDialog(context, "Esrror", "Invalid market!"); + return; + } + showConfirmDialog( + context, "market.remove.confirm", () => _removeMarket(market)); + } + + _removeMarket(Market market) async { + setState(() { + _isLoading = true; + }); + MarketModel marketModel = Provider.of(context, listen: false); + try { + await marketModel.deleteMarket(market.id); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + _add() async { + if (_marketNameCtl.text == "") { + showMsgDialog(context, "Esrror", "Invalid market name!"); + return; + } + setState(() { + _isLoading = true; + }); + MarketModel marketModel = Provider.of(context, listen: false); + try { + await marketModel.addMarket(_marketNameCtl.text); + _marketNameCtl.text = ""; + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + _showDialog(BuildContext context) async { + await showDialog( + context: context, + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row( + children: [ + new Expanded( + child: InputText( + labelTextKey: "market.edit.name", + controller: _marketNameCtl, + autoFocus: true, + ), + ) + ], + ), + actions: [ + new FlatButton( + child: LocalText(context, "btn.cancel", color: primaryColor), + onPressed: () { + Navigator.pop(context); + }), + new FlatButton( + child: LocalText( + context, + "btn.save", + color: primaryColor, + ), + onPressed: () { + Navigator.pop(context); + _add(); + }) + ], + ), + ); + } +} diff --git a/lib/fcs/common/pages/market/model/market_model.dart b/lib/fcs/common/pages/market/model/market_model.dart new file mode 100644 index 0000000..4aa0d9d --- /dev/null +++ b/lib/fcs/common/pages/market/model/market_model.dart @@ -0,0 +1,57 @@ +import 'dart:async'; + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/fcs/common/domain/constants.dart'; +import 'package:fcs/fcs/common/domain/entities/market.dart'; +import 'package:fcs/fcs/common/helpers/firebase_helper.dart'; +import 'package:fcs/fcs/common/pages/model/base_model.dart'; +import 'package:logging/logging.dart'; + +class MarketModel extends BaseModel { + final log = Logger('MarketModel'); + StreamSubscription listener; + List markets = []; + + void initUser(user) async { + super.initUser(user); + _loadMarkets(); + } + + @override + logout() async { + markets = []; + } + + Future _loadMarkets() async { + if (user == null || !user.hasStaffs()) return; + + try { + if (listener != null) listener.cancel(); + + listener = Firestore.instance + .collection("/$config_collection/$setting_doc_id/$markets_collection") + .snapshots() + .listen((QuerySnapshot snapshot) { + markets.clear(); + markets = snapshot.documents.map((documentSnapshot) { + var user = Market.fromMap( + documentSnapshot.data, documentSnapshot.documentID); + return user; + }).toList(); + notifyListeners(); + }); + } catch (e) { + log.warning("Error!! $e"); + } + } + + Future addMarket(String marketName) async { + await request("/markets", "POST", + payload: {"name": marketName}, token: await getToken()); + } + + Future deleteMarket(String id) async { + await request("/markets", "DELETE", + payload: {"id": id}, token: await getToken()); + } +} diff --git a/lib/fcs/common/pages/package/barcode_screen_page.dart b/lib/fcs/common/pages/package/barcode_screen_page.dart deleted file mode 100644 index b1fc35a..0000000 --- a/lib/fcs/common/pages/package/barcode_screen_page.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:barcode_scan/barcode_scan.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/vo/buyer.dart'; -import 'package:fcs/widget/progress.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; - -class BarcodeScreenPage extends StatefulWidget { - final BuyerProduct buyerProduct; - const BarcodeScreenPage({Key key, this.buyerProduct}) : super(key: key); - @override - _BarcodeScreenPageState createState() => _BarcodeScreenPageState(); -} - -class _BarcodeScreenPageState extends State { - final _formKey = GlobalKey(); - bool _isLoading = false; - String scanResult; - - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - return LocalProgress( - inAsyncCall: _isLoading, - child: Scaffold( - appBar: AppBar( - backgroundColor: primaryColor, - title: Text("Bar Code Scranner"), - ), - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - InkWell( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "Scan : ", - style: TextStyle( - color: primaryColor, - fontWeight: FontWeight.bold, - fontSize: 20), - ), - Icon( - Ionicons.ios_qr_scanner, - size: 50, - ), - ], - ), - onTap: () async { - await scan(); - }, - ) - ], - )), - ); - } - - Future scan() async { - var result = await BarcodeScanner.scan(); - print("ScanResult => $result"); - setState(() => scanResult = result); - } -} diff --git a/lib/fcs/common/pages/package/model/package_model.dart b/lib/fcs/common/pages/package/model/package_model.dart index 26b5f69..e33c57d 100644 --- a/lib/fcs/common/pages/package/model/package_model.dart +++ b/lib/fcs/common/pages/package/model/package_model.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/fcs/common/domain/constants.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart'; -import 'package:fcs/fcs/common/domain/vo/shipment_status.dart'; import 'package:fcs/fcs/common/pages/model/base_model.dart'; import 'package:fcs/fcs/common/services/services.dart'; import 'package:logging/logging.dart'; @@ -12,174 +12,11 @@ class PackageModel extends BaseModel { final log = Logger('PackageModel'); StreamSubscription listener; - static List statusHistory = [ - ShipmentStatus(status: "Received", date: DateTime(2020, 6, 1), done: true), - ShipmentStatus(status: "Processed", date: DateTime(2020, 6, 1), done: true), - ShipmentStatus(status: "Shipped", date: DateTime(2020, 6, 5), done: false), - ShipmentStatus(status: "Arrived", date: DateTime(2020, 6, 7), done: false), - ShipmentStatus( - status: "Delivered", date: DateTime(2020, 6, 15), done: false) - ]; - - static List packages = [ - Package( - shipmentNumber: "A202", - receiverNumber: "3", - receiverName: "Ko Myo Min", - boxNumber: "1", - rate: 7, - packageType: "General", - weight: 25, - status: "Received", - receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', - cargoDesc: "Computers", - arrivedDate: DateTime(2020, 6, 1), - market: "Amazon", - id: "PKG2039", - trackingID: "23-234s-asdfl", - shipmentHistory: statusHistory), - Package( - shipmentNumber: "A202", - receiverNumber: "3", - receiverName: "Ko Myo Min", - boxNumber: "2", - rate: 7, - packageType: "General", - weight: 20, - status: "Received", - cargoDesc: "Clothes", - arrivedDate: DateTime(2020, 6, 1), - market: "Macy", - trackingID: "asd-sdf-23498", - id: "PKG2040", - receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', - shipmentHistory: statusHistory), - Package( - shipmentNumber: "A202", - receiverNumber: "3", - receiverName: "Ko Myo Min", - boxNumber: "3", - rate: 7, - packageType: "General", - weight: 15, - cargoDesc: "Shoes", - status: "Processed", - market: "Macy", - trackingID: "8923-234-sd", - id: "PKG2041", - arrivedDate: DateTime(2020, 6, 1), - receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', - shipmentHistory: statusHistory), - Package( - shipmentNumber: "A202", - receiverNumber: "2", - receiverName: "Ma Aye", - boxNumber: "1", - rate: 8, - packageType: "Medicine", - weight: 15, - status: "Processed", - market: "Macy", - trackingID: "lsdf-sd09sdf", - cargoDesc: "Dietary supplement", - id: "PKG2042", - arrivedDate: DateTime(2020, 6, 1), - receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon', - shipmentHistory: statusHistory), - Package( - shipmentNumber: "A202", - receiverNumber: "2", - receiverName: "Ma Aye", - boxNumber: "2", - rate: 7, - packageType: "General", - cargoDesc: "Handbags", - weight: 55, - market: "Macy", - trackingID: "234-sdflsdf-213", - status: "Shipped", - id: "PKG2043", - arrivedDate: DateTime(2020, 6, 1), - receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon', - shipmentHistory: statusHistory), - Package( - shipmentNumber: "A201", - receiverNumber: "1", - receiverName: "Ko Wai", - boxNumber: "1", - rate: 9, - packageType: "Dangerous", - cargoDesc: "Phones and Scooters", - weight: 25, - status: "Arrived", - market: "Amazon", - trackingID: "sdf-asdf-23489", - id: "PKG2044", - arrivedDate: DateTime(2020, 5, 21), - receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon', - shipmentHistory: statusHistory), - Package( - shipmentNumber: "A201", - receiverNumber: "1", - receiverName: "Ko Wai", - boxNumber: "2", - rate: 7, - packageType: "General", - cargoDesc: "Construction tools", - weight: 5, - status: "Processed", - market: "Amazon", - id: "PKG2045", - trackingID: "oiuw-sdfpo-234", - arrivedDate: DateTime(2020, 5, 21), - receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon', - shipmentHistory: statusHistory), - ]; - - List get getPackages { - return packages - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); - } - - List get completed { - return packages.where((e) => e.status == "Processed").toList() - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); - } - - List get shipped { - return packages.where((e) => e.status == "Shipped").toList() - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); - } - - List get arrived { - return packages.where((e) => e.status == "Arrived").toList() - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); - } - - List get delivered { - return packages.where((e) => e.status == "Delivered").toList() - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); - } - - List get upcoming { - return packages.where((e) => e.status == "Received").toList() - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); - } + List packages = []; void initUser(user) { super.initUser(user); + _loadPackages(); } @override @@ -188,9 +25,39 @@ class PackageModel extends BaseModel { packages = []; } + Future _loadPackages() async { + if (user == null) return; + String path = ""; + if (user.isCustomer()) { + path = "/$user_collection/${user.id}/$packages_collection"; + } else { + path = "/$packages_collection"; + } + try { + listener = Firestore.instance + .collection("$path") + .where("is_delivered", isEqualTo: false) + .snapshots() + .listen((QuerySnapshot snapshot) { + packages.clear(); + packages = snapshot.documents.map((documentSnapshot) { + var package = Package.fromMap( + documentSnapshot.data, documentSnapshot.documentID); + return package; + }).toList(); + notifyListeners(); + }); + } catch (e) { + log.warning("Error!! $e"); + } + } + Future> searchUser(String term) { return Services.instance.userService.searchUser(term); } - createPackages(User user, List packages) {} + Future createPackages(User user, List packages) { + return Services.instance.packageService + .createPackages(packages, user.fcsID); + } } diff --git a/lib/fcs/common/pages/package/package_creation.dart b/lib/fcs/common/pages/package/package_creation.dart index 8259ea0..06628c1 100644 --- a/lib/fcs/common/pages/package/package_creation.dart +++ b/lib/fcs/common/pages/package/package_creation.dart @@ -3,7 +3,7 @@ import 'package:fcs/fcs/common/domain/vo/shipping_address.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/package/barcode_screen_page.dart'; +import 'package:fcs/fcs/common/pages/package/tracking_id_page.dart'; import 'package:fcs/fcs/common/pages/package/shipping_address_editor.dart'; import 'package:fcs/fcs/common/pages/package/shipping_address_list.dart'; import 'package:fcs/fcs/common/pages/package/shipping_address_row.dart'; @@ -12,6 +12,7 @@ import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/fcs_expansion_tile.dart'; import 'package:fcs/fcs/common/pages/widgets/my_data_table.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:fcs/pages/barcode_screen_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:intl/intl.dart'; diff --git a/lib/fcs/common/pages/package/package_list.dart b/lib/fcs/common/pages/package/package_list.dart index 68ca0e1..3491dc0 100644 --- a/lib/fcs/common/pages/package/package_list.dart +++ b/lib/fcs/common/pages/package/package_list.dart @@ -84,10 +84,10 @@ class _PackageListState extends State { scrollDirection: Axis.vertical, padding: EdgeInsets.only(top: 15), shrinkWrap: true, - itemCount: packageModel.getPackages.length, + itemCount: packageModel.packages.length, itemBuilder: (BuildContext context, int index) { return PackageListRow( - package: packageModel.getPackages[index], + package: packageModel.packages[index], isReadOnly: false, ); })), @@ -100,124 +100,4 @@ class _PackageListState extends State { BottomUpPageRoute(PackageNew()), ); } - - Widget _upComing() { - var packageModel = Provider.of(context); - return Column( - children: [ - Expanded( - child: new ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, - ), - scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, - itemCount: packageModel.upcoming.length, - itemBuilder: (BuildContext context, int index) { - return PackageListRow( - package: packageModel.upcoming[index], - isReadOnly: false, - ); - }), - ), - ], - ); - } - - Widget _completed() { - var packageModel = Provider.of(context); - return Column( - children: [ - Expanded( - child: new ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, - ), - scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, - itemCount: packageModel.completed.length, - itemBuilder: (BuildContext context, int index) { - return PackageListRow( - package: packageModel.completed[index], - isReadOnly: false, - ); - }), - ), - ], - ); - } - - Widget _shipped() { - var packageModel = Provider.of(context); - return Column( - children: [ - Expanded( - child: new ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, - ), - scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, - itemCount: packageModel.shipped.length, - itemBuilder: (BuildContext context, int index) { - return PackageListRow( - package: packageModel.shipped[index], - isReadOnly: false, - ); - }), - ), - ], - ); - } - - Widget _arrived() { - var packageModel = Provider.of(context); - return Column( - children: [ - Expanded( - child: new ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, - ), - scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, - itemCount: packageModel.arrived.length, - itemBuilder: (BuildContext context, int index) { - return PackageListRow( - package: packageModel.arrived[index], - isReadOnly: false, - ); - }), - ), - ], - ); - } - - Widget _delivered() { - var packageModel = Provider.of(context); - return Column( - children: [ - Expanded( - child: new ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, - ), - scrollDirection: Axis.vertical, - padding: EdgeInsets.only(top: 15), - shrinkWrap: true, - itemCount: packageModel.delivered.length, - itemBuilder: (BuildContext context, int index) { - return PackageListRow( - package: packageModel.delivered[index], - isReadOnly: false, - ); - }), - ), - ], - ); - } } diff --git a/lib/fcs/common/pages/package/package_list_row.dart b/lib/fcs/common/pages/package/package_list_row.dart index 2f18064..d609683 100644 --- a/lib/fcs/common/pages/package/package_list_row.dart +++ b/lib/fcs/common/pages/package/package_list_row.dart @@ -92,12 +92,12 @@ class _PackageListRowtate extends State { children: [ Padding( padding: const EdgeInsets.all(3.0), - child: getStatus(_package.status), + child: getStatus(_package.currentStatus), ), Padding( padding: const EdgeInsets.all(0), child: new Text( - dateFormat.format(_package.arrivedDate), + dateFormat.format(_package.currentStatusDate), style: new TextStyle(fontSize: 15.0, color: Colors.grey), ), ), diff --git a/lib/fcs/common/pages/package/package_new.dart b/lib/fcs/common/pages/package/package_new.dart index c090645..585a401 100644 --- a/lib/fcs/common/pages/package/package_new.dart +++ b/lib/fcs/common/pages/package/package_new.dart @@ -1,18 +1,19 @@ -import 'package:barcode_scan/barcode_scan.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/package/tracking_id_page.dart'; import 'package:fcs/fcs/common/pages/package/user_serach.dart'; import 'package:fcs/fcs/common/pages/staff/model/staff_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/display_text.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:flutter/services.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; +import 'model/package_model.dart'; + typedef void FindCallBack(); class PackageNew extends StatefulWidget { @@ -22,8 +23,6 @@ class PackageNew extends StatefulWidget { } class _PackageNewState extends State { - TextEditingController _phoneInput = new TextEditingController(); - bool _isLoading = false; User user; @@ -114,7 +113,7 @@ class _PackageNewState extends State { Icons.add, color: primaryColor, ), - onPressed: _scan, + onPressed: _addPackage, ) ], )), @@ -133,71 +132,58 @@ class _PackageNewState extends State { )); } - void _scan() async { - PermissionStatus permission = - await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); - if (permission != PermissionStatus.granted) { - Map permissions = - await PermissionHandler() - .requestPermissions([PermissionGroup.camera]); - if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { - showMsgDialog(context, "Error", "Camera permission is not granted"); - return null; - } - } + Widget _packageItem(BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0, left: 15), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(packages[index].market), + Text(packages[index].trackingID), + // DisplayText( + // labelText: "Tracking ID", + // text: packages[index].trackingID, + // ), + ], + ), + ), + IconButton( + icon: Icon( + Icons.remove, + color: primaryColor, + ), + onPressed: () { + setState(() { + packages.removeAt(index); + }); + }, + ) + ], + ), + ); + } - String barcode; - try { - barcode = await BarcodeScanner.scan(); - } on PlatformException catch (e) { - if (e.code == BarcodeScanner.CameraAccessDenied) { - print('The user did not grant the camera permission!'); - } else { - print('Unknown error: $e'); - } - } on FormatException { - print( - 'null (User returned using the "back"-button before scanning anything. Result)'); - } catch (e) { - print('Unknown error: $e'); - } + _addPackage() async { + Package package = await Navigator.push( + context, + BottomUpPageRoute(TrackingIDPage()), + ); - if (barcode != null) { - if (packages.any((e) => e.trackingID == barcode)) { + if (package != null) { + if (packages.any((e) => e.trackingID == package.trackingID)) { showMsgDialog(context, "Error", "Already scanned!"); return; } setState(() { - packages.add(Package(trackingID: barcode)); + packages.add(package); }); } } - Widget _packageItem(BuildContext context, int index) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: DisplayText( - labelText: "Tracking ID", - text: packages[index].trackingID, - ), - ), - IconButton( - icon: Icon( - Icons.remove, - color: primaryColor, - ), - onPressed: () { - setState(() { - packages.removeAt(index); - }); - }, - ) - ], - ); - } - _create() async { if (user == null || packages == null || packages.length == 0) { showMsgDialog(context, "Error", "Invalid user!"); @@ -206,9 +192,10 @@ class _PackageNewState extends State { setState(() { _isLoading = true; }); - StaffModel staffModel = Provider.of(context, listen: false); + PackageModel packageModel = + Provider.of(context, listen: false); try { - // await staffModel.updatePrivileges(this.selectedUser.id, privilegesIDs()); + await packageModel.createPackages(user, packages); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); diff --git a/lib/fcs/common/pages/package/tracking_id_page.dart b/lib/fcs/common/pages/package/tracking_id_page.dart new file mode 100644 index 0000000..cc19ca2 --- /dev/null +++ b/lib/fcs/common/pages/package/tracking_id_page.dart @@ -0,0 +1,175 @@ +import 'package:barcode_scan/barcode_scan.dart'; +import 'package:fcs/fcs/common/domain/entities/market.dart'; +import 'package:fcs/fcs/common/domain/entities/package.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/market/market_editor.dart'; +import 'package:fcs/fcs/common/pages/market/model/market_model.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; +import 'package:fcs/fcs/common/pages/widgets/input_text.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:flutter_icons/flutter_icons.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; + +const MANAGE_MARKET = "Manage Market"; + +class TrackingIDPage extends StatefulWidget { + const TrackingIDPage({Key key}) : super(key: key); + @override + _TrackingIDPageState createState() => _TrackingIDPageState(); +} + +class _TrackingIDPageState extends State { + TextEditingController _transcationIDCtl = new TextEditingController(); + bool _isLoading = false; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(Icons.close, color: primaryColor, size: 30), + onPressed: () => Navigator.of(context).pop(), + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + ), + body: Center( + child: Padding( + padding: const EdgeInsets.all(18.0), + child: ListView( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: InputText( + labelTextKey: "package.tracking.id", + controller: _transcationIDCtl, + )), + IconButton( + icon: Icon(MaterialCommunityIcons.barcode_scan, + size: 30, color: primaryColor), + onPressed: _scan, + ), + ], + ), + SizedBox( + height: 30, + ), + dropDown(), + SizedBox( + height: 30, + ), + fcsButton(context, getLocalString(context, "btn.select"), + callack: _select) + ], + ), + ), + )), + ); + } + + String selectedMarket; + Widget dropDown() { + List _markets = Provider.of(context).markets; + List markets = _markets.map((e) => e.name).toList(); + markets.insert(0, MANAGE_MARKET); + + return Row( + children: [ + Padding( + padding: const EdgeInsets.only(right: 18.0), + child: LocalText( + context, + "package.create.market", + color: primaryColor, + fontSize: 20, + ), + ), + Container( + width: 150, + child: DropdownButton( + value: selectedMarket, + style: TextStyle(color: Colors.black, fontSize: 14), + underline: Container( + height: 1, + color: Colors.grey, + ), + onChanged: (String newValue) { + setState(() { + if (newValue == MANAGE_MARKET) { + selectedMarket = null; + _manageMarket(); + return; + } + selectedMarket = newValue; + }); + }, + isExpanded: true, + items: markets.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: value == MANAGE_MARKET + ? secondaryColor + : primaryColor)), + ); + }).toList(), + ), + ), + ], + ); + } + + _manageMarket() { + Navigator.push( + context, + BottomUpPageRoute(MarketEditor()), + ); + } + + _scan() async { + PermissionStatus permission = + await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); + if (permission != PermissionStatus.granted) { + Map permissions = + await PermissionHandler() + .requestPermissions([PermissionGroup.camera]); + if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { + showMsgDialog(context, "Error", "Camera permission is not granted"); + return null; + } + } + + try { + String barcode = await BarcodeScanner.scan(); + if (barcode != null) { + setState(() { + _transcationIDCtl.text = barcode; + }); + } + } catch (e) { + print('error: $e'); + } + } + + _select() { + if (_transcationIDCtl.text == "" && selectedMarket == null) return; + Navigator.pop(context, + Package(trackingID: _transcationIDCtl.text, market: selectedMarket)); + } +} diff --git a/lib/fcs/common/pages/package/user_serach.dart b/lib/fcs/common/pages/package/user_serach.dart index 2ba6780..51b0acc 100644 --- a/lib/fcs/common/pages/package/user_serach.dart +++ b/lib/fcs/common/pages/package/user_serach.dart @@ -20,7 +20,7 @@ class UserSearchDelegate extends SearchDelegate { UserSearchDelegate({this.callbackUserSelect}); @override - String get searchFieldLabel => 'Enter FCS ID or Name'; + String get searchFieldLabel => 'Search by FCS ID or Name'; @override ThemeData appBarTheme(BuildContext context) { diff --git a/lib/fcs/common/pages/profile/profile_page.dart b/lib/fcs/common/pages/profile/profile_page.dart index b056cb9..e8f0b38 100644 --- a/lib/fcs/common/pages/profile/profile_page.dart +++ b/lib/fcs/common/pages/profile/profile_page.dart @@ -54,7 +54,9 @@ class _ProfileState extends State { @override Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); - + if (mainModel.user == null) { + return Container(); + } final namebox = DisplayText( text: mainModel.user.name, labelText: getLocalString(context, "profile.name"), diff --git a/lib/fcs/common/pages/staff/model/staff_model.dart b/lib/fcs/common/pages/staff/model/staff_model.dart index bdc456b..78b0250 100644 --- a/lib/fcs/common/pages/staff/model/staff_model.dart +++ b/lib/fcs/common/pages/staff/model/staff_model.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/fcs/common/domain/constants.dart'; import 'package:fcs/fcs/common/domain/entities/role.dart'; @@ -9,6 +11,7 @@ import 'package:logging/logging.dart'; class StaffModel extends BaseModel { final log = Logger('StaffModel'); + StreamSubscription listener; List employees = []; List privileges = []; @@ -21,6 +24,7 @@ class StaffModel extends BaseModel { @override logout() async { + if (listener != null) listener.cancel(); employees = []; } @@ -28,7 +32,9 @@ class StaffModel extends BaseModel { if (user == null || !user.hasStaffs()) return; try { - Firestore.instance + if (listener != null) listener.cancel(); + + listener = Firestore.instance .collection("/$user_collection") .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false) @@ -41,8 +47,6 @@ class StaffModel extends BaseModel { return user; }).toList(); notifyListeners(); - }).onError((e) { - log.warning("Error! $e"); }); } catch (e) { log.warning("Error!! $e"); diff --git a/lib/fcs/common/pages/widgets/bottom_up_page_route.dart b/lib/fcs/common/pages/widgets/bottom_up_page_route.dart index cd27cd9..1f07ffc 100644 --- a/lib/fcs/common/pages/widgets/bottom_up_page_route.dart +++ b/lib/fcs/common/pages/widgets/bottom_up_page_route.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; -class BottomUpPageRoute extends PageRouteBuilder { +class BottomUpPageRoute extends PageRouteBuilder { final Widget child; BottomUpPageRoute(this.child) diff --git a/lib/fcs/common/pages/widgets/display_text.dart b/lib/fcs/common/pages/widgets/display_text.dart index a26e86c..c49714c 100644 --- a/lib/fcs/common/pages/widgets/display_text.dart +++ b/lib/fcs/common/pages/widgets/display_text.dart @@ -40,13 +40,15 @@ class DisplayText extends StatelessWidget { padding: const EdgeInsets.only(top: 8.0, bottom: 8), child: Row( children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Icon( - iconData, - color: primaryColor, - ), - ), + iconData == null + ? Container() + : Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + iconData, + color: primaryColor, + ), + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/fcs/common/pages/widgets/input_text.dart b/lib/fcs/common/pages/widgets/input_text.dart index f0fa8e0..e992c93 100644 --- a/lib/fcs/common/pages/widgets/input_text.dart +++ b/lib/fcs/common/pages/widgets/input_text.dart @@ -14,6 +14,7 @@ class InputText extends StatelessWidget { final bool withBorder; final Color borderColor; final TextInputType textInputType; + final bool autoFocus; const InputText( {Key key, @@ -24,6 +25,7 @@ class InputText extends StatelessWidget { this.maxLines = 1, this.withBorder = false, this.borderColor, + this.autoFocus = false, this.textInputType}) : super(key: key); @override @@ -34,7 +36,7 @@ class InputText extends StatelessWidget { padding: const EdgeInsets.only(top: 15.0, bottom: 5), child: TextFormField( controller: controller, - autofocus: false, + autofocus: autoFocus, cursorColor: primaryColor, style: textStyle, maxLines: maxLines, diff --git a/lib/fcs/common/pages/widgets/local_text.dart b/lib/fcs/common/pages/widgets/local_text.dart index a185ac7..36333d0 100644 --- a/lib/fcs/common/pages/widgets/local_text.dart +++ b/lib/fcs/common/pages/widgets/local_text.dart @@ -15,7 +15,7 @@ class LocalText extends Text { : super( AppTranslations.of(context).text(translationKey, translationVariables: translationVariables), - style: Provider.of(context).isEng + style: Provider.of(context, listen: false).isEng ? newLabelStyle( color: color, fontSize: fontSize, @@ -45,12 +45,15 @@ class LocalLargeTitle extends Text { class TextLocalStyle extends Text { final BuildContext context; - TextLocalStyle(this.context, String text, {Color color, double fontSize,FontWeight fontWeight}) + 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, fontSize: fontSize, fontWeight: fontWeight) : TextStyle( color: color, fontFamily: "MyanmarUnicode", - fontSize: fontSize,fontWeight: fontWeight)); + fontSize: fontSize, + fontWeight: fontWeight)); } diff --git a/lib/fcs/common/services/package_imp.dart b/lib/fcs/common/services/package_imp.dart new file mode 100644 index 0000000..f1b3eb7 --- /dev/null +++ b/lib/fcs/common/services/package_imp.dart @@ -0,0 +1,20 @@ +import 'package:fcs/fcs/common/data/providers/package_data_provider.dart'; +import 'package:fcs/fcs/common/domain/entities/connectivity.dart'; +import 'package:fcs/fcs/common/domain/entities/package.dart'; +import 'package:fcs/fcs/common/services/package_service.dart'; +import 'package:flutter/material.dart'; + +class PackageServiceImp implements PackageService { + PackageServiceImp({ + @required this.connectivity, + @required this.packageDataProvider, + }); + + final Connectivity connectivity; + final PackageDataProvider packageDataProvider; + + @override + Future createPackages(List packages, String fcsID) { + return packageDataProvider.createPackages(packages, fcsID); + } +} diff --git a/lib/fcs/common/services/package_service.dart b/lib/fcs/common/services/package_service.dart new file mode 100644 index 0000000..e032ff0 --- /dev/null +++ b/lib/fcs/common/services/package_service.dart @@ -0,0 +1,5 @@ +import 'package:fcs/fcs/common/domain/entities/package.dart'; + +abstract class PackageService { + Future createPackages(List packages, String fcsID); +} diff --git a/lib/fcs/common/services/services.dart b/lib/fcs/common/services/services.dart index 4d52788..ed6020e 100644 --- a/lib/fcs/common/services/services.dart +++ b/lib/fcs/common/services/services.dart @@ -1,8 +1,11 @@ import 'package:fcs/fcs/common/data/providers/auth_fb.dart'; +import 'package:fcs/fcs/common/data/providers/package_data_provider.dart'; import 'package:fcs/fcs/common/data/providers/user_data_provider.dart'; import 'package:fcs/fcs/common/services/auth_imp.dart'; import 'package:fcs/fcs/common/services/messaging_imp.dart'; import 'package:fcs/fcs/common/services/messaging_service.dart'; +import 'package:fcs/fcs/common/services/package_imp.dart'; +import 'package:fcs/fcs/common/services/package_service.dart'; import 'package:fcs/fcs/common/services/user_imp.dart'; import 'package:fcs/fcs/common/services/user_service.dart'; @@ -13,6 +16,7 @@ class Services { AuthService _authService; UserService _userService; + PackageService _packageService; MessagingService _messagingService; Services._() { _authService = AuthServiceImp( @@ -22,9 +26,12 @@ class Services { _userService = UserServiceImp( connectivity: null, userDataProvider: UserDataProvider()); _messagingService = MessagingServiceImp(); + _packageService = PackageServiceImp( + connectivity: null, packageDataProvider: PackageDataProvider()); } AuthService get authService => _authService; UserService get userService => _userService; MessagingService get messagingService => _messagingService; + PackageService get packageService => _packageService; }