From 249ff4206cbb37d62e5d6564293750feaa3382f6 Mon Sep 17 00:00:00 2001 From: Sneha Date: Mon, 3 Nov 2025 11:45:05 +0530 Subject: [PATCH] changes in profile --- lib/common/settings.dart | 45 +++++++++ lib/orders/all_orders.dart | 8 +- lib/orders/assign_driver.dart | 150 ++++++++++++++++++++++++++++++ lib/orders/change_driver.dart | 31 +++--- lib/profile/fleet.dart | 10 +- lib/resources/tanker_details.dart | 45 +++++---- 6 files changed, 249 insertions(+), 40 deletions(-) diff --git a/lib/common/settings.dart b/lib/common/settings.dart index d20bb57..ed9dbb2 100644 --- a/lib/common/settings.dart +++ b/lib/common/settings.dart @@ -9,6 +9,8 @@ import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:supplier_new/common/preloader.dart'; +import '../resources/tankers_model.dart'; + const Color primaryColor = Color(0XFF8270DB); const Color secondaryColor = Color(0XFFBFE0ED); const Color greyColor = Color(0XFF7E7F80); @@ -156,6 +158,7 @@ class AppSettings{ static String getAcceptedOrdersFromUsersUrl = host + 'getAllTankersBookingdetails'; static String getPlanRequestsFromUsersUrl = host + 'getuserRequestbookingsforplansforsupplier'; static String getTankersUrl = host + 'getTankers'; + static String getTankerDetailsByNameUrl = host + 'getsingledetails'; static String addTankerUrl = host + 'addTankers'; static String updateTankerUrl = host + 'updateTankers'; static String getDriversUrl = host + 'getalldeliveryboys'; @@ -512,6 +515,48 @@ class AppSettings{ } } + static Future getTankerDetailsByName(String tankerName) async { + try { + var uri = Uri.parse("$getTankerDetailsByNameUrl/$supplierId"); + uri = uri.replace(query: 'tankerName=$tankerName'); + + var response = await http.get(uri, headers: await buildRequestHeaders()); + + if (response.statusCode == 200) { + final decoded = jsonDecode(response.body); + + if (decoded['data'] != null && + decoded['data'] is List && + decoded['data'].isNotEmpty) { + return TankersModel.fromJson(decoded['data'][0]); // ✅ return model + } else { + debugPrint("⚠️ No tanker data found in response"); + return null; + } + } else if (response.statusCode == 401) { + bool status = await AppSettings.resetToken(); + if (status) { + response = await http.get(uri, headers: await buildRequestHeaders()); + if (response.statusCode == 200) { + final decoded = jsonDecode(response.body); + if (decoded['data'] != null && + decoded['data'] is List && + decoded['data'].isNotEmpty) { + return TankersModel.fromJson(decoded['data'][0]); // ✅ model again + } + } + } + return null; + } else { + debugPrint("❌ Failed: ${response.statusCode}"); + return null; + } + } catch (e) { + debugPrint("⚠️ getTankerDetailsByName() error: $e"); + return null; + } + } + static Future addTankers(payload) async { var response = await http.post(Uri.parse(addTankerUrl + '/' + supplierId), body: json.encode(payload), headers: await buildRequestHeaders()); diff --git a/lib/orders/all_orders.dart b/lib/orders/all_orders.dart index 9abf47b..90deaff 100644 --- a/lib/orders/all_orders.dart +++ b/lib/orders/all_orders.dart @@ -303,6 +303,9 @@ class OrderCard extends StatelessWidget { else if(order.status.toLowerCase()=='deliveryboy_assigned'){ st='assigned'; } + else if(order.status.toLowerCase()=='tanker_assigned'){ + st='assigned'; + } else{ st=order.status.toLowerCase(); } @@ -332,6 +335,9 @@ class OrderCard extends StatelessWidget { else if(order.status.toLowerCase()=='deliveryboy_assigned'){ st='assigned'; } + else if(order.status.toLowerCase()=='tanker_assigned'){ + st='assigned'; + } else{ st=order.status.toLowerCase(); } @@ -583,7 +589,7 @@ class OrderCard extends StatelessWidget { children: [ Expanded( child: Text( - "Assigned to ${order.delivery_agent_name}", + order.delivery_agent_name!=''?"Assigned to ${order.delivery_agent_name}":"Assigned to ${order.tanker_name}", maxLines: 1, overflow: TextOverflow.ellipsis, style: fontTextStyle( diff --git a/lib/orders/assign_driver.dart b/lib/orders/assign_driver.dart index af0b625..52859ef 100644 --- a/lib/orders/assign_driver.dart +++ b/lib/orders/assign_driver.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:supplier_new/common/settings.dart'; +import 'package:supplier_new/resources/source_loctaions_model.dart'; import '../resources/drivers_model.dart'; import '../resources/tankers_model.dart'; @@ -19,8 +20,10 @@ class _AssignDriverScreenState extends State { double totalFare = 0.0; bool isLoading = false; bool isTankersDataLoading = false; + bool isSourceDataLoading = false; List driversList = []; List tankersList = []; + List sourceLocationsList = []; @override void initState() { @@ -28,6 +31,7 @@ class _AssignDriverScreenState extends State { super.initState(); _fetchTankers(); _fetchDrivers(); + _fetchSourceLocations(); advance = 150; advancePayable = advance; totalFare = advance + double.parse(widget.order.quoted_amount); @@ -70,9 +74,28 @@ class _AssignDriverScreenState extends State { } } + Future _fetchSourceLocations() async { + setState(() => isSourceDataLoading = true); + try { + final response = await AppSettings.getSourceLoctaions(); + final data = (jsonDecode(response)['data'] as List) + .map((e) => SourceLocationsModel.fromJson(e)) + .toList(); + if (!mounted) return; + setState(() { + sourceLocationsList = data; + isSourceDataLoading = false; + }); + } catch (e) { + debugPrint("⚠️ Error fetching tankers: $e"); + setState(() => isSourceDataLoading = false); + } + } + void _showAssignTankerBottomSheet() { int? selectedTankerIndex; int? selectedDriverIndex; + int? selectedSourceIndex; int _capToLiters(dynamic cap) { if (cap == null) return -1; @@ -432,6 +455,133 @@ class _AssignDriverScreenState extends State { ); }, )), + + const SizedBox(height: 8), + + // 🧍 Source Locations List + Text( + "SELECT SOURCE LOCATION", + style: fontTextStyle( + 10, const Color(0XFF2D2E30), FontWeight.w600), + ), + const SizedBox(height: 4), + + // 🚨 Driver list disabled until tanker is selected + selectedTankerIndex == null + ? Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.only(top: 8), + decoration: BoxDecoration( + color: const Color(0XFFFFFFFF), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: const Color(0xFFC3C4C4)), + ), + child: Center( + child: Text( + 'Select a tanker to choose source location', + style: fontTextStyle( + 14, + const Color(0xFF2D2E30), + FontWeight.w400), + ), + ), + ) + : isSourceDataLoading + ? const Center( + child: CircularProgressIndicator()) + : (driversList.isEmpty + ? Center( + child: Padding( + padding: + const EdgeInsets.symmetric( + vertical: 12), + child: Text( + 'No Data Available', + style: fontTextStyle( + 12, + const Color(0xFF939495), + FontWeight.w500), + ), + ), + ) + : ListView.separated( + shrinkWrap: true, + physics: + const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + itemCount: sourceLocationsList.length, + separatorBuilder: (_, __) => + const SizedBox(height: 12), + itemBuilder: (context, idx) { + final d = sourceLocationsList[idx]; + final isSelected = + selectedSourceIndex == idx; + + return GestureDetector( + onTap: () { + /* if (isAvailable) { + setModalState(() { + selectedDriverIndex = idx; + }); + } else { + AppSettings.longFailedToast( + 'Only available drivers can be selected', + ); + }*/ + setModalState(() { + selectedSourceIndex = idx; + }); + }, + child: Card( + color: + const Color(0XFFFFFFFF), + elevation: 1, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular( + 12), + side: BorderSide( + color: isSelected + ? primaryColor + : const Color( + 0XFFC3C4C4), + width: 1, + ), + ), + child: Padding( + padding: + const EdgeInsets.all( + 12.0), + child: Row( + children: [ + Image.asset( + 'images/avatar.png', + fit: BoxFit.cover, + width: 20, + height: 20, + ), + const SizedBox( + width: 8), + Expanded( + child: Text( + d.source_name, + style: fontTextStyle( + 14, + const Color( + 0XFF2D2E30), + FontWeight + .w500), + ), + ), + ], + ), + ), + ), + ); + }, + )), ], ), ), diff --git a/lib/orders/change_driver.dart b/lib/orders/change_driver.dart index f151485..916c183 100644 --- a/lib/orders/change_driver.dart +++ b/lib/orders/change_driver.dart @@ -924,18 +924,25 @@ class _ChangeDriverScreenState extends State { height: MediaQuery.of(context).size.height * .012, ), _assignedTankerDetails(), - SizedBox( - height: MediaQuery.of(context).size.height * .012, - ), - Text( - "ASSIGNED TO", - style: fontTextStyle( - 10, const Color(0XFF646566), FontWeight.w600), - ), - SizedBox( - height: MediaQuery.of(context).size.height * .012, - ), - _assignedDriverDetails() + Visibility( + visible:widget.order.delivery_agent_name != null && + widget.order.delivery_agent_name.toString().trim().isNotEmpty, + child: Column( + children: [ + SizedBox( + height: MediaQuery.of(context).size.height * .012, + ), + Text( + "ASSIGNED TO", + style: fontTextStyle( + 10, const Color(0XFF646566), FontWeight.w600), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .012, + ), + _assignedDriverDetails() + ], + )) ], )), ], diff --git a/lib/profile/fleet.dart b/lib/profile/fleet.dart index 5377768..1b5501b 100644 --- a/lib/profile/fleet.dart +++ b/lib/profile/fleet.dart @@ -138,7 +138,7 @@ class _FleetStep1PageState extends State { return StatefulBuilder( builder: (context, setInner) { return Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 0), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 0), decoration: BoxDecoration( color: Color(0xFFF1F1F1), // background color border: Border.all(color: Color(0xFFE5E5E5)), @@ -151,6 +151,7 @@ class _FleetStep1PageState extends State { dense: true, // 👈 makes tile shorter contentPadding: EdgeInsets.zero, // 👈 removes default 16px minVerticalPadding: 0, + visualDensity: const VisualDensity(vertical: -4, horizontal: 0), // tighten title: Text( it['tankerName'] ?? 'Unnamed', style: fontTextStyle(14, Color(0xFF2D2E30), FontWeight.w600). copyWith(height: 0.1), @@ -174,13 +175,8 @@ class _FleetStep1PageState extends State { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), decoration: BoxDecoration( color: Color(0xFFFFFFFF), // 👈 white background - border: Border.all(color:Color(0xFFE5E5E5)), // light border + border: Border.all(color:Color(0xFFFFFFFF)), // light border borderRadius: BorderRadius.circular(8), // smooth rounded edges - boxShadow: [ - BoxShadow(color: Color(0xFF2A2A2A).withOpacity(0.03), - blurRadius: 3, offset: const Offset(0, 1), - ), - ], ), child: Text( "${it['typeofwater'] ?? ''} : ${it['capacity'] ?? ''} L", diff --git a/lib/resources/tanker_details.dart b/lib/resources/tanker_details.dart index fef1426..a5fa0b3 100644 --- a/lib/resources/tanker_details.dart +++ b/lib/resources/tanker_details.dart @@ -147,6 +147,29 @@ class _TankerDetailsPageState extends State { selectedTypeOfWater = null; } + Future _refreshTankerDetails() async { + try { + setState(() => isLoading = true); + + final updatedDetails = await AppSettings.getTankerDetailsByName( + _nameCtrl.text.trim(), + ); + + if (updatedDetails != null) { + setState(() { + widget.tankerDetails = updatedDetails; + }); + } else { + AppSettings.longFailedToast("Failed to fetch updated tanker details"); + } + } catch (e) { + debugPrint("⚠️ Error refreshing tanker details: $e"); + AppSettings.longFailedToast("Error refreshing tanker details"); + } finally { + setState(() => isLoading = false); + } + } + String? fitToOption(String? incoming, List options) { if (incoming == null) return null; final inc = incoming.trim(); @@ -191,7 +214,8 @@ class _TankerDetailsPageState extends State { if (tankStatus) { AppSettings.longSuccessToast("Tanker Updated Successfully"); - Navigator.pop(context, true); // close sheet + Navigator.pop(context, true); + _refreshTankerDetails();// close sheet _resetForm(); // refresh from server } else { @@ -730,25 +754,6 @@ class _TankerDetailsPageState extends State { ); } - Widget _buildStatusChip(String label, Color color) { - return Container( - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), - decoration: BoxDecoration( - color: color.withOpacity(0.1), - borderRadius: BorderRadius.circular(20), - border: Border.all(color: color), - ), - child: Text( - label, - style: TextStyle( - color: color, - fontSize: 12, - fontWeight: FontWeight.w600, - ), - ), - ); - } - Widget _buildTripCard({ required String driverName, required String time,