From c9461bfef886ff113d6d08f6ebd957ac98179f84 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Tue, 1 Sep 2020 15:24:07 +0300 Subject: [PATCH] finish update order status function --- lib/config/config.dart | 4 +- lib/core/service/orders_service.dart | 24 ++++- lib/core/viewModels/orders_view_model.dart | 29 ++++-- lib/pages/delivery/information_page.dart | 2 +- .../data_display/dialog/custom_dialog.dart | 94 ++++++++++++++++--- 5 files changed, 124 insertions(+), 29 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 679ef20..b86765f 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,15 +6,15 @@ const GET_PROJECT = '/Lists.svc/REST/GetProject'; const LOGIN = "/Authentication.svc/REST/CheckDriverAuthentication"; 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'; /// Body Constant const CHANNEL = 9; - /// design constant const MAX_SMALL_SCREEN = 660; - class AppGlobal { static BuildContext context; } diff --git a/lib/core/service/orders_service.dart b/lib/core/service/orders_service.dart index ccd69ad..5af7599 100644 --- a/lib/core/service/orders_service.dart +++ b/lib/core/service/orders_service.dart @@ -1,6 +1,7 @@ import 'package:driverapp/config/config.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'; import 'package:driverapp/core/model/scan_qr/scan_qr_request_model.dart'; import 'package:driverapp/core/service/base_service.dart'; @@ -9,15 +10,12 @@ class OrdersService extends BaseService { List get orders => _orders; bool isOrderInserted; + bool isOrderStatusUpdated; PendingOrders _requestGetPendingOrders = PendingOrders( - driverID: 1111, searchKey: "", pageSize: 0, pageIndex: 0, - tokenID: "@dm!n", - userID: "1111", - mobileNo: "0541710575", ); Future getPendingOrders() async { @@ -59,4 +57,22 @@ class OrdersService extends BaseService { throw e; } } + + Future updateOrderStatus( + UpdateOrderStatusRequestModel updateOrderStatusRequestModel) 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: updateOrderStatusRequestModel.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 e077f5f..b526f16 100644 --- a/lib/core/viewModels/orders_view_model.dart +++ b/lib/core/viewModels/orders_view_model.dart @@ -1,21 +1,22 @@ 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/service/orders_service.dart'; import '../../locator.dart'; import 'base_view_model.dart'; class OrdersViewModel extends BaseViewModel { - OrdersService _pendingOrdersService = locator(); + OrdersService _OrdersService = locator(); - List get orders => _pendingOrdersService.orders; + List get orders => _OrdersService.orders; bool isBottomSheetAppear = false; Future getPendingOrders() async { setState(ViewState.Busy); - await _pendingOrdersService.getPendingOrders(); - if (_pendingOrdersService.hasError) { - error = _pendingOrdersService.error; + await _OrdersService.getPendingOrders(); + if (_OrdersService.hasError) { + error = _OrdersService.error; setState(ViewState.Error); } else setState(ViewState.Idle); @@ -23,9 +24,21 @@ class OrdersViewModel extends BaseViewModel { Future insertOrder() async { setState(ViewState.ErrorLocal); - await _pendingOrdersService.insertOrder(); - if (_pendingOrdersService.hasError) { - error = _pendingOrdersService.error; + await _OrdersService.insertOrder(); + if (_OrdersService.hasError) { + error = _OrdersService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + + Future updateOrderStatus( + UpdateOrderStatusRequestModel updateOrderStatusRequestModel) async { + setState(ViewState.BusyLocal); + await _OrdersService.updateOrderStatus(updateOrderStatusRequestModel); + if (_OrdersService.hasError) { + error = _OrdersService.error; setState(ViewState.ErrorLocal); } else setState(ViewState.Idle); diff --git a/lib/pages/delivery/information_page.dart b/lib/pages/delivery/information_page.dart index e84967d..73d8e91 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/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/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 '../../uitl/translations_delegate_base.dart'; import '../../widgets/others/app_scaffold_widget.dart'; class InformationPage extends StatelessWidget { final dynamic item; int orderStatus; InformationPage(this.item); @override Widget build(BuildContext context) { return BaseView( builder: (BuildContext context, OrdersViewModel model, Widget child) => AppScaffold( body: Container( color: Color(0xff41bdbb), child: Container( color: Color(0xff41bdbb), child: ListView( children: [ Column( children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( margin: EdgeInsets.only( right: MediaQuery.of(context).size.width * 0.15, //50 ), child: IconButton( color: Colors.white, iconSize: 50, icon: Icon(Icons.arrow_back), onPressed: () { Navigator.pop(context); }, ), ), Container( child: Text( TranslationBase.of(context).deliveryInfo, style: TextStyle( color: Colors.white, fontSize: 20, ), ), ), ], ), Stack( children: [ Container( width: MediaQuery.of(context).size.width, //400, height: MediaQuery.of(context).size.width, //500, ), Container( width: MediaQuery.of(context).size.width * 1, //800, height: MediaQuery.of(context).size.width * 1.5, //700, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.3, //100 ), decoration: BoxDecoration( color: Colors.white, 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.2, //170, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ delivery_info_button( btnColor: Color(0xfff44336), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () {}, ), delivery_info_button( btnColor: Colors.green, btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), delivery_info_button( btnColor: Colors.orangeAccent, btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), delivery_info_button( btnColor: Color(0xff41bdbb), btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () {}, ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, //30, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, //15, right: MediaQuery.of(context).size.width * 0.02, //15 ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 20), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, //20, ), Column( children: List.generate( item.itemsQuantitiesList.length, (index) { return package_content( packageName: item .itemsQuantitiesList[index] .itemName .toString(), //'Panadol Extra 50 tablet', packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, //10, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, //30, ), FlatButton( color: Color(0xff41bdbb), padding: EdgeInsets.only( right: MediaQuery.of(context).size.width * 0.3, //100, left: MediaQuery.of(context).size.width * 0.3, //100, bottom: MediaQuery.of(context).size.width * 0.035, //15, top: MediaQuery.of(context).size.width * 0.035, //15 ), shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(30.0), side: BorderSide(color: Color(0xff41bdbb)), ), child: Text( TranslationBase.of(context).clientReached, style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16), ), onPressed: () { model.showBottomSheet(); }, ), ], ), ), CustomerBrief( itemId: item.patientID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn), ], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet( children: [ SizedBox( height: 10, ), Center( child: Texts( 'Select Action', 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: 6, ), ActionSheetButton( label: "Delivered", icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 1, model); }, ), SizedBox( height: 6, ), ActionSheetButton( label: "Not Available", icon: DriverApp.not_available, onTap: () { selectAction(context, 2, model); }, ), SizedBox( height: 6, ), ActionSheetButton( label: "Rejected", icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 6, ), ActionSheetButton( label: "Not Reachable", icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 4, model); }, ), ], ), ), ], ), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; switch (orderStatus) { case 1: orderStatusText = "Delivered"; break; case 2: orderStatusText = "Not Available"; break; case 3: orderStatusText = "Rejected"; break; case 4: orderStatusText = "Not Reachable"; break; } showDialog( context: context, builder: (BuildContext context) { return CustomDialog( child: Container( child: Column( children: [ SizedBox( height: 30, ), Text( 'you have selected:', style: TextStyle( fontWeight: FontWeight.w500, color: Colors.black, fontSize: 15.0), ), Text( orderStatusText, style: TextStyle( color: Theme.of(context).primaryColor, fontSize: 18.0), ), SizedBox( height: 40, ), FractionallySizedBox( widthFactor: 0.8, child: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ Texts( 'Are you sure?', color: Colors.black, fontSize: 20, ), SizedBox( height: 10, ), SecondaryButton( label: "Confirm", onTap: () { Navigator.of(context).pop(); model.hideBottomSheet(); Navigator.push( context, MaterialPageRoute( builder: (context) => DeliveryConfirmedPage(item), ), ); }, ), SizedBox( height: 10, ), SecondaryButton( label: "Cancel", onTap: () { model.hideBottomSheet(); Navigator.of(context).pop(); }, ), ], ), ) ], ), )); }); } } \ 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/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 '../../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: (BuildContext context, OrdersViewModel model, Widget child) => AppScaffold( body: Container( color: Color(0xff41bdbb), child: Container( color: Color(0xff41bdbb), child: ListView( children: [ Column( children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( margin: EdgeInsets.only( right: MediaQuery.of(context).size.width * 0.15, //50 ), child: IconButton( color: Colors.white, iconSize: 50, icon: Icon(Icons.arrow_back), onPressed: () { Navigator.pop(context); }, ), ), Container( child: Text( TranslationBase.of(context).deliveryInfo, style: TextStyle( color: Colors.white, fontSize: 20, ), ), ), ], ), Stack( children: [ Container( width: MediaQuery.of(context).size.width, //400, height: MediaQuery.of(context).size.width, //500, ), Container( width: MediaQuery.of(context).size.width * 1, //800, height: MediaQuery.of(context).size.width * 1.5, //700, margin: EdgeInsets.only( top: MediaQuery.of(context).size.width * 0.3, //100 ), decoration: BoxDecoration( color: Colors.white, 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.2, //170, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ delivery_info_button( btnColor: Color(0xfff44336), btnIcon: Icon( Icons.near_me, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).location, btnFunction: () {}, ), delivery_info_button( btnColor: Colors.green, btnIcon: Icon( Icons.whatshot, size: 30, color: Colors.white, ), btnName: 'Whatsapp', btnFunction: () {}, ), delivery_info_button( btnColor: Colors.orangeAccent, btnIcon: Icon( Icons.mail_outline, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), delivery_info_button( btnColor: Color(0xff41bdbb), btnIcon: Icon( Icons.phone, size: 30, color: Colors.white, ), btnName: TranslationBase.of(context).call, btnFunction: () {}, ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, //30, ), Container( margin: EdgeInsets.only( left: MediaQuery.of(context).size.width * 0.05, //15, right: MediaQuery.of(context).size.width * 0.02, //15 ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( TranslationBase.of(context) .packageContent, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 20), ), SizedBox( height: MediaQuery.of(context).size.width * 0.05, //20, ), Column( children: List.generate( item.itemsQuantitiesList.length, (index) { return package_content( packageName: item .itemsQuantitiesList[index] .itemName .toString(), //'Panadol Extra 50 tablet', packageCount: item .itemsQuantitiesList[index] .quantity .toString(), ); }), ), SizedBox( height: MediaQuery.of(context).size.width * 0.01, //10, ), ], ), ), SizedBox( height: MediaQuery.of(context).size.width * 0.1, //30, ), FlatButton( color: Color(0xff41bdbb), padding: EdgeInsets.only( right: MediaQuery.of(context).size.width * 0.3, //100, left: MediaQuery.of(context).size.width * 0.3, //100, bottom: MediaQuery.of(context).size.width * 0.035, //15, top: MediaQuery.of(context).size.width * 0.035, //15 ), shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(30.0), side: BorderSide(color: Color(0xff41bdbb)), ), child: Text( TranslationBase.of(context).clientReached, style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16), ), onPressed: () { model.showBottomSheet(); }, ), ], ), ), CustomerBrief( itemId: item.patientID, customerFirstName: item.firstName, customerLastName: item.lastName, mobileNo: item.mobileNumber, totalPayment: item.amount, deliveryTime: item.orderCreatedOn), ], ), ], ), ], ), ), ), bottomSheet: !model.isBottomSheetAppear ? Container( width: 0, height: 0, ) : CustomBottomSheet( children: [ SizedBox( height: 10, ), Center( child: Texts( 'Select Action', 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: 6, ), ActionSheetButton( label: "Delivered", icon: DriverApp.deliverd_icon, onTap: () { selectAction(context, 1, model); }, ), SizedBox( height: 6, ), ActionSheetButton( label: "Not Available", icon: DriverApp.not_available, onTap: () { selectAction(context, 2, model); }, ), SizedBox( height: 6, ), ActionSheetButton( label: "Rejected", icon: DriverApp.rejected_icon, onTap: () { selectAction(context, 3, model); }, ), SizedBox( height: 6, ), ActionSheetButton( label: "Not Reachable", icon: DriverApp.not_reachable_icon, onTap: () { selectAction(context, 4, model); }, ), ], ), ), ], ), ), ); } selectAction(BuildContext context, orderStatus, OrdersViewModel model) { String orderStatusText; this.orderStatus = orderStatus; switch (orderStatus) { case 1: orderStatusText = "Delivered"; break; case 2: orderStatusText = "Not Available"; break; case 3: orderStatusText = "Rejected"; break; case 4: orderStatusText = "Not Reachable"; 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 diff --git a/lib/widgets/data_display/dialog/custom_dialog.dart b/lib/widgets/data_display/dialog/custom_dialog.dart index 3ec8443..88ad467 100644 --- a/lib/widgets/data_display/dialog/custom_dialog.dart +++ b/lib/widgets/data_display/dialog/custom_dialog.dart @@ -1,25 +1,91 @@ +import 'package:driverapp/core/enum/viewstate.dart'; +import 'package:driverapp/core/viewModels/orders_view_model.dart'; +import 'package:driverapp/pages/base/base_view.dart'; +import 'package:driverapp/widgets/buttons/secondary_button.dart'; import 'package:flutter/material.dart'; +import '../text.dart'; + class CustomDialog extends StatelessWidget { - final Widget child; +// final Widget child; + final String orderStatusText; + final Function callService; + final OrdersViewModel model; - CustomDialog({ - @required this.child, - }); + CustomDialog({this.orderStatusText, this.callService, this.model}); @override Widget build(BuildContext context) { - return Center( - child: Container( - height: MediaQuery.of(context).size.height * 0.35, - width: MediaQuery.of(context).size.width * 0.95, - child: Dialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15), + return BaseView( + builder: (_, model, w) => Center( + child: Container( + height: MediaQuery.of(context).size.height * 0.35, + width: MediaQuery.of(context).size.width * 0.95, + child: Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + ), + elevation: 0.0, + backgroundColor: Colors.white, + child: Container( + child: Column( + children: [ + SizedBox( + height: 30, + ), + Text( + 'you have selected:', + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.black, + fontSize: 15.0), + ), + Text( + orderStatusText, + style: TextStyle( + color: Theme.of(context).primaryColor, fontSize: 18.0), + ), + SizedBox( + height: 40, + ), + FractionallySizedBox( + widthFactor: 0.8, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Texts( + 'Are you sure?', + color: Colors.black, + fontSize: 20, + ), + SizedBox( + height: 10, + ), + SecondaryButton( + label: "Confirm", + loading: model.state == ViewState.BusyLocal, + onTap: () { + model.setState(ViewState.BusyLocal); + callService(); + }, + ), + SizedBox( + height: 10, + ), + SecondaryButton( + label: "Cancel", + onTap: () { + model.hideBottomSheet(); + Navigator.of(context).pop(); + }, + ), + ], + ), + ) + ], + ), + ), ), - elevation: 0.0, - backgroundColor: Colors.white, - child: child, ), ), );