changes in profile

master
Sneha 1 month ago
parent b3e018b333
commit 249ff4206c

@ -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<TankersModel?> 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<bool> addTankers(payload) async {
var response = await http.post(Uri.parse(addTankerUrl + '/' + supplierId),
body: json.encode(payload), headers: await buildRequestHeaders());

@ -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(

@ -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<AssignDriverScreen> {
double totalFare = 0.0;
bool isLoading = false;
bool isTankersDataLoading = false;
bool isSourceDataLoading = false;
List<DriversModel> driversList = [];
List<TankersModel> tankersList = [];
List<SourceLocationsModel> sourceLocationsList = [];
@override
void initState() {
@ -28,6 +31,7 @@ class _AssignDriverScreenState extends State<AssignDriverScreen> {
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<AssignDriverScreen> {
}
}
Future<void> _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<AssignDriverScreen> {
);
},
)),
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),
),
),
],
),
),
),
);
},
)),
],
),
),

@ -924,18 +924,25 @@ class _ChangeDriverScreenState extends State<ChangeDriverScreen> {
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()
],
))
],
)),
],

@ -138,7 +138,7 @@ class _FleetStep1PageState extends State<FleetStep1Page> {
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<FleetStep1Page> {
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<FleetStep1Page> {
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",

@ -147,6 +147,29 @@ class _TankerDetailsPageState extends State<TankerDetailsPage> {
selectedTypeOfWater = null;
}
Future<void> _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<String> options) {
if (incoming == null) return null;
final inc = incoming.trim();
@ -191,7 +214,8 @@ class _TankerDetailsPageState extends State<TankerDetailsPage> {
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<TankerDetailsPage> {
);
}
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,

Loading…
Cancel
Save