Initial commit

This commit is contained in:
2025-12-08 23:25:00 +05:00
commit ee5cb4ac1a
851 changed files with 115172 additions and 0 deletions

View File

@@ -0,0 +1,731 @@
import 'package:driver/constant/constant.dart';
import 'package:driver/controllers/order_details_controller.dart';
import 'package:driver/models/cart_product_model.dart';
import 'package:driver/models/tax_model.dart';
import 'package:driver/themes/app_them_data.dart';
import 'package:driver/themes/responsive.dart';
import 'package:driver/themes/theme_controller.dart';
import 'package:driver/utils/network_image_widget.dart';
import 'package:driver/widget/my_separator.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:timelines_plus/timelines_plus.dart';
class OrderDetailsScreen extends StatelessWidget {
const OrderDetailsScreen({super.key});
@override
Widget build(BuildContext context) {
final themeController = Get.find<ThemeController>();
final isDark = themeController.isDark.value;
return GetX(
init: OrderDetailsController(),
builder: (controller) {
return Scaffold(
backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface,
appBar: AppBar(
backgroundColor: isDark ? AppThemeData.surfaceDark : AppThemeData.surface,
centerTitle: false,
titleSpacing: 0,
title: Text(
"Order Details".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
),
body: controller.isLoading.value
? Constant.loader()
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${'Order'.tr} ${Constant.orderId(orderId: controller.orderModel.value.id.toString())}".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 18,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
],
),
),
Container(
decoration: BoxDecoration(
color: Constant.statusColor(status: controller.orderModel.value.status.toString()),
borderRadius: BorderRadius.circular(15),
),
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 15),
child: Text(
controller.orderModel.value.status.toString().tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.bold,
fontSize: 14,
color: Constant.statusText(status: controller.orderModel.value.status.toString()),
),
),
)
// RoundedButtonFill(
// title: controller.orderModel.value.status.toString().tr,
// color: Constant.statusColor(status: controller.orderModel.value.status.toString()),
// width: 32,
// height: 4.5,
// textColor: Constant.statusText(status: controller.orderModel.value.status.toString()),
// onPress: () async {},
// ),
],
),
const SizedBox(
height: 14,
),
Container(
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey900 : AppThemeData.grey50,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
children: [
Timeline.tileBuilder(
shrinkWrap: true,
padding: EdgeInsets.zero,
physics: const NeverScrollableScrollPhysics(),
theme: TimelineThemeData(
nodePosition: 0,
// indicatorPosition: 0,
),
builder: TimelineTileBuilder.connected(
contentsAlign: ContentsAlign.basic,
indicatorBuilder: (context, index) {
return SvgPicture.asset("assets/icons/ic_location.svg");
},
connectorBuilder: (context, index, connectorType) {
return const DashedLineConnector(
color: AppThemeData.grey300,
gap: 3,
);
},
contentsBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10),
child: index == 0
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${controller.orderModel.value.vendor!.title}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.primary300 : AppThemeData.primary300,
),
),
Text(
"${controller.orderModel.value.vendor!.location}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
fontSize: 14,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
],
)
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${controller.orderModel.value.address!.addressAs}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.primary300 : AppThemeData.primary300,
),
),
Text(
controller.orderModel.value.author!.fullName(),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.primary300 : AppThemeData.primary300,
),
),
Text(
controller.orderModel.value.address!.getFullAddress(),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
fontSize: 14,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
],
),
);
},
itemCount: 2,
),
),
const SizedBox(
height: 10,
),
],
),
),
),
const SizedBox(
height: 14,
),
Text(
"Order Details".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
const SizedBox(
height: 10,
),
Container(
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey900 : AppThemeData.grey50,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
child: ListView.separated(
shrinkWrap: true,
padding: EdgeInsets.zero,
itemCount: controller.orderModel.value.products!.length,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
CartProductModel cartProductModel = controller.orderModel.value.products![index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(14)),
child: Stack(
children: [
NetworkImageWidget(
imageUrl: cartProductModel.photo.toString(),
height: Responsive.height(8, context),
width: Responsive.width(16, context),
fit: BoxFit.cover,
),
Container(
height: Responsive.height(8, context),
width: Responsive.width(16, context),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: const Alignment(-0.00, -1.00),
end: const Alignment(0, 1),
colors: [Colors.black.withOpacity(0), const Color(0xFF111827)],
),
),
),
],
),
),
const SizedBox(
width: 10,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Text(
"${cartProductModel.name}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
),
Text(
"x ${cartProductModel.quantity}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
double.parse(cartProductModel.discountPrice == null || cartProductModel.discountPrice!.isEmpty
? "0.0"
: cartProductModel.discountPrice.toString()) <=
0
? Text(
Constant.amountShow(amount: cartProductModel.price),
style: TextStyle(
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontFamily: AppThemeData.semiBold,
fontWeight: FontWeight.w600,
),
)
: Row(
children: [
Text(
Constant.amountShow(amount: cartProductModel.discountPrice.toString()),
style: TextStyle(
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontFamily: AppThemeData.semiBold,
fontWeight: FontWeight.w600,
),
),
const SizedBox(
width: 5,
),
Text(
Constant.amountShow(amount: cartProductModel.price),
style: TextStyle(
fontSize: 14,
decoration: TextDecoration.lineThrough,
decorationColor: isDark ? AppThemeData.grey500 : AppThemeData.grey400,
color: isDark ? AppThemeData.grey500 : AppThemeData.grey400,
fontFamily: AppThemeData.semiBold,
fontWeight: FontWeight.w600,
),
),
],
),
],
),
),
],
),
cartProductModel.variantInfo == null || cartProductModel.variantInfo!.variantOptions!.isEmpty
? Container()
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Variants".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
const SizedBox(
height: 5,
),
Wrap(
spacing: 6.0,
runSpacing: 6.0,
children: List.generate(
cartProductModel.variantInfo!.variantOptions!.length,
(i) {
return Container(
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey800 : AppThemeData.grey100,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5),
child: Text(
"${cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)} : ${cartProductModel.variantInfo!.variantOptions![cartProductModel.variantInfo!.variantOptions!.keys.elementAt(i)]}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
color: isDark ? AppThemeData.grey500 : AppThemeData.grey400,
),
),
),
);
},
).toList(),
),
],
),
),
cartProductModel.extras == null || cartProductModel.extras!.isEmpty
? const SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Text(
"Addons".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(
amount: (double.parse(cartProductModel.extrasPrice.toString()) * double.parse(cartProductModel.quantity.toString()))
.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.primary300 : AppThemeData.primary300,
fontSize: 16,
),
),
],
),
Wrap(
spacing: 6.0,
runSpacing: 6.0,
children: List.generate(
cartProductModel.extras!.length,
(i) {
return Container(
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey800 : AppThemeData.grey100,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 5),
child: Text(
cartProductModel.extras![i].toString(),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
color: isDark ? AppThemeData.grey500 : AppThemeData.grey400,
),
),
),
);
},
).toList(),
),
],
),
],
);
},
separatorBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200),
);
},
),
),
),
const SizedBox(
height: 14,
),
Text(
"Bill Details".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
const SizedBox(
height: 10,
),
Container(
width: Responsive.width(100, context),
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey900 : AppThemeData.grey50,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 14),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Item totals".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(amount: controller.subTotal.value.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
const SizedBox(
height: 10,
),
controller.orderModel.value.takeAway == true || Constant.userModel?.vendorID?.isNotEmpty == true
? const SizedBox()
: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Delivery Fee".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(
amount: controller.orderModel.value.deliveryCharge == null || controller.orderModel.value.deliveryCharge!.isEmpty
? "0.0"
: controller.orderModel.value.deliveryCharge.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
const SizedBox(
height: 10,
),
MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200),
const SizedBox(
height: 10,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Coupon Discount".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
"- (${Constant.amountShow(amount: controller.orderModel.value.discount.toString())})",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.danger300 : AppThemeData.danger300,
fontSize: 16,
),
),
],
),
controller.orderModel.value.specialDiscount != null && controller.orderModel.value.specialDiscount!['special_discount'] != null
? Column(
children: [
const SizedBox(
height: 10,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Special Discount".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
"- (${Constant.amountShow(amount: controller.specialDiscountAmount.value.toString())})",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.danger300 : AppThemeData.danger300,
fontSize: 16,
),
),
],
),
],
)
: const SizedBox(),
const SizedBox(
height: 10,
),
controller.orderModel.value.takeAway == true || Constant.userModel?.vendorID?.isNotEmpty == true
? const SizedBox()
: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Delivery Tips".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
],
),
),
Text(
Constant.amountShow(amount: controller.orderModel.value.tipAmount.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
const SizedBox(
height: 10,
),
MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200),
const SizedBox(
height: 10,
),
ListView.builder(
itemCount: controller.orderModel.value.taxSetting!.length,
shrinkWrap: true,
padding: EdgeInsets.zero,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
TaxModel taxModel = controller.orderModel.value.taxSetting![index];
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"${taxModel.title.toString()} (${taxModel.type == "fix" ? Constant.amountShow(amount: taxModel.tax) : "${taxModel.tax}%"})",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(
amount: Constant.calculateTax(
amount: (controller.subTotal.value -
double.parse(controller.orderModel.value.discount.toString()) -
controller.specialDiscountAmount.value)
.toString(),
taxModel: taxModel)
.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
);
},
),
const SizedBox(
height: 10,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"To Pay".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(amount: controller.totalAmount.value.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
],
),
),
),
const SizedBox(
height: 14,
),
],
),
),
),
);
});
}
}

View File

@@ -0,0 +1,372 @@
import 'package:driver/app/order_list_screen/order_details_screen.dart';
import 'package:driver/constant/constant.dart';
import 'package:driver/controllers/dash_board_controller.dart';
import 'package:driver/controllers/order_list_controller.dart';
import 'package:driver/models/order_model.dart';
import 'package:driver/themes/app_them_data.dart';
import 'package:driver/themes/round_button_fill.dart';
import 'package:driver/themes/theme_controller.dart';
import 'package:driver/widget/my_separator.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:timelines_plus/timelines_plus.dart';
class OrderListScreen extends StatelessWidget {
const OrderListScreen({super.key});
@override
Widget build(BuildContext context) {
final themeController = Get.find<ThemeController>();
return Obx(() {
final isDark = themeController.isDark.value;
return GetX(
init: OrderListController(),
builder: (controller) {
return Scaffold(
body: controller.isLoading.value
? Constant.loader()
: Constant.isDriverVerification == true && Constant.userModel!.isDocumentVerify == false
? Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey700 : AppThemeData.grey200,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(120),
),
),
child: Padding(
padding: const EdgeInsets.all(20),
child: SvgPicture.asset("assets/icons/ic_document.svg"),
),
),
const SizedBox(
height: 12,
),
Text(
"Document Verification in Pending".tr,
style: TextStyle(color: isDark ? AppThemeData.grey100 : AppThemeData.grey800, fontSize: 22, fontFamily: AppThemeData.semiBold),
),
const SizedBox(
height: 5,
),
Text(
"Your documents are being reviewed. We will notify you once the verification is complete.".tr,
textAlign: TextAlign.center,
style: TextStyle(color: isDark ? AppThemeData.grey50 : AppThemeData.grey500, fontSize: 16, fontFamily: AppThemeData.bold),
),
const SizedBox(
height: 20,
),
RoundedButtonFill(
title: "View Status".tr,
width: 55,
height: 5.5,
color: AppThemeData.primary300,
textColor: AppThemeData.grey50,
onPress: () async {
DashBoardController dashBoardController = Get.put(DashBoardController());
dashBoardController.drawerIndex.value = 4;
},
),
],
),
)
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
child: controller.orderList.isEmpty
? Constant.showEmptyView(message: "Order Not found".tr,isDark: isDark)
: ListView.builder(
shrinkWrap: true,
itemCount: controller.orderList.length,
itemBuilder: (context, index) {
OrderModel orderModel = controller.orderList[index];
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5),
child: InkWell(
onTap: () {
Get.to(const OrderDetailsScreen(), arguments: {"orderModel": orderModel});
},
child: Container(
decoration: ShapeDecoration(
color: isDark ? AppThemeData.grey900 : AppThemeData.grey50,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Order ID".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
),
Text(
Constant.orderId(orderId: orderModel.id.toString()),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
],
),
const SizedBox(
height: 5,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Status".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
),
Text(
orderModel.status.toString(),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: Constant.statusColor(status: orderModel.status),
),
),
],
),
const SizedBox(
height: 5,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Date".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
),
Text(
Constant.timestampToDateTime(orderModel.createdAt!),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
],
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200),
),
Timeline.tileBuilder(
shrinkWrap: true,
padding: EdgeInsets.zero,
physics: const NeverScrollableScrollPhysics(),
theme: TimelineThemeData(
nodePosition: 0,
// indicatorPosition: 0,
),
builder: TimelineTileBuilder.connected(
contentsAlign: ContentsAlign.basic,
indicatorBuilder: (context, index) {
return index == 0
? Container(
decoration: ShapeDecoration(
color: AppThemeData.primary50,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(120),
),
),
child: Padding(
padding: const EdgeInsets.all(10),
child: SvgPicture.asset(
"assets/icons/ic_building.svg",
colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn),
),
),
)
: Container(
decoration: ShapeDecoration(
color: AppThemeData.carRent50,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(120),
),
),
child: Padding(
padding: const EdgeInsets.all(10),
child: SvgPicture.asset(
"assets/icons/ic_location.svg",
colorFilter: ColorFilter.mode(AppThemeData.primary300, BlendMode.srcIn),
),
),
);
},
connectorBuilder: (context, index, connectorType) {
return const DashedLineConnector(
color: AppThemeData.grey300,
gap: 3,
);
},
contentsBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10),
child: index == 0
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${orderModel.vendor!.title}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
Text(
"${orderModel.vendor!.location}",
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
fontSize: 12,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
],
)
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Deliver to the".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
fontSize: 16,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
),
),
Text(
orderModel.address!.getFullAddress(),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.medium,
fontSize: 12,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
),
),
],
),
);
},
itemCount: 2,
),
),
Visibility(
visible: (Constant.userModel?.vendorID?.isEmpty == true),
child: Column(children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 5),
child: MySeparator(color: isDark ? AppThemeData.grey700 : AppThemeData.grey200),
),
const SizedBox(
height: 10,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Delivery Charge".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(amount: orderModel.deliveryCharge),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
]),
),
const SizedBox(
height: 5,
),
orderModel.tipAmount == null || orderModel.tipAmount!.isEmpty || double.parse(orderModel.tipAmount.toString()) <= 0
? const SizedBox()
: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
"Tips".tr,
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.regular,
color: isDark ? AppThemeData.grey300 : AppThemeData.grey600,
fontSize: 16,
),
),
),
Text(
Constant.amountShow(amount: orderModel.tipAmount),
textAlign: TextAlign.start,
style: TextStyle(
fontFamily: AppThemeData.semiBold,
color: isDark ? AppThemeData.grey50 : AppThemeData.grey900,
fontSize: 16,
),
),
],
),
const SizedBox(
height: 10,
),
],
),
),
),
),
);
},
),
),
);
});
});
}
}