From 252a4c04861e2df93c0c49c82f07b5fbd6f9006b Mon Sep 17 00:00:00 2001 From: Sneha Date: Fri, 7 Nov 2025 15:03:57 +0530 Subject: [PATCH] map radius --- .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 976 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 2227 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1143 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 2508 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 1507 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 3195 bytes ios/Runner/Resources/InfoPlist.strings | 1 + lib/profile/service_location.dart | 582 ++++++++++-------- lib/profile/service_locations_radius.dart | 147 +++++ 9 files changed, 472 insertions(+), 258 deletions(-) create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 ios/Runner/Resources/InfoPlist.strings create mode 100644 lib/profile/service_locations_radius.dart diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec571981432b7327b777dcf6098ee5da4678925 GIT binary patch literal 976 zcmV;>126oEP)N(H5G!Og|9|U7J?v04$Dv!b-A2} z4#^h2AO%?f0F6eCq9}vGxNb5fCyQfaV?&?S+}zyS(lU4K@p$w)om!&_an{VtOhJA= z(KIyF@7=dgC=`Y=tE$S}+xvxR006l;SE}#bU&y<^psca6F_XzO-*GaTrSr=ISH{?H%dwn1mW>`!OLoDYP8vGM8n~5iVTJ)PaYQ=jS~|SQBhHQ zBogfBW)`F@pU-zqs|}Dc+2MhK0gYNccj|OHOK;t>zO|O!z8xMO9*nH=J9h>L2Z<&o zCT9PE127Epcsv9_{Jy=ttx&I1s>21Tbsqw z5Fj(NvX~I$d8WaJJHixC&u5-*ZEe9Y%s;_yw?DL4#3?C@l7-`VZf;J%AD+a-M3HC% z>UcNPQOjTe-!S)?H<{mV~S@m^wU0q#7!;Xl^QmO!sc^_S1 zFlKY7Uuu`E-+ki5$)?6em&@g!IWjU*QBf|JD=5yI{bJGU0;EE&;BvXX_tn@?`!D5l zPrt}pu`BP`@#Fr@Vve%X(zG;bbaXV8StTXcM@L7AMj%*sFe3x_+|$pm68*RL)k{Pf zQt94?`ufh!PQRa;nlc&;7cX6+EUT}tucEx1XyW7J^@T++40{?c1NYb8W&_-7QE_B- z#$wZ{QzzT(cK^tO2lvy{(^s!qLrvDu(9lu297RzU#EOiJ8sp^(XB;+}El(&bCH zo}PaRKJsbhDt=|9*=Bp!(b4I0j$;_kVzC_k{gh>G{KP1$n* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..42c9a9a0a86607a6547443542e58171e21454ab6 GIT binary patch literal 2227 zcmb_e`9BkmAEsn-4>=N1NF_HpKCUH4etX`(JkR^}PPMTz<>5Tf$-=_IV{T?_ccRe$ljGFM{2O=b zGz$wyq`9$?!{fsBf@m8dszm=DD>fi;VgbNA%7HrsoG&5CO(H75VMkb1R1Ofp9 zO`R1`7{R-$%}^d*Udids`p(XaMlan;gWtCD5TtQr~ z_ZHeTE12_P66j({kwuQ8hPS+4E@UcAL}|>h6K!PBwCu@I_86EJzt> zYip9!1x=8I)+p`HswyfEufp}~yL)>P&P~Y)Hf*^jQ=JEgYD$o(CLa~#e zyW!_u+!XIA=8RO1b$5FwHZ>I$NhEfyY;1JS&mQd1#t-Z2yc?%SMzRjd$Ccx2D=RBs zya;>-yRWG$qpmI`6-=+??@>-QevQf>w6@yb+;nd6WbN~+^1AOL|Dsqo$I#gqfhd;c z*V56UIi2I|`%N`a6CLVH6VcVyJ{ua^)O03Camm<360N^2gGV{KxNJ3`6C2hR3Gzi4 z0H0)eRTbsvJ3#0*kWEERE%ebN$_Ju>yu21z>Lqarg+iH}%@hTrK&58ZYSZqyU*@{H z$bRkdvO=7H2}kofj7m za&!cu)^~Q@KW*z#aBto?n!(|xQW9eajt=Y2oXOeyMKQIr`zKx60zKN>-zR_?E-^4r zP>7-n$Nr`Kz~0lNPHmzYz$>Z5D{EBkkP_=#4 zvGD}bR$j>bAB1YjTgm~$Mllcy)w-^RY#1Vu5Z_j5T*(3N$E@&e44*w1i6nl~KJoMC zH~H#oY61`lNN0?mIcE3PCxv)J6E2?wHuIqikwYIf|CV{$Dp8`^>n}fdH@EMd|dZ4eV;CORsn7l*X`pn>kK;~eu ziv7fsK0Y@t`|`!`HEuN?+y#>k^NYc=(BlO;2y~h%pC6M%&0*)H#I;o+aJ=_D<*F z&Ps3154;C(eQ}jHfN+kHd}K-9s)QRFdWP7JBCl9)0)*1)e^Hu)`d*w167eu_AVf}T z#N2TfmIOA!M=w!ut##h-u`#m3Z#UGcbD~ z^3V3teS}EN(edF^2HOfsW%v1yFPI2~t?6 zy6r87a9ZDfqJ_-sd^&yp>EpQm{zRyYYn`U1rjx}^L33lHcC=2Ux1-B&S9YS-?qH-o zxeKWu8^wrNgfAB9MwHuKJz?PwAP-3$>puHKk*q`7f6_Dd3T>Ver@fU zj+hu3{nab>PQJc!$Le26Bt<#R@E&$*>W!L>5p=Wx=^^t~khOEtzh!wY(j2(x!;24U zACL-D@icorK0c2@Lf(p8hh8~>zPgI7Zt;b|lFF)0&|+BQ_u(?~7ffn&m5i!Q|OivSCVt({Z?wdPoTuK(k-osV151wNA@31h>jb*(Sm7N=K@{F*U-?lP-2l7n# EANM9h{{R30 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..44035992219d0af6709b1784058664236fb5bad7 GIT binary patch literal 1143 zcmV--1c>{IP)PG2;cHr;epTC3FRnpUt1 zSgp&twL-Vqbn5g-I$O{eHkxfgZ0ZYF=}g?z4Kc>06y*@OyRBJb$YHZs?lep8`;PDP z-1GZ{+;IsIj^p5e66l}-dkAf%CbX5B&{k?fTd4_cr6#nMn$T8iLcZ1O^_tD*oSdAL zloWDLCf}-3)lW@M^7(uiHpj)slXx=8)<=&frY0u=09#vIox0AhuInToPNp>w2y}LI z?0g&_8?)JLB9Vx!^U1W{?eAY&S_*C2wVI*tharfZDWq99Ha2eF{DM#}EG!HT4k(r7 zq>LcV+SAj$xw#qMf8N_GlgR`EVdNvovChxW!y_ZRF1g+A8$CBJwX{S&g#;^(k@~<0RZ^@eyvtxy7M)I!H8r~q*kBLr`PGj z`;3f?^9>E@=@|?L!{KlkjeS;&rKq?#l39^jO(x^&s*_Nrrl$58O}{>Sc2TW%xm*be z337SaUmF`3hB2AUgR!o!uN(XN!uyNO&C@npP0c4LiUI)a_GuU%DJd;ICY2tTwWqrq zK@dVIl}e8u&FZ*z?O*6lez*VU^403TIV!SIO3 z;|X1bVYonYEH5u_U#&QfYumNq|A#7-<%x-j005y-SXEuE*Xalw+S;y)L?RxKw|~|L z4@PI7JRy_IX#l|X%r~4P%JT9L2L=ZISXl|(v+8u-y7g6U?Wg->MG(ZG-{p7e z%$bj)qoYyRQ)ILmph2$aluC83?ktgY$7GVfFON@1*bi&p?b~Z>YlJd6IazV?B#z^V zr4`_)Z$ig@>x4ui$8-mr>x|uQwOR>fR8-W3#-^8#)X!gH&qJOh97Qax z{K|ov+FFa{A>sFHc6N4rd|WD(Qes6>w7p$RDF69lKD&H5HZ~S};qp!O5>|u1{TOgq zVh$HyYH4jae~z$vy~~iFpU-Bq$+wOS4?7%=&?Y7(rb(?XDk{ct+&iiU0dM$K$io)s z&^t1j48u^ZM&ow7cb1lym%qDrucES&d@F~`sjIIK27*i`lh5ZLN=nMg%Hndl008Xy z3KW+P#ij3hA?liACcRryQd&?TnVz;SE-rdrcrXlOu~-ZyHTUcB<0oFV#1g*A5}*Cg z6L>tHSez#o@9#VIKtfxo32mh&w3V9BR%$|9sR?bRCbX5B{0-u1pck}CzEl7J002ov JPDHLkV1n>TG|m73 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0998d4a643c4c2246be0655142092ffe328f3289 GIT binary patch literal 2508 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 JPDHLkV1h4g?6v>^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80fa48830766f8c6d0cce5eae02663d299902d6c GIT binary patch literal 3195 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 A$^ZZW literal 0 HcmV?d00001 diff --git a/ios/Runner/Resources/InfoPlist.strings b/ios/Runner/Resources/InfoPlist.strings new file mode 100644 index 0000000..8a0f810 --- /dev/null +++ b/ios/Runner/Resources/InfoPlist.strings @@ -0,0 +1 @@ +"CFBundleDisplayName" = "Aquick Supplier"; \ No newline at end of file diff --git a/lib/profile/service_location.dart b/lib/profile/service_location.dart index deb10f8..5dd2703 100644 --- a/lib/profile/service_location.dart +++ b/lib/profile/service_location.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:supplier_new/common/settings.dart'; +import 'package:supplier_new/profile/service_locations_radius.dart'; import '../resources/source_loctaions_model.dart'; void main() => runApp(const MaterialApp(home: ServiceLocation())); @@ -15,13 +17,14 @@ class ServiceLocation extends StatefulWidget { class _ServiceLocationState extends State { final _formKey = GlobalKey(); String _deliveryFrom = 'business'; - final TextEditingController _radiusController = - TextEditingController(text: "10"); + final TextEditingController _radiusController = TextEditingController(text: "10"); bool _customizeEachSource = false; bool isLoading = false; int currentStep = 3; List sourceLocationsList = []; + // 🔹 Notifier for dynamic map radius + late final ValueNotifier _radiusKmNotifier; final List _services = [ "24/7 Emergency services", @@ -32,15 +35,31 @@ class _ServiceLocationState extends State { ]; final Set _selectedServices = {}; - final Map _expandedMap = {}; @override void initState() { super.initState(); + _radiusKmNotifier = ValueNotifier( + double.tryParse(_radiusController.text) ?? 10, + ); + + // 🔹 Listen to radius text changes + _radiusController.addListener(() { + final v = double.tryParse(_radiusController.text); + _radiusKmNotifier.value = (v == null || v.isNaN || v <= 0) ? 10 : v; + }); + _fetchSources(); } + @override + void dispose() { + _radiusController.dispose(); + _radiusKmNotifier.dispose(); + super.dispose(); + } + Future _fetchSources() async { setState(() => isLoading = true); try { @@ -76,290 +95,336 @@ class _ServiceLocationState extends State { child: isLoading ? const Center(child: CircularProgressIndicator()) : Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.fromLTRB(20, 10, 20, 24), - children: [ - Text("Step $currentStep/5", - style: fontTextStyle(16, Color(0xFFC3C4C4), FontWeight.w500)), - const SizedBox(height: 16), - Row( - children: List.generate(5, (index) { - final isFilled = index < currentStep; - return Expanded( - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 2), - height: 5, - decoration: BoxDecoration( - color: isFilled - ? const Color(0xFF0D3771) - : const Color(0xFFE6E6E6), - borderRadius: BorderRadius.circular(2), - ), - ), - ); - }), + key: _formKey, + child: ListView( + padding: const EdgeInsets.fromLTRB(20, 10, 20, 24), + children: [ + Text("Step $currentStep/5", + style: fontTextStyle( + 16, const Color(0xFFC3C4C4), FontWeight.w500)), + const SizedBox(height: 16), + Row( + children: List.generate(5, (index) { + final isFilled = index < currentStep; + return Expanded( + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 2), + height: 5, + decoration: BoxDecoration( + color: isFilled + ? const Color(0xFF0D3771) + : const Color(0xFFE6E6E6), + borderRadius: BorderRadius.circular(2), + ), ), + ); + }), + ), - const SizedBox(height: 16), + const SizedBox(height: 16), + + Text("SERVICE LOCATIONS", + style: fontTextStyle( + 20, const Color(0xFF515253), FontWeight.w600)), + const SizedBox(height: 16), + Align( + alignment: Alignment.centerLeft, + child: Image.asset('images/marker-pin.png', + width: 24, height: 24), + ), + const SizedBox(height: 16), + Text( + "Define where you want to provide delivery services", + style: fontTextStyle( + 14, const Color(0xFF939495), FontWeight.w500), + ), + const SizedBox(height: 16), - Text("SERVICE LOCATIONS", - style: fontTextStyle(20, Color(0xFF515253), FontWeight.w600)), + RadioListTile( + value: 'business', + groupValue: _deliveryFrom, + onChanged: (value) => + setState(() => _deliveryFrom = value ?? 'business'), + title: Text("From Business Location", + style: fontTextStyle( + 12, const Color(0xFF2D2E30), FontWeight.w400)), + dense: true, + contentPadding: EdgeInsets.zero, + visualDensity: + const VisualDensity(horizontal: 0, vertical: -3), + ), + RadioListTile( + value: 'source', + groupValue: _deliveryFrom, + onChanged: (value) => + setState(() => _deliveryFrom = value ?? 'source'), + title: Text("From Source Locations", + style: fontTextStyle( + 12, const Color(0xFF2D2E30), FontWeight.w400)), + dense: true, + contentPadding: EdgeInsets.zero, + visualDensity: + const VisualDensity(horizontal: 0, vertical: -3), + ), + + const SizedBox(height: 16), + + // 🔹 BUSINESS LOCATION SECTION + Visibility( + visible: _deliveryFrom == 'business', + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Delivery Radius (in Kms) *", + style: fontTextStyle( + 12, const Color(0xFF2F3036), FontWeight.w600)), const SizedBox(height: 16), - Align( - alignment: Alignment.centerLeft, - child: Image.asset('images/marker-pin.png', - width: 24, height: 24), + TextFormField( + controller: _radiusController, + keyboardType: TextInputType.number, + decoration: InputDecoration( + hintText: "Enter radius in kms", + hintStyle: fontTextStyle( + 14, const Color(0xFF939495), FontWeight.w400), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 12), + ), ), const SizedBox(height: 16), - Text( - "Define where you want to provide delivery services", - style: fontTextStyle(14, Color(0xFF939495), FontWeight.w500), + Container( + width: double.infinity, + height: 220, // 👈 small map fits neatly + decoration: BoxDecoration( + border: Border.all(color: const Color(0xFFE6E6E6)), + borderRadius: BorderRadius.circular(8), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: ServiceLocationsRadiusScreen( + initialPosition: const LatLng(17.381597, 78.481791), + radiusKmListenable: _radiusKmNotifier, + ), + ), ), - const SizedBox(height: 16), + ], + ), + ), - RadioListTile( - value: 'business', - groupValue: _deliveryFrom, - onChanged: (value) => - setState(() => _deliveryFrom = value ?? 'business'), - title: Text("From Business Location", - style: fontTextStyle(12, Color(0xFF2D2E30), FontWeight.w400)), - dense: true, - contentPadding: EdgeInsets.zero, - visualDensity: - const VisualDensity(horizontal: 0, vertical: -3), - ), - RadioListTile( - value: 'source', - groupValue: _deliveryFrom, - onChanged: (value) => - setState(() => _deliveryFrom = value ?? 'source'), - title: Text("From Source Locations", - style: fontTextStyle(12, Color(0xFF2D2E30), FontWeight.w400)), - dense: true, - contentPadding: EdgeInsets.zero, - visualDensity: - const VisualDensity(horizontal: 0, vertical: -3), + // 🔹 SOURCE LOCATIONS SECTION + Visibility( + visible: _deliveryFrom == 'source', + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Delivery Radius (in Kms) *", + style: fontTextStyle( + 12, const Color(0xFF2F3036), FontWeight.w600)), + const SizedBox(height: 16), + TextFormField( + controller: _radiusController, + keyboardType: TextInputType.number, + decoration: InputDecoration( + hintText: "Enter radius in kms", + hintStyle: fontTextStyle( + 14, const Color(0xFF939495), FontWeight.w400), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8), + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 12), + ), ), - const SizedBox(height: 16), - - - Visibility( - visible: _deliveryFrom == 'business', - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("Delivery Radius (in Kms) *", - style: fontTextStyle(12, Color(0xFF2F3036), FontWeight.w600)), - const SizedBox(height: 16), - TextFormField( - controller: _radiusController, - keyboardType: TextInputType.number, - decoration: InputDecoration( - hintText: "Enter radius in kms", - hintStyle: fontTextStyle(14, Color(0xFF939495), FontWeight.w400), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - contentPadding: const EdgeInsets.symmetric( - horizontal: 12, vertical: 12), - ), - ), - const SizedBox(height: 16), - Container( - width: double.infinity, - height: 160, - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('images/google_maps.png'), - fit: BoxFit.contain, - ), - ), + Row( + children: [ + Checkbox( + value: _customizeEachSource, + onChanged: (val) => setState( + () => _customizeEachSource = val ?? false), + materialTapTargetSize: + MaterialTapTargetSize.shrinkWrap, + visualDensity: const VisualDensity( + horizontal: -4, vertical: -4), + ), + const SizedBox(width: 6), + Expanded( + child: Text( + "Customize for each source location", + style: fontTextStyle( + 12, const Color(0xFF2D2E30), + FontWeight.w400), ), - ], - ), + ), + ], ), + const SizedBox(height: 12), - // ✅ Source Location Customization Section - Visibility( - visible: _deliveryFrom == 'source', - child: Column( - + // 🔹 Show source list if enabled + if (_customizeEachSource) + Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("Delivery Radius (in Kms) *", - style: fontTextStyle(12, Color(0xFF2F3036), FontWeight.w600)), - const SizedBox(height: 16), - TextFormField( - controller: _radiusController, - keyboardType: TextInputType.number, - decoration: InputDecoration( - hintText: "Enter radius in kms", - hintStyle: fontTextStyle(14, const Color(0xFF939495), FontWeight.w400), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - ), - contentPadding: const EdgeInsets.symmetric( - horizontal: 12, vertical: 12), - ), - ), - const SizedBox(height: 16), - Row( - children: [ - Checkbox( - value: _customizeEachSource, - onChanged: (val) => setState( - () => _customizeEachSource = val ?? false), - materialTapTargetSize: - MaterialTapTargetSize.shrinkWrap, - visualDensity: const VisualDensity( - horizontal: -4, vertical: -4), - ), - const SizedBox(width: 6), + children: sourceLocationsList.isEmpty + ? [ + const Text( + "No source locations available"), + ] + : List.generate(sourceLocationsList.length, + (index) { + final d = sourceLocationsList[index]; + final isExpanded = + _expandedMap[index] ?? false; - Expanded( - child: Text( - "Customize for each source location", - style: fontTextStyle(12, Color(0xFF2D2E30), FontWeight.w400), + return Container( + margin: + const EdgeInsets.only(bottom: 8), + decoration: BoxDecoration( + color: const Color(0xFFF7F7F7), + border: Border.all( + color: + const Color(0xFFE5E5E5)), + borderRadius: + BorderRadius.circular(12), ), - ), - ], - ), - const SizedBox(height: 12), - - // 🔹 Show all source locations when checkbox checked - if (_customizeEachSource) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: sourceLocationsList.isEmpty - ? [ - const Text("No source locations available"), - ] - : List.generate(sourceLocationsList.length, (index) { - final d = sourceLocationsList[index]; - return StatefulBuilder( - builder: (context, setInner) { - // ✅ Always read from map dynamically (not fixed final variable) - final isExpanded = _expandedMap[index] ?? false; - - return Container( - margin: const EdgeInsets.only(bottom: 8), - decoration: BoxDecoration( - color: const Color(0xFFF7F7F7), - border: Border.all(color: const Color(0xFFE5E5E5)), - borderRadius: BorderRadius.circular(12), + child: Column( + children: [ + ListTile( + dense: true, + contentPadding: + EdgeInsets.zero, + minVerticalPadding: 0, + visualDensity: + const VisualDensity( + vertical: -4, + horizontal: 0), + title: Text( + d.source_name ?? + 'Unnamed location', + style: fontTextStyle( + 14, + const Color(0xFF2D2E30), + FontWeight.w600), ), - child: Column( - children: [ - ListTile( - dense: true, - contentPadding: EdgeInsets.zero, - minVerticalPadding: 0, - visualDensity: const VisualDensity(vertical: -4, horizontal: 0), - title: Text( - d.source_name ?? 'Unnamed location', - style: fontTextStyle(14, const Color(0xFF2D2E30), FontWeight.w600), - ), - trailing: IconButton( - icon: Image.asset( - isExpanded - ? 'images/arrow-up.png' - : 'images/downarrow.png', - width: 18, - height: 18, - ), - onPressed: () { - setInner(() { - _expandedMap[index] = !isExpanded; - }); - }, - ), - ), - if (isExpanded) - Container( - margin: const EdgeInsets.only(left: 10, right: 10, bottom: 6), - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: const Color(0xFFE5E5E5)), - ), - child: Text( - "Address: ${d.address ?? 'N/A'}", - style: fontTextStyle(12, const Color(0xFF646566), FontWeight.w400), - ), - ), - ], + trailing: IconButton( + icon: Image.asset( + isExpanded + ? 'images/arrow-up.png' + : 'images/downarrow.png', + width: 18, + height: 18, + ), + onPressed: () { + setState(() { + _expandedMap[index] = + !isExpanded; + }); + }, ), - ); - }, - ); - }), - ), - - const SizedBox(height: 16), - Container( - width: double.infinity, - height: 160, - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage('images/google_maps.png'), - fit: BoxFit.contain, - ), - ), - ), - ], + ), + if (isExpanded) + Container( + margin: + const EdgeInsets.only( + left: 10, + right: 10, + bottom: 6), + padding: + const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.circular( + 8), + border: Border.all( + color: + const Color( + 0xFFE5E5E5)), + ), + child: Text( + "Address: ${d.address ?? 'N/A'}", + style: fontTextStyle( + 12, + const Color( + 0xFF646566), + FontWeight.w400), + ), + ), + ], + ), + ); + }), ), - ), - - const SizedBox(height: 24), - Text("Types of Services", - style: fontTextStyle(16, Color(0xFF2D2E30), FontWeight.w600)), - const SizedBox(height: 12), - Text( - "Define what type of services you would wish to provide", - style: fontTextStyle(14, Color(0xFF939495), FontWeight.w500)), const SizedBox(height: 16), - ..._services - .map((service) => _serviceItem(service)) - .toList(), - const SizedBox(height: 24), - SizedBox( + Container( width: double.infinity, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFF8270DB), - foregroundColor: Colors.white, - padding: const EdgeInsets.symmetric(vertical: 14), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(24)), + height: 250, + decoration: BoxDecoration( + border: + Border.all(color: const Color(0xFFE6E6E6)), + borderRadius: BorderRadius.circular(8), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(8), + child: ServiceLocationsRadiusScreen( + initialPosition: + const LatLng(20.5937, 78.9629), + radiusKmListenable: _radiusKmNotifier, ), - onPressed: () { - final selected = _selectedServices.isEmpty - ? "No services selected" - : _selectedServices.join(", "); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - "Saved successfully for ${_deliveryFrom == 'business' ? 'Business Location' : 'Source Locations'}\nSelected: $selected"), - ), - ); - }, - child: Text("Save & Continue", - style: fontTextStyle(14, Color(0xFFFFFFFF), FontWeight.w400)), ), ), ], ), ), + + const SizedBox(height: 24), + Text("Types of Services", + style: fontTextStyle( + 16, const Color(0xFF2D2E30), FontWeight.w600)), + const SizedBox(height: 12), + Text("Define what type of services you would wish to provide", + style: fontTextStyle( + 14, const Color(0xFF939495), FontWeight.w500)), + + const SizedBox(height: 16), + ..._services.map((service) => _serviceItem(service)).toList(), + const SizedBox(height: 24), + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF8270DB), + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24)), + ), + onPressed: () { + final selected = _selectedServices.isEmpty + ? "No services selected" + : _selectedServices.join(", "); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + "Saved successfully for ${_deliveryFrom == 'business' ? 'Business Location' : 'Source Locations'}\nSelected: $selected"), + ), + ); + }, + child: Text("Save & Continue", + style: fontTextStyle( + 14, Colors.white, FontWeight.w400)), + ), + ), + ], + ), + ), ), ); } - // ✅ Service item + // ✅ Service item checkbox list Widget _serviceItem(String label) { final bool selected = _selectedServices.contains(label); return GestureDetector( @@ -378,13 +443,14 @@ class _ServiceLocationState extends State { children: [ Icon( selected ? Icons.check_box : Icons.check_box_outline_blank, - color: selected ? Color(0xFF8270DB) : Color(0xFF939495), + color: selected ? const Color(0xFF8270DB) : const Color(0xFF939495), size: 20, ), const SizedBox(width: 8), Expanded( - child: Text(label, style: fontTextStyle(12, Color(0xFF2D2E30), FontWeight.w400), - ), + child: Text(label, + style: fontTextStyle( + 12, const Color(0xFF2D2E30), FontWeight.w400)), ), ], ), diff --git a/lib/profile/service_locations_radius.dart b/lib/profile/service_locations_radius.dart new file mode 100644 index 0000000..222382b --- /dev/null +++ b/lib/profile/service_locations_radius.dart @@ -0,0 +1,147 @@ +import 'dart:math'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class ServiceLocationsRadiusScreen extends StatefulWidget { + final LatLng? initialPosition; + final ValueListenable? radiusKmListenable; + + const ServiceLocationsRadiusScreen({ + Key? key, + this.initialPosition, + this.radiusKmListenable, + }) : super(key: key); + + @override + State createState() => + _ServiceLocationsRadiusScreenState(); +} + +class _ServiceLocationsRadiusScreenState + extends State { + GoogleMapController? _controller; + LatLng? _currentPosition; + LatLng? _circleCenter; + bool _isMapReady = false; + Set _circles = {}; + + final double _fallbackRadiusMeters = 10000; // 10 km + final LatLng _indiaCenter = const LatLng(20.5937, 78.9629); + + @override + void initState() { + super.initState(); + if (widget.initialPosition == null) { + _checkLocationPermissionAndGetCurrentPosition(); + } else { + _circleCenter = widget.initialPosition; + } + + widget.radiusKmListenable?.addListener(_onRadiusChangedFromParent); + } + + @override + void dispose() { + widget.radiusKmListenable?.removeListener(_onRadiusChangedFromParent); + super.dispose(); + } + + // 🔹 When radius changes in parent + void _onRadiusChangedFromParent() { + final km = + widget.radiusKmListenable?.value ?? (_fallbackRadiusMeters / 1000.0); + final meters = km * 1000.0; + final center = _circleCenter ?? _currentPosition ?? _indiaCenter; + _addRadiusCircle(center, radiusInMeters: meters); + } + + // 🔹 Get current location + Future _checkLocationPermissionAndGetCurrentPosition() async { + var status = await Permission.location.status; + if (!status.isGranted) { + status = await Permission.location.request(); + if (!status.isGranted) return; + } + + bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) return; + + final position = await Geolocator.getCurrentPosition(); + setState(() { + _currentPosition = LatLng(position.latitude, position.longitude); + }); + } + + // 🔹 Add / update the circle + void _addRadiusCircle(LatLng center, {double? radiusInMeters}) async { + final meters = radiusInMeters ?? + (widget.radiusKmListenable?.value ?? (_fallbackRadiusMeters / 1000.0)) * + 1000.0; + + setState(() { + _circleCenter = center; + _circles = { + Circle( + circleId: const CircleId("radius_circle"), + center: center, + radius: meters, + fillColor: Colors.blue.withOpacity(0.2), + strokeColor: Colors.blueAccent, + strokeWidth: 2, + ), + }; + }); + + // 👇 adjust zoom so full circle is visible even in small container + if (_controller != null) { + final zoom = _getZoomLevelForSmallMap(meters); + await _controller!.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition(target: center, zoom: zoom), + ), + ); + } + } + + // 🔹 Calculate zoom for small map container (200–300 px) + double _getZoomLevelForSmallMap(double radiusMeters) { + // Adjust constant here if map size differs + final scale = radiusMeters / 200; // Smaller scale for small map + double zoomLevel = 16 - log(scale) / log(2); + if (zoomLevel > 18) zoomLevel = 18; + if (zoomLevel < 4) zoomLevel = 4; + return zoomLevel; + } + + @override + Widget build(BuildContext context) { + final LatLng target = + widget.initialPosition ?? _currentPosition ?? _indiaCenter; + + final initialCameraPosition = CameraPosition( + target: target, + zoom: 12, + ); + + return GoogleMap( + initialCameraPosition: initialCameraPosition, + mapType: MapType.normal, + circles: _circles, + zoomControlsEnabled: false, + myLocationEnabled: false, + myLocationButtonEnabled: false, + onMapCreated: (controller) async { + _controller = controller; + _isMapReady = true; + + await Future.delayed(const Duration(milliseconds: 500)); + final center = widget.initialPosition ?? _currentPosition ?? _indiaCenter; + final km = widget.radiusKmListenable?.value ?? 10; + _addRadiusCircle(center, radiusInMeters: km * 1000.0); + }, + ); + } +}