dEAL COMPLIETDED

aamir_dev
faizatflutter 11 months ago
parent 71ae7cf3e4
commit 58db44969f

@ -742,5 +742,9 @@
"paymentType": "نوع الدفع", "paymentType": "نوع الدفع",
"searchByCreatedDate": "البحث حسب تاريخ الإنشاء", "searchByCreatedDate": "البحث حسب تاريخ الإنشاء",
"dealCompleted": "تم إتمام الصفقة", "dealCompleted": "تم إتمام الصفقة",
"theDealNotCompleted": "لم تكتمل الصفقة" "theDealNotCompleted": "لم تكتمل الصفقة",
"cancelRequest": "أريد إلغاء الطلب.",
"highPrice": "سعر مرتفع",
"offerNotMatched": "العرض لم يتطابق مع الطلب.",
"offerRejected": "تم رفض العرض."
} }

@ -740,5 +740,10 @@
"paymentType": "Payment Type", "paymentType": "Payment Type",
"searchByCreatedDate": "Search By Created Date", "searchByCreatedDate": "Search By Created Date",
"dealCompleted": "The Deal Completed", "dealCompleted": "The Deal Completed",
"theDealNotCompleted": "The Deal Not Completed" "theDealNotCompleted": "The Deal Not Completed",
"cancelRequest": "I want to cancel the request.",
"highPrice": "High Price",
"offerNotMatched": "The offer did not match the request.",
"offerRejected": "Offer has been Rejected."
} }

@ -758,7 +758,11 @@ class CodegenLoader extends AssetLoader{
"paymentType": "نوع الدفع", "paymentType": "نوع الدفع",
"searchByCreatedDate": "البحث حسب تاريخ الإنشاء", "searchByCreatedDate": "البحث حسب تاريخ الإنشاء",
"dealCompleted": "تم إتمام الصفقة", "dealCompleted": "تم إتمام الصفقة",
"theDealNotCompleted": "لم تكتمل الصفقة" "theDealNotCompleted": "لم تكتمل الصفقة",
"cancelRequest": "أريد إلغاء الطلب.",
"highPrice": "سعر مرتفع",
"offerNotMatched": "العرض لم يتطابق مع الطلب.",
"offerRejected": "تم رفض العرض."
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
@ -1502,7 +1506,11 @@ static const Map<String,dynamic> en_US = {
"paymentType": "Payment Type", "paymentType": "Payment Type",
"searchByCreatedDate": "Search By Created Date", "searchByCreatedDate": "Search By Created Date",
"dealCompleted": "The Deal Completed", "dealCompleted": "The Deal Completed",
"theDealNotCompleted": "The Deal Not Completed" "theDealNotCompleted": "The Deal Not Completed",
"cancelRequest": "I want to cancel the request.",
"highPrice": "High Price",
"offerNotMatched": "The offer did not match the request.",
"offerRejected": "Offer has been Rejected."
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
} }

@ -722,5 +722,9 @@ abstract class LocaleKeys {
static const searchByCreatedDate = 'searchByCreatedDate'; static const searchByCreatedDate = 'searchByCreatedDate';
static const dealCompleted = 'dealCompleted'; static const dealCompleted = 'dealCompleted';
static const theDealNotCompleted = 'theDealNotCompleted'; static const theDealNotCompleted = 'theDealNotCompleted';
static const cancelRequest = 'cancelRequest';
static const highPrice = 'highPrice';
static const offerNotMatched = 'offerNotMatched';
static const offerRejected = 'offerRejected';
} }

@ -4,6 +4,7 @@ import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
@ -23,7 +24,6 @@ import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:signalr_core/signalr_core.dart'; import 'package:signalr_core/signalr_core.dart';
import 'package:easy_localization/easy_localization.dart';
class ChatVM extends BaseVM { class ChatVM extends BaseVM {
final ChatRepo chatRepo; final ChatRepo chatRepo;
@ -94,11 +94,13 @@ class ChatVM extends BaseVM {
element.isSelected = false; element.isSelected = false;
} }
dealOptionsModelList[index].isSelected = true; dealOptionsModelList[index].isSelected = true;
notifyListeners();
} }
List<int> indexesForCancelSpecialCarOffer = [0, 1, 6, 7]; List<int> indexesForCancelSpecialCarOffer = [0, 1, 6, 10];
List<int> indexesForCancelSparePartOffer = [2, 7]; List<int> indexesForCancelSparePartOffer = [2, 10];
List<int> indexesForRejectOffer = [3, 4, 5, 7]; List<int> indexesForRejectOffer = [3, 4, 5, 10];
List<int> indexesForDealNotCompleted = [7, 4, 8, 9, 10];
List<OfferRequestCommentModel> offerRejectModelList = [ List<OfferRequestCommentModel> offerRejectModelList = [
OfferRequestCommentModel( OfferRequestCommentModel(
@ -139,6 +141,21 @@ class ChatVM extends BaseVM {
OfferRequestCommentModel( OfferRequestCommentModel(
index: 7, index: 7,
isSelected: false, isSelected: false,
title: LocaleKeys.cancelRequest.tr(),
),
OfferRequestCommentModel(
index: 8,
isSelected: false,
title: LocaleKeys.offerNotMatched.tr(),
),
OfferRequestCommentModel(
index: 9,
isSelected: false,
title: LocaleKeys.testTheService.tr(),
),
OfferRequestCommentModel(
index: 10,
isSelected: false,
title: LocaleKeys.otherVar.tr(), title: LocaleKeys.otherVar.tr(),
), ),
]; ];

@ -3,6 +3,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';

@ -1,10 +1,6 @@
import 'dart:developer'; import 'package:easy_localization/easy_localization.dart' as lcl;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
@ -21,14 +17,11 @@ import 'package:mc_common_app/views/advertisement/components/picked_images_conta
import 'package:mc_common_app/views/chat/widgets/chat_bottom_sheets.dart'; import 'package:mc_common_app/views/chat/widgets/chat_bottom_sheets.dart';
import 'package:mc_common_app/views/chat/widgets/chat_message_widget.dart'; import 'package:mc_common_app/views/chat/widgets/chat_message_widget.dart';
import 'package:mc_common_app/views/requests/request_bottomsheets.dart'; import 'package:mc_common_app/views/requests/request_bottomsheets.dart';
import 'package:mc_common_app/views/setting_options/widgets/custom_setting_options_tile.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart' as lcl;
class ChatView extends StatefulWidget { class ChatView extends StatefulWidget {
final ChatViewArguments chatViewArguments; final ChatViewArguments chatViewArguments;

@ -9,7 +9,6 @@ import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart'; import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart'; import 'package:mc_common_app/view_models/dashboard_view_model_customer.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
@ -53,7 +52,7 @@ void dealCompletedConfirmationBottomSheet({required BuildContext mainContext, re
if (status) { if (status) {
chatVM.updateAcknowledgePaymentToMowaterStatus(false); chatVM.updateAcknowledgePaymentToMowaterStatus(false);
mainContext.read<DashboardVmCustomer>().onNavbarTapped(4); mainContext.read<DashboardVmCustomer>().onNavbarTapped(4);
navigateReplaceWithName(mainContext, AppRoutes.dashboard); navigateReplaceWithNameUntilRoute(mainContext, AppRoutes.dashboard);
} }
}, },
), ),

@ -1,6 +1,5 @@
import 'dart:developer';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_localization/easy_localization.dart' as lcl;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
@ -18,6 +17,7 @@ import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart'; import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/views/chat/widgets/chat_bottom_sheets.dart';
import 'package:mc_common_app/views/requests/request_bottomsheets.dart'; import 'package:mc_common_app/views/requests/request_bottomsheets.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart'; import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart';
@ -25,7 +25,6 @@ import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart' as lcl;
class ChatMessageCustomWidget extends StatefulWidget { class ChatMessageCustomWidget extends StatefulWidget {
final ChatMessageModel chatMessageModel; final ChatMessageModel chatMessageModel;
@ -48,7 +47,7 @@ class ChatMessageCustomWidget extends StatefulWidget {
} }
class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> { class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
Future buildDealBottomSheetForSpecialCar({required ChatMessageModel chatMessageModel, required RequestOfferStatusEnum requestOfferStatusEnum}) { Future buildDealNotCompletedBottomSheetOptions({required ChatMessageModel chatMessageModel}) {
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
@ -62,53 +61,57 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Column( 12.height,
crossAxisAlignment: CrossAxisAlignment.start, ListView.separated(
children: [ shrinkWrap: true,
12.height, itemCount: chatVM.offerRejectModelList.length,
ListView( separatorBuilder: (BuildContext context, int index) {
children: [ bool indexContains = chatVM.indexesForDealNotCompleted.indexWhere((i) => i == index) != -1;
CheckBoxWithTitleDescription( if ((!indexContains)) {
isSelected: chatVM.dealOptionsModelList[0].isSelected!, return const SizedBox();
title: '${chatVM.dealOptionsModelList[0].title}', }
description: '',
onSelection: (bool value) { return const Divider(thickness: 0.5);
chatVM.updateIsSelectedInDealOptionsModelList(0, value); },
}, itemBuilder: (BuildContext context, int index) {
), bool indexContains = chatVM.indexesForDealNotCompleted.indexWhere((i) => i == index) != -1;
CheckBoxWithTitleDescription(
isSelected: chatVM.dealOptionsModelList[1].isSelected ?? false, if (!indexContains) {
title: '${chatVM.dealOptionsModelList[1].title}', return const SizedBox();
description: '', }
onSelection: (bool value) {
chatVM.updateIsSelectedInDealOptionsModelList(1, value); OfferRequestCommentModel offerRequestCommentModel = chatVM.offerRejectModelList[index];
}, return CircleCheckBoxWithTitle(
), isChecked: offerRequestCommentModel.isSelected ?? false,
], title: '${offerRequestCommentModel.title}',
), onSelected: () {
if (chatVM.dealOptionsModelList[1].isSelected!) ...[ chatVM.updateSelectionInOfferRejectModelList(index);
12.height, },
TxtField( selectedColor: MyColors.darkPrimaryColor,
maxLines: 5, );
value: chatVM.rejectOfferDescription, },
errorValue: chatVM.rejectOfferDescriptionError,
keyboardType: TextInputType.text,
hint: LocaleKeys.description.tr(),
onChanged: (v) => chatVM.updateRejectOfferDescription(v),
),
],
],
), ),
if (chatVM.offerRejectModelList.last.isSelected ?? false) ...[
// comparing if the "other" is selected
12.height,
TxtField(
maxLines: 5,
value: chatVM.rejectOfferDescription,
errorValue: chatVM.rejectOfferDescriptionError,
keyboardType: TextInputType.text,
hint: LocaleKeys.description.tr(),
onChanged: (v) => chatVM.updateRejectOfferDescription(v),
),
],
25.height, 25.height,
ShowFillButton( ShowFillButton(
title: LocaleKeys.submit.tr(), title: LocaleKeys.submit.tr(),
onPressed: () async { onPressed: () async {
String comments = ""; String comments = "";
if (chatVM.selectedOfferRequestCommentModel.index == chatVM.offerRejectModelList.length - 1) //Other if (chatVM.offerRejectModelList.last.isSelected ?? false) {
{
comments = chatVM.rejectOfferDescription; comments = chatVM.rejectOfferDescription;
} else { } else {
comments = chatVM.selectedOfferRequestCommentModel.title ?? ""; comments = chatVM.offerRejectModelList.firstWhere((element) => element.isSelected!).title ?? "";
} }
if (!chatVM.isRejectOfferButtonValidated()) { if (!chatVM.isRejectOfferButtonValidated()) {
return; return;
@ -125,13 +128,13 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
serviceItemName: chatMessageModel.reqOffer!.serviceItemName ?? "", serviceItemName: chatMessageModel.reqOffer!.serviceItemName ?? "",
manufacturedOn: chatMessageModel.reqOffer!.manufacturedOn ?? "", manufacturedOn: chatMessageModel.reqOffer!.manufacturedOn ?? "",
manufacturedById: chatMessageModel.reqOffer!.manufacturedById ?? 0, manufacturedById: chatMessageModel.reqOffer!.manufacturedById ?? 0,
requestOfferStatusEnum: requestOfferStatusEnum, requestOfferStatusEnum: RequestOfferStatusEnum.rejected,
context: context, context: context,
); );
if (status) { if (status) {
final requestVM = context.read<RequestsVM>(); final requestVM = context.read<RequestsVM>();
chatMessageModel.reqOffer!.requestOfferStatusEnum = requestOfferStatusEnum; chatMessageModel.reqOffer!.requestOfferStatusEnum = RequestOfferStatusEnum.rejected;
int index = chatVM.serviceProviderOffersList int index = chatVM.serviceProviderOffersList
.indexWhere((element) => (element.providerId == requestVM.currentSelectedOffer!.providerId) && (element.requestId == requestVM.currentSelectedOffer!.requestId)); .indexWhere((element) => (element.providerId == requestVM.currentSelectedOffer!.providerId) && (element.requestId == requestVM.currentSelectedOffer!.requestId));
@ -139,9 +142,8 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
chatVM.serviceProviderOffersList[index].requestOfferStatusEnum = chatMessageModel.reqOffer!.requestOfferStatusEnum; chatVM.serviceProviderOffersList[index].requestOfferStatusEnum = chatMessageModel.reqOffer!.requestOfferStatusEnum;
} }
setState(() {}); setState(() {});
// Navigator.pop(context);
chatVM.updateRejectOfferDescription(''); chatVM.updateRejectOfferDescription('');
Utils.showToast("Offer ${requestOfferStatusEnum == RequestOfferStatusEnum.rejected ? "Rejected" : "Cancelled"}"); Utils.showToast(LocaleKeys.offerRejected.tr());
// navigateReplaceWithName(context, AppRoutes.dashboard); // navigateReplaceWithName(context, AppRoutes.dashboard);
} }
}, },
@ -156,6 +158,68 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
); );
} }
Future buildDealBottomSheetOptionsForSpecialCar({required ChatMessageModel chatMessageModel, required RequestOfferStatusEnum requestOfferStatusEnum}) {
return showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
builder: (BuildContext context) {
return Consumer(builder: (BuildContext context, ChatVM chatVM, Widget? child) {
return InfoBottomSheet(
title: LocaleKeys.pleaseSpecify.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
description: Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
12.height,
CheckBoxWithTitleDescription(
isSelected: chatVM.dealOptionsModelList[0].isSelected!,
title: '${chatVM.dealOptionsModelList[0].title}',
description: '',
onSelection: (bool value) {
chatVM.updateIsSelectedInDealOptionsModelList(0, value);
},
),
CheckBoxWithTitleDescription(
isSelected: chatVM.dealOptionsModelList[1].isSelected ?? false,
title: '${chatVM.dealOptionsModelList[1].title}',
description: '',
onSelection: (bool value) {
chatVM.updateIsSelectedInDealOptionsModelList(1, value);
},
),
],
),
25.height,
ShowFillButton(
title: LocaleKeys.continu.tr(),
onPressed: () async {
if (chatVM.dealOptionsModelList[0].isSelected ?? false) {
final requestVM = context.read<RequestsVM>();
return dealCompletedConfirmationBottomSheet(
mainContext: context,
requestStatusEnum: RequestStatusEnum.completed,
requestId: requestVM.currentSelectedRequest!.id,
);
} else {
buildDealNotCompletedBottomSheetOptions(chatMessageModel: chatMessageModel);
}
},
maxWidth: double.infinity,
),
19.height,
],
),
));
});
},
);
}
Future buildRejectOrCancelOfferBottomSheet({required ChatMessageModel chatMessageModel, required RequestOfferStatusEnum requestOfferStatusEnum}) { Future buildRejectOrCancelOfferBottomSheet({required ChatMessageModel chatMessageModel, required RequestOfferStatusEnum requestOfferStatusEnum}) {
return showModalBottomSheet( return showModalBottomSheet(
context: context, context: context,
@ -434,7 +498,11 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
borderColor: MyColors.greenColor, borderColor: MyColors.greenColor,
isFilled: false, isFilled: false,
onPressed: () { onPressed: () {
offerAcceptConfirmationBottomSheet(chatMessageModel: chatMessageModel); if (widget.requestsTypeEnum == RequestsTypeEnum.specialCarRequest) {
buildDealBottomSheetOptionsForSpecialCar(chatMessageModel: chatMessageModel, requestOfferStatusEnum: requestOfferStatusEnum);
} else {
offerAcceptConfirmationBottomSheet(chatMessageModel: chatMessageModel);
}
}, },
backgroundColor: MyColors.white, backgroundColor: MyColors.white,
txtColor: MyColors.greenColor, txtColor: MyColors.greenColor,

@ -21,31 +21,41 @@ class CheckBoxWithTitleDescription extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SizedBox( return GestureDetector(
width: double.infinity, onTap: isDisabled
child: Row( ? null
crossAxisAlignment: CrossAxisAlignment.start, : () {
mainAxisAlignment: MainAxisAlignment.start, onSelection(!isSelected);
children: [
Checkbox(
value: isSelected,
activeColor: isDisabled ? MyColors.lightIconColor : MyColors.darkPrimaryColor,
onChanged: (bool? v) {
if (isDisabled) return;
onSelection(v ?? false);
}, },
), child: SizedBox(
Expanded( width: double.infinity,
child: Column( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: description.isNotEmpty ? CrossAxisAlignment.start : CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
title.toText(fontSize: 14, isBold: true), Checkbox(
description.toText(fontSize: 12, color: MyColors.lightTextColor), value: isSelected,
], activeColor: isDisabled ? MyColors.lightIconColor : MyColors.darkPrimaryColor,
onChanged: isDisabled
? null
: (bool? v) {
onSelection(v ?? false);
},
), ),
), Expanded(
], child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
title.toText(fontSize: 14, isBold: true),
if (description.isNotEmpty) ...[
description.toText(fontSize: 12, color: MyColors.lightTextColor),
]
],
),
),
],
),
), ),
); );
} }

Loading…
Cancel
Save