You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3041 lines
162 KiB

import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:geolocator/geolocator.dart';
import 'package:intl/intl.dart';
import 'package:bookatanker/common/settings.dart';
import 'package:bookatanker/supplier/book_a_tanker.dart';
import 'package:bookatanker/supplier/my_orders.dart';
import 'package:bookatanker/supplier/my_suppliers.dart';
import 'package:bookatanker/supplier/order_details.dart';
import 'package:bookatanker/supplier/order_requests.dart';
import 'package:bookatanker/supplier/payment_example.dart';
import 'package:bookatanker/supplier/paymnets/payments_main.dart';
import 'package:bookatanker/supplier/plans/plan_details.dart';
import 'package:bookatanker/supplier/plans/plan_request_screen.dart';
import 'package:bookatanker/supplier/plans/plan_requests.dart';
import 'package:bookatanker/supplier/profile.dart';
import 'package:bookatanker/supplier/supplier_calendar.dart';
import 'package:bookatanker/supplier/supplier_orders_model.dart';
import 'package:image_picker/image_picker.dart';
import 'package:smooth_page_indicator/smooth_page_indicator.dart';
import 'package:bookatanker/supplier/todaysprice/todays_price.dart';
import '../models/connected_suppliers_model.dart';
import 'order_arrived.dart';
import 'order_status_overlay.dart';
import 'order_tracking_page.dart';
import 'my_orders_model.dart';
import 'paln_requests_model.dart';
class SupplierLanding extends StatefulWidget {
const SupplierLanding({super.key});
@override
State<SupplierLanding> createState() => _SupplierLandingState();
}
class _SupplierLandingState extends State<SupplierLanding> {
final GlobalKey<_SupplierHomeState> _supplierHomeKey =
GlobalKey<_SupplierHomeState>();
int _currentIndex = 0;
final ImagePicker _picker = ImagePicker();
final storage = FlutterSecureStorage(
aOptions: AndroidOptions(
resetOnError: true,
encryptedSharedPreferences: true,
),
);
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController searchController1 = new TextEditingController();
List cart = [];
final ValueNotifier<List<MyOrdersModel>> activeOrdersNotifier =
ValueNotifier<List<MyOrdersModel>>([]);
// List of bottom navigation bar items
final List<BottomNavigationBarItem> _bottomNavItems = [
BottomNavigationBarItem(
icon: Padding(
padding:
EdgeInsets.fromLTRB(0, 5, 0, 0), // Adjust height to control spacing
child: ImageIcon(AssetImage('images/homeBottomIcon.png')),
),
label: "Home",
),
BottomNavigationBarItem(
icon: Padding(
padding:
EdgeInsets.fromLTRB(0, 5, 0, 0), // Adjust height to control spacing
child: ImageIcon(AssetImage('images/ordersBottomIcon.png')),
),
// Replace with your image path
label: "Orders",
),
BottomNavigationBarItem(
icon: Padding(
padding:
EdgeInsets.fromLTRB(0, 5, 0, 0), // Adjust height to control spacing
child: ImageIcon(AssetImage('images/calenderBottomIcon.png')),
),
// Replace with your image path
label: "Calendar",
),
BottomNavigationBarItem(
icon: Padding(
padding:
EdgeInsets.fromLTRB(0, 5, 0, 0), // Adjust height to control spacing
child: ImageIcon(AssetImage('images/suppliersBottomIcon.png')),
), // Replace with your image path
label: "Suppliers",
),
BottomNavigationBarItem(
icon: Padding(
padding:
EdgeInsets.fromLTRB(0, 5, 0, 0), // Adjust height to control spacing
child: ImageIcon(AssetImage('images/paymentsBottomIcon.png')),
),
// Replace with your image path
label: "Payments",
),
];
void _onItemTapped(int index) {
setState(() {
_currentIndex = index;
});
}
Widget _buildBody() {
switch (_currentIndex) {
case 0:
return SupplierHome(
key: _supplierHomeKey,
activeDeliveryNotifier: activeOrdersNotifier,
);
case 1:
return const MyOrders(navigationFrom: 'bottom_bar');
case 2:
return PaymentsMainScreen();
case 3:
return MySuppliers(navigationFrom: 'bottom_bar');
case 4:
return const PaymentsMainScreen();
default:
return SupplierHome(activeDeliveryNotifier: activeOrdersNotifier);
}
}
_showLocationBottomSheet(BuildContext context) {
showModalBottomSheet(
context: context,
isScrollControlled: true, // Makes it go full screen if needed
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
),
builder: (context) {
return DraggableScrollableSheet(
expand: false,
builder: (context, scrollController) {
return Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
),
child: Column(
mainAxisSize:
MainAxisSize.min, // Ensures it doesn't take full height
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
/// 🔹 Drag Handle (Line at the top)
Align(
alignment: Alignment.center,
child: Container(
width: 53,
height: 2,
decoration: BoxDecoration(
color: Color(0XFF757575),
borderRadius: BorderRadius.circular(10),
),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
Text(
"Location",
style:
fontTextStyle(14, Color(0XFF2D2E30), FontWeight.w600),
),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
Container(
child: TextFormField(
controller: searchController1,
decoration: searchTextFormFieldDecoration(
'images/search.png', 'Search'),
style:
fontTextStyle(14, Color(0XFF101214), FontWeight.w400),
cursorColor: Color(0XFF1D7AFC),
//TextStyle(color: Colors.black,fontWeight: FontWeight.bold),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * .024,
),
GestureDetector(
onTap: () {},
child: Row(
children: [
Image.asset(
'images/add_icon.png',
width: 24, // Adjust size
height: 24,
),
SizedBox(
width: MediaQuery.of(context).size.width * .024,
),
Text(
"Add New Address",
style: fontTextStyle(
12, Color(0XFF2D2E30), FontWeight.w600),
),
],
),
),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
Divider(
color: Colors.grey.shade300,
),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
GestureDetector(
onTap: () {},
child: Row(
children: [
Image.asset(
'images/gps_current_location.png',
width: 24, // Adjust size
height: 24,
),
SizedBox(
width: MediaQuery.of(context).size.width * .024,
),
Text(
"Use Current Location",
style: fontTextStyle(
12, Color(0XFF2D2E30), FontWeight.w600),
),
],
),
),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
],
),
);
},
);
},
);
}
double _calculateDistance(lat1, lon1, lat2, lon2) {
var p = 0.017453292519943295;
var a = 0.5 -
cos((lat2 - lat1) * p) / 2 +
cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2;
return 12742 * asin(sqrt(a));
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
if (_currentIndex == 0) {
Navigator.pop(context, true);
return true;
} else {
setState(() {
_currentIndex = 0;
});
return false;
}
},
child: Scaffold(
backgroundColor: Colors.white,
appBar: (_currentIndex == 2 ||
_currentIndex == 3 ||
_currentIndex == 1) // 👈 index of Profile page
? null
: AppBar(
backgroundColor: Color(0XFFFFFFFF),
elevation: 0,
scrolledUnderElevation: 0,
titleSpacing: 0,
title: GestureDetector(
onTap: () {
_showLocationBottomSheet(context);
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize
.min, // Ensures it doesn't take extra space
children: [
Text(
'Home',
style: fontTextStyle(
16, Color(0XFF232527), FontWeight.w600),
),
SizedBox(width: 5), // Space between text and icon
Image.asset(
'images/arrow_down.png', // Replace with your arrow image
width: 24, // Adjust size
height: 24,
)
],
),
Text(
AppSettings.userAddress,
style: fontTextStyle(
10, Color(0XFF515253), FontWeight.w400),
),
],
)),
iconTheme: IconThemeData(color: Color(0XFF2A2A2A)),
actions: [
Row(
children: [
Padding(
padding: EdgeInsets.fromLTRB(0, 10, 10, 10),
child: IconButton(
icon: Image.asset(
'images/notification_appbar.png', // Example URL image
),
onPressed: () {},
),
)
],
)
],
leading: IconButton(
icon: Image.asset(
'images/bookatanker_profile.png', // Replace with your image path
width: 24, // Adjust size as needed
height: 24,
), //
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Profile()),
);
},
),
),
body: Stack(
children: [
_buildBody(),
// 🔐 Listen to the notifier to show/hide overlay
ValueListenableBuilder<List<MyOrdersModel>>(
valueListenable: activeOrdersNotifier,
builder: (context, activeOrders, _) {
final isVisible = activeOrders.isNotEmpty;
return OrderStatusOverlayMulti(
isVisible: isVisible,
activeOrders: activeOrders,
onTap: (order) async {
// 0.05 km = 50 meters
const double arrivalRadiusKm = 0.05;
double dist = _calculateDistance(
AppSettings.userLatitude,
AppSettings.userLongitude,
17.41670599999999,
78.4519569,
);
if (dist <= arrivalRadiusKm) {
// 👇 Pass ONLY the tapped order
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
ArrivalScreen(orderDetails: order),
),
);
// If result indicates API reload
if (result == true) {
_supplierHomeKey.currentState?.getOrdersData();
}
} else {
// 👇 Pass ONLY the tapped order
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrderTrackingPage(
lat: AppSettings.userLatitude,
lng: AppSettings.userLongitude,
d_lat: 17.41670599999999,
d_lng: 78.4519569,
u_address: order.displayAddress,
orderDetails:
order, // <---- ADD THIS (you must add this parameter in the page)
),
),
);
}
},
);
},
),
],
),
/*_body(),,*/
bottomNavigationBar: SizedBox(
//height: 123, // 56 (top message) + 56 (BottomNavigationBar)
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
BottomNavigationBar(
backgroundColor: Color(0XFFFFFFFF),
items: _bottomNavItems,
selectedItemColor:
primaryColor, // Color of selected icon and text
unselectedItemColor:
Color(0XFF939495), // Color of unselected icon and text
selectedLabelStyle: fontTextStyleHeight(
10,
primaryColor,
FontWeight.w400,
MediaQuery.of(context).size.height * .0032,
),
unselectedLabelStyle: fontTextStyleHeight(
10,
Color(0XFF939495),
FontWeight.w400,
MediaQuery.of(context).size.height * .0032,
),
currentIndex: _currentIndex,
onTap: _onItemTapped,
type: BottomNavigationBarType
.fixed, // Ensures all 6 items are visible
),
],
),
),
/*Padding(
padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
child: BottomNavigationBar(
backgroundColor: Color(0XFFFFFFFF),
items: _bottomNavItems,
selectedItemColor: primaryColor, // Color of selected icon and text
unselectedItemColor:
Color(0XFF939495), // Color of unselected icon and text
selectedLabelStyle: fontTextStyleHeight(
10,
primaryColor,
FontWeight.w400,
MediaQuery.of(context).size.height * .0032,
),
unselectedLabelStyle: fontTextStyleHeight(
10,
Color(0XFF939495),
FontWeight.w400,
MediaQuery.of(context).size.height * .0032,
),
currentIndex: _currentIndex,
onTap: _onItemTapped,
type: BottomNavigationBarType.fixed, // Ensures all 6 items are visible
),
)*/
));
}
}
class SupplierHome extends StatefulWidget {
const SupplierHome({super.key, required this.activeDeliveryNotifier});
final ValueNotifier<List<MyOrdersModel>> activeDeliveryNotifier;
@override
State<SupplierHome> createState() => _SupplierHomeState();
}
class _SupplierHomeState extends State<SupplierHome> {
bool isConnectedDataLoading = false;
bool isOrdersDataLoading = false;
bool isSupplierOrdersDataLoading = false;
bool isPlanRequestsDataLoading = false;
List<ConnectedSuppliersModel> connectedSuppliersList = [];
List<MyOrdersModel> ordersList = [];
List<SupplierOrdersModel> supplierOrdersList = [];
List<PlanRequestModel> planRequestsList = [];
List<MyOrdersModel> upcomingOrders = [];
double lat = 0;
double lng = 0;
final PageController _pageController = PageController();
final PageController _pageController1 = PageController();
final PageController _pageControllerForPlans = PageController();
Future<void> getConnectedSuppliersData() async {
isConnectedDataLoading = true;
try {
var response = await AppSettings.getConnetcedSuppliers();
setState(() {
connectedSuppliersList =
((jsonDecode(response)['data']) as List).map((dynamic model) {
return ConnectedSuppliersModel.fromJson(model);
}).toList();
connectedSuppliersList.forEach((element) async {
var distanceInM;
double distanceInMeters = await Geolocator.distanceBetween(
element.lat, element.lng, lat, lng);
});
isConnectedDataLoading = false;
});
} catch (e) {
setState(() {
isConnectedDataLoading = false;
});
}
}
Future<void> getOrdersData() async {
setState(() => isOrdersDataLoading = true);
try {
final response1 = await AppSettings.getAllOrders();
final decoded = jsonDecode(response1);
print("🔹 API RESPONSE (getOrdersData): $decoded");
if (decoded == null || decoded['data'] == null) {
print("⚠️ No 'data' found in response");
setState(() {
ordersList = [];
upcomingOrders = [];
isOrdersDataLoading = false;
});
return;
}
final List<dynamic> data = decoded['data'];
if (data.isEmpty) {
print("⚠️ Empty data list");
setState(() {
ordersList = [];
upcomingOrders = [];
isOrdersDataLoading = false;
});
return;
}
final parsedOrders = data.map((e) => MyOrdersModel.fromJson(e)).toList();
// 🔹 Flexible filter for upcoming deliveries
final filtered = parsedOrders.where((order) {
final s = order.orderStatus.toLowerCase();
return s != "pending" ||
s == "advance_paid" ||
s == "assigned" ||
s == "deliveryboy_assigned";
}).toList();
print(
"✅ Total orders: ${parsedOrders.length}, Upcoming: ${filtered.length}");
setState(() {
ordersList = parsedOrders;
upcomingOrders = filtered;
isOrdersDataLoading = false;
});
// ✅ Update the global overlay flag (deliverboystarted anywhere?)
final excludedStatuses = {
'deliveryboy_assigned',
'completed',
'cancelled',
'advance_paid'
};
final activeOrders = parsedOrders.where((o) {
final s = (o.orderStatus ?? '').toLowerCase().replaceAll(' ', '');
return !excludedStatuses.contains(s);
}).toList();
// ✅ publish full list to the notifier
widget.activeDeliveryNotifier.value = activeOrders;
// You can OR-in other active states if needed:
// || (o.orderStatus ?? '').toLowerCase() == 'deliveryboy_assigned'
} catch (e) {
print("❌ Error in getOrdersData(): $e");
setState(() => isOrdersDataLoading = false);
}
}
Future<void> getAcceptedOrdersFromSupplier() async {
isSupplierOrdersDataLoading = true;
var response1 = await AppSettings.getAcceptedOrdersDataFromSupplier();
var json = jsonDecode(response1);
setState(() {
supplierOrdersList = (json['data'] as List)
.map((model) => SupplierOrdersModel.fromJson(model))
.where((order) => order.status.toLowerCase() == 'accept')
.toList();
isSupplierOrdersDataLoading = false;
});
}
Future<void> getAcceptedPlansFromSupplier() async {
isPlanRequestsDataLoading = true;
var response1 = await AppSettings.getAcceptedPlansFromSupplier();
var json = jsonDecode(response1);
setState(() {
planRequestsList = (json['data'] as List)
.map((model) => PlanRequestModel.fromJson(model))
.where((order) => order.status.toLowerCase() == 'accepted')
.toList();
isPlanRequestsDataLoading = false;
});
}
Map<String, dynamic> getOrderStatus(String orderTimeStr, String dbStatus) {
String status = "Invalid time";
Color color = Colors.grey;
final dbLower = (dbStatus ?? "").toLowerCase().trim();
// ✅ Statuses that ignore time
if (dbLower == "reject")
return {"status": "Rejected", "color": const Color(0XFFE2483D)};
if (dbLower == "accept")
return {"status": "Accepted", "color": const Color(0XFF0A9E04)};
if (dbLower == "delivered")
return {"status": "Delivered", "color": const Color(0XFF2E7D32)};
if (dbLower == "cancelled" ||
dbLower == "cancelled_by_user" ||
dbLower == "cancelled_by_supplier") {
return {"status": "Cancelled", "color": const Color(0XFF757575)};
}
// ✅ Time-based status (only if not rejected/accepted/etc.)
if (orderTimeStr.isEmpty) {
// fallback for pending without time
return {"status": "Pending", "color": const Color(0XFFE56910)};
}
try {
final format = DateFormat("dd-MM-yyyy HH:mm");
final orderTime = format.parse(orderTimeStr);
final now = DateTime.now();
final difference = now.difference(orderTime);
if (difference.inMinutes < 2) {
status = "New";
color = const Color(0XFF1D7AFC); // Blue
} else if (difference.inMinutes < 30) {
final remaining = 30 - difference.inMinutes;
status = "Expires in ${remaining}m"; // show time for pending
color = difference.inMinutes < 10
? const Color(0XFFE56910)
: const Color(0XFFE2483D);
} else {
// Expired overrides pending
status = "Expired";
color = const Color(0XFF757575);
}
} catch (e) {
debugPrint("⚠️ Error parsing time: $e");
status = "Invalid time";
color = Colors.grey;
}
return {"status": status, "color": color};
}
String getOrderTimeOnly(String orderTimeStr) {
if (orderTimeStr.isEmpty) return "";
try {
final format = DateFormat("dd-MM-yyyy HH:mm");
final orderTime = format.parse(orderTimeStr);
final now = DateTime.now();
final difference = now.difference(orderTime);
if (difference.inDays < 2) {
return "New";
} else if (difference.inDays < 20) {
final remaining = 20 - difference.inDays;
return "Expires in ${remaining}d";
} else {
return "Expired";
}
} catch (e) {
return "";
}
}
@override
void initState() {
// TODO: implement initState
super.initState();
widget.activeDeliveryNotifier.value = [];
getConnectedSuppliersData();
getOrdersData();
getAcceptedOrdersFromSupplier();
getAcceptedPlansFromSupplier();
lat = AppSettings.userLatitude;
lng = AppSettings.userLongitude;
}
showRejectOrdersDialog(var object) async {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return AlertDialog(
backgroundColor:
Color(0XFFFFFFFF), // Set your desired background color
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12), // Optional: Rounded corners
),
title: Center(
child: Text(
'Reject Order Request',
style: fontTextStyle(16, Color(0XFF3B3B3B), FontWeight.w600),
),
),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Container(
child: Text(
'Do u want to reject order request',
style:
fontTextStyle(14, Color(0XFF101214), FontWeight.w600),
),
),
],
),
),
actions: <Widget>[
Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFF1D7AFC)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Cancel',
style: fontTextStyle(
12, Color(0XFF1D7AFC), FontWeight.w600)),
),
),
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * .016,
),
Expanded(
child: GestureDetector(
onTap: () async {
var payload = <String, dynamic>{};
payload["supplierId"] = object.supplierId;
payload["action"] = 'reject';
payload["paymentId"] = '';
try {
bool status =
await AppSettings.acceptOrderRequests(
payload, object.dbId);
if (!mounted) return;
if (status) {
AppSettings.longSuccessToast('Rejected');
Navigator.pop(context);
getAcceptedOrdersFromSupplier();
} else {
AppSettings.longFailedToast(
'Failed to reject order request');
}
} catch (e) {
AppSettings.longFailedToast('Error: $e');
}
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFE2483D),
border: Border.all(
width: 1, color: Color(0XFFE2483D)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Reject',
style: fontTextStyle(12, Color(0XFFFFFFFF),
FontWeight.w600)),
),
),
)),
)
],
),
),
],
);
});
},
);
}
showAcceptOrdersDialog(var object) async {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return AlertDialog(
backgroundColor:
Color(0XFFFFFFFF), // Set your desired background color
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12), // Optional: Rounded corners
),
title: Center(
child: Text(
'Accept Order Request',
style: fontTextStyle(16, Color(0XFF3B3B3B), FontWeight.w600),
),
),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Container(
child: Text(
'Do u want to Accept the order request?',
style:
fontTextStyle(14, Color(0XFF101214), FontWeight.w600),
),
),
],
),
),
actions: <Widget>[
Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFFE2483D)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Cancel',
style: fontTextStyle(
12, Color(0XFFE2483D), FontWeight.w600)),
),
),
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * .016,
),
Expanded(
child: GestureDetector(
onTap: () async {
Navigator.pop(context);
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrderDetails(
supplierDetails: object,
),
),
);
// If result indicates API reload
if (result == true) {
getAcceptedOrdersFromSupplier();
}
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFF1D7AFC)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Accept',
style: fontTextStyle(12, Color(0XFF1D7AFC),
FontWeight.w600)),
),
),
)),
)
],
),
),
],
);
});
},
);
}
showAcceptPlanDialog(var object) async {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return AlertDialog(
backgroundColor:
Color(0XFFFFFFFF), // Set your desired background color
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12), // Optional: Rounded corners
),
title: Center(
child: Text(
'Accept Plan Request',
style: fontTextStyle(16, Color(0XFF3B3B3B), FontWeight.w600),
),
),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Container(
child: Text(
'Do u want to Accept the plan request?',
style:
fontTextStyle(14, Color(0XFF101214), FontWeight.w600),
),
),
],
),
),
actions: <Widget>[
Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFFE2483D)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Cancel',
style: fontTextStyle(
12, Color(0XFFE2483D), FontWeight.w600)),
),
),
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * .016,
),
Expanded(
child: GestureDetector(
onTap: () async {
var payload = {
"action": "accept",
"ref_number": '',
"payment_type":object.paymentType
};
try {
bool status = await AppSettings.acceptPlanRequestsWithPayment(payload, object.dbId);
if (!mounted) return;
if (status) {
AppSettings.longSuccessToast('Accepted');
Navigator.pop(context);
getAcceptedPlansFromSupplier();
// Use Navigator safely
/* Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => OrderDetails(supplierDetails: object),
),
);*/
} else {
AppSettings.longFailedToast('Failed to accept order request');
}
} catch (e) {
AppSettings.longFailedToast('Error: $e');
}
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFF1D7AFC)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Accept',
style: fontTextStyle(12, Color(0XFF1D7AFC),
FontWeight.w600)),
),
),
)),
)
],
),
),
],
);
});
},
);
}
showRejectPlanDialog(var object) async {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return AlertDialog(
backgroundColor:
Color(0XFFFFFFFF), // Set your desired background color
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12), // Optional: Rounded corners
),
title: Center(
child: Text(
'Reject Plan Request',
style: fontTextStyle(16, Color(0XFF3B3B3B), FontWeight.w600),
),
),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Container(
child: Text(
'Do u want to Reject the plan request?',
style:
fontTextStyle(14, Color(0XFF101214), FontWeight.w600),
),
),
],
),
),
actions: <Widget>[
Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: GestureDetector(
onTap: () {
Navigator.pop(context);
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFF1D7AFC)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Cancel',
style: fontTextStyle(
12, Color(0XFF1D7AFC), FontWeight.w600)),
),
),
),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * .016,
),
Expanded(
child: GestureDetector(
onTap: () async {
var payload = {
"action": "reject",
"ref_number": '',
"payment_type":object.paymentType
};
try {
bool status = await AppSettings.acceptPlanRequestsWithPayment(payload, object.dbId);
if (!mounted) return;
if (status) {
AppSettings.longSuccessToast('Rejected');
Navigator.pop(context);
getAcceptedPlansFromSupplier();
// Use Navigator safely
/* Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => OrderDetails(supplierDetails: object),
),
);*/
} else {
AppSettings.longFailedToast('Failed to accept order request');
}
} catch (e) {
AppSettings.longFailedToast('Error: $e');
}
},
child: Container(
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Color(0XFFFFFFFF),
border: Border.all(
width: 1, color: Color(0XFFE2483D)),
borderRadius: BorderRadius.circular(
12,
)),
alignment: Alignment.center,
child: Visibility(
visible: true,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Text('Reject',
style: fontTextStyle(12, Color(0XFFE2483D),
FontWeight.w600)),
),
),
)),
)
],
),
),
],
);
});
},
);
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Stack(children: [
Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: MediaQuery.of(context).size.height * .008,
),
Row(
children: [
Expanded(
child: GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BookATanker()),
);
},
child: Card(
color: Color(0XFFFFFFFF),
elevation: 2,
child: Container(
padding: EdgeInsets.fromLTRB(5, 5, 0, 0),
height: 165,
//width: MediaQuery.of(context).size.height * .14,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.fromLTRB(5, 5, 0, 0),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'Book a tanker',
style: fontTextStyle(
14,
Color(0XFF2D2E30),
FontWeight.w700),
),
Text(
'Order now or schedule for later',
style: fontTextStyle(
12,
Color(0XFF757575),
FontWeight.w400),
),
],
)),
/* Expanded(child: Align(
alignment: Alignment.bottomRight,
child: Image.asset('images/WaterTankImage.png'),
))*/
],
)),
),
),
),
Expanded(
child: GestureDetector(
onTap: () {
/* Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SupplyCalendarScreen()),
);*/
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PlanRequestScreen()),
);
},
child: Card(
color: Color(0XFFFFFFFF),
elevation: 2,
child: Container(
padding: EdgeInsets.fromLTRB(5, 5, 0, 0),
//height:MediaQuery.of(context).size.height * .20,
height: 165,
// width: MediaQuery.of(context).size.height * .14,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.fromLTRB(5, 5, 0, 0),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
'Plans',
style: fontTextStyle(
14,
Color(0XFF2D2E30),
FontWeight.w700),
),
Text(
'Subscribe for long-term water delivery',
style: fontTextStyle(
12,
Color(0XFF757575),
FontWeight.w400),
),
],
)),
SizedBox(
height:
MediaQuery.of(context).size.height * .038,
),
/*Expanded(child: Align(
alignment: Alignment.bottomRight,
child: Image.asset('images/ConsumptionImage.png',),))*/ /*height: 80,width: 80,*/
],
)),
),
)),
],
),
SizedBox(
height: MediaQuery.of(context).size.height * .024,
),
Visibility(
visible: supplierOrdersList.length != 0,
child: Column(
children: [
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrderRequestsPage()),
);
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Order Requests',
style: fontTextStyle(
14, Color(0XFF2A2A2A), FontWeight.w600),
),
SizedBox(
width: MediaQuery.of(context).size.width * .093,
),
Row(
children: [
Image.asset(
'images/arrow-right.png',
fit: BoxFit.cover,
width:
16, // Match the diameter of the CircleAvatar
height: 16,
),
],
)
],
),
),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
Center(
child: Container(
width: double.infinity,
color: Color(0XFFFFFFFF),
height: 150,
padding: EdgeInsets.all(0),
child: isSupplierOrdersDataLoading
? Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
)
: supplierOrdersList.length != 0
? Column(
children: [
Expanded(
child: PageView.builder(
controller: _pageController1,
itemCount:
supplierOrdersList.length,
itemBuilder: (context, index) {
final order =
supplierOrdersList[index];
final orderDateTime =
"${order.acceptedTime}"
.trim();
final statusTime =
getOrderTimeOnly(
orderDateTime);
// status badge color
Color statusColor =
Color(0xFF1D7AFC);
if (statusTime == "Expired") {
statusColor =
Color(0xFF757575);
} else if (statusTime ==
"New") {
statusColor =
Color(0XFF1D7AFC);
} else if (statusTime
.endsWith("m")) {
statusColor =
Color(0XFFE56910);
}
return Container(
decoration: BoxDecoration(
color: Color(
0XFFFFFFFF), // Same as Card color
borderRadius:
BorderRadius.circular(
12), // Rounded corners
border: Border.all(
color: Color(
0XFF1D7AFC), // Border color
width:
0.5, // Border width
),
),
//color: Color(0XFFFFFFFF),
child: Padding(
padding:
EdgeInsets.all(12),
child: Column(
mainAxisSize:
MainAxisSize.min,
crossAxisAlignment:
CrossAxisAlignment
.start,
mainAxisAlignment:
MainAxisAlignment
.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Visibility(
visible: supplierOrdersList[
index]
.supplierName !=
'',
child: Text(
supplierOrdersList[
index]
.supplierName,
style: fontTextStyle(
14,
Color(
0XFF343637),
FontWeight
.w600),
),
),
Visibility(
visible: statusTime
.isNotEmpty,
child: Padding(
padding: const EdgeInsets
.only(
top: 4.0,
bottom:
4.0),
child:
Container(
padding: EdgeInsets.symmetric(
horizontal:
6,
vertical:
2),
decoration:
BoxDecoration(
color:
statusColor,
borderRadius:
BorderRadius.circular(
4),
),
child: Text(
statusTime,
style: fontTextStyle(
10,
Colors
.white,
FontWeight
.w500),
),
),
),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Visibility(
visible: supplierOrdersList[
index]
.displayAddress !=
'',
child: Text(
supplierOrdersList[
index]
.displayAddress,
style: fontTextStyle(
10,
Color(
0XFF646566),
FontWeight
.w400),
),
),
Visibility(
visible: supplierOrdersList[
index]
.date !=
'',
child: Text(
supplierOrdersList[
index]
.date +
' ' +
supplierOrdersList[
index]
.time,
style: fontTextStyle(
9,
Color(
0XFF646566),
FontWeight
.w400),
),
),
],
),
SizedBox(
height: MediaQuery.of(
context)
.size
.height *
.012,
),
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment
.start,
mainAxisAlignment:
MainAxisAlignment
.start,
children: [
Container(
padding: EdgeInsets.symmetric(
horizontal:
4,
vertical:
2),
decoration:
BoxDecoration(
color: supplierOrdersList[index].typeofwater.toString().toLowerCase() ==
'bore water'
? Color(
0xFF8877DD)
: Color(
0xFFCA86B0),
borderRadius:
BorderRadius.circular(
4),
border:
Border
.all(
width:
1,
color: supplierOrdersList[index].typeofwater.toString().toLowerCase() ==
'bore water'
? Color(0xFF8877DD)
: Color(0xFFCA86B0),
),
),
child:
AutoSizeText(
capitalizeFirst(
supplierOrdersList[index]
.typeofwater),
maxLines:
1,
overflow:
TextOverflow
.ellipsis,
style: fontTextStyle(
12,
Color(
0xFFFFFFFF),
FontWeight
.w400),
),
),
Row(
children: [
Text(
'' +
AppSettings.formDouble(supplierOrdersList[index].quotedAmount) +
'/',
style: fontTextStyle(
20,
Color(0XFF515253),
FontWeight.w600),
),
Text(
supplierOrdersList[index]
.capacity,
style: fontTextStyle(
12,
Color(0XFF2D2E30),
FontWeight.w600),
)
],
),
],
),
Row(
children: [
GestureDetector(
onTap: statusTime ==
"Expired"
? null
: () {
showRejectOrdersDialog(supplierOrdersList[index]);
},
child:
ColorFiltered(
colorFilter: statusTime ==
"Expired"
? ColorFilter.mode(
Color(
0XFF9F9F9F),
BlendMode
.srcIn)
: ColorFilter.mode(
Colors.transparent,
BlendMode.multiply),
child: Image
.asset(
'images/wrong_button.png',
width:
44,
height:
44,
),
),
),
SizedBox(
width: MediaQuery.of(context)
.size
.width *
.012,
),
GestureDetector(
onTap: statusTime ==
"Expired"
? null
: () async {
// showAcceptOrdersDialog(supplierOrdersList[index]);
final result =
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => OrderDetails(
supplierDetails: supplierOrdersList[index],
),
),
);
;
if (result ==
true) {
getConnectedSuppliersData();
getOrdersData();
getAcceptedOrdersFromSupplier();
getAcceptedPlansFromSupplier();
}
},
child:
ColorFiltered(
colorFilter: statusTime ==
"Expired"
? ColorFilter.mode(
Color(
0XFF9F9F9F),
BlendMode
.srcIn)
: ColorFilter.mode(
Colors.transparent,
BlendMode.multiply),
child: Image
.asset(
'images/right_button.png',
width:
44,
height:
44,
),
),
),
],
)
],
)
],
)),
);
},
),
),
SizedBox(
height: MediaQuery.of(context)
.size
.height *
.010,
),
SmoothPageIndicator(
controller: _pageController1,
count: supplierOrdersList.length,
effect: ExpandingDotsEffect(
activeDotColor: Colors.blueAccent,
dotHeight: 3,
dotWidth: 3,
),
),
],
)
: Center(
child: Text(
'No Data Available',
style: fontTextStyle(
12,
Color(0XFF000000),
FontWeight.w500),
),
),
),
),
],
)),
SizedBox(
height: MediaQuery.of(context).size.height * .024,
),
Visibility(
visible: planRequestsList.length != 0,
child: Column(
children: [
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PlanRequestsScreen()),
);
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Plan Requests',
style: fontTextStyle(
14, Color(0XFF2A2A2A), FontWeight.w600),
),
SizedBox(
width:
MediaQuery.of(context).size.width * .093,
),
Row(
children: [
Image.asset(
'images/arrow-right.png',
fit: BoxFit.cover,
width:
16, // Match the diameter of the CircleAvatar
height: 16,
),
],
)
],
)),
SizedBox(
height: MediaQuery.of(context).size.height * .012,
),
Center(
child: Container(
width: double.infinity,
color: Color(0XFFFFFFFF),
height: 230,
padding: EdgeInsets.all(0),
child: isPlanRequestsDataLoading
? Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
)
: planRequestsList.length != 0
? Column(
children: [
Expanded(
child: PageView.builder(
controller:
_pageControllerForPlans,
itemCount:
planRequestsList.length,
itemBuilder: (context, index) {
final plans =
planRequestsList[index];
final orderDateTime =
"${plans.acceptedTime}"
.trim();
final statusTime =
getOrderTimeOnly(
orderDateTime);
// status badge color
Color statusColor =
Color(0xFF1D7AFC);
if (statusTime == "Expired") {
statusColor =
Color(0xFF757575);
} else if (statusTime ==
"New") {
statusColor =
Color(0XFF1D7AFC);
} else if (statusTime
.endsWith("m")) {
statusColor =
Color(0XFFE56910);
}
final int totalOrders =
planRequestsList[index]
.dates
.length;
final double biddingPrice =
double.tryParse(
planRequestsList[
index]
.biddingPrice) ??
0;
final double totalAmount =
totalOrders * biddingPrice;
return Container(
decoration: BoxDecoration(
color: Color(
0XFFFFFFFF), // Same as Card color
borderRadius:
BorderRadius.circular(
12), // Rounded corners
border: Border.all(
color: Color(
0XFF1D7AFC), // Border color
width:
0.5, // Border width
),
),
//color: Color(0XFFFFFFFF),
child: Padding(
padding:
EdgeInsets.all(12),
child: Column(
mainAxisSize:
MainAxisSize.min,
crossAxisAlignment:
CrossAxisAlignment
.start,
mainAxisAlignment:
MainAxisAlignment
.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Visibility(
visible: planRequestsList[
index]
.supplierName !=
'',
child: Text(
planRequestsList[
index]
.supplierName,
style: fontTextStyle(
14,
Color(
0XFF343637),
FontWeight
.w600),
),
),
Visibility(
visible: statusTime
.isNotEmpty,
child: Padding(
padding: const EdgeInsets
.only(
top: 4.0,
bottom:
4.0),
child:
Container(
padding: EdgeInsets.symmetric(
horizontal:
6,
vertical:
2),
decoration:
BoxDecoration(
color:
statusColor,
borderRadius:
BorderRadius.circular(
4),
),
child: Text(
statusTime,
style: fontTextStyle(
10,
Colors
.white,
FontWeight
.w500),
),
),
),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Visibility(
visible: planRequestsList[
index]
.displayAddress !=
'',
child: Text(
planRequestsList[
index]
.displayAddress,
style: fontTextStyle(
10,
Color(
0XFF646566),
FontWeight
.w400),
),
),
Visibility(
visible: planRequestsList[
index]
.startDate !=
'',
child: Text(
planRequestsList[
index]
.startDate +
' to ' +
planRequestsList[
index]
.endDate,
style: fontTextStyle(
9,
Color(
0XFF646566),
FontWeight
.w400),
),
),
],
),
SizedBox(
height: MediaQuery.of(
context)
.size
.height *
.012,
),
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment
.start,
mainAxisAlignment:
MainAxisAlignment
.start,
children: [
Container(
padding: EdgeInsets.symmetric(
horizontal:
4,
vertical:
2),
decoration:
BoxDecoration(
color: planRequestsList[index].typeofwater.toString().toLowerCase() ==
'bore water'
? Color(
0xFF8877DD)
: Color(
0xFFCA86B0),
borderRadius:
BorderRadius.circular(
4),
border:
Border
.all(
width:
1,
color: planRequestsList[index].typeofwater.toString().toLowerCase() ==
'bore water'
? Color(0xFF8877DD)
: Color(0xFFCA86B0),
),
),
child:
AutoSizeText(
capitalizeFirst(
planRequestsList[index]
.typeofwater),
maxLines:
1,
overflow:
TextOverflow
.ellipsis,
style: fontTextStyle(
12,
Color(
0xFFFFFFFF),
FontWeight
.w400),
),
),
Row(
children: [
Text(
'Actual Price: ',
style: fontTextStyle(
12,
Color(0XFF646566),
FontWeight.w400),
),
Text(
'' +
AppSettings.formDouble(planRequestsList[index].quotedAmount) +
'/',
style: fontTextStyle(
12,
Color(0XFF515253),
FontWeight.w600),
),
Text(
planRequestsList[index]
.capacity,
style: fontTextStyle(
12,
Color(0XFF2D2E30),
FontWeight.w600),
)
],
),
Row(
children: [
Text(
'Bidding Price: ',
style: fontTextStyle(
12,
Color(0XFF646566),
FontWeight.w400),
),
Text(
'' +
AppSettings.formDouble(planRequestsList[index].biddingPrice) +
'/',
style: fontTextStyle(
12,
Color(0XFF515253),
FontWeight.w600),
),
Text(
planRequestsList[index]
.capacity,
style: fontTextStyle(
12,
Color(0XFF2D2E30),
FontWeight.w600),
)
],
),
Row(
children: [
Text(
'Frequency: ',
style: fontTextStyle(
12,
Color(0XFF646566),
FontWeight.w400),
),
Text(
planRequestsList[index].frequency +
'/week',
style: fontTextStyle(
12,
Color(0XFF2D2E30),
FontWeight.w600),
)
],
),
],
),
Row(
children: [
GestureDetector(
onTap: statusTime ==
"Expired"
? null
: () {
showRejectPlanDialog(planRequestsList[index]);
},
child:
ColorFiltered(
colorFilter: statusTime ==
"Expired"
? ColorFilter.mode(
Color(
0XFF9F9F9F),
BlendMode
.srcIn)
: ColorFilter.mode(
Colors.transparent,
BlendMode.multiply),
child: Image
.asset(
'images/wrong_button.png',
width:
44,
height:
44,
),
),
),
SizedBox(
width: MediaQuery.of(context)
.size
.width *
.012,
),
GestureDetector(
onTap: statusTime ==
"Expired"
? null
: () async{
// showAcceptOrdersDialog(supplierOrdersList[index]);
if (planRequestsList[index].paymentType ==
'advance') {
final result =
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PlanDetails(
supplierDetails: planRequestsList[index],
),
),
);
if (result ==
true) {
getConnectedSuppliersData();
getOrdersData();
getAcceptedOrdersFromSupplier();
getAcceptedPlansFromSupplier();
}
} else {
showAcceptPlanDialog(planRequestsList[index]);
}
},
child:
ColorFiltered(
colorFilter: statusTime ==
"Expired"
? ColorFilter.mode(
Color(
0XFF9F9F9F),
BlendMode
.srcIn)
: ColorFilter.mode(
Colors.transparent,
BlendMode.multiply),
child: Image
.asset(
'images/right_button.png',
width:
44,
height:
44,
),
),
),
],
)
],
),
SizedBox(
height: MediaQuery.of(
context)
.size
.height *
.010,
),
Row(
children: [
Text(
'Payment Type: ',
style: fontTextStyle(
12,
Color(
0XFF646566),
FontWeight
.w400),
),
Text(
planRequestsList[
index]
.paymentType,
style: fontTextStyle(
12,
Color(
0XFF515253),
FontWeight
.w600),
),
],
),
Visibility(
visible: planRequestsList[
index]
.paymentType !=
'after_delivery',
child: Row(
children: [
Text(
planRequestsList[index]
.paymentType ==
'credit'
? 'Credit Limit: '
: 'Advance Amount: ',
style: fontTextStyle(
12,
Color(
0XFF646566),
FontWeight
.w400),
),
Text(
planRequestsList[
index]
.advanceAmount,
style: fontTextStyle(
12,
Color(
0XFF515253),
FontWeight
.w600),
),
],
),
),
Text.rich(
TextSpan(
children: [
TextSpan(
text:
"Total amount for this plan orders ",
style:
fontTextStyle(
12,
const Color(
0xFF939495),
FontWeight
.w400,
),
),
TextSpan(
text:
'$totalOrders × ${biddingPrice.toStringAsFixed(0)} = ₹${totalAmount.toStringAsFixed(0)}',
style:
fontTextStyle(
12,
const Color(
0xFF515253),
FontWeight
.w500,
),
),
],
),
softWrap: true,
maxLines: 2,
overflow:
TextOverflow
.visible,
textAlign: TextAlign
.center,
)
],
)),
);
},
),
),
SizedBox(
height: MediaQuery.of(context)
.size
.height *
.010,
),
SmoothPageIndicator(
controller: _pageControllerForPlans,
count: planRequestsList.length,
effect: ExpandingDotsEffect(
activeDotColor: Colors.blueAccent,
dotHeight: 3,
dotWidth: 3,
),
),
],
)
: Center(
child: Text(
'No Data Available',
style: fontTextStyle(
12,
Color(0XFF000000),
FontWeight.w500),
),
),
),
),
],
)),
SizedBox(
height: MediaQuery.of(context).size.height * .024,
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Todays Price',
style:
fontTextStyle(14, Color(0XFF2A2A2A), FontWeight.w600),
),
SizedBox(
width: MediaQuery.of(context).size.width * .093,
),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TodaysPriceMainScreen()),
);
},
child: Row(
children: [
Image.asset(
'images/arrow-right.png',
fit: BoxFit.cover,
width: 16, // Match the diameter of the CircleAvatar
height: 16,
),
],
),
)
],
),
SizedBox(
height: MediaQuery.of(context).size.height * .006,
),
Column(
children: [
GestureDetector(
onTap: () {
/* Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SupplyCalendarScreen()),
);*/
},
child: Card(
color: Colors.white,
//width: MediaQuery.of(context).size.height * .14,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'DRINKING WATER',
style: fontTextStyle(12,
Color(0XFF646566), FontWeight.w500),
),
SizedBox(
height:
MediaQuery.of(context).size.height *
.012,
),
Container(
decoration: BoxDecoration(
color: Color(0xFFED8C85),
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: Color(0xFFED8C85), width: 1),
),
padding: EdgeInsets.all(2),
child: Row(
mainAxisSize: MainAxisSize
.min, // Important for wrapping content
children: [
Image.asset(
'images/long_arrow_down.png',
fit: BoxFit.cover,
width: 8,
height: 8,
),
SizedBox(
width:
4), // spacing between image and text
Text(
'0.35%',
style: fontTextStyle(
10,
Color(0xFFFFFFFF),
FontWeight.w400),
),
],
),
)
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'Avg',
style: fontTextStyle(10,
Color(0XFF757575), FontWeight.w400),
),
Row(
children: [
Text(
'₹ 1,432/',
style: fontTextStyle(
20,
Color(0XFF2D2E30),
FontWeight.w600),
),
Text(
'5,000L',
style: fontTextStyle(
14,
Color(0XFF2D2E30),
FontWeight.w600),
)
],
),
],
)
],
)),
),
),
SizedBox(
width: MediaQuery.of(context).size.width * .024,
),
GestureDetector(
onTap: () {
/* Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SupplyCalendarScreen()),
);*/
},
child: Card(
color: Colors.white,
//width: MediaQuery.of(context).size.height * .14,
child: Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 12),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'BORE WATER',
style: fontTextStyle(12,
Color(0XFF646566), FontWeight.w500),
),
SizedBox(
height:
MediaQuery.of(context).size.height *
.012,
),
Container(
decoration: BoxDecoration(
color: Color(0XFF36AF31),
borderRadius: BorderRadius.circular(4),
border: Border.all(
color: Color(0XFF36AF31), width: 1),
),
padding: EdgeInsets.all(2),
child: Row(
mainAxisSize: MainAxisSize
.min, // Important for wrapping content
children: [
Image.asset(
'images/long_arrow_up.png',
fit: BoxFit.cover,
width: 8,
height: 8,
),
SizedBox(
width:
4), // spacing between image and text
Text(
'0.23%',
style: fontTextStyle(
10,
Color(0xFFFFFFFF),
FontWeight.w400),
),
],
),
)
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'Avg',
style: fontTextStyle(10,
Color(0XFF757575), FontWeight.w400),
),
Row(
children: [
Text(
'₹ 840/',
style: fontTextStyle(
20,
Color(0XFF2D2E30),
FontWeight.w600),
),
Text(
'5,000L',
style: fontTextStyle(
14,
Color(0XFF2D2E30),
FontWeight.w600),
)
],
),
],
)
],
)),
),
),
],
),
SizedBox(
height: MediaQuery.of(context).size.height * .024,
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'My Suppliers',
style:
fontTextStyle(14, Color(0XFF2A2A2A), FontWeight.w600),
),
SizedBox(
width: MediaQuery.of(context).size.width * .093,
),
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MySuppliers(
navigationFrom: 'dashboard',
)),
);
},
child: Row(
children: [
Image.asset(
'images/arrow-right.png',
fit: BoxFit.cover,
width: 16, // Match the diameter of the CircleAvatar
height: 16,
),
],
),
)
],
),
Container(
height: 100,
child: isConnectedDataLoading
? Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
)
: connectedSuppliersList.isNotEmpty
? ListView.separated(
scrollDirection: Axis.horizontal,
padding: EdgeInsets.all(8),
itemCount: connectedSuppliersList.length,
separatorBuilder: (context, index) => SizedBox(
width: MediaQuery.of(context).size.width * .03,
),
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
CircleAvatar(
radius: 35,
backgroundColor: Color(0XFFE8F2FF),
child: Image.asset(
'images/profile_user.png',
fit: BoxFit.cover,
width: 70,
height: 70,
),
),
SizedBox(
width: MediaQuery.of(context)
.size
.width *
.012),
Text(
connectedSuppliersList[index]
.supplier_name,
style: fontTextStyle(10,
Color(0XFF646566), FontWeight.w400),
),
],
),
);
},
)
: Center(
child: Text(
'No Data Available',
style: fontTextStyle(
12, Color(0XFF000000), FontWeight.w500),
),
),
),
SizedBox(
height: MediaQuery.of(context).size.height * .024,
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Upcoming Deliveries',
style:
fontTextStyle(14, Color(0XFF2A2A2A), FontWeight.w600),
),
SizedBox(
width: MediaQuery.of(context).size.width * .093,
),
Row(
children: [
GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MyOrders(
navigationFrom: 'dashboard',
),
),
);
},
child: Image.asset(
'images/arrow-right.png',
fit: BoxFit.cover,
width: 16, // Match the diameter of the CircleAvatar
height: 16,
),
)
],
)
],
),
Center(
child: Container(
width: double.infinity,
color: Color(0XFFFFFFFF),
height: 160,
padding: EdgeInsets.all(0),
child: isOrdersDataLoading
? Center(
child: CircularProgressIndicator(
color: primaryColor,
strokeWidth: 5.0,
),
)
: upcomingOrders.length != 0
? Column(
children: [
Expanded(
child: PageView.builder(
controller: _pageController,
itemCount: upcomingOrders.length,
itemBuilder: (context, index) {
return Card(
color: Color(0XFFFFFFFF),
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Visibility(
visible: upcomingOrders[
index]
.supplierName !=
'',
child: Text(
upcomingOrders[index]
.supplierName,
style: fontTextStyle(
16,
Color(0XFF2D2E30),
FontWeight.w600),
),
),
Align(
alignment: Alignment
.centerRight,
child: Container(
padding: EdgeInsets
.fromLTRB(
4, 2, 2, 4),
decoration:
BoxDecoration(
color: Color(
0XFFFFFFFF), // Same as Card color
borderRadius:
BorderRadius
.circular(
4), // Rounded corners
border:
Border.all(
color: Color(
0XFFFFFFFF), // Border color
width:
1, // Border width
),
),
child: Row(
children: [
Image.asset(
'images/credit.png',
width:
12, // Adjust as needed
height:
12, // Adjust as needed
),
SizedBox(
width: MediaQuery.of(
context)
.size
.width *
.008,
),
Text(
'Credit Account',
style: fontTextStyle(
9,
Color(
0XFF2D2E30),
FontWeight
.w500),
),
],
)),
)
],
),
Visibility(
visible:
upcomingOrders[index]
.typeofwater !=
'',
child: Text(
upcomingOrders[index]
.typeofwater,
style: fontTextStyle(
12,
Color(0XFF4692FD),
FontWeight.w400),
),
),
Visibility(
visible: upcomingOrders[
index]
.displayAddress !=
'',
child: Text(
upcomingOrders[index]
.displayAddress,
style: fontTextStyle(
12,
Color(0XFF515253),
FontWeight.w400),
),
),
Row(
mainAxisAlignment:
MainAxisAlignment
.spaceBetween,
children: [
Visibility(
visible: true,
child: Text(
upcomingOrders[index]
.displayDateOfOrder,
style: fontTextStyle(
10,
Color(0XFF939495),
FontWeight.w500),
),
),
Align(
alignment: Alignment
.centerRight,
child: Visibility(
visible:
upcomingOrders[
index]
.price !=
'',
child: Text(
'' +
upcomingOrders[
index]
.price,
style: fontTextStyle(
12,
Color(
0XFF515253),
FontWeight
.w400),
),
),
)
],
),
Divider(
color: Colors.grey.shade300,
),
Align(
alignment: Alignment.center,
child: Row(
mainAxisAlignment:
MainAxisAlignment
.center,
crossAxisAlignment:
CrossAxisAlignment
.center,
children: [
GestureDetector(
child: Text(
'TRACK ORDER',
style: fontTextStyle(
12,
Color(
0XFF1D7AFC),
FontWeight
.w600)),
onTap: () {},
),
SizedBox(
width: MediaQuery.of(
context)
.size
.width *
.15,
),
GestureDetector(
child: Text('CANCEL',
style: fontTextStyle(
12,
Color(
0XFFE2483D),
FontWeight
.w600)),
onTap: () {},
),
],
),
),
],
)),
);
},
),
),
SizedBox(
height: MediaQuery.of(context).size.height *
.010,
),
SmoothPageIndicator(
controller: _pageController,
count: upcomingOrders.length,
effect: ExpandingDotsEffect(
activeDotColor: Colors.blueAccent,
dotHeight: 3,
dotWidth: 3,
),
),
],
)
: Center(
child: Text(
'No Data Available',
style: fontTextStyle(
12, Color(0XFF000000), FontWeight.w500),
),
),
),
),
],
)),
]),
);
}
}