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(); + }, + ), + ], + ), ), + ], ), )