diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 18790bd4..681e0b22 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1269,10 +1269,31 @@ const Map localizedValues = { "TaxAmount": {"en": "Tax Amount:", "ar": "Tax Amount:"}, "TotalAmountPayable": {"en": "Total Amount Payable:", "ar": "Total Amount Payable:"}, "iAcceptTermsConditions": {"en": "I Accept the Terms And Conditions", "ar": "You can pay by the following options:"}, + "somethingWentWrongTryLater": {"en": "Sorry something went wrong please try again later", "ar": "نعتذر لخدمتكم يرجى المحاولة لاحقا"}, "YouCanPayByTheFollowingOptions": {"en": "You can pay by the following options:", "ar": "I Accept the Terms And Conditions"}, "RRTDDetails": {"en": "The RRT service provides medical services urgent and stable cases, not life-threatening situation or extremities and the service includes providing medical care from a copmplete medical team at home", "ar": "The RRT service provides medical services urgent and stable cases, not life-threatening situation or extremities and the service includes providing medical care from a copmplete medical team at home"}, "Rapid-Response-Team": {"en": "Rapid Response Team", "ar": "فريق الاستجابة السريع"}, "rrtService": {"en": "RRT Service", "ar": "خدمة RRT"}, + "rrtUserAgreementTitle":{ + "en":"Communication via email, text messages and phone calls", + "ar":"الاتصال عبر البريد الإلكتروني، والرسائل النصية، والمكالمات الهاتفية" + }, + "rrtUserAgreementP1":{ + "en" : "I understand that the contact number or Email that I have provided on registration will be used for communication by HMG. I hereby agree to be notified by HMG through SMS, Email or any other method for appointments notifications, current HMG’s medical services, and any services introduced by the HMG in the future or any modifications made to the services offered by the HMG. And these messages may be submitted as evidence where the HMG has the right to use at any time whatsoever and as it sees fit.", + "ar" : "أدرك بأن رقم الهاتف أو البريد الإلكتروني الذي قدمته للمجموعة سيستخدم كوسيلة اتصال بيني وبينها، وأقر بموافقتي على قيام المجموعة بإخطاري عن طريق الرسائل القصيرة أو البريد الإلكتروني أو أي طريقة أخرى بالمواعيد وبأي خدمات طبية تقدمها المجموعة أو قد تطرحها المجموعة للجمهور في المستقبل أو أي تعديلات قد تطرأ على الخدمات المقدمة من قبل المجموعة. وتعتبر هذه الرسائل دليل إثبات يحق للمجموعة استخدامه في أي وقت تشاء. " + }, + "rrtUserAgreementP2":{ + "en":"I understand the risks of communicating by email and text messages, in particular the privacy risks. I understand that HMG cannot guarantee the security and confidentiality of email or text communication. HMG will not be responsible for messages that are not received or delivered due to technical failure, or for disclosure of confidential information unless caused by intentional misconduct.", + "ar":"أفھم مخاطر التواصل عبر البرید الإلکتروني والرسائل النصیة، خاصة مخاطر الخصوصیة، وادرك أن المجموعة لا يمكنها ضمان أمن وسرية البريد الإلكتروني أو الرسائل النصية ولن تكون المجموعة مسؤولة عن الرسائل التي لم يتم استلامها أو تسليمها بسبب الفشل التقني أو الكشف عن المعلومات السرية ما لم يكن سببها سوء سلوك متعمد." + }, + "rrtUserAgreementP3":{ + "en":'I hereby agree to receive emails, text messages, phone calls for appointments notifications, special promotions and new features or products introduced by HMG or any third party.', + "ar":"وافق على تلقي رسائل البريد الإلكتروني، والرسائل النصية، والمكالمات الهاتفية للإخطار بالمواعيد والعروض الترويجية والمميزات والمنتجات الجديدة الخاصة بالمجموعة أو اي طرف اخر." + }, + "rrtOrderSuccessMessage": { + "en": "The request has been sent successfully, You will be contacted soon.", + "ar": "تم ارسال الطلب بنجاح وسيتم الاتصال بك قريبا." + }, "bill-amount": {"en": "Bill Amount", "ar": "مبلغ الفاتورة"}, "transport-method": {"en": "Transportation Method", "ar": "طريقة النقل"}, "directions": {"en": "Directions", "ar": "الاتجاهات"}, diff --git a/lib/core/model/pharmacies/Addresses.dart b/lib/core/model/pharmacies/Addresses.dart index b00b1a17..40bcb778 100644 --- a/lib/core/model/pharmacies/Addresses.dart +++ b/lib/core/model/pharmacies/Addresses.dart @@ -86,4 +86,9 @@ class Addresses { return data; } + @override + String toString() { + return "${address1 ?? ""} ${address2 ?? ""}"; + } + } diff --git a/lib/core/model/prescriptions/prescriptions_order.dart b/lib/core/model/prescriptions/prescriptions_order.dart index fdcbf203..d3390d92 100644 --- a/lib/core/model/prescriptions/prescriptions_order.dart +++ b/lib/core/model/prescriptions/prescriptions_order.dart @@ -1,4 +1,7 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class PrescriptionsOrder { int iD; @@ -32,6 +35,19 @@ class PrescriptionsOrder { dynamic projectDescription; dynamic projectDescriptionN; + String getNearestProjectDescription(){ + return isAppArabic ? nearestProjectDescriptionN : nearestProjectDescription; + } + String getStatusName(TranslationBase localize){ + if(status == 1) + return localize.pending; + else if(status == 3) + return localize.completed; + return '$status'; + } + + String getFormattedDateTime()=> DateUtil.getDateFormatted(pickupDateTime); + PrescriptionsOrder( {this.iD, this.patientID, diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 03f12df1..42dc2f4b 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -169,6 +169,7 @@ class BaseAppClient { } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode); + debugPrint(parsed.toString()); } else if (parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']) { if (parsed['SameClinicApptList'] != null) { diff --git a/lib/core/viewModels/er/rrt-view-model.dart b/lib/core/viewModels/er/rrt-view-model.dart index 975b01a1..1289538d 100644 --- a/lib/core/viewModels/er/rrt-view-model.dart +++ b/lib/core/viewModels/er/rrt-view-model.dart @@ -1,7 +1,19 @@ +import 'dart:async'; +import 'dart:convert'; + import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/core/service/parmacyModule/parmacy_module_service.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/rrt/service_price.dart'; +import 'package:diplomaticquarterapp/services/pharmacy_services/pharmacyAddress_service.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:flutter/cupertino.dart'; import '../base_view_model.dart'; @@ -9,91 +21,127 @@ import '../base_view_model.dart'; class RRTService extends BaseService{ } -class _RRTServiceOrders{ +class _RRTServiceData{ List pendingOrders = []; List completedOrders = []; + ServicePrice servicePrice; } class RRTViewModel extends BaseViewModel{ var _service = RRTService(); - _RRTServiceOrders rrtOrders = _RRTServiceOrders(); - - Future getRequiredData() async{ - getServicePrice(); - getAllOrders(); + var _pharmacy_service = locator(); + var _pharmacy_address_service = locator(); + + _RRTServiceData rrtServiceData = _RRTServiceData(); + + Future<_RRTServiceData> loadRequiredData() async{ + await getServicePrice(); + await getAllOrders(); + return rrtServiceData; } - Future createOrder(){ - var body = {"Latitude":24.828170776367188,"Longitude":46.63229029757938,"IdentificationNo":"2344670985","NationalityID":"JOR","CreatedBy":1231755,"OrderServiceID":5,"Notes":""}; - _service.baseAppClient.post(PATIENT_ER_INSERT_PRES_ORDER, body: body, onSuccess: (response, statusCode){ - print(response); - }, onFailure: (error, statusCode){ + Future createOrder(Map body) async{ + body['IdentificationNo'] = user.patientIdentificationNo; + body['NationalityID'] = user.nationalityID; + body['CreatedBy'] = user.patientIdentificationType; + body['OrderServiceID'] = 5; + int requestNo; + await _service.baseAppClient.post(PATIENT_ER_INSERT_PRES_ORDER, body: body, onSuccess: (response, statusCode){ + requestNo = response['RequestNo']; + }, onFailure: (error, statusCode){ + AppToast.showErrorToast(message: error); }); - return null; + return requestNo; } // Service ID: 4 == RRT - Future<_RRTServiceOrders> getAllOrders() async{ + Future<_RRTServiceData> getAllOrders() async{ await _service.baseAppClient.post(GET_PRESCRIPTIONS_ALL_ORDERS, body: {}, onSuccess: (response, statusCode){ var data = response["PatientER_GetPatientAllPresOrdersList"]; if(data != null && data is List){ data.forEach((json){ - if(json["ServiceID"] == 4){ + if(json["ServiceID"] == 5){ if(json["Status"] == 1){ // Pending - rrtOrders.pendingOrders.clear(); - rrtOrders.pendingOrders.add(PrescriptionsOrder.fromJson(json)); + rrtServiceData.pendingOrders.clear(); + rrtServiceData.pendingOrders.add(PrescriptionsOrder.fromJson(json)); }else if (json["Status"] == 3){ // Completed - rrtOrders.completedOrders.clear(); - rrtOrders.completedOrders.add(PrescriptionsOrder.fromJson(json)); + rrtServiceData.completedOrders.clear(); + rrtServiceData.completedOrders.add(PrescriptionsOrder.fromJson(json)); } } + return Future.error("404"); }); } }, onFailure: (error, statusCode){ - print(error); + AppToast.showErrorToast(message: error); }); - return rrtOrders; + return rrtServiceData; } - Future getOrderDetails(){ - + Future getOrderDetails() async{ return null; } - Future getAllQuestions(){ - _service.baseAppClient.post(GET_ALL_RRT_QUESTIONS, body: {}, onSuccess: (response, statusCode){ - print(response); + Future getAllQuestions() async{ + dynamic response_; + await _service.baseAppClient.post(GET_ALL_RRT_QUESTIONS, body: {}, onSuccess: (response, statusCode){ + response_ = response; }, onFailure: (error, statusCode){ - print(error); + AppToast.showErrorToast(message: error); }); - return null; + return response_; } - Future getServicePrice(){ - var body = {"IdentificationNo":user.patientIdentificationNo}; - _service.baseAppClient.post(GET_RRT_SERVICE_PRICE, body: body, onSuccess: (response, statusCode){ - print(response); + Future getServicePrice() async{ + Map body = {"IdentificationNo":user.patientIdentificationNo}; + ServicePrice servicePrice; + await _service.baseAppClient.post(GET_RRT_SERVICE_PRICE, body: body, onSuccess: (response, statusCode){ + var data = response['PatientE_RealRRT_GetServicePriceList']; + if(data != null && data is List){ + var priceData = data.first; + if(priceData != null){ + servicePrice = ServicePrice.fromJson(priceData); + rrtServiceData.servicePrice = servicePrice; + } + } }, onFailure: (error, statusCode){ - print(error); + AppToast.showErrorToast(message: error); }); - return null; + return servicePrice; } - Future cancelOrder(){ - var body = {"PresOrderID":"2318","PresOrderStatus":4,"EditedBy":3,"RejectionReason":""}; - _service.baseAppClient.post(PATIENT_ER_UPDATE_PRES_ORDER, body: body, onSuccess: (response, statusCode){ - print(response); + Future cancelOrder(PrescriptionsOrder order, {String reason = ""}) async{ + var body = {"PresOrderID":order.iD, "PresOrderStatus":4,"EditedBy":3,"RejectionReason":reason}; + var success = false; + await _service.baseAppClient.post(PATIENT_ER_UPDATE_PRES_ORDER, body: body, onSuccess: (response, statusCode){ + success = true; }, onFailure: (error, statusCode){ - print(error); + AppToast.showErrorToast(message: error); + success = false; }); - return null; + return Future.value(success); } - Future getCancelReasons(){ } + + Future> getAddresses() async{ + Object error; + try{ + var token = await sharedPref.getString(PHARMACY_AUTORZIE_TOKEN); + if(token == null) + await _pharmacy_service.generatePharmacyToken(); + + await _pharmacy_service.makeVerifyCustomer({'PatientID': user.patientID.toString()}); + await _pharmacy_address_service.getAddresses(); + return _pharmacy_address_service.addresses; + }catch(e){ + error = e; + } + Future.error(error); + } } \ No newline at end of file diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index 17ccb267..2e6d1f29 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -11,6 +11,7 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; +var isAppArabic = false; class ProjectViewModel extends BaseViewModel { // Platform Bridge PlatformBridge platformBridge() { @@ -69,19 +70,19 @@ class ProjectViewModel extends BaseViewModel { currentLanguage = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); _appLocale = Locale(currentLanguage); - _isArabic = currentLanguage == 'ar'; + isAppArabic = _isArabic = currentLanguage == 'ar'; notifyListeners(); } void changeLanguage(String lan) { if (lan != "en" && currentLanguage != lan) { _appLocale = Locale("ar"); - _isArabic = true; + isAppArabic = _isArabic = true; currentLanguage = 'ar'; sharedPref.setString(APP_LANGUAGE, 'ar'); } else if (lan != "ar" && currentLanguage != lan) { _appLocale = Locale("en"); - _isArabic = false; + isAppArabic = _isArabic = false; currentLanguage = 'en'; sharedPref.setString(APP_LANGUAGE, 'en'); } diff --git a/lib/models/rrt/service_price.dart b/lib/models/rrt/service_price.dart new file mode 100644 index 00000000..d206c986 --- /dev/null +++ b/lib/models/rrt/service_price.dart @@ -0,0 +1,53 @@ +class ServicePrice { + String currency; + double maxPrice; + double maxTotalPrice; + double maxVAT; + double minPrice; + double minTotalPrice; + double minVAT; + int price; + int totalPrice; + int vat; + + ServicePrice({ + this.currency, + this.maxPrice, + this.maxTotalPrice, + this.maxVAT, + this.minPrice, + this.minTotalPrice, + this.minVAT, + this.price, + this.totalPrice, + this.vat}); + + ServicePrice.fromJson(dynamic json) { + currency = json["Currency"]; + maxPrice = json["MaxPrice"]; + maxTotalPrice = json["MaxTotalPrice"]; + maxVAT = json["MaxVAT"]; + minPrice = json["MinPrice"]; + minTotalPrice = json["MinTotalPrice"]; + minVAT = json["MinVAT"]; + price = json["Price"]; + totalPrice = json["TotalPrice"]; + vat = json["VAT"]; + } + + Map toJson() { + var map = {}; + map["Currency"] = currency; + map["MaxPrice"] = maxPrice; + map["MaxTotalPrice"] = maxTotalPrice; + map["MaxVAT"] = maxVAT; + map["MinPrice"] = minPrice; + map["MinTotalPrice"] = minTotalPrice; + map["MinVAT"] = minVAT; + map["Price"] = price; + map["TotalPrice"] = totalPrice; + map["VAT"] = vat; + return map; + } + +} \ No newline at end of file diff --git a/lib/pages/ErService/rapid-response-team/rrt-agreement-page.dart b/lib/pages/ErService/rapid-response-team/rrt-agreement-page.dart new file mode 100644 index 00000000..c3048127 --- /dev/null +++ b/lib/pages/ErService/rapid-response-team/rrt-agreement-page.dart @@ -0,0 +1,49 @@ +import 'package:diplomaticquarterapp/pages/conference/clipped_video.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class RRTAgreementPage extends StatelessWidget{ + TranslationBase localize; + + @override + Widget build(BuildContext context) { + localize = TranslationBase.of(context); + + return AppScaffold( + appBarTitle: localize.userAgreement, + isShowAppBar: true, + showHomeAppBarIcon: false, + body: SingleChildScrollView( + padding: EdgeInsets.all(20), + child: Column( + children: [ + Text(localize.rrtUserAgreementTitle, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w500, fontSize: 22), maxLines: 100, textAlign: TextAlign.center), + SizedBox(height: 20), + text(localize.rrtUserAgreementP1), + text(localize.rrtUserAgreementP2), + text(localize.rrtUserAgreementP3) + ], + ), + ) + ); + } + + Widget text(String string)=> Padding( + padding: const EdgeInsets.symmetric(vertical: 15), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + clipBehavior: Clip.hardEdge, + width: 10, height: 10, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: Colors.black) + ), + SizedBox(width: 20), + Expanded(child: Text(string, style: TextStyle(color: Colors.black87, fontSize: 18), maxLines: 100, textAlign: TextAlign.justify)), + ], + ), + ); + +} \ No newline at end of file diff --git a/lib/pages/ErService/rapid-response-team/rrt-logs-page.dart b/lib/pages/ErService/rapid-response-team/rrt-logs-page.dart index acfe13d8..59f11fb2 100644 --- a/lib/pages/ErService/rapid-response-team/rrt-logs-page.dart +++ b/lib/pages/ErService/rapid-response-team/rrt-logs-page.dart @@ -1,94 +1,54 @@ +import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-order-list-item.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class RRTLogPage extends StatefulWidget{ + final List orders; + const RRTLogPage({this.orders}); + @override State createState() => RRTLogPageState(); } class RRTLogPageState extends State{ + + RRTViewModel viewModel; + @override Widget build(BuildContext context) { - return BaseView( - onModelReady: (viewModel){ - }, - builder: (ctx, vm, widget){ + return BaseView( + onModelReady: (vm) => viewModel = vm, + builder: (ctx, vm, widgetState){ return ListView.builder( - itemCount: 10, - itemBuilder: (ctx, idx) => RRTLogListItem() + itemCount: widget.orders.length, + itemBuilder: (ctx, idx) { + var order = widget.orders[idx]; + return RRTLogListItem(order, onCancel: deleteOrder); + } ); } ); } -} - - - -// ------------------------ -// List Item Widget -// ------------------------ - - -final _item_content_seperator = Container(height: 0.25, padding: EdgeInsets.all(10), color: Colors.grey.withOpacity(0.5)); - -class RRTLogListItem extends StatelessWidget{ - BuildContext _context; - @override - Widget build(BuildContext context) { - _context = context; - - return Container( - padding: EdgeInsets.all(15), margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(15), - boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.25), spreadRadius: 1, blurRadius: 3)] - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _contentItem(label: "Request ID", value: "2318"), - _item_content_seperator, - _contentItem(label: "Status", value: "2318"), - _item_content_seperator, - _contentItem(label: "Pickup Date", value: "2318"), - _item_content_seperator, - _contentItem(label: "Location", value: "2318"), - _item_content_seperator, - SizedBox(height: 10), - FractionallySizedBox(child: cancelButton()) - ], - ), - ); - } - - Widget _contentItem({@required String label, String value}){ - return Container( - padding: EdgeInsets.symmetric(vertical: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(label, style: TextStyle(color: Theme.of(_context).appBarTheme.color, fontSize: 9, letterSpacing: 1),), - SizedBox(height: 5,), - Text(value, style: TextStyle(color: Theme.of(_context).appBarTheme.color,fontWeight: FontWeight.bold, fontSize: 14),), - ], - ), - ); + deleteOrder(PrescriptionsOrder order) async { + GifLoaderDialogUtils.showMyDialog(context); + var success = await viewModel.cancelOrder(order); + GifLoaderDialogUtils.hideDialog(context); + if(success) + setState(() { + widget.orders.remove(order); + }); } - Widget cancelButton() => MaterialButton( - height: 45, - color: Color(0xFFc5272d), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ), - onPressed: () { }, - child: Text("CANCEL", style: TextStyle(color: Colors.white, fontSize: 13),), - - ); } + diff --git a/lib/pages/ErService/rapid-response-team/rrt-main-screen.dart b/lib/pages/ErService/rapid-response-team/rrt-main-screen.dart index fe1c6a9d..905d0810 100644 --- a/lib/pages/ErService/rapid-response-team/rrt-main-screen.dart +++ b/lib/pages/ErService/rapid-response-team/rrt-main-screen.dart @@ -1,6 +1,9 @@ +import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart'; import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-logs-page.dart'; import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-request-page.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -16,27 +19,55 @@ class RRTMainScreenState extends State with SingleTickerProvider TabController tabController; PageController pageController = PageController(initialPage: 0, keepPage: true); + RRTViewModel viewModel; + bool loadingData; + @override void initState() { super.initState(); tabController = TabController(length: 2, vsync: this); } + TranslationBase localize; @override Widget build(BuildContext context) { + localize = TranslationBase.of(context); return AppScaffold( - appBarTitle: 'Rapid Response Team', + appBarTitle: localize.rapidResponseTeam, isShowAppBar: true, - body: Column( + body: BaseView( + onModelReady: (vm) async { + viewModel = vm; + loadingData = true; + await vm.loadRequiredData().then((value){ + }).whenComplete(() => setState(() => loadingData = false)); + }, + builder: (ctx, vm, widget) => content(), + ) + ); + } + + Widget content(){ + if(loadingData == true){ + return Center(child: CircularProgressIndicator()); + // else if(viewModel.state == ViewState.Error) + + }else if(viewModel.rrtServiceData != null && viewModel.rrtServiceData.servicePrice != null){ + return Column( children: [ tabBar(), Expanded( child: contentPager() ) ], - ), - ); + ); + }else{ + return Container( + alignment: Alignment.center, + child: Text(localize.somethingWentWrongTryLater, style: TextStyle(color: Colors.red), maxLines: 5,), + ); + } } Widget tabBar() => Container( @@ -52,10 +83,10 @@ class RRTMainScreenState extends State with SingleTickerProvider indicatorSize: TabBarIndicatorSize.label, tabs: [ Tab( - child: Text("Rapid Response Team", style: TextStyle(color: Theme.of(context).appBarTheme.color),), + child: Text(localize.rapidResponseTeam, style: TextStyle(color: Theme.of(context).appBarTheme.color),), ), Tab( - child: Text("Order Log", style: TextStyle(color: Theme.of(context).appBarTheme.color),), + child: Text(localize.orderLog, style: TextStyle(color: Theme.of(context).appBarTheme.color),), ), ] ), @@ -65,8 +96,8 @@ class RRTMainScreenState extends State with SingleTickerProvider onPageChanged: onPageChanged, controller: pageController, children: [ - RRTRequestPage(), - RRTLogPage(), + RRTRequestPage(servicePrice: viewModel.rrtServiceData.servicePrice, pendingOrders: viewModel.rrtServiceData.pendingOrders), + RRTLogPage(orders: viewModel.rrtServiceData.completedOrders), ], ); diff --git a/lib/pages/ErService/rapid-response-team/rrt-order-list-item.dart b/lib/pages/ErService/rapid-response-team/rrt-order-list-item.dart new file mode 100644 index 00000000..ed6078ff --- /dev/null +++ b/lib/pages/ErService/rapid-response-team/rrt-order-list-item.dart @@ -0,0 +1,71 @@ + +import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +final _item_content_seperator = Container(height: 0.25, padding: EdgeInsets.all(10), color: Colors.grey.withOpacity(0.5)); + +class RRTLogListItem extends StatelessWidget{ + final PrescriptionsOrder order; + final Function(PrescriptionsOrder) onCancel; + RRTLogListItem(this.order, {this.onCancel}); + + BuildContext _context; + + TranslationBase localize; + @override + Widget build(BuildContext context) { + _context = context; + localize = TranslationBase.of(context); + + return Container( + padding: EdgeInsets.all(15), margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.25), spreadRadius: 1, blurRadius: 3)] + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _contentItem(label: localize.reqId, value: order.iD.toString()), + _item_content_seperator, + _contentItem(label: localize.status, value: order.getStatusName(localize)), + _item_content_seperator, + _contentItem(label: localize.pickupDate, value: order.getFormattedDateTime()), + _item_content_seperator, + _contentItem(label: localize.location, value: order.getNearestProjectDescription()), + _item_content_seperator, + SizedBox(height: 10), + + if(onCancel != null) + FractionallySizedBox(child: cancelButton()) + ], + ), + ); + } + + Widget _contentItem({@required String label, String value}){ + return Container( + padding: EdgeInsets.symmetric(vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: TextStyle(color: Theme.of(_context).appBarTheme.color, fontSize: 9, letterSpacing: 1),), + SizedBox(height: 5,), + Text(value, style: TextStyle(color: Theme.of(_context).appBarTheme.color,fontWeight: FontWeight.bold, fontSize: 14),), + ], + ), + ); + } + + Widget cancelButton() => MaterialButton( + height: 45, + color: Color(0xFFc5272d), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ), + onPressed: () => onCancel(order), + child: Text(localize.cancel, style: TextStyle(color: Colors.white, fontSize: 13),), + + ); +} diff --git a/lib/pages/ErService/rapid-response-team/rrt-pickup-address-page.dart b/lib/pages/ErService/rapid-response-team/rrt-pickup-address-page.dart index 5b6bf6f6..20acbbb4 100644 --- a/lib/pages/ErService/rapid-response-team/rrt-pickup-address-page.dart +++ b/lib/pages/ErService/rapid-response-team/rrt-pickup-address-page.dart @@ -1,18 +1,33 @@ import 'dart:async'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/models/rrt/service_price.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/RadioStringDialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_material_pickers/flutter_material_pickers.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:google_maps_place_picker/google_maps_place_picker.dart'; +import 'package:provider/provider.dart'; + +import 'rrt-place-order.dart'; class RRTRequestPickupAddressPage extends StatefulWidget{ + final ServicePrice servicePrice; + RRTRequestPickupAddressPage({@required this.servicePrice}); + @override State createState() => RRTRequestPickupAddressPageState(); @@ -28,55 +43,95 @@ class RRTRequestPickupAddressPageState extends State myAdresses = ["One","Two","Three",]; - dynamic selectedAddress; - + List myAddresses = []; + Addresses selectedAddress; + StreamController addressStreamController = StreamController(); + Stream addressStream; + StreamController addressLoadingStreamController = StreamController(); + Stream addressLoadingStream; + @override void initState(){ super.initState(); goToCurrentLocation(); + addressStream = addressStreamController.stream; + addressLoadingStream = addressLoadingStreamController.stream; + } + + void loadAddresses() async{ + // GifLoaderDialogUtils.showMyDialog(context); + myAddresses = await viewModel.getAddresses(); + // GifLoaderDialogUtils.hideDialog(context); + + if(myAddresses.isNotEmpty) + setState(() {}); } + TranslationBase localize; + RRTViewModel viewModel; + @override Widget build(BuildContext context) { - return BaseView( - onModelReady: (viewModel){ + localize = TranslationBase.of(context); + ProjectViewModel projectViewModel = Provider.of(context); + + addressStreamController.sink.add(0); + return BaseView( + onModelReady: (vm){ + viewModel = vm; + loadAddresses(); }, builder: (ctx, vm, widget) => AppScaffold( - appBarTitle: TranslationBase.of(context).pickupLocation, + appBarTitle: localize.pickupLocation, isShowAppBar: true, body: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - selectAddress(), + StreamBuilder( + stream: addressStream, + builder: (context, snapshot) { + return selectAddressField(); + } + ), + StreamBuilder( + stream: addressLoadingStream, + builder: (context, snapshot) { + return snapshot.hasData ? LinearProgressIndicator(backgroundColor: Colors.transparent) : Container(height: 4,); + } + ), Expanded( - child: Stack( - children: [ - GoogleMap( - myLocationEnabled: true, - onTap: moveToLocation, - mapType: MapType.normal, - initialCameraPosition: mapCameraPosition, - onCameraIdle: (){ - mapIdle = true; - setState((){}); - }, - onCameraMove: (camPosition){ - mapCameraPosition = camPosition; - }, - onCameraMoveStarted: (){ - mapIdle = false; - setState((){}); - }, - onMapCreated: (controller){ - mapController.complete(controller); - }, - ), - - centerTargetPoint() - ], - ) + child: + PlacePicker( + apiKey: GOOGLE_API_KEY, + enableMyLocationButton: true, + automaticallyImplyAppBarLeading: false, + autocompleteOnTrailingWhitespace: true, + selectInitialPosition: true, + autocompleteLanguage: projectViewModel.currentLanguage, + enableMapTypeButton: true, + searchForInitialValue: false, + selectedPlaceWidgetBuilder: (_, selectedPlace, state, isSearchBarFocused) { + if(state == SearchingState.Idle){ + addressLoadingStreamController.sink.add(null); + if(selectedPlace != null){ + var loc = selectedPlace.geometry.location; + var address1 = selectedPlace.addressComponents.first.longName; + var address2 = ""; + if(selectedPlace.addressComponents.length > 1) + address2 = selectedPlace.addressComponents[1].longName; + + selectedAddress = Addresses(latLong: '${loc.lat},${loc.lng}', address1: address1, address2: address2); + addressStreamController.sink.add(0); + } + }else{ + addressLoadingStreamController.sink.add(0); + } + return Container(); + }, + initialPosition: LatLng(24.7114693, 46.67469582), + useCurrentLocation: false, + ), ), continueButton() ], @@ -104,23 +159,20 @@ class RRTRequestPickupAddressPageState extends State + Navigator.push( + context, + FadePage(page: RRTPlaceOrderPage(selectedAddress: selectedAddress, servicePrice: widget.servicePrice,)) + ), + child: Text(localize.continues, style: TextStyle(color: Colors.white, fontSize: 15, letterSpacing: 1),), ), ); } @@ -144,19 +200,26 @@ class RRTRequestPickupAddressPageState extends State 1){ + var cordinates = itm.latLong.split(','); + var latlng = LatLng(double.parse(cordinates.first), double.parse(cordinates.last)); + moveToLocation(latlng); + }else{ + AppToast.showErrorToast(message: 'Invalid address coordinates'); + } }); }, ); diff --git a/lib/pages/ErService/rapid-response-team/rrt-place-order.dart b/lib/pages/ErService/rapid-response-team/rrt-place-order.dart new file mode 100644 index 00000000..9cded48d --- /dev/null +++ b/lib/pages/ErService/rapid-response-team/rrt-place-order.dart @@ -0,0 +1,191 @@ +import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; +import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart'; +import 'package:diplomaticquarterapp/models/rrt/service_price.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; + +class RRTPlaceOrderPage extends StatelessWidget{ + TranslationBase localize; + RRTViewModel viewModel; + Addresses selectedAddress; + final ServicePrice servicePrice; + + RRTPlaceOrderPage({@required this.selectedAddress, @required this.servicePrice}); + + TextEditingController noteController = TextEditingController(text: ''); + BuildContext _context; + @override + Widget build(BuildContext context) { + _context = context; + localize = TranslationBase.of(context); + var lat = selectedAddress.latLong.split(',').first; + var lng = selectedAddress.latLong.split(',').last; + + return BaseView( + onModelReady: (vm) => viewModel = vm, + builder: (ctx,vm,wState){ + return AppScaffold( + appBarTitle: localize.rapidResponseTeam, + isShowAppBar: true, + body: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text(localize.selectedLocation, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),), + + selectedAddressField(), + + AspectRatio( + aspectRatio: 3/1, + child: ClipRRect( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(10), + child: Image.network( + "https://maps.googleapis.com/maps/api/staticmap?center=$lat,$lng &zoom=16&size=800x400&maptype=roadmap&markers=color:red%7C$lat,$lng&key=AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8", + fit: BoxFit.cover, + ), + ), + ), + + SizedBox(height: 10,), + + Container( + height: 70, + margin: EdgeInsets.symmetric(vertical: 5), + padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10), + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(10), + boxShadow: [BoxShadow(blurRadius: 5, spreadRadius: 2, offset: Offset(2,2), color: Colors.grey.withOpacity(0.25))] + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(localize.totalAmountPayable, style: TextStyle(fontSize: 13),), + SizedBox(height: 5,), + Text("${servicePrice.totalPrice ?? '- - -'} ${localize.sar}" , style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),), + ], + ), + ), + + Container( + height: 70, + margin: EdgeInsets.symmetric(vertical: 5), + padding: EdgeInsets.symmetric(horizontal: 0, vertical: 10), + decoration: BoxDecoration( + color: Colors.white, borderRadius: BorderRadius.circular(10), + boxShadow: [BoxShadow(blurRadius: 5, spreadRadius: 2, offset: Offset(2,2), color: Colors.grey.withOpacity(0.25))] + ), + child: TextField( + controller: noteController, + style: TextStyle(fontSize: 18.0), + decoration: InputDecoration( + filled: true, + fillColor: Colors.white, + labelText: localize.notes, + contentPadding: const EdgeInsets.only(left: 14.0, bottom: 8.0, top: 8.0), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.white), + borderRadius: BorderRadius.circular(10), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.white), + borderRadius: BorderRadius.circular(10), + ), + ) + ), + ), + ], + ), + ), + ), + submitButton(context) + ], + ) + ); + }, + ); + } + + + Widget selectedAddressField(){ + var address = "${selectedAddress.address1 ?? ''} ${selectedAddress.address2 ?? ''}"; + return Container( + margin: EdgeInsets.symmetric(vertical: 10), + child: Expanded( + child: MaterialButton( + height: 50, color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ), + onPressed: (){}, + child: Row( + children: [ + Expanded(child: Text(address, style: TextStyle(color: Colors.black87, fontSize: 15, letterSpacing: 1))), + Icon(Icons.location_on_rounded, size: 30, color: Colors.black,) + ], + ), + ), + ), + ); + } + + + Widget submitButton(BuildContext context){ + return Padding( + padding: const EdgeInsets.all(15), + child: MaterialButton( + height: 50, + color: Theme.of(context).appBarTheme.color, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + onPressed: () => placeOrder(), + child: Text(localize.submit, style: TextStyle(color: Colors.white, fontSize: 15, letterSpacing: 1),), + ), + ); + } + + placeOrder() async{ + if(selectedAddress != null && selectedAddress.latLong != null && selectedAddress.latLong.isNotEmpty && selectedAddress.latLong.split(',').length > 1){ + GifLoaderDialogUtils.showMyDialog(_context); + + Map params = {}; + var cordinates = selectedAddress.latLong.split(','); + var latlng = LatLng(double.parse(cordinates.first), double.parse(cordinates.last)); + params['Latitude'] = latlng.latitude; + params['Longitude'] = latlng.longitude; + params['Notes'] = noteController.text; + var requestId = await viewModel.createOrder(params); + + GifLoaderDialogUtils.hideDialog(_context); + + if(requestId != null){ + AlertDialogBox( + context: _context, + title: '', + message: localize.rrtOrderSuccessMessage, + okText: localize.ok, + okFunction: (){ + + } + ).showAlertDialog(); + } + }else{ + AppToast.showErrorToast(message: 'Invalid location selected'); + } + + } + + gotoRRTRoot(){ + + } +} \ No newline at end of file diff --git a/lib/pages/ErService/rapid-response-team/rrt-request-page.dart b/lib/pages/ErService/rapid-response-team/rrt-request-page.dart index 14a244d5..4cbfeb4b 100644 --- a/lib/pages/ErService/rapid-response-team/rrt-request-page.dart +++ b/lib/pages/ErService/rapid-response-team/rrt-request-page.dart @@ -1,6 +1,13 @@ +import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/rrt/service_price.dart'; +import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-agreement-page.dart'; +import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-order-list-item.dart'; import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-pickup-address-page.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; @@ -8,47 +15,79 @@ import 'package:flutter/material.dart'; class RRTRequestPage extends StatefulWidget{ + final List pendingOrders; + final ServicePrice servicePrice; + + RRTRequestPage({this.pendingOrders, this.servicePrice}); + @override - State createState() => RRTRequestPageState(); + State createState() => RRTRequestPageState(); } class RRTRequestPageState extends State{ bool acceptTerms = false; + TranslationBase localize; + RRTViewModel viewModel; + @override Widget build(BuildContext context) { + localize = TranslationBase.of(context); return BaseView( - onModelReady: (viewModel) async{ - await viewModel.getRequiredData(); - }, - builder: (ctx, vm, widget) => Column( - children: [ - Expanded( - child: ListView( - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), - children: [ - serviceDescription(context), - SizedBox(height: 20), - priceTable(context), - - acceptPolicy(), - - Container(height: 0.5, color: Theme.of(context).appBarTheme.color),// Seperator - - Container( - padding: EdgeInsets.only(top: 20, bottom: 5), - alignment: Alignment.center, - child: Text(TranslationBase.of(context).youCanPayByTheFollowingOptions, style: TextStyle(fontSize: 13, color: Theme.of(context).appBarTheme.color, fontWeight: FontWeight.w500), maxLines: 2) - ), - - paymentOptions(), - ], + onModelReady: (vm){ + viewModel = vm; + }, + builder: (ctx, vm, widgetState){ + + if(widget.pendingOrders.isNotEmpty) + return currentOrderContent(); + else + return requestContent(); + + }, + ); + + } + + Widget requestContent(){ + return Column( + children: [ + Expanded( + child: ListView( + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), + children: [ + serviceDescription(context), + SizedBox(height: 20), + priceTable(context), + + acceptPolicy(), + + Container(height: 0.5, color: Theme.of(context).appBarTheme.color),// Seperator + + Container( + padding: EdgeInsets.only(top: 20, bottom: 5), + alignment: Alignment.center, + child: Text(localize.youCanPayByTheFollowingOptions, style: TextStyle(fontSize: 13, color: Theme.of(context).appBarTheme.color, fontWeight: FontWeight.w500), maxLines: 2) ), - ), - actionButtons() - ], - ) + paymentOptions(), + ], + ), + ), + + actionButtons() + ], + ); + } + + Widget currentOrderContent(){ + var orders = widget.pendingOrders; + return ListView.builder( + itemCount: orders.length, + itemBuilder: (ctx, idx) { + var order = orders[idx]; + return RRTLogListItem(order, onCancel: deleteOrder); + } ); } @@ -56,7 +95,7 @@ class RRTRequestPageState extends State{ Padding( padding: const EdgeInsets.symmetric(horizontal: 10), child: Text( - TranslationBase.of(context).rrtDDetails, + localize.rrtDDetails, textAlign: TextAlign.justify, style: TextStyle(color: Theme.of(context).appBarTheme.color, fontSize: 15, height: 1.5, fontWeight: FontWeight.w300), ), @@ -64,22 +103,25 @@ class RRTRequestPageState extends State{ Widget priceTable(BuildContext context){ var radius = Radius.circular(8); + String amount = widget.servicePrice.price.toString(); + String vat = widget.servicePrice.vat.toString(); + String total = widget.servicePrice.totalPrice.toString(); return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Container( height: 30, decoration: BoxDecoration(color: Theme.of(context).appBarTheme.color, borderRadius: BorderRadius.only(topLeft: radius, topRight: radius)), - child: Center(child: Text(TranslationBase.of(context).approximateServiceFee, style: TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.w500, letterSpacing: 1))), + child: Center(child: Text(localize.approximateServiceFee, style: TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.w500, letterSpacing: 1))), ), - pricingRow(label: TranslationBase.of(context).amountBeforeTax, value: '500 SAR'), + pricingRow(label: localize.amountBeforeTax, value: '$amount ${localize.sar}'), Container(height: 0.5, color: Theme.of(context).appBarTheme.color), - pricingRow(label: TranslationBase.of(context).taxAmount, value: '50 SAR'), + pricingRow(label: localize.taxAmount, value: '$vat ${localize.sar}'), Container(height: 0.5, color: Theme.of(context).appBarTheme.color), - pricingRow(label: TranslationBase.of(context).totalAmountPayable, value: '550 SAR', labelBold: true), + pricingRow(label: localize.totalAmountPayable, value: '$total ${localize.sar}', labelBold: true), Container(height: 0.5, color: Theme.of(context).appBarTheme.color), ], ); @@ -115,15 +157,18 @@ class RRTRequestPageState extends State{ }), SizedBox(width: 10), Expanded( - child: Text(TranslationBase.of(context).iAcceptTermsConditions, style: TextStyle(fontSize: 13, color: Theme.of(context).appBarTheme.color), maxLines: 2) + child: Text(localize.iAcceptTermsConditions, style: TextStyle(fontSize: 13, color: Theme.of(context).appBarTheme.color), maxLines: 2) ), Container( alignment: Alignment.center, width: MediaQuery.of(context).size.width * 0.25, child: TextButton( - child: Text(TranslationBase.of(context).clickHere, style: TextStyle(fontSize: 12, color: Colors.blue, fontWeight: FontWeight.w400)), + child: Text(localize.clickHere, style: TextStyle(fontSize: 12, color: Colors.blue, fontWeight: FontWeight.w400)), onPressed: (){ - + Navigator.push( + context, + FadePage( + page: RRTAgreementPage())); } ), ) @@ -133,10 +178,10 @@ class RRTRequestPageState extends State{ } Widget paymentOptions()=> Container( - height: 30, - alignment: Alignment.center, - child: Image.asset("assets/payment_options/payment_options.png", fit: BoxFit.fill,) - ); + height: 30, + alignment: Alignment.center, + child: Image.asset("assets/payment_options/payment_options.png", fit: BoxFit.fill,) + ); Widget actionButtons(){ return Container( @@ -149,28 +194,46 @@ class RRTRequestPageState extends State{ color: Theme.of(context).appBarTheme.color, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ), onPressed: () { }, - child: Text(TranslationBase.of(context).cancel, style: TextStyle(color: Colors.white, fontSize: 13, letterSpacing: 1),), + child: Text(localize.cancel, style: TextStyle(color: Colors.white, fontSize: 13, letterSpacing: 1),), ), ), SizedBox(width: 20,), Expanded( child: MaterialButton( - height: 50, - color: Theme.of(context).appBarTheme.color, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ), - child: Text(TranslationBase.of(context).ok, style: TextStyle(color: Colors.white, fontSize: 13, letterSpacing: 1),), - onPressed: () { - Navigator.push( - context, - FadePage( - page: RRTRequestPickupAddressPage())); - }, + height: 50, + color: Theme.of(context).appBarTheme.color, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ), + child: Text(localize.ok, style: TextStyle(color: Colors.white, fontSize: 13, letterSpacing: 1),), + onPressed: () { + if(acceptTerms) + goToPickupAddress(); + else + AppToast.showErrorToast(message: localize.pleaseAcceptTerms); + } ), ) ], ), ); } + + goToPickupAddress()async{ + Navigator.push( + context, + FadePage(page: RRTRequestPickupAddressPage(servicePrice: widget.servicePrice,)) + ); + } + + + deleteOrder(PrescriptionsOrder order) async { + GifLoaderDialogUtils.showMyDialog(context); + var success = await viewModel.cancelOrder(order); + GifLoaderDialogUtils.hideDialog(context); + if(success) + setState(() { + widget.pendingOrders.remove(order); + }); + } } \ No newline at end of file diff --git a/lib/pages/login/forgot-password.dart b/lib/pages/login/forgot-password.dart index 0bc93081..30720401 100644 --- a/lib/pages/login/forgot-password.dart +++ b/lib/pages/login/forgot-password.dart @@ -144,7 +144,7 @@ class _ForgotPassword extends State { Navigator.of(context).pop(); AlertDialogBox( context: con, - confirmMessage: res['ReturnMessage'], + message: res['ReturnMessage'], okText: TranslationBase.of(con).ok, okFunction: () { AlertDialogBox.closeAlertDialog(con); diff --git a/lib/pages/login/register.dart b/lib/pages/login/register.dart index 1591d1d5..faac5fc8 100644 --- a/lib/pages/login/register.dart +++ b/lib/pages/login/register.dart @@ -256,7 +256,7 @@ class _Register extends State { // AppToast.showErrorToast(message: response['ErrorEndUserMessage']); AlertDialogBox( context: context, - confirmMessage: response['ErrorEndUserMessage'], + message: response['ErrorEndUserMessage'], okText: TranslationBase.of(context).ok, okFunction: () { AlertDialogBox.closeAlertDialog(context); @@ -276,7 +276,7 @@ class _Register extends State { //AppToast.showErrorToast(message: response); AlertDialogBox( context: context, - confirmMessage: response, + message: response, okText: TranslationBase.of(context).ok, okFunction: () { AlertDialogBox.closeAlertDialog(context); diff --git a/lib/services/pharmacy_services/pharmacyAddress_service.dart b/lib/services/pharmacy_services/pharmacyAddress_service.dart index 592359ca..7856a506 100644 --- a/lib/services/pharmacy_services/pharmacyAddress_service.dart +++ b/lib/services/pharmacy_services/pharmacyAddress_service.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart'; @@ -10,12 +12,14 @@ class PharmacyAddressService extends BaseService { CountryData country; int selectedAddressIndex = 0; - Future getAddresses() async { + Future> getAddresses() async { var customerId = await sharedPref.getString(PHARMACY_CUSTOMER_ID); Map queryParams = {'fields': 'addresses'}; hasError = false; Addresses selectedAddress; try { + var completer = Completer(); + await baseAppClient.getPharmacy("$GET_CUSTOMERS_ADDRESSES$customerId", onSuccess: (dynamic response, int statusCode) async { addresses.clear(); @@ -33,13 +37,19 @@ class PharmacyAddressService extends BaseService { addresses.add(address); index++; }); + completer.complete(); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, queryParams: queryParams); - } catch (error) { + + await completer.future; + + } catch (error){ throw error; } + + return addresses; } Future getCountries(String countryName) async { diff --git a/lib/uitl/HMGNetworkConnectivity.dart b/lib/uitl/HMGNetworkConnectivity.dart index c4044573..213f9b46 100644 --- a/lib/uitl/HMGNetworkConnectivity.dart +++ b/lib/uitl/HMGNetworkConnectivity.dart @@ -76,7 +76,7 @@ class HMGNetworkConnectivity { AlertDialogBox( context: context, okText: translator.ok, - confirmMessage: message, + message: message, okFunction: () { AlertDialogBox.closeAlertDialog(context); }).showAlertDialog(context); diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 9127f582..b37932f2 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1166,8 +1166,14 @@ class TranslationBase { String get taxAmount => localizedValues['TaxAmount'][locale.languageCode]; String get totalAmountPayable => localizedValues['TotalAmountPayable'][locale.languageCode]; String get iAcceptTermsConditions => localizedValues['iAcceptTermsConditions'][locale.languageCode]; + String get somethingWentWrongTryLater => localizedValues['somethingWentWrongTryLater'][locale.languageCode]; String get youCanPayByTheFollowingOptions => localizedValues['YouCanPayByTheFollowingOptions'][locale.languageCode]; String get rrtService => localizedValues['rrtService'][locale.languageCode]; + String get rrtUserAgreementTitle => localizedValues['rrtUserAgreementTitle'][locale.languageCode]; + String get rrtUserAgreementP1 => localizedValues['rrtUserAgreementP1'][locale.languageCode]; + String get rrtUserAgreementP2 => localizedValues['rrtUserAgreementP2'][locale.languageCode]; + String get rrtUserAgreementP3 => localizedValues['rrtUserAgreementP3'][locale.languageCode]; + String get rrtOrderSuccessMessage => localizedValues['rrtOrderSuccessMessage'][locale.languageCode]; String get billAmount => localizedValues['bill-amount'][locale.languageCode]; String get transportMethod => localizedValues['transport-method'][locale.languageCode]; diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index d73bf6e8..9759ef5c 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -501,7 +501,7 @@ class Utils { } else { AlertDialogBox( context: context, - confirmMessage: + message: "Please login with your account first to use this feature", okText: "OK", okFunction: () { diff --git a/lib/widgets/dialogs/alert_dialog.dart b/lib/widgets/dialogs/alert_dialog.dart index 81507326..be202fd9 100644 --- a/lib/widgets/dialogs/alert_dialog.dart +++ b/lib/widgets/dialogs/alert_dialog.dart @@ -5,24 +5,29 @@ import 'package:flutter/material.dart'; class AlertDialogBox { final BuildContext context; - final confirmMessage; + final title; + final message; final okText; final Function okFunction; AlertDialogBox( {@required this.context, - @required this.confirmMessage, + this.title, + @required this.message, @required this.okText, @required this.okFunction}); - showAlertDialog(BuildContext context) { + showAlertDialog({BuildContext context}) { Widget continueButton = - FlatButton(child: Text(this.okText), onPressed: this.okFunction); + FlatButton(child: Text(this.okText), onPressed: (){ + this.okFunction(); + closeAlertDialog(context); + }); // set up the AlertDialog AlertDialog alert = AlertDialog( - title: Text(TranslationBase.of(context).confirm), - content: Text(this.confirmMessage), + title: Text(title ?? TranslationBase.of(context).confirm), + content: Text(this.message), actions: [ continueButton, ], @@ -31,7 +36,7 @@ class AlertDialogBox { // show the dialog showDialog( barrierDismissible: false, - context: context, + context: this.context, builder: (BuildContext context) { return alert; },