From e9223d3e97ffa1eca713b66a2db55bb1156c3775 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Wed, 9 Sep 2020 08:33:56 +0300 Subject: [PATCH] delivery info page updates --- lib/core/service/orders_service.dart | 26 +- lib/pages/delivery/information_page.dart | 401 +++++++++++++++++- lib/widgets/delivery/customer_brief_card.dart | 8 +- 3 files changed, 422 insertions(+), 13 deletions(-) diff --git a/lib/core/service/orders_service.dart b/lib/core/service/orders_service.dart index 785ad1e..f188901 100644 --- a/lib/core/service/orders_service.dart +++ b/lib/core/service/orders_service.dart @@ -6,12 +6,13 @@ import 'package:driverapp/core/model/orders/update_order_status_request_model.da import 'package:driverapp/core/model/scan_qr/scan_qr_request_model.dart'; import 'package:driverapp/core/service/base_service.dart'; import 'package:driverapp/core/model/orders/deliverd_order_req_model.dart'; +import 'package:driverapp/uitl/utils.dart'; +import 'package:location/location.dart'; class OrdersService extends BaseService { List _orders = List(); List _nextOrdersList = List(); List _deliverdOrderList = List(); - List get orders => _orders; List get deliverdOrderList => _deliverdOrderList; @@ -19,13 +20,6 @@ class OrdersService extends BaseService { bool isOrderInserted; bool isOrderStatusUpdated; - PendingOrders _requestGetPendingOrders = PendingOrders( - searchKey: "", - pageSize: 0, - pageIndex: 0, - latitude: "24.640000", - longitude: "46.753000", - ); DeliverdOrderModel _requestGetDeliverdOrders = DeliverdOrderModel( searchKey: "", pageSize: 0, @@ -35,6 +29,14 @@ class OrdersService extends BaseService { ); Future getPendingOrders() async { + LocationData loc = await Utils.getLocation(); + PendingOrders _requestGetPendingOrders = PendingOrders( + searchKey: "", + pageSize: 0, + pageIndex: 0, + latitude: loc.latitude.toString(), + longitude: loc.longitude.toString(), + ); hasError = false; try { await baseAppClient.post(GET_ALL_ORDERS, @@ -110,6 +112,14 @@ class OrdersService extends BaseService { } Future getDeliverdList() async { + LocationData loc = await Utils.getLocation(); + PendingOrders _requestGetPendingOrders = PendingOrders( + searchKey: "", + pageSize: 0, + pageIndex: 0, + latitude: loc.latitude.toString(), + longitude: loc.longitude.toString(), + ); hasError = false; try { await baseAppClient.post(GET_ALL_DELIVERD_ORDER, diff --git a/lib/pages/delivery/information_page.dart b/lib/pages/delivery/information_page.dart index 3a13967..84787c7 100644 --- a/lib/pages/delivery/information_page.dart +++ b/lib/pages/delivery/information_page.dart @@ -1 +1,400 @@ -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/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) { showDeliveryOptions(OrdersViewModel model) { showModalBottomSheet( backgroundColor: Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.only( topLeft: Radius.circular(50.0), topRight: Radius.circular(50.0), ), ), context: context, builder: (BuildContext bc) { return ListView( children: [ Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(50.0), topRight: Radius.circular(50.0), ), ), child: Column( mainAxisSize: MainAxisSize.min, 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.45, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(50.0), topRight: Radius.circular(50.0), ), ), 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), ], ), ], ), )) ], ), ), ], ); }); } return BaseView( builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarColor: Color(0xff45B7AE), arrowColor: Colors.white, titleColor: Colors.white, appBarTitle: TranslationBase.of(context).deliveryInfo, body: Container( color: Colors.red, child: Container( color: Color(0xff45B7AE), 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).orientation == Orientation.portrait ? MediaQuery.of(context).size.width * 1.5 : MediaQuery.of(context).size.width * 0.9, margin: EdgeInsets.only( top: MediaQuery.of(context).orientation == Orientation.portrait ? MediaQuery.of(context).size.width * 0.23 : MediaQuery.of(context).size.width * 0.13), 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.23, //MediaQuery.of(context).size.width * 0.005, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DeliveryInfoButton( btnColor: Colors.white, //Color(0xffED1C24), btnIcon: Icon(DriverApp.location_1, size: MediaQuery.of(context) .orientation == Orientation.portrait ? 50 : 90, color: Color(0xffED1C24)), btnName: TranslationBase.of(context).location, btnFunction: () { MapsLauncher.launchCoordinates( item.latitude, item.longitude); }, ), DeliveryInfoButton( btnColor: Colors.white, //Color(0xFF61B260), btnIcon: Icon( DriverApp.whatsapp, size: MediaQuery.of(context).orientation == Orientation.portrait ? 50 : 90, color: Color(0xFF5EA34A), ), btnName: 'Whatsapp', btnFunction: () {}, ), DeliveryInfoButton( btnColor: Colors.white, //Color(0xFFFCB657), btnIcon: Icon( DriverApp.message, size: MediaQuery.of(context).orientation == Orientation.portrait ? 50 : 90, color: Color(0xffFFA540), ), btnName: TranslationBase.of(context).sms, btnFunction: () {}, ), DeliveryInfoButton( btnColor: Colors .white, //Theme.of(context).primaryColor, btnIcon: Icon( DriverApp.call, size: MediaQuery.of(context).orientation == Orientation.portrait ? 50 : 90, color: Theme.of(context).primaryColor, ), btnName: TranslationBase.of(context).call, btnFunction: () => launch("tel://" + item.mobileNumber), ), ], ), SizedBox( height: MediaQuery.of(context).size.width * 0.08, ), 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: () { showDeliveryOptions(model); }, ), ), ], ), ), 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, ), ], ), ], ), ], ), ), ), ), ); } 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/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) { + showDeliveryOptions(OrdersViewModel model) { + showModalBottomSheet( + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(50.0), + topRight: Radius.circular(50.0), + ), + ), + context: context, + builder: (BuildContext bc) { + return ListView( + children: [ + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(50.0), + topRight: Radius.circular(50.0), + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + 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.45, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(50.0), + topRight: Radius.circular(50.0), + ), + ), + 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), + ], + ), + ], + ), + )) + ], + ), + ), + ], + ); + }); + } + + return BaseView( + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarColor: Color(0xff45B7AE), + arrowColor: Colors.white, + titleColor: Colors.white, + appBarTitle: TranslationBase.of(context).deliveryInfo, + body: Container( + color: Colors.red, + child: Container( + color: Color(0xff45B7AE), + 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).orientation == + Orientation.portrait + ? MediaQuery.of(context).size.width * 1.9 + : MediaQuery.of(context).size.width * 1.1, + margin: EdgeInsets.only( + top: MediaQuery.of(context).orientation == + Orientation.portrait + ? MediaQuery.of(context).size.width * 0.23 + : MediaQuery.of(context).size.width * 0.13), + 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.4, + //MediaQuery.of(context).size.width * 0.005, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + DeliveryInfoButton( + btnColor: Colors.white, //Color(0xffED1C24), + btnIcon: Icon(DriverApp.location_1, + size: MediaQuery.of(context) + .orientation == + Orientation.portrait + ? 50 + : 90, + color: Color(0xffED1C24)), + btnName: + TranslationBase.of(context).location, + btnFunction: () { + MapsLauncher.launchCoordinates( + item.latitude, item.longitude); + }, + ), + DeliveryInfoButton( + btnColor: Colors.white, //Color(0xFF61B260), + btnIcon: Icon( + DriverApp.whatsapp, + size: + MediaQuery.of(context).orientation == + Orientation.portrait + ? 50 + : 90, + color: Color(0xFF5EA34A), + ), + btnName: 'Whatsapp', + btnFunction: () {}, + ), + DeliveryInfoButton( + btnColor: Colors.white, //Color(0xFFFCB657), + btnIcon: Icon( + DriverApp.message, + size: + MediaQuery.of(context).orientation == + Orientation.portrait + ? 50 + : 90, + color: Color(0xffFFA540), + ), + btnName: TranslationBase.of(context).sms, + btnFunction: () {}, + ), + DeliveryInfoButton( + btnColor: Colors + .white, //Theme.of(context).primaryColor, + btnIcon: Icon( + DriverApp.call, + size: + MediaQuery.of(context).orientation == + Orientation.portrait + ? 50 + : 90, + color: Theme.of(context).primaryColor, + ), + btnName: TranslationBase.of(context).call, + btnFunction: () => + launch("tel://" + item.mobileNumber), + ), + ], + ), + SizedBox( + height: + MediaQuery.of(context).size.width * 0.08, + ), + 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.1, + ), + Container( + child: SecondaryButton( + label: + TranslationBase.of(context).clientReached, + onTap: () { + showDeliveryOptions(model); + }, + ), + ), + ], + ), + ), + 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, + ), + ], + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + 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), + ), + ); + } + } +} diff --git a/lib/widgets/delivery/customer_brief_card.dart b/lib/widgets/delivery/customer_brief_card.dart index 9e39e7f..a55bc3f 100644 --- a/lib/widgets/delivery/customer_brief_card.dart +++ b/lib/widgets/delivery/customer_brief_card.dart @@ -1,6 +1,6 @@ import 'package:driverapp/widgets/data_display/circle-container.dart'; import 'package:flutter/material.dart'; - +import 'package:driverapp/config/size_config.dart'; import '../../uitl/date_uitl.dart'; import '../../uitl/translations_delegate_base.dart'; @@ -36,9 +36,9 @@ class CustomerBriefCard extends StatelessWidget { return Center( child: Container( width: MediaQuery.of(context).orientation == Orientation.landscape - ? 580 - : 370, - height: 270, + ? SizeConfig.widthMultiplier * 125.0 + : SizeConfig.widthMultiplier * 90.0, + height: 290, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only(