From bbd953ae43cf5c49d3ec8df0e370d10ae653c1cf Mon Sep 17 00:00:00 2001 From: Zohaib Iqbal Kambrani <> Date: Tue, 19 Jan 2021 11:41:55 +0300 Subject: [PATCH] Order Delivery Driver tracking [inprogress] --- .../map_markers/destination_map_marker.png | Bin 0 -> 4974 bytes assets/images/map_markers/driver-pin.png | Bin 0 -> 13918 bytes .../images/map_markers/source_map_marker.png | Bin 0 -> 5311 bytes lib/config/config.dart | 4 +- lib/config/localized_values.dart | 5 + lib/core/model/pharmacies/order_model.dart | 28 ++- lib/pages/pharmacy/order/Order.dart | 17 +- lib/pages/pharmacy/order/OrderDetails.dart | 177 ++++++++------- lib/pages/pharmacy/order/TrackDriver.dart | 211 ++++++++++++++++++ lib/uitl/translations_delegate_base.dart | 1 + pubspec.yaml | 4 +- 11 files changed, 356 insertions(+), 91 deletions(-) create mode 100644 assets/images/map_markers/destination_map_marker.png create mode 100644 assets/images/map_markers/driver-pin.png create mode 100644 assets/images/map_markers/source_map_marker.png create mode 100644 lib/pages/pharmacy/order/TrackDriver.dart diff --git a/assets/images/map_markers/destination_map_marker.png b/assets/images/map_markers/destination_map_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4eca3531d475b04944fc5341f98cd910e313eb GIT binary patch literal 4974 zcmV-!6OrtRP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000P?Nkl6anGbppBJLhR60z+83I0M`JCEUz^H{1<2eo&mN19i}_LWKffUPXnI< zl0IHH0aU7EvHCX`cpP{Pc*#U(6d3r!Sp+->900!WGo(u?soFXKY*jWC#-J`#F>r?( zKQ^fDEfInp31E)0VUM!uZ80e6m|KB;K!fUzOi`t>X}_{Dk*}btfmYzxz(j+`%8AOx z7GQclfhqzX1pWog!XC{A+JFbb7{7uBb+!6se$ApsgQ1h1ud92wI;x;*f#-n_V!s?< zhq|Xof%*c_2$T^WjRhJ-GIdu}Kz$EbZQwJTU;g`1&+eBaA5y{jVTS3(W z%g7%s6Uo#MZ3A@=a4-3%6(X5hZVRY|z)JF0t3)!j&~#8$zL*Mma<^-wA*JiY(KBpZ;?n8*_Wj#wV2p5`j6>Dy7&R@Dkd|I` zNk{;r#uZUl@9Wb@G4g9kZIg+qk%YATU6=iT71Kug-LzIv*G8_p%K(xlX$4i44`b5B z)O)JmZxg2J1XYobkN}=rbI5NqCg_}=Tff67(=jPst!q2@+pk{s+muqB5mlOxkhZKk zsKcBXlwT7EjgYj1D#@2Isdb%JNS=M^b&NV=9i%L}yOxFyo_XY;Zqu~BJwF+BNUduF zf#lhjUL)$54vWWKQ$kfu8AT-p9Nu|?1Ka)=#W889Ue^igRllvBapRTDySI{((({{1 z+cqEJk77T4X9og}qyQlS9MTEO*E@ON%@de^-@8c+*$n;Oo5oXAT)@-cXs5q#Kz}5y z3mg*2Y&F`(sNH^9SvhmeMIjAp`uuVh+&_ha5eaXQyw2{{cCck-;E+6n@)}Xw{Ic=` ziz+S&X;9U*e_PZ>W7aki@LjXy{rwC zaGhRc4x^lP+`~SE>e_M^)K6waVZ!$AZcu%|e{@C^fG_XbALO18H=yo-C zkpSxICucmntFA3)eAN|9m^#u{NC5xvdV=SO60UO;nGn$z?QHJy99b39MqYNtXxPMI zsGimiN~zILt9Lbb(c}@9MH7b$ew)H|_F4&QFtYrH)zV;GBmw+Bo0GEp?8bFo0{*E3 zR-;d_TGs{k7Tl|z3=EXg&vo2|AKhT?*eaVhjocD%K}IMKN7B!laKsJ65okTclIr< zu$sH*>FUL~^_`5JbOk*}dfBo02s@j)Ooy}|cqG@0Bz&sKRtmHOuz&0kXJbK6iPyOyA` zm7kL3BAKN+4cy{)mlp&mfX}I4Sw85C!gZe4b#dLGx{*ayPDLEj?}Y0#=xiW}Drvir zrSqbyJ;3L6Hxg7iyYRCE@&S-8%>gJ>*BP^Z**)g2K~ z%YZ)z)mYG#JohSCwm%F%2>c?*2E!=1`WN6fS z3S=g(593pMpR{MUd1y$*kk6n%zHj>o@FyRx)rBm!wbhoJw+R%;FB|KC$8vmDn+>$t zbmO*x8hmT87pJ8T}0E~ftv0FvFXP!wG5>;M1&07*qoM6N<$f`0-`-v9sr literal 0 HcmV?d00001 diff --git a/assets/images/map_markers/driver-pin.png b/assets/images/map_markers/driver-pin.png new file mode 100644 index 0000000000000000000000000000000000000000..9d16ceca4edf852f6c6e969dce7a63342a332073 GIT binary patch literal 13918 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 X{s0vkKK?KU0ihtHD%~h)9`^qMzf|}` literal 0 HcmV?d00001 diff --git a/assets/images/map_markers/source_map_marker.png b/assets/images/map_markers/source_map_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..4b493b097b087a641bfbadb013f4a59935c7f394 GIT binary patch literal 5311 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 R8VCRY002ovPDHLkV1k@%_;3IK literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index 4315f13c..795da85b 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -12,8 +12,8 @@ const EXA_CART_API_BASE_URL = 'https://mdlaboratories.com/exacartapi'; const PACKAGES_CATEGORIES = '/api/categories'; const PACKAGES_PRODUCTS = '/api/products'; -// const BASE_URL = 'https://uat.hmgwebservices.com/'; -const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; +// const BASE_URL = 'https://hmgwebservices.com/'; //const BASE_PHARMACY_URL = 'http://swd-pharapp-01:7200/api/'; const BASE_PHARMACY_URL = 'https://uat.hmgwebservices.com/epharmacy/api/'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 387dbcb1..b103825c 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1449,4 +1449,9 @@ const Map localizedValues = { "en": "View List of Children", "ar": "عرض قائمة الأطفال" }, + + "trackDeliveryDriver": { + "en": "Track Delivery Driver", + "ar": "trackDeliveryDriver" + }, }; diff --git a/lib/core/model/pharmacies/order_model.dart b/lib/core/model/pharmacies/order_model.dart index 027d1f81..c0a12caa 100644 --- a/lib/core/model/pharmacies/order_model.dart +++ b/lib/core/model/pharmacies/order_model.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:diplomaticquarterapp/core/model/pharmacies/PharmacyImageObject.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; List orderModelFromJson(String str) => List.from(json.decode(str).map((x) => OrderModel.fromJson(x))); @@ -306,7 +307,22 @@ class IngAddress { String customerAttributes; DateTime createdOnUtc; dynamic province; - LatLong latLong; + String latLong; + + LatLng getLocation(){ + if(latLong.contains(',')){ + var parts = latLong.trim().split(','); + if(parts.length == 2){ + var lat = double.tryParse(parts.first); + var lng = double.tryParse(parts.last); + if(lat != null || lng != null) { + var location = LatLng(lat, lng); + return location; + } + } + } + return null; + } factory IngAddress.fromJson(Map json) => IngAddress( id: json["id"], @@ -326,7 +342,7 @@ class IngAddress { customerAttributes: json["customer_attributes"], createdOnUtc: DateTime.parse(json["created_on_utc"]), province: json["province"], - latLong: latLongValues.map[json["lat_long"]], + latLong: json["lat_long"], ); Map toJson() => { @@ -347,7 +363,7 @@ class IngAddress { "customer_attributes": customerAttributes, "created_on_utc": createdOnUtc.toIso8601String(), "province": province, - "lat_long": latLongValues.reverse[latLong], + "lat_long": latLong, }; } @@ -491,9 +507,9 @@ class OrderModelCustomer { isSystemAccount: json["is_system_account"], systemName: json["system_name"], lastIpAddress: lastIpAddressValues.map[json["last_ip_address"]], - createdOnUtc: DateTime.parse(json["created_on_utc"]), - lastLoginDateUtc: DateTime.parse(json["last_login_date_utc"]), - lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]), + createdOnUtc: (json["created_on_utc"] != null) ? DateTime.parse(json["created_on_utc"]) : null, + lastLoginDateUtc: (json["created_on_utc"] != null) ? DateTime.parse(json["last_login_date_utc"]) : null, + lastActivityDateUtc: (json["created_on_utc"] != null) ? DateTime.parse(json["last_activity_date_utc"]) : null, registeredInStoreId: json["registered_in_store_id"], roleIds: List.from(json["role_ids"].map((x) => x)), ); diff --git a/lib/pages/pharmacy/order/Order.dart b/lib/pages/pharmacy/order/Order.dart index 576bf2a0..5bb4ea42 100644 --- a/lib/pages/pharmacy/order/Order.dart +++ b/lib/pages/pharmacy/order/Order.dart @@ -924,6 +924,7 @@ class _OrderPageState extends State with SingleTickerProviderStateMix } Widget getCancelledOrder(OrderModelViewModel model){ + for(int i=0 ; i< model.order.length; i++){ if( model.order[i].orderStatusId == 40 || model.order[i].orderStatusId == 996 || model.order[i].orderStatusId == 200){ @@ -1136,13 +1137,17 @@ class _OrderPageState extends State with SingleTickerProviderStateMix ), ), ); - } + int test = Test()["1"]; + } } - - - - - +class Test{ + static const values = { + "1":1, + "2":2, + "3":3 + }; + int operator [](String key) => values[key]; +} \ No newline at end of file diff --git a/lib/pages/pharmacy/order/OrderDetails.dart b/lib/pages/pharmacy/order/OrderDetails.dart index 5438663d..d5d064a7 100644 --- a/lib/pages/pharmacy/order/OrderDetails.dart +++ b/lib/pages/pharmacy/order/OrderDetails.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/order_model_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/pharmacy/order/Order.dart'; +import 'package:diplomaticquarterapp/pages/pharmacy/order/TrackDriver.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -46,6 +47,7 @@ class _OrderDetailsPageState extends State { var model; var isCancel = false; var isRefund = false; + var isActiveDelivery = true; var dataIsCancel; var dataIsRefund; @@ -105,9 +107,9 @@ class _OrderDetailsPageState extends State { color: getStatusBackgroundColor(), borderRadius: BorderRadius.circular(30.0)), child: Text( - languageID == "ar" - ? widget.orderModel.orderStatusn.toString(): - widget.orderModel.orderStatus.toString().substring(12) , + languageID == "ar" + ? widget.orderModel.orderStatusn.toString(): + widget.orderModel.orderStatus.toString().substring(12) , // TranslationBase.of(context).delivered, style: TextStyle( color: Colors.white, @@ -125,8 +127,8 @@ class _OrderDetailsPageState extends State { children: [ Text( widget.orderModel.shippingAddress.firstName - .toString() - .substring(10) + + .toString() + .substring(10) + ' ' + widget.orderModel.shippingAddress.lastName .toString() @@ -141,18 +143,18 @@ class _OrderDetailsPageState extends State { Container( margin: EdgeInsets.fromLTRB(10.0, 5.0, 1.0, 5.0), child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.orderModel.shippingAddress.address1 - .toString() - .substring(9), - style: TextStyle( - fontSize: 10.0, - fontWeight: FontWeight.bold, - color: Colors.grey, - ), - ),] + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.orderModel.shippingAddress.address1 + .toString() + .substring(9), + style: TextStyle( + fontSize: 10.0, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ),] ), ), Container( @@ -162,8 +164,8 @@ class _OrderDetailsPageState extends State { children: [ Text( widget.orderModel.shippingAddress.address2 - .toString() - .substring(9) + + .toString() + .substring(9) + ' ' + widget.orderModel.shippingAddress.country .toString() + @@ -231,7 +233,7 @@ class _OrderDetailsPageState extends State { Container( child: flutterImage.Image.asset( widget.orderModel.shippingRateComputationMethodSystemName != - "Shipping.Aramex" + "Shipping.Aramex" ? "assets/images/pharmacy_module/payment/LogoParmacyGreen.png" : "assets/images/pharmacy_module/payment/aramex_shipping_logo.png", fit: BoxFit.contain, @@ -320,19 +322,19 @@ class _OrderDetailsPageState extends State { physics: ScrollPhysics(), itemCount:widget.orderModel.orderItems.length, itemBuilder: (context, index){ - return Container( - child: productTile(productName: widget.orderModel.orderItems[index].product.name.toString(), - productPrice: widget.orderModel.orderItems[index].product.price.toString(), - productRate: widget.orderModel.orderItems[index].product.approvedRatingSum.toDouble(), - productReviews:widget.orderModel.orderItems[index].product.approvedTotalReviews, - totalPrice: "${(widget.orderModel.orderItems[index].product.price - * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", - qyt: widget.orderModel.orderItems[index].quantity.toString(), - isOrderDetails:true, - imgs: widget.orderModel.orderItems[index].product.images != null && - widget.orderModel.orderItems[index].product.images.length != 0 - ? widget.orderModel.orderItems[index].product.images [0].src.toString() - : null, + return Container( + child: productTile(productName: widget.orderModel.orderItems[index].product.name.toString(), + productPrice: widget.orderModel.orderItems[index].product.price.toString(), + productRate: widget.orderModel.orderItems[index].product.approvedRatingSum.toDouble(), + productReviews:widget.orderModel.orderItems[index].product.approvedTotalReviews, + totalPrice: "${(widget.orderModel.orderItems[index].product.price + * widget.orderModel.orderItems[index].quantity).toStringAsFixed(2)}", + qyt: widget.orderModel.orderItems[index].quantity.toString(), + isOrderDetails:true, + imgs: widget.orderModel.orderItems[index].product.images != null && + widget.orderModel.orderItems[index].product.images.length != 0 + ? widget.orderModel.orderItems[index].product.images [0].src.toString() + : null, status: widget.orderModel.orderStatusId, product: widget.orderModel.orderItems[index].product, ), @@ -510,58 +512,81 @@ class _OrderDetailsPageState extends State { ), widget.orderModel.orderStatusId == 10 ? InkWell( - onTap: () { - model.makeOrder(); - }, - child: Container( + onTap: () { + model.makeOrder(); + }, + child: Container( // margin: EdgeInsets.only(top: 20.0), - height: 50.0, - color: Colors.transparent, - child: Container( - padding: EdgeInsets.only(left: 130.0, right: 130.0), - decoration: BoxDecoration( - border: Border.all( - color: Colors.green, - style: BorderStyle.solid, - width: 4.0), - color: Colors.green, - borderRadius: BorderRadius.circular(5.0)), - child: Center( - child: Text( - TranslationBase.of(context).payOnline, - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - ), - ), - ), + height: 50.0, + color: Colors.transparent, + child: Container( + padding: EdgeInsets.only(left: 130.0, right: 130.0), + decoration: BoxDecoration( + border: Border.all( + color: Colors.green, + style: BorderStyle.solid, + width: 4.0), + color: Colors.green, + borderRadius: BorderRadius.circular(5.0)), + child: Center( + child: Text( + TranslationBase.of(context).payOnline, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, ), ), - ) + ), + ), + ), + ) : Container(), // getCancelOrder(canCancel, canRefund), isCancel ? InkWell( - onTap: () { - presentConfirmDialog(model, - widget.orderModel.id); //(widget.orderModel.id)); + onTap: () { + presentConfirmDialog(model, + widget.orderModel.id); //(widget.orderModel.id)); // - }, - child: Container( + }, + child: Container( // padding: EdgeInsets.only(left: 13.0, right: 13.0, top: 5.0), - height: 50.0, - color: Colors.transparent, - child: Center( - child: Text( - TranslationBase.of(context).cancelOrder, - style: TextStyle( - color: Colors.red[900], - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline), - ), - ), - ), - ) + height: 50.0, + color: Colors.transparent, + child: Center( + child: Text( + TranslationBase.of(context).cancelOrder, + style: TextStyle( + color: Colors.red[900], + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline), + ), + ), + ), + ) + : Container(), + isActiveDelivery + ? InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => TrackDriver(order: widget.orderModel), + )); + }, + child: Container( + height: 50.0, + color: Colors.transparent, + child: Center( + child: Text( + TranslationBase.of(context).trackDeliveryDriver, + style: TextStyle( + color: Colors.green[900], + fontWeight: FontWeight.normal, + decoration: TextDecoration.none), + ), + ), + ), + ) : Container(), ], ), diff --git a/lib/pages/pharmacy/order/TrackDriver.dart b/lib/pages/pharmacy/order/TrackDriver.dart new file mode 100644 index 00000000..b9a8056f --- /dev/null +++ b/lib/pages/pharmacy/order/TrackDriver.dart @@ -0,0 +1,211 @@ +import 'dart:async'; + +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/pharmacies/order_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_polyline_points/flutter_polyline_points.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:location/location.dart'; + + +class TrackDriver extends StatefulWidget { + final OrderModel order; + TrackDriver({this.order}); + + @override + State createState() => _TrackDriverState(); +} + +class _TrackDriverState extends State { + OrderModel _order; + + Completer _controller = Completer(); + + + double CAMERA_ZOOM = 16; + double CAMERA_TILT = 0; + double CAMERA_BEARING = 30; + LatLng SOURCE_LOCATION = null; + LatLng DEST_LOCATION = null; + + // for my drawn routes on the map + Set _polylines = Set(); + List polylineCoordinates = []; + PolylinePoints polylinePoints; + + Set _markers = Set(); + + BitmapDescriptor sourceIcon; // for my custom marker pins + BitmapDescriptor destinationIcon; // for my custom marker pins + Location location;// wrapper around the location API + + @override + void initState() { + _order = widget.order; + DEST_LOCATION = _order.shippingAddress.getLocation(); + location = new Location(); + polylinePoints = PolylinePoints(); + setSourceAndDestinationIcons(); + } + + @override + Widget build(BuildContext context) { + return new Scaffold( + body: GoogleMap( + myLocationEnabled: true, + compassEnabled: true, + markers: _markers, + polylines: _polylines, + mapType: MapType.normal, + initialCameraPosition: _orderDeliveryLocationCamera(), + onMapCreated: (GoogleMapController controller) { + _controller.complete(controller); + showPinsOnMap(); + }, + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: _goToDriver, + label: Text('To the lake!'), + icon: Icon(Icons.directions_boat), + ), + ); + } + + + void setSourceAndDestinationIcons() async { + sourceIcon = await BitmapDescriptor.fromAssetImage( + ImageConfiguration(devicePixelRatio: 2.5), + 'assets/images/map_markers/source_map_marker.png'); + + destinationIcon = await BitmapDescriptor.fromAssetImage( + ImageConfiguration(devicePixelRatio: 2.5), + 'assets/images/map_markers/destination_map_marker.png'); + } + + CameraPosition _orderDeliveryLocationCamera(){ + + final CameraPosition orderDeliveryLocCamera = CameraPosition( + bearing: CAMERA_BEARING, + target: DEST_LOCATION, + tilt: CAMERA_TILT, + zoom: CAMERA_ZOOM); + return orderDeliveryLocCamera; + } + + CameraPosition _driverLocationCamera(){ + final CameraPosition driverLocCamera = CameraPosition( + bearing: CAMERA_BEARING, + target: SOURCE_LOCATION, + tilt: CAMERA_TILT, + zoom: CAMERA_ZOOM); + return driverLocCamera; + } + + + Future _goToOrderDeliveryLocation() async { + final GoogleMapController controller = await _controller.future; + final CameraPosition orderDeliveryLocCamera = _orderDeliveryLocationCamera(); + controller.animateCamera(CameraUpdate.newCameraPosition(orderDeliveryLocCamera)); + } + + Future _goToDriver() async { + final GoogleMapController controller = await _controller.future; + final CameraPosition driverLocCamera = _driverLocationCamera(); + controller.animateCamera(CameraUpdate.newCameraPosition(driverLocCamera)); + } + + + Future _fitCameraBetweenBothPoints() async { + final GoogleMapController controller = await _controller.future; + final CameraPosition driverLocCamera = CameraPosition( + bearing: CAMERA_BEARING, + target: SOURCE_LOCATION, + tilt: CAMERA_TILT, + zoom: CAMERA_ZOOM); + controller.animateCamera(CameraUpdate.newCameraPosition(driverLocCamera)); + } + + void showPinsOnMap() { + // source pin + if(SOURCE_LOCATION != null){ + setState(() { + var pinPosition = SOURCE_LOCATION; + _markers.add(Marker( + markerId: MarkerId('sourcePin'), + position: pinPosition, + icon: sourceIcon + )); + }); + } + + // destination pin + if(DEST_LOCATION != null){ + setState(() { + var destPosition = DEST_LOCATION; + _markers.add(Marker( + markerId: MarkerId('destPin'), + position: destPosition, + icon: destinationIcon + )); + }); + } + // set the route lines on the map from source to destination + // for more info follow this tutorial + // drawRoute(); + } + + void updatePinOnMap() async { + // create a new CameraPosition instance + // every time the location changes, so the camera + // follows the pin as it moves with an animation + CameraPosition cPosition = CameraPosition( + zoom: CAMERA_ZOOM, + tilt: CAMERA_TILT, + bearing: CAMERA_BEARING, + target: SOURCE_LOCATION, + ); + final GoogleMapController controller = await _controller.future; + controller.animateCamera(CameraUpdate.newCameraPosition(cPosition)); + // do this inside the setState() so Flutter gets notified + // that a widget update is due + setState(() { + // updated position + var pinPosition = SOURCE_LOCATION; + + // the trick is to remove the marker (by id) + // and add it again at the updated location + _markers.removeWhere((m) => m.markerId.value == 'sourcePin'); + _markers.add(Marker( + markerId: MarkerId('sourcePin'), + position: pinPosition, // updated position + icon: sourceIcon + )); + }); + } + + void drawRoute() async { + return; // Ignore draw Route + + List result = await polylinePoints.getRouteBetweenCoordinates( + GOOGLE_API_KEY, + SOURCE_LOCATION.latitude, + SOURCE_LOCATION.longitude, + DEST_LOCATION.latitude, + DEST_LOCATION.longitude); + if(result.isNotEmpty){ + result.forEach((PointLatLng point){ + polylineCoordinates.add( + LatLng(point.latitude,point.longitude) + ); + }); + setState(() { + _polylines.add(Polyline( + width: 5, // set the width of the polylines + polylineId: PolylineId('poly'), + color: Color.fromARGB(255, 40, 122, 198), + points: polylineCoordinates + )); + }); + } + } +} \ No newline at end of file diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 63cf8a44..954af3b9 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -550,6 +550,7 @@ class TranslationBase { localizedValues['Prescriptions'][locale.languageCode]; String get history => localizedValues['History'][locale.languageCode]; String get orderNo => localizedValues['OrderNo'][locale.languageCode]; + String get trackDeliveryDriver => localizedValues['trackDeliveryDriver'][locale.languageCode]; String get orderDetails => localizedValues['OrderDetails'][locale.languageCode]; String get vitalSign => localizedValues['VitalSign'][locale.languageCode]; diff --git a/pubspec.yaml b/pubspec.yaml index 785e831d..24589cbb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -82,7 +82,8 @@ dependencies: google_maps_flutter: ^1.0.3 - + flutter_polyline_points: ^0.1.0 + location: ^2.3.5 # Qr code Scanner barcode_scan_fix: ^1.0.2 @@ -183,6 +184,7 @@ flutter: # assets: assets: - assets/images/ + - assets/images/map_markers/ - assets/images/pharmacy/ - assets/images/medical/ - assets/images/new-design/