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.
687 lines
24 KiB
687 lines
24 KiB
import 'dart:convert';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:bookatanker/common/settings.dart';
|
|
import 'package:bookatanker/models/supplier_tankers_model.dart';
|
|
|
|
class PlaceOrder extends StatefulWidget {
|
|
var details;
|
|
PlaceOrder({this.details});
|
|
|
|
@override
|
|
State<PlaceOrder> createState() => _PlaceOrderState();
|
|
}
|
|
|
|
class _PlaceOrderState extends State<PlaceOrder> {
|
|
|
|
bool isTankerDataLoading = false;
|
|
bool isSereverIssue = false;
|
|
List<SupplierTankersModel> tankersList = [];
|
|
String? _selectedOption = 'Yes';
|
|
int quantity = 1;
|
|
DateTime? _selectedDate;
|
|
String displayDeliveryDate='';
|
|
TimeOfDay? _selectedTime;
|
|
TimeOfDay _selectedTime1 = TimeOfDay(hour: 9, minute: 0);
|
|
|
|
Future<void> _pickTime() async {
|
|
final TimeOfDay now = TimeOfDay.now();
|
|
|
|
final TimeOfDay? picked = await showTimePicker(
|
|
context: context,
|
|
initialTime: _selectedTime ?? now,
|
|
helpText: 'Select a time',
|
|
);
|
|
|
|
if (picked != null && picked != _selectedTime) {
|
|
setState(() {
|
|
_selectedTime = picked;
|
|
});
|
|
}
|
|
}
|
|
|
|
void _showTimePicker() {
|
|
showCupertinoModalPopup(
|
|
context: context,
|
|
builder: (_) => Container(
|
|
height: 300,
|
|
color: Colors.white,
|
|
child: Column(
|
|
children: [
|
|
Container(
|
|
padding: EdgeInsets.all(16),
|
|
child: Text(
|
|
'Select Time',
|
|
style: TextStyle(fontWeight: FontWeight.bold),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: CupertinoDatePicker(
|
|
mode: CupertinoDatePickerMode.time,
|
|
use24hFormat: false, // true for 24-hour format
|
|
initialDateTime: DateTime(
|
|
0,
|
|
0,
|
|
0,
|
|
/* _selectedTime!.hour,
|
|
_selectedTime!.minute,*/
|
|
),
|
|
onDateTimeChanged: (DateTime newTime) {
|
|
setState(() {
|
|
_selectedTime = TimeOfDay(
|
|
hour: newTime.hour,
|
|
minute: newTime.minute,
|
|
);
|
|
});
|
|
},
|
|
),
|
|
),
|
|
CupertinoButton(
|
|
child: Text('Done'),
|
|
onPressed: () => Navigator.of(context).pop(),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> _selectTime(BuildContext context) async {
|
|
|
|
final TimeOfDay? picked = await showTimePicker(
|
|
context: context,
|
|
initialTime: _selectedTime1,
|
|
cancelText: 'Cancel',
|
|
confirmText: 'Confirm',
|
|
builder: (BuildContext context, Widget? child) {
|
|
return Theme(
|
|
data: ThemeData.dark().copyWith(
|
|
primaryColor: Color(0XFF1D7AFC),
|
|
timePickerTheme: TimePickerThemeData(
|
|
backgroundColor: Colors.white,
|
|
dialBackgroundColor: Colors.white,
|
|
hourMinuteTextColor: Color(0XFF1D7AFC),
|
|
dayPeriodTextColor: Color(0XFF1D7AFC),
|
|
dialTextColor: Color(0XFF1D7AFC),
|
|
dayPeriodColor: Color(0XFFC3C4C4),
|
|
hourMinuteShape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(20),
|
|
side: BorderSide(color: Color(0XFFFFFFFF), width: 2),
|
|
),
|
|
dayPeriodShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
|
|
dialHandColor: Color(0XFFC3C4C4),
|
|
hourMinuteColor: Color(0XFFFFFFFF),
|
|
dialTextStyle: fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),
|
|
dayPeriodTextStyle: fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),
|
|
hourMinuteTextStyle: fontTextStyle(50, Color(0XFF1D7AFC), FontWeight.w600),
|
|
helpTextStyle: fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),
|
|
cancelButtonStyle: ButtonStyle(
|
|
foregroundColor: MaterialStateProperty.all<Color>(Color(0XFF1D7AFC)),
|
|
padding: MaterialStateProperty.all<EdgeInsets>(EdgeInsets.symmetric(horizontal: 20, vertical: 10)),
|
|
textStyle: MaterialStateProperty.all<TextStyle>(fontTextStyle(14, Colors.white, FontWeight.w600)),
|
|
),
|
|
confirmButtonStyle: ButtonStyle(
|
|
foregroundColor: MaterialStateProperty.all<Color>(Color(0XFF1D7AFC)),
|
|
padding: MaterialStateProperty.all<EdgeInsets>(EdgeInsets.symmetric(horizontal: 20, vertical: 10)),
|
|
textStyle: MaterialStateProperty.all<TextStyle>(fontTextStyle(14, Colors.white, FontWeight.w600)),
|
|
),
|
|
)),
|
|
child: child!,
|
|
);
|
|
},
|
|
);
|
|
|
|
if (picked != null && picked != _selectedTime) {
|
|
setState(() {
|
|
_selectedTime = picked;
|
|
});
|
|
}
|
|
}
|
|
|
|
Future<void> _pickDate() async {
|
|
DateTime now = DateTime.now();
|
|
DateTime lastDate = now.add(Duration(days: 15));
|
|
|
|
final DateTime? picked = await showDatePicker(
|
|
context: context,
|
|
initialDate: _selectedDate ?? now,
|
|
firstDate: now, // Restrict to today or later
|
|
lastDate: lastDate, // Only allow next 15 days
|
|
helpText: 'Select From Date',
|
|
initialEntryMode: DatePickerEntryMode.calendarOnly,
|
|
builder: (BuildContext context, Widget? child) {
|
|
return Theme(
|
|
data: ThemeData.light().copyWith(
|
|
inputDecorationTheme: InputDecorationTheme(
|
|
border: InputBorder.none, // Removes the text field border
|
|
),
|
|
colorScheme: ColorScheme.light(
|
|
primary: Color(0XFF1D7AFC),
|
|
onPrimary: Color(0XFFFFFFFF), // Header text color
|
|
surface: Color(0XFFFFFFFF),
|
|
onSurface: Colors.black,
|
|
secondary: Colors.pink,
|
|
|
|
),
|
|
dividerColor: Color(0XFFF5F6F6),
|
|
textButtonTheme: TextButtonThemeData(
|
|
style: ButtonStyle(
|
|
foregroundColor: MaterialStateProperty.all(Color(0XFF1D7AFC),), // Text color
|
|
//backgroundColor: MaterialStateProperty.all(Colors.grey[200]), // Background
|
|
textStyle: MaterialStateProperty.all(fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),), // Font style
|
|
shape: MaterialStateProperty.all(RoundedRectangleBorder(borderRadius: BorderRadius.circular(8))), // Rounded corners
|
|
),
|
|
// Background of the dialog box
|
|
),
|
|
textTheme: TextTheme(
|
|
bodyLarge: fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),
|
|
labelLarge: fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),
|
|
titleLarge: fontTextStyle(14, Color(0XFF1D7AFC), FontWeight.w600),
|
|
headlineLarge: fontTextStyle(20, Color(0XFF1D7AFC), FontWeight.w600),
|
|
|
|
),
|
|
|
|
),
|
|
child: child!,
|
|
);
|
|
},
|
|
);
|
|
|
|
if (picked != null && picked != _selectedDate) {
|
|
setState(() {
|
|
_selectedDate = picked;
|
|
//apiFromDate = DateFormat('dd-MMM-yyyy - 23:50').format(_selectedDate!);
|
|
String from=DateFormat('dd-MMM-yyyy - HH:mm').format(_selectedDate!);
|
|
DateTime parsedFromDate = DateFormat('dd-MMM-yyyy - HH:mm').parse(from);
|
|
String formattedFromDate = DateFormat('dd MMM yyyy').format(parsedFromDate);
|
|
displayDeliveryDate = formattedFromDate;
|
|
});
|
|
}
|
|
}
|
|
|
|
Future<void> getTankers() async {
|
|
isTankerDataLoading = true;
|
|
try {
|
|
var tankerResponse = await AppSettings.getAllTankers(widget.details.supplier_id);
|
|
|
|
setState(() {
|
|
tankersList =
|
|
((jsonDecode(tankerResponse)['data']) as List).map((dynamic model) {
|
|
return SupplierTankersModel.fromJson(model);
|
|
}).toList();
|
|
|
|
|
|
|
|
isTankerDataLoading = false;
|
|
});
|
|
} catch (e) {
|
|
setState(() {
|
|
isTankerDataLoading = false;
|
|
isSereverIssue = true;
|
|
});
|
|
/* AppSettings.longFailedToast('There is an issue at server side please try after some time');
|
|
Navigator.pop(context);*/
|
|
}
|
|
}
|
|
|
|
|
|
@override
|
|
void initState() {
|
|
// TODO: implement initState
|
|
super.initState();
|
|
getTankers();
|
|
}
|
|
|
|
void increment() {
|
|
setState(() {
|
|
quantity++;
|
|
});
|
|
}
|
|
|
|
void decrement() {
|
|
setState(() {
|
|
if (quantity > 1) quantity--;
|
|
});
|
|
}
|
|
|
|
Widget renderUi(){
|
|
Map<String, List<SupplierTankersModel>> groupByType(List<SupplierTankersModel> items) {
|
|
final Map<String, List<SupplierTankersModel>> grouped = {};
|
|
for (var item in items) {
|
|
grouped.putIfAbsent(item.type_of_water, () => []).add(item);
|
|
}
|
|
return grouped;
|
|
}
|
|
final groupedData = groupByType(tankersList);
|
|
|
|
if(tankersList.isNotEmpty){
|
|
return Padding(padding: EdgeInsets.fromLTRB(12, 8, 12, 8),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
// 🔹 Supplier Name
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Text(
|
|
widget.details.supplier_name,
|
|
style: fontTextStyle(16, Color(0XFF2D2E30), FontWeight.w600),
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .020),
|
|
|
|
// 🔹 Grouped Items
|
|
...groupedData.entries.map((entry) {
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(entry.key,
|
|
style: fontTextStyle(12, Color(0XFF232527), FontWeight.w500)),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .020),
|
|
Wrap(
|
|
spacing: 8,
|
|
runSpacing: 8,
|
|
children: entry.value.map((item) {
|
|
return Container(
|
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
|
|
decoration: BoxDecoration(
|
|
color: item.isStrikethrough
|
|
? Colors.black87
|
|
: item.isSelected
|
|
? Colors.black
|
|
: Colors.transparent,
|
|
border: Border.all(
|
|
color: item.isSelected
|
|
? Colors.orange
|
|
: Colors.grey.shade400,
|
|
),
|
|
borderRadius: BorderRadius.circular(30),
|
|
),
|
|
child: Text(
|
|
item.capacity + ' L',
|
|
style: TextStyle(
|
|
color: item.isStrikethrough ? Colors.white : Colors.black,
|
|
decoration: item.isStrikethrough
|
|
? TextDecoration.lineThrough
|
|
: TextDecoration.none,
|
|
),
|
|
),
|
|
);
|
|
}).toList(),
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .020),
|
|
Divider(color: Colors.grey.shade300,),
|
|
],
|
|
);
|
|
}).toList(),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
// 🔹 Quantity Row: Comes immediately after list
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'Quantity',
|
|
style: fontTextStyle(12, Color(0XFF232527), FontWeight.w500),
|
|
),
|
|
Row(
|
|
children: [
|
|
GestureDetector(
|
|
onTap: () {
|
|
decrement();
|
|
},
|
|
child: Container(
|
|
width: 24,
|
|
height: 24,
|
|
decoration: BoxDecoration(
|
|
color: Color(0XFFC9DFFE),
|
|
shape: BoxShape.circle,
|
|
),
|
|
child: Center(
|
|
child: Image.asset(
|
|
'images/minus.png',
|
|
width: 12,
|
|
height: 12,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(width: MediaQuery.of(context).size.width * .008),
|
|
Text(
|
|
quantity.toString(),
|
|
style: fontTextStyle(12, Color(0XFF000000), FontWeight.w400),
|
|
),
|
|
SizedBox(width: MediaQuery.of(context).size.width * .008),
|
|
GestureDetector(
|
|
onTap: () {
|
|
increment();
|
|
},
|
|
child: Container(
|
|
width: 24,
|
|
height: 24,
|
|
decoration: BoxDecoration(
|
|
color: Color(0XFFC9DFFE),
|
|
shape: BoxShape.circle,
|
|
),
|
|
child: Center(
|
|
child: Image.asset(
|
|
'images/plus.png',
|
|
width: 12,
|
|
height: 12,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Divider(color: Colors.grey.shade300,),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Text(
|
|
'Pump',
|
|
style: fontTextStyle(12, Color(0XFF232527), FontWeight.w500),
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .004),
|
|
Row(
|
|
children: [
|
|
Row(
|
|
children: [
|
|
Radio<String>(
|
|
value: 'Yes',
|
|
groupValue: _selectedOption,
|
|
activeColor: primaryColor,
|
|
visualDensity: VisualDensity.compact,
|
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
|
onChanged: (value) {
|
|
setState(() {
|
|
_selectedOption = value;
|
|
});
|
|
},
|
|
),
|
|
Text('Yes',style: fontTextStyle(12, Color(0XFF2D2E30), FontWeight.w500),),
|
|
],
|
|
),
|
|
SizedBox(width: MediaQuery.of(context).size.width * .040),
|
|
Row(
|
|
children: [
|
|
Radio<String>(
|
|
value: 'No',
|
|
groupValue: _selectedOption,
|
|
activeColor: primaryColor,
|
|
visualDensity: VisualDensity.compact,
|
|
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
|
onChanged: (value) {
|
|
setState(() {
|
|
_selectedOption = value;
|
|
});
|
|
},
|
|
),
|
|
Text('No',style: fontTextStyle(12, Color(0XFF2D2E30), FontWeight.w500),),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Divider(color: Colors.grey.shade300,),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'Date of delivery',
|
|
style: fontTextStyle(12, Color(0XFF232527), FontWeight.w500),
|
|
),
|
|
Row(
|
|
children: [
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.rectangle,
|
|
color: Color(0XFFF6F6F6),
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Color(0XFFF6F6F6),
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
5,
|
|
)),
|
|
padding: EdgeInsets.fromLTRB(4, 4, 4,4),
|
|
child: Text(
|
|
displayDeliveryDate.toString(),
|
|
style: fontTextStyle(12, Color(0XFF646566), FontWeight.w500),
|
|
),
|
|
),
|
|
SizedBox(width: MediaQuery.of(context).size.width * .032),
|
|
GestureDetector(
|
|
onTap: () {
|
|
_pickDate();
|
|
},
|
|
child: Image.asset(
|
|
'images/calender.png',
|
|
width: 20,
|
|
height: 20,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Divider(color: Colors.grey.shade300,),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'Time of delivery',
|
|
style: fontTextStyle(12, Color(0XFF232527), FontWeight.w500),
|
|
),
|
|
Row(
|
|
children: [
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.rectangle,
|
|
color: Color(0XFFF6F6F6),
|
|
border: Border.all(
|
|
width: 1,
|
|
color: Color(0XFFF6F6F6),
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
5,
|
|
)),
|
|
padding: EdgeInsets.fromLTRB(4, 4, 4,4),
|
|
child: Text(
|
|
_selectedTime1.format(context),
|
|
style: fontTextStyle(12, Color(0XFF646566), FontWeight.w500),
|
|
),
|
|
),
|
|
|
|
SizedBox(width: MediaQuery.of(context).size.width * .032),
|
|
GestureDetector(
|
|
onTap: () {
|
|
//_pickTime();
|
|
//_showTimePicker();
|
|
_selectTime(context);
|
|
},
|
|
child: Image.asset(
|
|
'images/clock.png',
|
|
width: 20,
|
|
height: 20,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
SizedBox(height: MediaQuery.of(context).size.height * .016),
|
|
Row(
|
|
children: [
|
|
GestureDetector(
|
|
onTap: () {},
|
|
child: Image.asset(
|
|
'images/add_icon.png',
|
|
width: 24,
|
|
height: 24,
|
|
),
|
|
),
|
|
SizedBox(width: MediaQuery.of(context).size.width * .032),
|
|
Text(
|
|
'Add order',
|
|
style: fontTextStyle(12, Color(0XFF232527), 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('SAVE DRAFT',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFF1D7AFC),
|
|
FontWeight.w600)),
|
|
),
|
|
),
|
|
),),
|
|
SizedBox(
|
|
width: MediaQuery.of(context)
|
|
.size
|
|
.width *
|
|
.032,
|
|
),
|
|
Expanded(child: GestureDetector(
|
|
onTap: () {
|
|
/*Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (context) => PlaceOrder(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('CONTINUE',
|
|
style: fontTextStyle(
|
|
12,
|
|
Color(0XFFFFFFFF),
|
|
FontWeight.w600)),
|
|
),
|
|
),
|
|
))
|
|
],
|
|
)
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
else{
|
|
return Center(
|
|
child: Text(
|
|
'No Data Available',
|
|
style: fontTextStyle(
|
|
12, Color(0XFF000000), FontWeight.w500),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: Color(0XFFFFFFFF),
|
|
appBar: AppBar(
|
|
backgroundColor: Colors.white,
|
|
title: Text(
|
|
'Place Order',
|
|
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
|
|
),
|
|
),
|
|
),
|
|
),
|
|
body: isTankerDataLoading
|
|
? Center(
|
|
child: CircularProgressIndicator(
|
|
color: primaryColor,
|
|
strokeWidth: 5.0,
|
|
),
|
|
)
|
|
: renderUi(),
|
|
);
|
|
}
|
|
}
|