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.
1541 lines
88 KiB
1541 lines
88 KiB
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'dart:typed_data';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:syncfusion_flutter_charts/charts.dart';
|
|
import 'package:bookatanker/common/settings.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'dart:io';
|
|
import 'dart:ui' as ui;
|
|
import 'package:gallery_saver/gallery_saver.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:share/share.dart';
|
|
import 'package:bookatanker/supplier/favourites_model.dart';
|
|
import 'package:bookatanker/supplier/place_order.dart';
|
|
import 'package:bookatanker/supplier/supplier_details.dart';
|
|
|
|
import '../models/connected_suppliers_model.dart';
|
|
import '../models/water_suppliers_model.dart';
|
|
|
|
class MySuppliers extends StatefulWidget {
|
|
var navigationFrom;
|
|
MySuppliers({this.navigationFrom});
|
|
@override
|
|
State<MySuppliers> createState() => _MySuppliersState();
|
|
}
|
|
|
|
class _MySuppliersState extends State<MySuppliers>
|
|
with TickerProviderStateMixin {
|
|
late TabController _controller;
|
|
String tabMessage = "Welcome to Tab 1";
|
|
bool isDataLoading = false;
|
|
bool isConnectedDataLoading = false;
|
|
bool isFavouriteDataLoading = false;
|
|
List<WaterSuppliersModel> suppliersList = [];
|
|
List<ConnectedSuppliersModel> connectedSuppliersList = [];
|
|
List<favouritesModel> favouritesList = [];
|
|
Set<String> favouriteIds = {}; // for fast lookup
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_controller = TabController(vsync: this, length: 3);
|
|
// Listen for tab changes
|
|
_controller.addListener(() {
|
|
if (_controller.indexIsChanging) {
|
|
setState(() {
|
|
// Change message or perform any other update
|
|
tabMessage =
|
|
_controller.index == 0 ? "Welcome to Tab 1" : "Welcome to Tab 2";
|
|
});
|
|
}
|
|
});
|
|
getAllSuppliersData();
|
|
getConnectedSuppliersData();
|
|
getAllFavouritesData();
|
|
}
|
|
|
|
Future<void> getAllSuppliersData() async {
|
|
|
|
setState(() {
|
|
isDataLoading = true;
|
|
});
|
|
|
|
try {
|
|
|
|
String tankerResponse = await AppSettings.getAllSuppliers();
|
|
|
|
if (tankerResponse.isEmpty) {
|
|
setState(() {
|
|
isDataLoading = false;
|
|
});
|
|
return;
|
|
}
|
|
|
|
var decoded = jsonDecode(tankerResponse);
|
|
|
|
List supplierList = decoded['suppliers'] ?? [];
|
|
|
|
List<WaterSuppliersModel> tempList = [];
|
|
|
|
for (var item in supplierList) {
|
|
|
|
try {
|
|
|
|
tempList.add(WaterSuppliersModel.fromJson(item));
|
|
|
|
} catch (e) {
|
|
|
|
print("Supplier parse error: $e");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setState(() {
|
|
suppliersList = tempList;
|
|
isDataLoading = false;
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
print("API ERROR: $e");
|
|
|
|
setState(() {
|
|
isDataLoading = false;
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Future<void> getAllFavouritesData() async {
|
|
isFavouriteDataLoading = true;
|
|
try {
|
|
var tankerResponse = await AppSettings.getAllFavourites();
|
|
|
|
setState(() {
|
|
favouritesList =
|
|
((jsonDecode(tankerResponse)['data']) as List).map((dynamic model) {
|
|
return favouritesModel.fromJson(model);
|
|
}).toList();
|
|
favouriteIds = favouritesList.map((e) => e.supplier_id).toSet();
|
|
isFavouriteDataLoading = false;
|
|
});
|
|
} catch (e) {
|
|
setState(() {
|
|
isFavouriteDataLoading = false;
|
|
});
|
|
}
|
|
}
|
|
|
|
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();
|
|
isConnectedDataLoading = false;
|
|
});
|
|
} catch (e) {
|
|
setState(() {
|
|
isConnectedDataLoading = false;
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_controller.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Widget mySuppliers() {
|
|
return isConnectedDataLoading
|
|
? Center(
|
|
child: CircularProgressIndicator(
|
|
color: primaryColor,
|
|
strokeWidth: 5.0,
|
|
),
|
|
)
|
|
: connectedSuppliersList.length != 0
|
|
? Padding(
|
|
padding: EdgeInsets.fromLTRB(12, 8, 12, 8),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
child: ListView.separated(
|
|
padding: EdgeInsets.all(8),
|
|
itemCount: connectedSuppliersList.length,
|
|
separatorBuilder: (context, index) => SizedBox(
|
|
height:
|
|
MediaQuery.of(context).size.height * .008,
|
|
),
|
|
itemBuilder: (BuildContext context, int index) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color:
|
|
Color(0XFFFFFFFF), // Same as Card color
|
|
borderRadius: BorderRadius.circular(
|
|
12), // Rounded corners
|
|
border: Border.all(
|
|
color: Colors.grey.shade300, // Border color
|
|
width: 1, // Border width
|
|
),
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
|
|
child: Column(
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.start,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
/*CircleAvatar(
|
|
radius: 30,
|
|
backgroundColor: Color(0XFFE8F2FF), // Fallback background color
|
|
child: usersList[index].profilePic.isNotEmpty? Image.network(usersList[index].profilePic,):
|
|
|
|
Text(
|
|
usersList[index].username.isNotEmpty ? usersList[index].username[0].toUpperCase() : '?', // First letter of name or '?'
|
|
style: TextStyle(
|
|
fontSize: 25,
|
|
fontWeight: FontWeight.bold,
|
|
color:Color(0XFF9EC6FE),
|
|
),
|
|
)
|
|
),*/
|
|
CircleAvatar(
|
|
radius: 20,
|
|
backgroundColor: Color(
|
|
0XFFE8F2FF), // Fallback background color
|
|
child: Image.asset(
|
|
'images/profile_user.png',
|
|
fit: BoxFit.cover,
|
|
width:
|
|
50, // Match the diameter of the CircleAvatar
|
|
height: 50,
|
|
), // Default icon if no profilePic
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context)
|
|
.size
|
|
.width *
|
|
.012,
|
|
),
|
|
Expanded(
|
|
flex: 2,
|
|
child: Container(
|
|
//width:MediaQuery.of(context).size.height * .3,
|
|
//height: MediaQuery.of(context).size.height * .06,
|
|
child: Column(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.start,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Visibility(
|
|
visible: true,
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment
|
|
.start,
|
|
children: [
|
|
Visibility(
|
|
visible:
|
|
connectedSuppliersList[
|
|
index]
|
|
.supplier_name !=
|
|
'',
|
|
child: Text(
|
|
connectedSuppliersList[
|
|
index]
|
|
.supplier_name
|
|
.toString(),
|
|
style: fontTextStyle(
|
|
16,
|
|
Color(
|
|
0XFF2D2E30),
|
|
FontWeight
|
|
.w600),
|
|
),
|
|
),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.center,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment
|
|
.center,
|
|
children: [
|
|
Image.asset(
|
|
'images/star.png',
|
|
fit: BoxFit.cover,
|
|
width:
|
|
16, // Match the diameter of the CircleAvatar
|
|
height: 16,
|
|
),
|
|
Visibility(
|
|
visible: true,
|
|
child: Text(
|
|
'4.2 (20K+ Ratings)',
|
|
style: fontTextStyle(
|
|
9,
|
|
Color(
|
|
0XFF515253),
|
|
FontWeight
|
|
.w400),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
Visibility(
|
|
visible: true,
|
|
child: Text(
|
|
'Drinking | Bore Water',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF4692FD),
|
|
FontWeight.w500),
|
|
),
|
|
),
|
|
Visibility(
|
|
visible: true,
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment
|
|
.start,
|
|
children: [
|
|
Text(
|
|
connectedSuppliersList[
|
|
index]
|
|
.displayAddress +
|
|
' ' +
|
|
connectedSuppliersList[
|
|
index]
|
|
.distanceInMeters
|
|
.toString() +
|
|
' Km',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(
|
|
0XFF515253),
|
|
FontWeight
|
|
.w400)),
|
|
GestureDetector(
|
|
onTap: () async {
|
|
AppSettings
|
|
.preLoaderDialog(
|
|
context);
|
|
if (connectedSuppliersList[
|
|
index]
|
|
.isFavorite) {
|
|
try {
|
|
bool
|
|
tankerResponse =
|
|
await AppSettings.removeFavourites(
|
|
connectedSuppliersList[index]
|
|
.supplier_id);
|
|
if (tankerResponse) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longSuccessToast(
|
|
'Supplier removed from favourites');
|
|
await getAllSuppliersData();
|
|
await getConnectedSuppliersData();
|
|
} else {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to remove from favourites');
|
|
}
|
|
} catch (e) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to remove from favourites');
|
|
}
|
|
} else {
|
|
try {
|
|
bool
|
|
tankerResponse =
|
|
await AppSettings.addFavourites(
|
|
connectedSuppliersList[index]
|
|
.supplier_id);
|
|
if (tankerResponse) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longSuccessToast(
|
|
'Supplier added to favourites');
|
|
await getAllSuppliersData();
|
|
await getConnectedSuppliersData();
|
|
await getAllFavouritesData();
|
|
} else {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to add favourites');
|
|
}
|
|
} catch (e) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to add favourites');
|
|
}
|
|
}
|
|
},
|
|
child:
|
|
connectedSuppliersList[
|
|
index]
|
|
.isFavorite
|
|
? Image.asset(
|
|
'images/heart_active.png',
|
|
fit: BoxFit
|
|
.cover,
|
|
width:
|
|
16, // Match the diameter of the CircleAvatar
|
|
height:
|
|
16,
|
|
)
|
|
: Image.asset(
|
|
'images/heart_outline.png',
|
|
fit: BoxFit
|
|
.cover,
|
|
width:
|
|
16, // Match the diameter of the CircleAvatar
|
|
height:
|
|
16,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Divider(
|
|
color: Colors.grey.shade300,
|
|
),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'Plan',
|
|
style: fontTextStyle(
|
|
10,
|
|
Color(0XFF343637),
|
|
FontWeight.w400),
|
|
),
|
|
Text(
|
|
'15,000 / week',
|
|
style: fontTextStyle(
|
|
10,
|
|
Color(0XFF2D2E30),
|
|
FontWeight.w500),
|
|
)
|
|
],
|
|
),
|
|
SizedBox(
|
|
height:
|
|
MediaQuery.of(context).size.height *
|
|
.016,
|
|
),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {},
|
|
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: Padding(
|
|
padding: EdgeInsets.fromLTRB(
|
|
16, 12, 16, 12),
|
|
child: Text('Chat',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF1D7AFC),
|
|
FontWeight.w600)),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context)
|
|
.size
|
|
.width *
|
|
.010,
|
|
),
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
/* Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => PlaceOrder(details: connectedSuppliersList[index],)),
|
|
);*/
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) =>
|
|
SupplierScreen(
|
|
details:
|
|
connectedSuppliersList[
|
|
index],
|
|
)),
|
|
);
|
|
},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.rectangle,
|
|
color: Color(0XFF1D7AFC),
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Color(0XFFFFFFFF),
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
12,
|
|
)),
|
|
alignment: Alignment.center,
|
|
child: Padding(
|
|
padding: EdgeInsets.fromLTRB(
|
|
16, 12, 16, 12),
|
|
child: Text('Place Order',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFFFFFFFF),
|
|
FontWeight.w600)),
|
|
),
|
|
),
|
|
))
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
);
|
|
})),
|
|
Align(
|
|
alignment: Alignment.center,
|
|
child: GestureDetector(
|
|
onTap: () {},
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Image.asset(
|
|
'images/add_icon.png',
|
|
fit: BoxFit.cover,
|
|
width:
|
|
24, // Match the diameter of the CircleAvatar
|
|
height: 24,
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context).size.width * .016,
|
|
),
|
|
Text('Find New Suppliers',
|
|
style: fontTextStyle(
|
|
12, Color(0XFF000000), FontWeight.w400))
|
|
],
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
)
|
|
: Center(
|
|
child: Text(
|
|
'No Data Available',
|
|
style: fontTextStyle(12, Color(0XFF000000), FontWeight.w500),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget otherSuppliers() {
|
|
return isDataLoading
|
|
? Center(
|
|
child: CircularProgressIndicator(
|
|
color: primaryColor,
|
|
strokeWidth: 5.0,
|
|
),
|
|
)
|
|
: suppliersList.length != 0
|
|
? Padding(
|
|
padding: EdgeInsets.fromLTRB(12, 8, 12, 8),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
child: ListView.separated(
|
|
padding: EdgeInsets.all(8),
|
|
itemCount: suppliersList.length,
|
|
separatorBuilder: (context, index) => SizedBox(
|
|
height:
|
|
MediaQuery.of(context).size.height * .008,
|
|
),
|
|
itemBuilder: (BuildContext context, int index) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color:
|
|
Color(0XFFFFFFFF), // Same as Card color
|
|
borderRadius: BorderRadius.circular(
|
|
12), // Rounded corners
|
|
border: Border.all(
|
|
color: Colors.grey.shade300, // Border color
|
|
width: 1, // Border width
|
|
),
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
|
|
child: Column(
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.start,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
/*CircleAvatar(
|
|
radius: 30,
|
|
backgroundColor: Color(0XFFE8F2FF), // Fallback background color
|
|
child: usersList[index].profilePic.isNotEmpty? Image.network(usersList[index].profilePic,):
|
|
|
|
Text(
|
|
usersList[index].username.isNotEmpty ? usersList[index].username[0].toUpperCase() : '?', // First letter of name or '?'
|
|
style: TextStyle(
|
|
fontSize: 25,
|
|
fontWeight: FontWeight.bold,
|
|
color:Color(0XFF9EC6FE),
|
|
),
|
|
)
|
|
),*/
|
|
CircleAvatar(
|
|
radius: 20,
|
|
backgroundColor: Color(
|
|
0XFFE8F2FF), // Fallback background color
|
|
child: Image.asset(
|
|
'images/profile_user.png',
|
|
fit: BoxFit.cover,
|
|
width:
|
|
50, // Match the diameter of the CircleAvatar
|
|
height: 50,
|
|
), // Default icon if no profilePic
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context)
|
|
.size
|
|
.width *
|
|
.012,
|
|
),
|
|
Expanded(
|
|
flex: 2,
|
|
child: Container(
|
|
//width:MediaQuery.of(context).size.height * .3,
|
|
//height: MediaQuery.of(context).size.height * .06,
|
|
child: Column(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.start,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Visibility(
|
|
visible: true,
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment
|
|
.start,
|
|
children: [
|
|
Visibility(
|
|
visible: suppliersList[
|
|
index]
|
|
.supplier_name !=
|
|
'',
|
|
child: Text(
|
|
suppliersList[index]
|
|
.supplier_name
|
|
.toString(),
|
|
style: fontTextStyle(
|
|
16,
|
|
Color(
|
|
0XFF2D2E30),
|
|
FontWeight
|
|
.w600),
|
|
),
|
|
),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.center,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment
|
|
.center,
|
|
children: [
|
|
Image.asset(
|
|
'images/star.png',
|
|
fit: BoxFit.cover,
|
|
width:
|
|
16, // Match the diameter of the CircleAvatar
|
|
height: 16,
|
|
),
|
|
Visibility(
|
|
visible: true,
|
|
child: Text(
|
|
'4.2 (20K+ Ratings)',
|
|
style: fontTextStyle(
|
|
9,
|
|
Color(
|
|
0XFF515253),
|
|
FontWeight
|
|
.w400),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
Visibility(
|
|
visible: true,
|
|
child: Text(
|
|
'Drinking | Bore Water',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF4692FD),
|
|
FontWeight.w500),
|
|
),
|
|
),
|
|
Visibility(
|
|
visible: true,
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment
|
|
.start,
|
|
children: [
|
|
Text(
|
|
suppliersList[index]
|
|
.displayAddress +
|
|
' ' +
|
|
suppliersList[
|
|
index]
|
|
.distanceInMeters
|
|
.toString() +
|
|
' Km',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(
|
|
0XFF515253),
|
|
FontWeight
|
|
.w400)),
|
|
GestureDetector(
|
|
onTap: () async {
|
|
AppSettings
|
|
.preLoaderDialog(
|
|
context);
|
|
if (favouriteIds.contains(
|
|
suppliersList[
|
|
index]
|
|
.supplier_id)) {
|
|
try {
|
|
bool
|
|
tankerResponse =
|
|
await AppSettings.removeFavourites(
|
|
suppliersList[index]
|
|
.supplier_id);
|
|
if (tankerResponse) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longSuccessToast(
|
|
'Supplier removed from favourites');
|
|
await getAllSuppliersData();
|
|
await getConnectedSuppliersData();
|
|
await getAllFavouritesData();
|
|
} else {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to remove from favourites');
|
|
}
|
|
} catch (e) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to remove from favourites');
|
|
}
|
|
} else {
|
|
try {
|
|
bool
|
|
tankerResponse =
|
|
await AppSettings.addFavourites(
|
|
suppliersList[index]
|
|
.supplier_id);
|
|
if (tankerResponse) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longSuccessToast(
|
|
'Supplier added to favourites');
|
|
await getAllSuppliersData();
|
|
await getConnectedSuppliersData();
|
|
await getAllFavouritesData();
|
|
} else {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to add favourites');
|
|
}
|
|
} catch (e) {
|
|
Navigator.of(
|
|
context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings
|
|
.longFailedToast(
|
|
'Failed to add favourites');
|
|
}
|
|
}
|
|
},
|
|
child: favouriteIds.contains(
|
|
suppliersList[
|
|
index]
|
|
.supplier_id)
|
|
? Image.asset(
|
|
'images/heart_active.png',
|
|
fit: BoxFit
|
|
.cover,
|
|
width:
|
|
16, // Match the diameter of the CircleAvatar
|
|
height: 16,
|
|
)
|
|
: Image.asset(
|
|
'images/heart_outline.png',
|
|
fit: BoxFit
|
|
.cover,
|
|
width:
|
|
16, // Match the diameter of the CircleAvatar
|
|
height: 16,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Divider(
|
|
color: Colors.grey.shade300,
|
|
),
|
|
SizedBox(
|
|
height:
|
|
MediaQuery.of(context).size.height *
|
|
.016,
|
|
),
|
|
suppliersList[index].isConnected
|
|
? Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
children: [
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
border: Border.all(
|
|
width: 1,
|
|
color:
|
|
Color(0XFF1D7AFC),
|
|
),
|
|
borderRadius:
|
|
BorderRadius
|
|
.circular(12),
|
|
),
|
|
alignment:
|
|
Alignment.center,
|
|
padding:
|
|
EdgeInsets.symmetric(
|
|
vertical: 12),
|
|
child: Text(
|
|
'Chat',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF1D7AFC),
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context)
|
|
.size
|
|
.width *
|
|
.010,
|
|
),
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) =>
|
|
SupplierScreen(
|
|
details:
|
|
suppliersList[
|
|
index],
|
|
),
|
|
),
|
|
);
|
|
},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color:
|
|
Color(0XFF1D7AFC),
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Colors.white,
|
|
),
|
|
borderRadius:
|
|
BorderRadius
|
|
.circular(12),
|
|
),
|
|
alignment:
|
|
Alignment.center,
|
|
padding:
|
|
EdgeInsets.symmetric(
|
|
vertical: 12),
|
|
child: Text(
|
|
'Place Order',
|
|
style: fontTextStyle(
|
|
12,
|
|
Colors.white,
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
)
|
|
: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () async {
|
|
var payload = new Map<
|
|
String, dynamic>();
|
|
payload["customerId"] =
|
|
AppSettings
|
|
.customerId;
|
|
payload["supplierId"] =
|
|
suppliersList[index]
|
|
.supplier_id;
|
|
|
|
bool requestStatus =
|
|
await AppSettings
|
|
.connectRequest(
|
|
payload);
|
|
|
|
if (requestStatus) {
|
|
AppSettings
|
|
.longSuccessToast(
|
|
"Request Sent Successfully");
|
|
await getAllSuppliersData();
|
|
await getConnectedSuppliersData();
|
|
} else {
|
|
AppSettings.longFailedToast(
|
|
"Request Sent faileds");
|
|
}
|
|
},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape
|
|
.rectangle,
|
|
color:
|
|
Color(0XFFFFFFFF),
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Color(
|
|
0XFF098603),
|
|
),
|
|
borderRadius:
|
|
BorderRadius
|
|
.circular(
|
|
24,
|
|
)),
|
|
alignment:
|
|
Alignment.center,
|
|
child: Padding(
|
|
padding:
|
|
EdgeInsets.fromLTRB(
|
|
24, 12, 24, 12),
|
|
child: Text('Connect',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(
|
|
0XFF098603),
|
|
FontWeight
|
|
.w600)),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
);
|
|
})),
|
|
],
|
|
),
|
|
)
|
|
: Center(
|
|
child: Text(
|
|
'No Data Available',
|
|
style: fontTextStyle(12, Color(0XFF000000), FontWeight.w500),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget favorites() {
|
|
return isFavouriteDataLoading
|
|
? Center(
|
|
child: CircularProgressIndicator(
|
|
color: primaryColor,
|
|
strokeWidth: 5.0,
|
|
),
|
|
)
|
|
: favouritesList.isNotEmpty
|
|
? Padding(
|
|
padding: EdgeInsets.fromLTRB(12, 8, 12, 8),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
child: ListView.separated(
|
|
padding: EdgeInsets.all(8),
|
|
itemCount: favouritesList.length,
|
|
separatorBuilder: (context, index) => SizedBox(
|
|
height: MediaQuery.of(context).size.height * .008,
|
|
),
|
|
itemBuilder: (BuildContext context, int index) {
|
|
final supplier = favouritesList[index];
|
|
final currentSupplierId = supplier.supplier_id;
|
|
|
|
final isConnected = connectedSuppliersList.any(
|
|
(item) => item.supplier_id == currentSupplierId,
|
|
);
|
|
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: Color(0XFFFFFFFF),
|
|
borderRadius: BorderRadius.circular(12),
|
|
border: Border.all(
|
|
color: Colors.grey.shade300,
|
|
width: 1,
|
|
),
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
|
|
child: Column(
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
CircleAvatar(
|
|
radius: 20,
|
|
backgroundColor: Color(0XFFE8F2FF),
|
|
child: Image.asset(
|
|
'images/profile_user.png',
|
|
fit: BoxFit.cover,
|
|
width: 50,
|
|
height: 50,
|
|
),
|
|
),
|
|
SizedBox(
|
|
width:
|
|
MediaQuery.of(context).size.width *
|
|
.012,
|
|
),
|
|
Expanded(
|
|
flex: 2,
|
|
child: Column(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.start,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
crossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
children: [
|
|
Visibility(
|
|
visible:
|
|
supplier.supplier_name !=
|
|
'',
|
|
child: Text(
|
|
supplier.supplier_name,
|
|
style: fontTextStyle(
|
|
16,
|
|
Color(0XFF2D2E30),
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
Row(
|
|
children: [
|
|
Image.asset(
|
|
'images/star.png',
|
|
fit: BoxFit.cover,
|
|
width: 16,
|
|
height: 16,
|
|
),
|
|
Text(
|
|
'4.2 (20K+ Ratings)',
|
|
style: fontTextStyle(
|
|
9,
|
|
Color(0XFF515253),
|
|
FontWeight.w400),
|
|
),
|
|
],
|
|
)
|
|
],
|
|
),
|
|
Text(
|
|
'Drinking | Bore Water',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF4692FD),
|
|
FontWeight.w500),
|
|
),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment
|
|
.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'${supplier.displayAddress} ${supplier.distanceInMeters} Km',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF515253),
|
|
FontWeight.w400)),
|
|
GestureDetector(
|
|
onTap: () async {
|
|
AppSettings.preLoaderDialog(
|
|
context);
|
|
try {
|
|
bool tankerResponse =
|
|
await AppSettings
|
|
.removeFavourites(
|
|
supplier
|
|
.supplier_id);
|
|
Navigator.of(context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
if (tankerResponse) {
|
|
AppSettings
|
|
.longSuccessToast(
|
|
'Supplier removed from favourites');
|
|
await getAllSuppliersData();
|
|
await getConnectedSuppliersData();
|
|
await getAllFavouritesData();
|
|
} else {
|
|
AppSettings.longFailedToast(
|
|
'Failed to remove from favourites');
|
|
}
|
|
} catch (e) {
|
|
Navigator.of(context,
|
|
rootNavigator:
|
|
true)
|
|
.pop();
|
|
AppSettings.longFailedToast(
|
|
'Failed to remove from favourites');
|
|
}
|
|
},
|
|
child: Image.asset(
|
|
'images/heart_active.png',
|
|
fit: BoxFit.cover,
|
|
width: 16,
|
|
height: 16,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Divider(color: Colors.grey.shade300),
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
'Plan',
|
|
style: fontTextStyle(10,
|
|
Color(0XFF343637), FontWeight.w400),
|
|
),
|
|
Text(
|
|
'15,000 / week',
|
|
style: fontTextStyle(10,
|
|
Color(0XFF2D2E30), FontWeight.w500),
|
|
)
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: MediaQuery.of(context).size.height *
|
|
.016,
|
|
),
|
|
isConnected
|
|
? Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Color(0XFF1D7AFC),
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
12),
|
|
),
|
|
alignment: Alignment.center,
|
|
padding: EdgeInsets.symmetric(
|
|
vertical: 12),
|
|
child: Text(
|
|
'Chat',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF1D7AFC),
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context)
|
|
.size
|
|
.width *
|
|
.010,
|
|
),
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) =>
|
|
SupplierScreen(
|
|
details: supplier,
|
|
),
|
|
),
|
|
);
|
|
},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color: Color(0XFF1D7AFC),
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Colors.white,
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
12),
|
|
),
|
|
alignment: Alignment.center,
|
|
padding: EdgeInsets.symmetric(
|
|
vertical: 12),
|
|
child: Text(
|
|
'Place Order',
|
|
style: fontTextStyle(
|
|
12,
|
|
Colors.white,
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
)
|
|
: Row(
|
|
children: [
|
|
Expanded(
|
|
child: GestureDetector(
|
|
onTap: () {},
|
|
child: Container(
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Color(0XFF098603),
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
24),
|
|
),
|
|
alignment: Alignment.center,
|
|
padding: EdgeInsets.symmetric(
|
|
vertical: 12),
|
|
child: Text(
|
|
'Connect',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF098603),
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
],
|
|
),
|
|
)
|
|
: Center(
|
|
child: Text(
|
|
'No Data Available',
|
|
style: fontTextStyle(12, Color(0XFF000000), FontWeight.w500),
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return DefaultTabController(
|
|
length: _controller.length, // Two tabs
|
|
child: Scaffold(
|
|
backgroundColor: Colors.white,
|
|
appBar:AppBar(
|
|
elevation: 0,
|
|
backgroundColor: Colors.white,
|
|
title: Text(
|
|
'My Suppliers',
|
|
style: fontTextStyle(14, Color(0XFF2A2A2A), FontWeight.w500),
|
|
),
|
|
iconTheme: IconThemeData(color: Color(0XFF2A2A2A)),
|
|
actions: [
|
|
Row(
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.fromLTRB(10, 10, 0, 10),
|
|
child: IconButton(
|
|
icon: Image(
|
|
image: AssetImage(
|
|
'images/calender_supplier_landing.png')),
|
|
onPressed: () {},
|
|
),
|
|
),
|
|
Padding(
|
|
padding: EdgeInsets.fromLTRB(0, 10, 10, 10),
|
|
child: IconButton(
|
|
icon: Image.asset(
|
|
'images/notification_appbar.png', // Example URL image
|
|
),
|
|
onPressed: () {},
|
|
),
|
|
)
|
|
],
|
|
)
|
|
],
|
|
leading: GestureDetector(
|
|
onTap: () {
|
|
Navigator.pop(context);
|
|
},
|
|
child: Padding(
|
|
padding: const EdgeInsets.fromLTRB(
|
|
8, 8, 8, 8), // Add padding if needed
|
|
child: Image.asset(
|
|
'images/backbutton_appbar.png', // Replace with your image path
|
|
fit: BoxFit.contain, // Adjust the fit
|
|
),
|
|
),
|
|
),
|
|
bottom: PreferredSize(
|
|
preferredSize: Size.fromHeight(70.0),
|
|
child: Container(
|
|
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
padding: EdgeInsets.all(4),
|
|
decoration: BoxDecoration(
|
|
color: Color(0xFFF5F6F6),
|
|
borderRadius: BorderRadius.circular(23),
|
|
// Remove all borders/shadows
|
|
),
|
|
child: ClipRRect(
|
|
borderRadius: BorderRadius.circular(19),
|
|
child: TabBar(
|
|
controller: _controller,
|
|
indicator: BoxDecoration(), // No underline
|
|
indicatorColor: Colors.transparent, // Extra safety
|
|
labelPadding: EdgeInsets.zero,
|
|
dividerColor: Colors
|
|
.transparent, // <-- Removes line between TabBar and TabBarView (Flutter 3.10+)
|
|
tabs: List.generate(3, (index) {
|
|
final labels = [
|
|
'Suppliers',
|
|
'My Suppliers',
|
|
'Favourites'
|
|
];
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: _controller.index == index
|
|
? Color(0XFFF5CD47)
|
|
: Color(0xFFF5F6F6),
|
|
borderRadius: BorderRadius.circular(27),
|
|
),
|
|
child: Tab(
|
|
child: Center(
|
|
child: Text(
|
|
labels[index],
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF3B3B3B),
|
|
FontWeight.w600,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
body: Builder(
|
|
builder: (BuildContext context) {
|
|
return TabBarView(
|
|
controller: _controller,
|
|
children: [
|
|
// Tab 1 content
|
|
otherSuppliers(),
|
|
|
|
// Tab 2 content
|
|
mySuppliers(),
|
|
// Tab 2 content
|
|
favorites()
|
|
],
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|