From 1ae437507a52cfcbb7747ccb9e8789216726e89a Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Thu, 3 Sep 2020 14:56:00 +0300 Subject: [PATCH 1/4] Fix landscape issues --- lib/pages/delivery/information_page.dart | 354 +++++++++++++++++- .../data_display/dialog/custom_dialog.dart | 56 +-- 2 files changed, 386 insertions(+), 24 deletions(-) diff --git a/lib/pages/delivery/information_page.dart b/lib/pages/delivery/information_page.dart index 99eae5b..97af3ef 100644 --- a/lib/pages/delivery/information_page.dart +++ b/lib/pages/delivery/information_page.dart @@ -1 +1,353 @@ -import 'package:driverapp/app-icons/driver_app_icons.dart'; import 'package:driverapp/core/enum/viewstate.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; import 'package:driverapp/core/viewModels/orders_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; import 'package:driverapp/pages/delivery/delivery_confirmed_page.dart'; import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/bottom_sheet/action_sheet_button.dart'; import 'package:driverapp/widgets/bottom_sheet/custom_bottom_sheet.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:driverapp/widgets/data_display/dialog/custom_dialog.dart'; import 'package:driverapp/widgets/data_display/text.dart'; import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; import 'package:driverapp/widgets/delivery/delivery_action_button.dart'; import 'package:driverapp/widgets/delivery/package_content.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:maps_launcher/maps_launcher.dart'; import '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class InformationPage extends StatelessWidget { final PendingOrdersRes item; int orderStatus; InformationPage(this.item); @override Widget build(BuildContext context) { return BaseView( builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarColor: Theme.of(context).primaryColor, arrowColor: Colors.white, titleColor: Colors.white, appBarTitle: TranslationBase.of(context).deliveryInfo, body: Container( color: Theme.of(context).primaryColor, child: Container( color: Theme.of(context).primaryColor, child: ListView( children: [ Column( children: [ Stack( children: [ Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width, ), Container( width: MediaQuery.of(context).size.width * 1, height: MediaQuery.of(context).size.width * 1.5, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.23, ), decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(45), topRight: Radius.circular(45)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( height: MediaQuery.of(context).size.width * 0.53, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DeliveryInfoButton( btnColor: Color(0xffED1C24), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () { MapsLauncher.launchCoordinates( item.latitude, item.longitude); },), DeliveryInfoButton( btnColor: Color(0xFF61B260), btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), DeliveryInfoButton( btnColor: Color(0xFFFCB657), btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), DeliveryInfoButton( btnColor: Theme.of(context).primaryColor, btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () => launch("tel://" + item.mobileNumber), ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, right: MediaQuery.of(context).size.width * 0.05, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8), child: Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.w900, fontSize: 20), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, ), Padding( padding: const EdgeInsets.only(left: 10), child: Column( children: List.generate( item.itemsQuantitiesList.length, (index) { return packageContent( packageName: item .itemsQuantitiesList[index] .itemName .toString(), packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.all(10), child: SecondaryButton( label: TranslationBase.of(context).clientReached, onTap: () { model.showBottomSheet(); }, ), ), ], ), ), CustomerBriefCard( itemId: item.patientID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn, longitude: item.longitude, latitude: item.latitude, ),], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet(children: [ SizedBox( height: 10, ), Center( child: Texts( TranslationBase.of(context).selectAction, color: Colors.black, fontSize: 22, ), ), SizedBox( height: 10, ), FractionallySizedBox( widthFactor: 0.9, child: Column( children: [ SizedBox( height: 3, child: Container( color: Hexcolor("#D5D5D5"), ), ), SizedBox( height: 15, ), ActionSheetButton( label: TranslationBase .of(context) .delivered, icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredAccepted, icon: DriverApp.not_available, onTap: () { selectAction(context, 4, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredRejected, icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 5, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .canceled, icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 6, model); }, ), SizedBox( height: 15 ), ], )), ]), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; this.orderStatus = orderStatus; switch (orderStatus) { case 3: orderStatusText = TranslationBase .of(context) .delivered; break; case 4: orderStatusText = TranslationBase .of(context) .deliveredAccepted; break; case 5: orderStatusText = TranslationBase .of(context) .deliveredRejected; break; case 6: orderStatusText = TranslationBase .of(context) .canceled; break; } showDialog( context: context, builder: (BuildContext context) { return CustomDialog( orderStatusText: orderStatusText, callService: () { updateOrderStatus(context, model); }, model: model,); }); } updateOrderStatus(BuildContext context, OrdersViewModel model) async { UpdateOrderStatusRequestModel updateOrderStatusRequestModel = UpdateOrderStatusRequestModel(deliveryOrderID: item.orderID, deliveryOrderStatus: orderStatus, rejectionReason: "NO Reason", cancleReason: ""); await model.updateOrderStatus(updateOrderStatusRequestModel); if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); Navigator.of(context).pop(); model.hideBottomSheet(); } else { Navigator.of(context).pop(); model.hideBottomSheet(); Navigator.push( context, MaterialPageRoute( builder: (context) => DeliveryConfirmedPage(item), ), ); } } } \ No newline at end of file +import 'package:driverapp/app-icons/driver_app_icons.dart'; +import 'package:driverapp/core/enum/viewstate.dart'; +import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; +import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; +import 'package:driverapp/core/viewModels/orders_view_model.dart'; +import 'package:driverapp/pages/base/base_view.dart'; +import 'package:driverapp/pages/delivery/delivery_confirmed_page.dart'; +import 'package:driverapp/uitl/utils.dart'; +import 'package:driverapp/widgets/bottom_sheet/action_sheet_button.dart'; +import 'package:driverapp/widgets/bottom_sheet/custom_bottom_sheet.dart'; +import 'package:driverapp/widgets/buttons/secondary_button.dart'; +import 'package:driverapp/widgets/data_display/dialog/custom_dialog.dart'; +import 'package:driverapp/widgets/data_display/text.dart'; +import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; +import 'package:driverapp/widgets/delivery/delivery_action_button.dart'; +import 'package:driverapp/widgets/delivery/package_content.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:maps_launcher/maps_launcher.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../uitl/translations_delegate_base.dart'; +import '../../widgets/others/app_scaffold_widget.dart'; + +class InformationPage extends StatelessWidget { + final PendingOrdersRes item; + int orderStatus; + + InformationPage(this.item); + + @override + Widget build(BuildContext context) { + return BaseView( + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarColor: Theme.of(context).primaryColor, + arrowColor: Colors.white, + titleColor: Colors.white, + appBarTitle: TranslationBase.of(context).deliveryInfo, + body: Container( + color: Theme.of(context).primaryColor, + child: Container( + color: Theme.of(context).primaryColor, + child: ListView( + children: [ + Column( + children: [ + Stack( + children: [ + Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.width, + ), + Container( + width: MediaQuery.of(context).size.width * 1, + height: MediaQuery.of(context).size.width * 1.5, + margin: EdgeInsets.only( + top: MediaQuery.of(context).size.width * 0.23, + ), + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(45), + topRight: Radius.circular(45)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: + MediaQuery.of(context).size.width * 0.53, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DeliveryInfoButton( + btnColor: Color(0xffED1C24), + btnIcon: Icon( + Icons.near_me, + size: 30, + color: Colors.white, + ), + btnName: + TranslationBase.of(context).location, + btnFunction: () { + MapsLauncher.launchCoordinates( + item.latitude, item.longitude); + },), + DeliveryInfoButton( + btnColor: Color(0xFF61B260), + btnIcon: Icon( + Icons.whatshot, + size: 30, + color: Colors.white, + ), + btnName: 'Whatsapp', + btnFunction: () {}, + ), + DeliveryInfoButton( + btnColor: Color(0xFFFCB657), + btnIcon: Icon( + Icons.mail_outline, + size: 30, + color: Colors.white, + ), + btnName: TranslationBase.of(context).sms, + btnFunction: () {}, + ), + DeliveryInfoButton( + btnColor: Theme.of(context).primaryColor, + btnIcon: Icon( + Icons.phone, + size: 30, + color: Colors.white, + ), + btnName: TranslationBase.of(context).call, + btnFunction: () => + launch("tel://" + item.mobileNumber), + ), + ], + ), + SizedBox( + height: MediaQuery.of(context).size.width * 0.1, + ), + Container( + margin: EdgeInsets.only( + left: + MediaQuery.of(context).size.width * 0.05, + right: + MediaQuery.of(context).size.width * 0.05, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8), + child: Text( + TranslationBase.of(context) + .packageContent, + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 20), + ), + ), + SizedBox( + height: + MediaQuery.of(context).size.width * + 0.05, + ), + Padding( + padding: const EdgeInsets.only(left: 10), + child: Column( + children: List.generate( + item.itemsQuantitiesList.length, + (index) { + return packageContent( + packageName: item + .itemsQuantitiesList[index] + .itemName + .toString(), + packageCount: item + .itemsQuantitiesList[index] + .quantity + .toString(), + ); + }), + ), + ), + SizedBox( + height: + MediaQuery.of(context).size.width * + 0.01, + ), + ], + ), + ), + SizedBox( + height: MediaQuery.of(context).size.width * 0.1, + ), + Container( + margin: EdgeInsets.all(10), + child: SecondaryButton( + label: + TranslationBase.of(context).clientReached, + onTap: () { + model.showBottomSheet(); + }, + ), + ), + ], + ), + ), + CustomerBriefCard( + itemId: item.patientID, + customerFirstName: item.firstName, + customerLastName: item.lastName, + mobileNo: item.mobileNumber, + totalPayment: item.amount, + deliveryTime: item.orderCreatedOn, + longitude: item.longitude, + latitude: item.latitude, + ),], + ), + ], + ), + ], + ), + ), + ), + bottomSheet: !model.isBottomSheetAppear + ? Container( + width: 0, + height: 0, + ) + : CustomBottomSheet(children: [ + SizedBox( + height: 10, + ), + Center( + child: Texts( + TranslationBase.of(context).selectAction, + color: Colors.black, + fontSize: 22, + ), + ), + SizedBox( + height: 10, + ), + FractionallySizedBox( + widthFactor: MediaQuery.of(context).orientation == + Orientation.portrait + ? 0.9 + : 0.98, + child: Container( + height: MediaQuery.of(context).size.height * 0.43, + width: double.infinity, + child: ListView( + children: [ + Column( + children: [ + SizedBox( + height: 3, + child: Container( + color: Hexcolor("#D5D5D5"), + ), + ), + SizedBox( + height: 15, + ), + ActionSheetButton( + label: TranslationBase.of(context).delivered, + icon: DriverApp.deliverd_icon, + onTap: () { + selectAction(context, 3, model); + }, + ), + SizedBox(height: 15), + ActionSheetButton( + label: TranslationBase.of(context) + .deliveredAccepted, + icon: DriverApp.not_available, + onTap: () { + selectAction(context, 4, model); + }, + ), + SizedBox(height: 15), + ActionSheetButton( + label: TranslationBase.of(context) + .deliveredRejected, + icon: DriverApp.rejected_icon, + onTap: () { + selectAction(context, 5, model); + }, + ), + SizedBox(height: 15), + ActionSheetButton( + label: TranslationBase.of(context).canceled, + icon: DriverApp.not_reachable_icon, + onTap: () { + selectAction(context, 6, model); + }, + ), + SizedBox(height: 15), + ], + ), + ], + ), + )), + ]), + ), + ); + } + + selectAction(BuildContext context, orderStatus, OrdersViewModel model) { + String orderStatusText; + this.orderStatus = orderStatus; + switch (orderStatus) { + case 3: + orderStatusText = TranslationBase + .of(context) + .delivered; + break; + case 4: + orderStatusText = TranslationBase + .of(context) + .deliveredAccepted; + break; + case 5: + orderStatusText = TranslationBase + .of(context) + .deliveredRejected; + break; + case 6: + orderStatusText = TranslationBase + .of(context) + .canceled; + break; + } + showDialog( + context: context, + builder: (BuildContext context) { + return CustomDialog( + orderStatusText: orderStatusText, callService: () { + updateOrderStatus(context, model); + }, model: model,); + }); + } + + + updateOrderStatus(BuildContext context, OrdersViewModel model) async { + UpdateOrderStatusRequestModel updateOrderStatusRequestModel = + UpdateOrderStatusRequestModel(deliveryOrderID: item.orderID, + deliveryOrderStatus: orderStatus, + rejectionReason: "NO Reason", + cancleReason: ""); + await model.updateOrderStatus(updateOrderStatusRequestModel); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + Navigator.of(context).pop(); + model.hideBottomSheet(); + } else { + Navigator.of(context).pop(); + model.hideBottomSheet(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DeliveryConfirmedPage(item), + ), + ); + } + } +} diff --git a/lib/widgets/data_display/dialog/custom_dialog.dart b/lib/widgets/data_display/dialog/custom_dialog.dart index 5b1cb9c..afd1a3b 100644 --- a/lib/widgets/data_display/dialog/custom_dialog.dart +++ b/lib/widgets/data_display/dialog/custom_dialog.dart @@ -1,3 +1,4 @@ +import 'package:driverapp/config/size_config.dart'; import 'package:driverapp/core/enum/viewstate.dart'; import 'package:driverapp/core/viewModels/orders_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; @@ -20,7 +21,9 @@ class CustomDialog extends StatelessWidget { return BaseView( builder: (_, model, w) => Center( child: Container( - height: MediaQuery.of(context).size.height * 0.50, + height: SizeConfig.isPortrait + ? MediaQuery.of(context).size.height * 0.43 + : MediaQuery.of(context).size.height * 0.90, width: MediaQuery.of(context).size.width * 0.95, child: Dialog( shape: RoundedRectangleBorder( @@ -50,7 +53,7 @@ class CustomDialog extends StatelessWidget { height: 40, ), FractionallySizedBox( - widthFactor: 0.8, + widthFactor: SizeConfig.isPortrait ? 0.9 : 0.8, child: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ @@ -64,28 +67,35 @@ class CustomDialog extends StatelessWidget { SizedBox( height: 10, ), - SecondaryButton( - label: TranslationBase - .of(context) - .confirm, - loading: model.state == ViewState.BusyLocal, - onTap: () { - model.setState(ViewState.BusyLocal); - callService(); - }, - ), - SizedBox( - height: 10, - ), - SecondaryButton( - label: TranslationBase - .of(context) - .canceled, - onTap: () { - model.hideBottomSheet(); - Navigator.of(context).pop(); - }, + FractionallySizedBox( + widthFactor: 0.9, + child: Column( + children: [ + SecondaryButton( + label: TranslationBase + .of(context) + .confirm, + loading: model.state == ViewState.BusyLocal, + onTap: () { + model.setState(ViewState.BusyLocal); + callService(); + }, + ), SizedBox( + height: 10, + ), + SecondaryButton( + label: TranslationBase + .of(context) + .canceled, + onTap: () { + model.hideBottomSheet(); + Navigator.of(context).pop(); + }, + ), + ], + ), ), + ], ), ) From aa1332676ada040cc04696c991590a1ca83caf87 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sun, 6 Sep 2020 12:03:04 +0300 Subject: [PATCH 2/4] First step form next orders service --- lib/config/config.dart | 3 +- .../orders/next_order_request_model.dart | 48 +++ lib/core/service/orders_service.dart | 18 ++ lib/core/viewModels/orders_view_model.dart | 33 +- .../delivery/delivery_confirmed_page.dart | 291 ++++++++++-------- 5 files changed, 249 insertions(+), 144 deletions(-) create mode 100644 lib/core/model/orders/next_order_request_model.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index b86765f..e53ecab 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -8,6 +8,7 @@ const GET_ALL_ORDERS = '/Patients.svc/REST/PatientER_Delivery_GetAllOrder'; const SCAN_QR = '/Patients.svc/REST/PatientER_Delivery_OrderInsert'; const UPDATE_ORDER_STATUS = '/Patients.svc/REST/PatientER_Delivery_UpdateOrderStatus'; +const NEXT_ORDER = "/Patients.svc/REST/PatientER_Delivery_NextOrder"; /// Body Constant const CHANNEL = 9; @@ -18,5 +19,3 @@ const MAX_SMALL_SCREEN = 660; class AppGlobal { static BuildContext context; } - - diff --git a/lib/core/model/orders/next_order_request_model.dart b/lib/core/model/orders/next_order_request_model.dart new file mode 100644 index 0000000..fdc5f90 --- /dev/null +++ b/lib/core/model/orders/next_order_request_model.dart @@ -0,0 +1,48 @@ +class NextOrderRequestModel { + int driverID; + String searchKey; + int pageSize; + int pageIndex; + String tokenID; + int userID; + String mobileNo; + String longitude; + String latitude; + + NextOrderRequestModel( + {this.driverID, + this.searchKey, + this.pageSize, + this.pageIndex, + this.tokenID, + this.userID, + this.mobileNo, + this.longitude, + this.latitude}); + + NextOrderRequestModel.fromJson(Map json) { + driverID = json['DriverID']; + searchKey = json['SearchKey']; + pageSize = json['PageSize']; + pageIndex = json['PageIndex']; + tokenID = json['TokenID']; + userID = json['UserID']; + mobileNo = json['MobileNo']; + longitude = json['Longitude']; + latitude = json['Latitude']; + } + + Map toJson() { + final Map data = new Map(); + data['DriverID'] = this.driverID; + data['SearchKey'] = this.searchKey; + data['PageSize'] = this.pageSize; + data['PageIndex'] = this.pageIndex; + data['TokenID'] = this.tokenID; + data['UserID'] = this.userID; + data['MobileNo'] = this.mobileNo; + data['Longitude'] = this.longitude; + data['Latitude'] = this.latitude; + return data; + } +} diff --git a/lib/core/service/orders_service.dart b/lib/core/service/orders_service.dart index 8b9ebee..0da0150 100644 --- a/lib/core/service/orders_service.dart +++ b/lib/core/service/orders_service.dart @@ -1,4 +1,5 @@ import 'package:driverapp/config/config.dart'; +import 'package:driverapp/core/model/orders/next_order_request_model.dart'; import 'package:driverapp/core/model/orders/pending_orders_req_model.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; @@ -73,4 +74,21 @@ class OrdersService extends BaseService { throw e; } } + + Future nextOrder(NextOrderRequestModel nextOrderRequestModel) async { + hasError = false; + try { + await baseAppClient.post(UPDATE_ORDER_STATUS, + onSuccess: (dynamic response, int statusCode) { +// isOrderStatusUpdated = response["PatientER_Delivery_IsOrderUpdated"]; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: nextOrderRequestModel.toJson()); + } catch (e) { + hasError = true; + super.error = error; + throw e; + } + } } diff --git a/lib/core/viewModels/orders_view_model.dart b/lib/core/viewModels/orders_view_model.dart index 9a367ad..93f31e2 100644 --- a/lib/core/viewModels/orders_view_model.dart +++ b/lib/core/viewModels/orders_view_model.dart @@ -1,4 +1,5 @@ import 'package:driverapp/core/enum/viewstate.dart'; +import 'package:driverapp/core/model/orders/next_order_request_model.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; import 'package:driverapp/core/model/scan_qr/scan_qr_request_model.dart'; @@ -8,16 +9,16 @@ import '../../locator.dart'; import 'base_view_model.dart'; class OrdersViewModel extends BaseViewModel { - OrdersService _OrdersService = locator(); + OrdersService _ordersService = locator(); - List get orders => _OrdersService.orders; + List get orders => _ordersService.orders; bool isBottomSheetAppear = false; Future getPendingOrders() async { setState(ViewState.Busy); - await _OrdersService.getPendingOrders(); - if (_OrdersService.hasError) { - error = _OrdersService.error; + await _ordersService.getPendingOrders(); + if (_ordersService.hasError) { + error = _ordersService.error; setState(ViewState.Error); } else setState(ViewState.Idle); @@ -25,9 +26,9 @@ class OrdersViewModel extends BaseViewModel { Future insertOrder(ScanQrRequestModel _scanQrRequestModel) async { setState(ViewState.ErrorLocal); - await _OrdersService.insertOrder(_scanQrRequestModel); - if (_OrdersService.hasError) { - error = _OrdersService.error; + await _ordersService.insertOrder(_scanQrRequestModel); + if (_ordersService.hasError) { + error = _ordersService.error; setState(ViewState.ErrorLocal); } else setState(ViewState.Idle); @@ -36,9 +37,19 @@ class OrdersViewModel extends BaseViewModel { Future updateOrderStatus( UpdateOrderStatusRequestModel updateOrderStatusRequestModel) async { setState(ViewState.BusyLocal); - await _OrdersService.updateOrderStatus(updateOrderStatusRequestModel); - if (_OrdersService.hasError) { - error = _OrdersService.error; + await _ordersService.updateOrderStatus(updateOrderStatusRequestModel); + if (_ordersService.hasError) { + error = _ordersService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future nextOrder(NextOrderRequestModel nextOrderRequestModel) async { + setState(ViewState.BusyLocal); + await _ordersService.nextOrder(nextOrderRequestModel); + if (_ordersService.hasError) { + error = _ordersService.error; setState(ViewState.ErrorLocal); } else setState(ViewState.Idle); diff --git a/lib/pages/delivery/delivery_confirmed_page.dart b/lib/pages/delivery/delivery_confirmed_page.dart index e56656c..61735cf 100644 --- a/lib/pages/delivery/delivery_confirmed_page.dart +++ b/lib/pages/delivery/delivery_confirmed_page.dart @@ -1,3 +1,10 @@ +import 'package:driverapp/core/enum/viewstate.dart'; +import 'package:driverapp/core/model/orders/next_order_request_model.dart'; +import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; +import 'package:driverapp/core/viewModels/orders_view_model.dart'; +import 'package:driverapp/pages/base/base_view.dart'; +import 'package:driverapp/pages/delivery/information_page.dart'; +import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; import 'package:flutter/cupertino.dart'; @@ -7,157 +14,179 @@ import '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class DeliveryConfirmedPage extends StatelessWidget { - final dynamic item; + final PendingOrdersRes item; DeliveryConfirmedPage(this.item); @override Widget build(BuildContext context) { - return AppScaffold( - body: SafeArea( - child: Container( - color: Theme.of(context).primaryColor, - child: ListView( - children: [ - Column( - children: [ - Column( - children: [ - Container( - child: Container( - alignment: Alignment.topLeft, - child: IconButton( - color: Colors.white, - iconSize: 40, - icon: Icon(Icons.arrow_back), - onPressed: () { - Navigator.pop(context); - }, + return BaseView( + builder: (_, model, w) => AppScaffold( + body: SafeArea( + child: Container( + color: Theme.of(context).primaryColor, + child: ListView( + children: [ + Column( + children: [ + Column( + children: [ + Container( + child: Container( + alignment: Alignment.topLeft, + child: IconButton( + color: Colors.white, + iconSize: 40, + icon: Icon(Icons.arrow_back), + onPressed: () { + Navigator.pop(context); + }, + ), ), ), - ), - Container( - child: Column( - children: [ - Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.width * 0.7, - padding: EdgeInsets.only( - top: MediaQuery.of(context).size.width * - 0.2, - ), - decoration: BoxDecoration( - color: Colors.white10, - shape: BoxShape.circle), - child: Column( - children: [ - Icon( - Icons.check_circle, - color: Colors.white, - size: 60, - ), - Text( - TranslationBase.of(context).deliveryInfo, - style: TextStyle( - color: Colors.white, - fontSize: 20, - fontWeight: FontWeight.bold), - ), - Text( - TranslationBase.of(context) - .confirmationSent, - style: TextStyle( + Container( + child: Column( + children: [ + Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.width * 0.7, + padding: EdgeInsets.only( + top: MediaQuery.of(context).size.width * 0.2, + ), + decoration: BoxDecoration( + color: Colors.white10, + shape: BoxShape.circle), + child: Column( + children: [ + Icon( + Icons.check_circle, color: Colors.white, - fontSize: 13, + size: 60, + ), + Text( + TranslationBase.of(context).deliveryInfo, + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold), ), - ), - ], + Text( + TranslationBase.of(context) + .confirmationSent, + style: TextStyle( + color: Colors.white, + fontSize: 13, + ), + ), + ], + ), ), - ), - ], + ], + ), ), - ), - ], - ), - Stack( - children: [ - Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.width, - ), - Container( - width: MediaQuery.of(context).size.width, - //800, - height: MediaQuery.of(context).size.width * 1.2, - //440, - margin: EdgeInsets.only(top: 60), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(80), - topRight: Radius.circular(80)), + ], + ), + Stack( + children: [ + Container( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.width, ), - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - margin: EdgeInsets.only( - bottom: MediaQuery.of(context).size.width * - 0.15, //50 - ), - child: Column( - children: [ - FlatButton.icon( - padding: EdgeInsets.all(8), - color: Colors.orangeAccent, - shape: RoundedRectangleBorder( - borderRadius: - new BorderRadius.circular(10.0), - ), - label: Text( - TranslationBase.of(context).addNoteBtn, - style: TextStyle(color: Colors.white), + Container( + width: MediaQuery.of(context).size.width, + //800, + height: MediaQuery.of(context).size.width * 1.2, + //440, + margin: EdgeInsets.only(top: 60), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(80), + topRight: Radius.circular(80)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.only( + bottom: MediaQuery.of(context).size.width * + 0.15, //50 + ), + child: Column( + children: [ + FlatButton.icon( + padding: EdgeInsets.all(8), + color: Colors.orangeAccent, + shape: RoundedRectangleBorder( + borderRadius: + new BorderRadius.circular(10.0), + ), + label: Text( + TranslationBase.of(context).addNoteBtn, + style: TextStyle(color: Colors.white), + ), + icon: Icon( + Icons.mode_edit, + color: Colors.white, + ), + onPressed: () {}, ), - icon: Icon( - Icons.mode_edit, - color: Colors.white, + SizedBox( + height: + MediaQuery.of(context).size.width * + 0.1, //20, ), - onPressed: () {}, - ), - SizedBox( - height: MediaQuery.of(context).size.width * - 0.1, //20, - ), - Container( - margin: EdgeInsets.all(10), - child: SecondaryButton( - label: TranslationBase.of(context) - .nextDelivery, - onTap: () {}, + Container( + margin: EdgeInsets.all(10), + child: SecondaryButton( + label: TranslationBase.of(context) + .nextDelivery, + onTap: () {}, + ), ), - ), - ], + ], + ), ), - ), - ], + ], + ), ), - ), - CustomerBriefCard( - itemId: item.patientID, - customerFirstName: item.firstName, - customerLastName: item.lastName, - mobileNo: item.mobileNumber, - totalPayment: item.amount, - deliveryTime: item.orderCreatedOn), - ], - ), - ], - ), - ], + CustomerBriefCard( + itemId: item.patientID, + customerFirstName: item.firstName, + customerLastName: item.lastName, + mobileNo: item.mobileNumber, + totalPayment: item.amount, + deliveryTime: item.orderCreatedOn), + ], + ), + ], + ), + ], + ), ), ), ), ); } + + getNextOrder(BuildContext context, OrdersViewModel model) async { + NextOrderRequestModel nextOrderRequestModel = NextOrderRequestModel( + pageIndex: 0, pageSize: 0, latitude: "", longitude: "", searchKey: ""); + await model.nextOrder(nextOrderRequestModel); + if (model.state == ViewState.ErrorLocal) { + Utils.showErrorToast(model.error); + Navigator.of(context).pop(); + model.hideBottomSheet(); + } else { + Navigator.of(context).pop(); + model.hideBottomSheet(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => InformationPage(item), + ), + ); + } + } } From 384710e9b6a50e6f911f8a49585d4378ad64c92d Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sun, 6 Sep 2020 14:29:29 +0300 Subject: [PATCH 3/4] finish next orders service --- .../orders/pending_orders_res_model.dart | 2 +- lib/core/service/orders_service.dart | 9 ++++-- lib/core/viewModels/orders_view_model.dart | 2 ++ .../delivery/delivery_confirmed_page.dart | 30 +++++++++++-------- lib/pages/delivery/information_page.dart | 2 +- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/lib/core/model/orders/pending_orders_res_model.dart b/lib/core/model/orders/pending_orders_res_model.dart index 6809612..5b68b5d 100644 --- a/lib/core/model/orders/pending_orders_res_model.dart +++ b/lib/core/model/orders/pending_orders_res_model.dart @@ -24,7 +24,7 @@ class PendingOrdersRes { String dischargeID; String patientID; bool patientOutSA; - int distanceInKilometers; + dynamic distanceInKilometers; List itemsQuantitiesList; PendingOrdersRes( diff --git a/lib/core/service/orders_service.dart b/lib/core/service/orders_service.dart index 0da0150..d1f4f22 100644 --- a/lib/core/service/orders_service.dart +++ b/lib/core/service/orders_service.dart @@ -8,8 +8,11 @@ import 'package:driverapp/core/service/base_service.dart'; class OrdersService extends BaseService { List _orders = List(); + List _nextOrdersList = List(); List get orders => _orders; + + List get nextOrdersList => _nextOrdersList; bool isOrderInserted; bool isOrderStatusUpdated; @@ -78,9 +81,11 @@ class OrdersService extends BaseService { Future nextOrder(NextOrderRequestModel nextOrderRequestModel) async { hasError = false; try { - await baseAppClient.post(UPDATE_ORDER_STATUS, + await baseAppClient.post(NEXT_ORDER, onSuccess: (dynamic response, int statusCode) { -// isOrderStatusUpdated = response["PatientER_Delivery_IsOrderUpdated"]; + response["PatientER_Delivery_NextOrder"].forEach((order) { + _nextOrdersList.add(PendingOrdersRes.fromJson(order)); + }); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; diff --git a/lib/core/viewModels/orders_view_model.dart b/lib/core/viewModels/orders_view_model.dart index 93f31e2..83a5549 100644 --- a/lib/core/viewModels/orders_view_model.dart +++ b/lib/core/viewModels/orders_view_model.dart @@ -12,6 +12,8 @@ class OrdersViewModel extends BaseViewModel { OrdersService _ordersService = locator(); List get orders => _ordersService.orders; + + List get nextOrdersList => _ordersService.nextOrdersList; bool isBottomSheetAppear = false; Future getPendingOrders() async { diff --git a/lib/pages/delivery/delivery_confirmed_page.dart b/lib/pages/delivery/delivery_confirmed_page.dart index 61735cf..5f8f6e1 100644 --- a/lib/pages/delivery/delivery_confirmed_page.dart +++ b/lib/pages/delivery/delivery_confirmed_page.dart @@ -142,7 +142,9 @@ class DeliveryConfirmedPage extends StatelessWidget { child: SecondaryButton( label: TranslationBase.of(context) .nextDelivery, - onTap: () {}, + onTap: () { + getNextOrder(context, model); + }, ), ), ], @@ -172,21 +174,25 @@ class DeliveryConfirmedPage extends StatelessWidget { getNextOrder(BuildContext context, OrdersViewModel model) async { NextOrderRequestModel nextOrderRequestModel = NextOrderRequestModel( - pageIndex: 0, pageSize: 0, latitude: "", longitude: "", searchKey: ""); + pageIndex: 0, + pageSize: 0, + latitude: "46.621730", + longitude: "24.797682", + searchKey: ""); await model.nextOrder(nextOrderRequestModel); if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); - Navigator.of(context).pop(); - model.hideBottomSheet(); } else { - Navigator.of(context).pop(); - model.hideBottomSheet(); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => InformationPage(item), - ), - ); + if (model.nextOrdersList != null && model.nextOrdersList.length == 0) { + Utils.showErrorToast("No Items in the list"); + } else { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => InformationPage(model.nextOrdersList[0]), + ), + ); + } } } } diff --git a/lib/pages/delivery/information_page.dart b/lib/pages/delivery/information_page.dart index 99eae5b..70df05d 100644 --- a/lib/pages/delivery/information_page.dart +++ b/lib/pages/delivery/information_page.dart @@ -1 +1 @@ -import 'package:driverapp/app-icons/driver_app_icons.dart'; import 'package:driverapp/core/enum/viewstate.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; import 'package:driverapp/core/viewModels/orders_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; import 'package:driverapp/pages/delivery/delivery_confirmed_page.dart'; import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/bottom_sheet/action_sheet_button.dart'; import 'package:driverapp/widgets/bottom_sheet/custom_bottom_sheet.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:driverapp/widgets/data_display/dialog/custom_dialog.dart'; import 'package:driverapp/widgets/data_display/text.dart'; import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; import 'package:driverapp/widgets/delivery/delivery_action_button.dart'; import 'package:driverapp/widgets/delivery/package_content.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:maps_launcher/maps_launcher.dart'; import '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class InformationPage extends StatelessWidget { final PendingOrdersRes item; int orderStatus; InformationPage(this.item); @override Widget build(BuildContext context) { return BaseView( builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarColor: Theme.of(context).primaryColor, arrowColor: Colors.white, titleColor: Colors.white, appBarTitle: TranslationBase.of(context).deliveryInfo, body: Container( color: Theme.of(context).primaryColor, child: Container( color: Theme.of(context).primaryColor, child: ListView( children: [ Column( children: [ Stack( children: [ Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width, ), Container( width: MediaQuery.of(context).size.width * 1, height: MediaQuery.of(context).size.width * 1.5, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.23, ), decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(45), topRight: Radius.circular(45)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( height: MediaQuery.of(context).size.width * 0.53, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DeliveryInfoButton( btnColor: Color(0xffED1C24), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () { MapsLauncher.launchCoordinates( item.latitude, item.longitude); },), DeliveryInfoButton( btnColor: Color(0xFF61B260), btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), DeliveryInfoButton( btnColor: Color(0xFFFCB657), btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), DeliveryInfoButton( btnColor: Theme.of(context).primaryColor, btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () => launch("tel://" + item.mobileNumber), ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, right: MediaQuery.of(context).size.width * 0.05, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8), child: Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.w900, fontSize: 20), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, ), Padding( padding: const EdgeInsets.only(left: 10), child: Column( children: List.generate( item.itemsQuantitiesList.length, (index) { return packageContent( packageName: item .itemsQuantitiesList[index] .itemName .toString(), packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.all(10), child: SecondaryButton( label: TranslationBase.of(context).clientReached, onTap: () { model.showBottomSheet(); }, ), ), ], ), ), CustomerBriefCard( itemId: item.patientID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn, longitude: item.longitude, latitude: item.latitude, ),], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet(children: [ SizedBox( height: 10, ), Center( child: Texts( TranslationBase.of(context).selectAction, color: Colors.black, fontSize: 22, ), ), SizedBox( height: 10, ), FractionallySizedBox( widthFactor: 0.9, child: Column( children: [ SizedBox( height: 3, child: Container( color: Hexcolor("#D5D5D5"), ), ), SizedBox( height: 15, ), ActionSheetButton( label: TranslationBase .of(context) .delivered, icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredAccepted, icon: DriverApp.not_available, onTap: () { selectAction(context, 4, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredRejected, icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 5, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .canceled, icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 6, model); }, ), SizedBox( height: 15 ), ], )), ]), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; this.orderStatus = orderStatus; switch (orderStatus) { case 3: orderStatusText = TranslationBase .of(context) .delivered; break; case 4: orderStatusText = TranslationBase .of(context) .deliveredAccepted; break; case 5: orderStatusText = TranslationBase .of(context) .deliveredRejected; break; case 6: orderStatusText = TranslationBase .of(context) .canceled; break; } showDialog( context: context, builder: (BuildContext context) { return CustomDialog( orderStatusText: orderStatusText, callService: () { updateOrderStatus(context, model); }, model: model,); }); } updateOrderStatus(BuildContext context, OrdersViewModel model) async { UpdateOrderStatusRequestModel updateOrderStatusRequestModel = UpdateOrderStatusRequestModel(deliveryOrderID: item.orderID, deliveryOrderStatus: orderStatus, rejectionReason: "NO Reason", cancleReason: ""); await model.updateOrderStatus(updateOrderStatusRequestModel); if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); Navigator.of(context).pop(); model.hideBottomSheet(); } else { Navigator.of(context).pop(); model.hideBottomSheet(); Navigator.push( context, MaterialPageRoute( builder: (context) => DeliveryConfirmedPage(item), ), ); } } } \ No newline at end of file +import 'package:driverapp/app-icons/driver_app_icons.dart'; import 'package:driverapp/core/enum/viewstate.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; import 'package:driverapp/core/viewModels/orders_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; import 'package:driverapp/pages/delivery/delivery_confirmed_page.dart'; import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/bottom_sheet/action_sheet_button.dart'; import 'package:driverapp/widgets/bottom_sheet/custom_bottom_sheet.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:driverapp/widgets/data_display/dialog/custom_dialog.dart'; import 'package:driverapp/widgets/data_display/text.dart'; import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; import 'package:driverapp/widgets/delivery/delivery_action_button.dart'; import 'package:driverapp/widgets/delivery/package_content.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class InformationPage extends StatelessWidget { final PendingOrdersRes item; int orderStatus; InformationPage(this.item); @override Widget build(BuildContext context) { return BaseView( builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarColor: Theme.of(context).primaryColor, arrowColor: Colors.white, titleColor: Colors.white, appBarTitle: TranslationBase.of(context).deliveryInfo, body: Container( color: Theme.of(context).primaryColor, child: Container( color: Theme.of(context).primaryColor, child: ListView( children: [ Column( children: [ Stack( children: [ Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width, ), Container( width: MediaQuery.of(context).size.width * 1, height: MediaQuery.of(context).size.width * 1.5, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.23, ), decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(45), topRight: Radius.circular(45)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( height: MediaQuery.of(context).size.width * 0.53, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DeliveryInfoButton( btnColor: Color(0xffED1C24), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () { MapsLauncher.launchCoordinates( item.latitude, item.longitude); },), DeliveryInfoButton( btnColor: Color(0xFF61B260), btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), DeliveryInfoButton( btnColor: Color(0xFFFCB657), btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), DeliveryInfoButton( btnColor: Theme.of(context).primaryColor, btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () => launch("tel://" + item.mobileNumber), ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, right: MediaQuery.of(context).size.width * 0.05, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8), child: Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.w900, fontSize: 20), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, ), Padding( padding: const EdgeInsets.only(left: 10), child: Column( children: List.generate( item.itemsQuantitiesList != null ? item .itemsQuantitiesList.length : 0, (index) { return packageContent( packageName: item .itemsQuantitiesList[index] .itemName .toString(), packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.all(10), child: SecondaryButton( label: TranslationBase.of(context).clientReached, onTap: () { model.showBottomSheet(); }, ), ), ], ), ), CustomerBriefCard( itemId: item.patientID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn, longitude: item.longitude, latitude: item.latitude, ),], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet(children: [ SizedBox( height: 10, ), Center( child: Texts( TranslationBase.of(context).selectAction, color: Colors.black, fontSize: 22, ), ), SizedBox( height: 10, ), FractionallySizedBox( widthFactor: 0.9, child: Column( children: [ SizedBox( height: 3, child: Container( color: Hexcolor("#D5D5D5"), ), ), SizedBox( height: 15, ), ActionSheetButton( label: TranslationBase .of(context) .delivered, icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredAccepted, icon: DriverApp.not_available, onTap: () { selectAction(context, 4, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredRejected, icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 5, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .canceled, icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 6, model); }, ), SizedBox( height: 15 ), ], )), ]), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; this.orderStatus = orderStatus; switch (orderStatus) { case 3: orderStatusText = TranslationBase .of(context) .delivered; break; case 4: orderStatusText = TranslationBase .of(context) .deliveredAccepted; break; case 5: orderStatusText = TranslationBase .of(context) .deliveredRejected; break; case 6: orderStatusText = TranslationBase .of(context) .canceled; break; } showDialog( context: context, builder: (BuildContext context) { return CustomDialog( orderStatusText: orderStatusText, callService: () { updateOrderStatus(context, model); }, model: model,); }); } updateOrderStatus(BuildContext context, OrdersViewModel model) async { UpdateOrderStatusRequestModel updateOrderStatusRequestModel = UpdateOrderStatusRequestModel(deliveryOrderID: item.orderID, deliveryOrderStatus: orderStatus, rejectionReason: "NO Reason", cancleReason: ""); await model.updateOrderStatus(updateOrderStatusRequestModel); if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); Navigator.of(context).pop(); model.hideBottomSheet(); } else { Navigator.of(context).pop(); model.hideBottomSheet(); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => DeliveryConfirmedPage(item), ), ); } } } \ No newline at end of file From f02af06ac300c23b14d2de0c78a0b702b4824359 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sun, 6 Sep 2020 15:02:42 +0300 Subject: [PATCH 4/4] finish next orders service --- lib/pages/delivery/delivery_confirmed_page.dart | 2 +- lib/pages/delivery/information_page.dart | 2 +- lib/widgets/delivery/customer_brief_card.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pages/delivery/delivery_confirmed_page.dart b/lib/pages/delivery/delivery_confirmed_page.dart index 5f8f6e1..35de795 100644 --- a/lib/pages/delivery/delivery_confirmed_page.dart +++ b/lib/pages/delivery/delivery_confirmed_page.dart @@ -154,7 +154,7 @@ class DeliveryConfirmedPage extends StatelessWidget { ), ), CustomerBriefCard( - itemId: item.patientID, + itemId: item.orderID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, diff --git a/lib/pages/delivery/information_page.dart b/lib/pages/delivery/information_page.dart index 70df05d..00e76b5 100644 --- a/lib/pages/delivery/information_page.dart +++ b/lib/pages/delivery/information_page.dart @@ -1 +1 @@ -import 'package:driverapp/app-icons/driver_app_icons.dart'; import 'package:driverapp/core/enum/viewstate.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; import 'package:driverapp/core/viewModels/orders_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; import 'package:driverapp/pages/delivery/delivery_confirmed_page.dart'; import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/bottom_sheet/action_sheet_button.dart'; import 'package:driverapp/widgets/bottom_sheet/custom_bottom_sheet.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:driverapp/widgets/data_display/dialog/custom_dialog.dart'; import 'package:driverapp/widgets/data_display/text.dart'; import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; import 'package:driverapp/widgets/delivery/delivery_action_button.dart'; import 'package:driverapp/widgets/delivery/package_content.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class InformationPage extends StatelessWidget { final PendingOrdersRes item; int orderStatus; InformationPage(this.item); @override Widget build(BuildContext context) { return BaseView( builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarColor: Theme.of(context).primaryColor, arrowColor: Colors.white, titleColor: Colors.white, appBarTitle: TranslationBase.of(context).deliveryInfo, body: Container( color: Theme.of(context).primaryColor, child: Container( color: Theme.of(context).primaryColor, child: ListView( children: [ Column( children: [ Stack( children: [ Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width, ), Container( width: MediaQuery.of(context).size.width * 1, height: MediaQuery.of(context).size.width * 1.5, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.23, ), decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(45), topRight: Radius.circular(45)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( height: MediaQuery.of(context).size.width * 0.53, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DeliveryInfoButton( btnColor: Color(0xffED1C24), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () { MapsLauncher.launchCoordinates( item.latitude, item.longitude); },), DeliveryInfoButton( btnColor: Color(0xFF61B260), btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), DeliveryInfoButton( btnColor: Color(0xFFFCB657), btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), DeliveryInfoButton( btnColor: Theme.of(context).primaryColor, btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () => launch("tel://" + item.mobileNumber), ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, right: MediaQuery.of(context).size.width * 0.05, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8), child: Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.w900, fontSize: 20), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, ), Padding( padding: const EdgeInsets.only(left: 10), child: Column( children: List.generate( item.itemsQuantitiesList != null ? item .itemsQuantitiesList.length : 0, (index) { return packageContent( packageName: item .itemsQuantitiesList[index] .itemName .toString(), packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.all(10), child: SecondaryButton( label: TranslationBase.of(context).clientReached, onTap: () { model.showBottomSheet(); }, ), ), ], ), ), CustomerBriefCard( itemId: item.patientID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn, longitude: item.longitude, latitude: item.latitude, ),], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet(children: [ SizedBox( height: 10, ), Center( child: Texts( TranslationBase.of(context).selectAction, color: Colors.black, fontSize: 22, ), ), SizedBox( height: 10, ), FractionallySizedBox( widthFactor: 0.9, child: Column( children: [ SizedBox( height: 3, child: Container( color: Hexcolor("#D5D5D5"), ), ), SizedBox( height: 15, ), ActionSheetButton( label: TranslationBase .of(context) .delivered, icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredAccepted, icon: DriverApp.not_available, onTap: () { selectAction(context, 4, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredRejected, icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 5, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .canceled, icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 6, model); }, ), SizedBox( height: 15 ), ], )), ]), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; this.orderStatus = orderStatus; switch (orderStatus) { case 3: orderStatusText = TranslationBase .of(context) .delivered; break; case 4: orderStatusText = TranslationBase .of(context) .deliveredAccepted; break; case 5: orderStatusText = TranslationBase .of(context) .deliveredRejected; break; case 6: orderStatusText = TranslationBase .of(context) .canceled; break; } showDialog( context: context, builder: (BuildContext context) { return CustomDialog( orderStatusText: orderStatusText, callService: () { updateOrderStatus(context, model); }, model: model,); }); } updateOrderStatus(BuildContext context, OrdersViewModel model) async { UpdateOrderStatusRequestModel updateOrderStatusRequestModel = UpdateOrderStatusRequestModel(deliveryOrderID: item.orderID, deliveryOrderStatus: orderStatus, rejectionReason: "NO Reason", cancleReason: ""); await model.updateOrderStatus(updateOrderStatusRequestModel); if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); Navigator.of(context).pop(); model.hideBottomSheet(); } else { Navigator.of(context).pop(); model.hideBottomSheet(); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => DeliveryConfirmedPage(item), ), ); } } } \ No newline at end of file +import 'package:driverapp/app-icons/driver_app_icons.dart'; import 'package:driverapp/core/enum/viewstate.dart'; import 'package:driverapp/core/model/orders/pending_orders_res_model.dart'; import 'package:driverapp/core/model/orders/update_order_status_request_model.dart'; import 'package:driverapp/core/viewModels/orders_view_model.dart'; import 'package:driverapp/pages/base/base_view.dart'; import 'package:driverapp/pages/delivery/delivery_confirmed_page.dart'; import 'package:driverapp/uitl/utils.dart'; import 'package:driverapp/widgets/bottom_sheet/action_sheet_button.dart'; import 'package:driverapp/widgets/bottom_sheet/custom_bottom_sheet.dart'; import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:driverapp/widgets/data_display/dialog/custom_dialog.dart'; import 'package:driverapp/widgets/data_display/text.dart'; import 'package:driverapp/widgets/delivery/customer_brief_card.dart'; import 'package:driverapp/widgets/delivery/delivery_action_button.dart'; import 'package:driverapp/widgets/delivery/package_content.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class InformationPage extends StatelessWidget { final PendingOrdersRes item; int orderStatus; InformationPage(this.item); @override Widget build(BuildContext context) { return BaseView( builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarColor: Theme.of(context).primaryColor, arrowColor: Colors.white, titleColor: Colors.white, appBarTitle: TranslationBase.of(context).deliveryInfo, body: Container( color: Theme.of(context).primaryColor, child: Container( color: Theme.of(context).primaryColor, child: ListView( children: [ Column( children: [ Stack( children: [ Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width, ), Container( width: MediaQuery.of(context).size.width * 1, height: MediaQuery.of(context).size.width * 1.5, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.23, ), decoration: BoxDecoration( color: Theme.of(context).scaffoldBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(45), topRight: Radius.circular(45)), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( height: MediaQuery.of(context).size.width * 0.53, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DeliveryInfoButton( btnColor: Color(0xffED1C24), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () { MapsLauncher.launchCoordinates( item.latitude, item.longitude); },), DeliveryInfoButton( btnColor: Color(0xFF61B260), btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), DeliveryInfoButton( btnColor: Color(0xFFFCB657), btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), DeliveryInfoButton( btnColor: Theme.of(context).primaryColor, btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () => launch("tel://" + item.mobileNumber), ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, right: MediaQuery.of(context).size.width * 0.05, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(left: 8), child: Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.w900, fontSize: 20), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, ), Padding( padding: const EdgeInsets.only(left: 10), child: Column( children: List.generate( item.itemsQuantitiesList != null ? item .itemsQuantitiesList.length : 0, (index) { return packageContent( packageName: item .itemsQuantitiesList[index] .itemName .toString(), packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, ), Container( margin: EdgeInsets.all(10), child: SecondaryButton( label: TranslationBase.of(context).clientReached, onTap: () { model.showBottomSheet(); }, ), ), ], ), ), CustomerBriefCard( itemId: item.orderID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn, longitude: item.longitude, latitude: item.latitude, ),], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet(children: [ SizedBox( height: 10, ), Center( child: Texts( TranslationBase.of(context).selectAction, color: Colors.black, fontSize: 22, ), ), SizedBox( height: 10, ), FractionallySizedBox( widthFactor: 0.9, child: Column( children: [ SizedBox( height: 3, child: Container( color: Hexcolor("#D5D5D5"), ), ), SizedBox( height: 15, ), ActionSheetButton( label: TranslationBase .of(context) .delivered, icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredAccepted, icon: DriverApp.not_available, onTap: () { selectAction(context, 4, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .deliveredRejected, icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 5, model); }, ), SizedBox( height: 15 ), ActionSheetButton( label: TranslationBase .of(context) .canceled, icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 6, model); }, ), SizedBox( height: 15 ), ], )), ]), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; this.orderStatus = orderStatus; switch (orderStatus) { case 3: orderStatusText = TranslationBase .of(context) .delivered; break; case 4: orderStatusText = TranslationBase .of(context) .deliveredAccepted; break; case 5: orderStatusText = TranslationBase .of(context) .deliveredRejected; break; case 6: orderStatusText = TranslationBase .of(context) .canceled; break; } showDialog( context: context, builder: (BuildContext context) { return CustomDialog( orderStatusText: orderStatusText, callService: () { updateOrderStatus(context, model); }, model: model,); }); } updateOrderStatus(BuildContext context, OrdersViewModel model) async { UpdateOrderStatusRequestModel updateOrderStatusRequestModel = UpdateOrderStatusRequestModel(deliveryOrderID: item.orderID, deliveryOrderStatus: orderStatus, rejectionReason: "NO Reason", cancleReason: ""); await model.updateOrderStatus(updateOrderStatusRequestModel); if (model.state == ViewState.ErrorLocal) { Utils.showErrorToast(model.error); Navigator.of(context).pop(); model.hideBottomSheet(); } else { Navigator.of(context).pop(); model.hideBottomSheet(); Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => DeliveryConfirmedPage(item), ), ); } } } \ No newline at end of file diff --git a/lib/widgets/delivery/customer_brief_card.dart b/lib/widgets/delivery/customer_brief_card.dart index 05bb430..7af12c1 100644 --- a/lib/widgets/delivery/customer_brief_card.dart +++ b/lib/widgets/delivery/customer_brief_card.dart @@ -4,7 +4,7 @@ import '../../uitl/date_uitl.dart'; import '../../uitl/translations_delegate_base.dart'; class CustomerBriefCard extends StatelessWidget { - final String itemId; + final int itemId; final String time; final String customerFirstName; final String customerLastName;