Updated both apps' structure
parent
e2a5bbfb65
commit
424942bf58
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,21 @@
|
||||
class BuyersChatForAdsModel {
|
||||
int? id;
|
||||
String? buyerUserID;
|
||||
String? buyerName;
|
||||
int? adsID;
|
||||
int? unReadMessagesCount;
|
||||
String? lastMessage;
|
||||
String? lastMessageDateTime;
|
||||
|
||||
BuyersChatForAdsModel({this.id, this.buyerUserID, this.buyerName, this.adsID});
|
||||
|
||||
BuyersChatForAdsModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
buyerUserID = json['buyerUserID'];
|
||||
buyerName = json['buyerName'];
|
||||
adsID = json['adsID'];
|
||||
unReadMessagesCount = json['unReadCount'];
|
||||
lastMessage = json['lastMessage'];
|
||||
lastMessageDateTime = json['lastMessageDateTime'];
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
|
||||
import 'package:mc_common_app/models/chat_models/buyers_chat_for_ads_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/navigator.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/widgets/common_widgets/app_bar.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class AdsBuyerChatsListView extends StatelessWidget {
|
||||
final List<BuyersChatForAdsModel> buyersListViewArguments;
|
||||
|
||||
const AdsBuyerChatsListView({super.key, required this.buyersListViewArguments});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: LocaleKeys.chat.tr()),
|
||||
body: buyersListViewArguments.isEmpty
|
||||
? Center(child: LocaleKeys.noOffersShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor))
|
||||
: ListView.separated(
|
||||
itemCount: buyersListViewArguments.length,
|
||||
padding: const EdgeInsets.all(16),
|
||||
itemBuilder: (context, index) {
|
||||
BuyersChatForAdsModel chatForAdsModel = buyersListViewArguments[index];
|
||||
return Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
(chatForAdsModel.buyerName ?? "").toText(fontSize: 16, isBold: true),
|
||||
if (chatForAdsModel.unReadMessagesCount != null && chatForAdsModel.unReadMessagesCount! > 0) ...[
|
||||
Center(
|
||||
child: "${chatForAdsModel.unReadMessagesCount ?? "1"}".toText(
|
||||
color: Colors.white,
|
||||
isBold: true,
|
||||
fontSize: 10,
|
||||
),
|
||||
).toContainer(
|
||||
backgroundColor: MyColors.redColor,
|
||||
borderRadius: 100,
|
||||
paddingAll: 1,
|
||||
width: 22,
|
||||
height: 22,
|
||||
),
|
||||
]
|
||||
],
|
||||
),
|
||||
8.height,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
(chatForAdsModel.lastMessage ?? "").toText(color: MyColors.lightTextColor, fontSize: 12),
|
||||
],
|
||||
),
|
||||
|
||||
if (chatForAdsModel.lastMessageDateTime != null) ...[
|
||||
DateTime.parse(chatForAdsModel.lastMessageDateTime!).getTimeAgo().toText(color: MyColors.lightTextColor),
|
||||
],
|
||||
// const Icon(
|
||||
// Icons.arrow_forward,
|
||||
// color: MyColors.darkIconColor,
|
||||
// size: 18,
|
||||
// ),
|
||||
],
|
||||
),
|
||||
],
|
||||
).onPress(() async {
|
||||
ChatViewArgumentsForAd chatViewArgumentsForAd = ChatViewArgumentsForAd(receiverUserID: chatForAdsModel.buyerUserID, adsID: chatForAdsModel.adsID);
|
||||
|
||||
ChatViewArguments chatViewArguments = ChatViewArguments(chatTypeEnum: ChatTypeEnum.ads, chatViewArgumentsForAd: chatViewArgumentsForAd);
|
||||
|
||||
final chatVM = context.read<ChatVM>();
|
||||
await chatVM.getUsersChatMessagesForAd(context: context, isForBuyer: false, adsChatBuyerId: chatForAdsModel.id).whenComplete(
|
||||
() => navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments),
|
||||
);
|
||||
}).toContainer(isShadowEnabled: true);
|
||||
},
|
||||
separatorBuilder: (context, index) => 16.height,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,146 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/config/dependency_injection.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/utils/navigator.dart';
|
||||
import 'package:mc_common_app/view_models/ad_view_model.dart';
|
||||
import 'package:mc_common_app/views/advertisement/ads_list.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/categories_list.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
class AdsFragment extends StatelessWidget {
|
||||
const AdsFragment({Key? key}) : super(key: key);
|
||||
|
||||
List<AdDetailsModel> getAdsList(AdVM adVM) {
|
||||
if (adVM.isExploreAdsTapped) {
|
||||
return adVM.exploreAdsFilteredList;
|
||||
}
|
||||
if (adVM.myAdsFilteredList.isNotEmpty) {
|
||||
return adVM.myAdsFilteredList;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer(
|
||||
builder: (BuildContext context, AdVM adVM, Widget? child) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.ads.tr(),
|
||||
isRemoveBackButton: true,
|
||||
actions: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: adVM.adsFiltersCounter > 0 ? 20 : 0, right: 21),
|
||||
child: Badge(
|
||||
isLabelVisible: adVM.adsFiltersCounter > 0,
|
||||
largeSize: 15,
|
||||
smallSize: 20,
|
||||
backgroundColor: MyColors.darkPrimaryColor,
|
||||
label: Text('${adVM.adsFiltersCounter}'),
|
||||
child: MyAssets.searchIcon.buildSvg(),
|
||||
),
|
||||
).onPress(() {
|
||||
navigateWithName(context, AppRoutes.adsFilterView);
|
||||
})
|
||||
],
|
||||
),
|
||||
body: SizedBox(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
children: [
|
||||
16.height,
|
||||
Consumer(
|
||||
builder: (BuildContext context, AdVM adVM, Widget? child) {
|
||||
return Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: ShowFillButton(
|
||||
isFilled: adVM.isExploreAdsTapped,
|
||||
maxHeight: 55,
|
||||
title: LocaleKeys.exploreAds.tr(),
|
||||
txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
|
||||
onPressed: () {
|
||||
print("accessToken: ${AppState().getUser.data!.accessToken}");
|
||||
adVM.populateAdsFilterList();
|
||||
if (adVM.myAds.isEmpty) {
|
||||
adVM.getMyAds();
|
||||
}
|
||||
adVM.updateIsExploreAds(true);
|
||||
},
|
||||
),
|
||||
),
|
||||
12.width,
|
||||
Expanded(
|
||||
child: ShowFillButton(
|
||||
isFilled: !adVM.isExploreAdsTapped,
|
||||
txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
|
||||
maxHeight: 55,
|
||||
title: LocaleKeys.myAds.tr(),
|
||||
onPressed: () {
|
||||
adVM.updateIsExploreAds(false);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
).horPaddingMain(),
|
||||
if (adVM.isExploreAdsTapped) ...[
|
||||
if (adVM.adsFiltersCounter == 0) ...[
|
||||
16.height,
|
||||
FiltersList(
|
||||
filterList: adVM.exploreAdsFilterOptions,
|
||||
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()),
|
||||
needLeftPadding: false)
|
||||
.paddingOnly(left: 21),
|
||||
]
|
||||
] else ...[
|
||||
16.height,
|
||||
FiltersList(
|
||||
filterList: adVM.myAdsFilterOptions,
|
||||
onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()),
|
||||
needLeftPadding: false,
|
||||
).paddingOnly(left: 21),
|
||||
],
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
16.height,
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
await adVM.getExploreAds();
|
||||
await adVM.getMyAds();
|
||||
},
|
||||
child: BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM)),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () async {
|
||||
navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider);
|
||||
},
|
||||
backgroundColor: MyColors.darkPrimaryColor,
|
||||
child: const Icon(Icons.add, color: MyColors.white),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
import 'package:mc_common_app/classes/app_state.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
||||
import 'package:mc_common_app/utils/navigator.dart';
|
||||
import 'package:mc_common_app/view_models/requests_view_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/utils/enums.dart';
|
||||
import 'package:mc_common_app/views/requests/widget/request_item.dart';
|
||||
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
|
||||
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
class MyRequestsFragment extends StatelessWidget {
|
||||
const MyRequestsFragment({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
title: LocaleKeys.myRequests.tr(),
|
||||
isRemoveBackButton: true,
|
||||
),
|
||||
body: Container(
|
||||
color: MyColors.backgroundColor,
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) {
|
||||
return Column(
|
||||
children: [
|
||||
16.height,
|
||||
FiltersList(
|
||||
filterList: requestsVM.requestsTypeFilterOptions,
|
||||
onFilterTapped: (index, selectedFilterId) {
|
||||
requestsVM.applyFilterOnRequestsVM(requestsTypeEnum: selectedFilterId.toRequestTypeStatusEnum());
|
||||
},
|
||||
),
|
||||
8.height,
|
||||
Expanded(
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async => await requestsVM.getRequests(isNeedToRebuild: true, appType: AppType.provider),
|
||||
child: requestsVM.state == ViewState.busy
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: requestsVM.myFilteredRequests.isEmpty
|
||||
? Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
LocaleKeys.noRequeststoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor),
|
||||
],
|
||||
)
|
||||
: ListView.separated(
|
||||
itemBuilder: (context, index) {
|
||||
return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index);
|
||||
},
|
||||
separatorBuilder: (context, index) {
|
||||
return 16.height;
|
||||
},
|
||||
itemCount: requestsVM.myFilteredRequests.length,
|
||||
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 8),
|
||||
),
|
||||
))
|
||||
],
|
||||
);
|
||||
}),
|
||||
),
|
||||
floatingActionButton: AppState().currentAppType == AppType.customer
|
||||
? FloatingActionButton(
|
||||
onPressed: () => navigateWithName(context, AppRoutes.createRequestPage),
|
||||
backgroundColor: MyColors.darkPrimaryColor,
|
||||
child: const Icon(
|
||||
Icons.add,
|
||||
color: MyColors.white,
|
||||
),
|
||||
)
|
||||
: null,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,47 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/config/routes.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
|
||||
import 'package:mc_common_app/utils/navigator.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
|
||||
class ServiceProviderWidget extends StatelessWidget {
|
||||
final List<BranchDetailModel> nearbyBranches;
|
||||
|
||||
const ServiceProviderWidget({Key? key, required this.nearbyBranches}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
width: double.infinity,
|
||||
height: 140,
|
||||
child: ListView.builder(
|
||||
itemCount: nearbyBranches.length,
|
||||
scrollDirection: Axis.horizontal,
|
||||
shrinkWrap: true,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
BranchDetailModel branchDetailModel = nearbyBranches[index];
|
||||
return SizedBox(
|
||||
width: 90,
|
||||
child: Column(
|
||||
children: [
|
||||
Image.asset(
|
||||
MyAssets.bnCar,
|
||||
width: 80,
|
||||
height: 80,
|
||||
fit: BoxFit.cover,
|
||||
).toCircle(borderRadius: 100),
|
||||
8.height,
|
||||
"${branchDetailModel.branchName}".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center),
|
||||
],
|
||||
),
|
||||
).onPress(() {
|
||||
navigateWithName(context, AppRoutes.branchDetailPage, arguments: branchDetailModel);
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,119 +0,0 @@
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mc_common_app/classes/consts.dart';
|
||||
import 'package:mc_common_app/extensions/int_extensions.dart';
|
||||
import 'package:mc_common_app/extensions/string_extensions.dart';
|
||||
import 'package:mc_common_app/theme/colors.dart';
|
||||
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
|
||||
|
||||
class ProviderAppointmentSliderWidget extends StatelessWidget {
|
||||
const ProviderAppointmentSliderWidget({Key? key}) : super(key: key);
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return CarouselSlider.builder(
|
||||
options: CarouselOptions(
|
||||
height: 160,
|
||||
viewportFraction: 1.0,
|
||||
enlargeCenterPage: false,
|
||||
enableInfiniteScroll: false,
|
||||
//
|
||||
// onPageChanged: (index) {
|
||||
// setState(() {
|
||||
// _current = index;
|
||||
// });
|
||||
// },
|
||||
),
|
||||
itemCount: 10,
|
||||
itemBuilder: (BuildContext context, int itemIndex, int pageViewIndex) => const BuildAppointmentContainerForProvider(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
class BuildAppointmentContainerForProvider extends StatelessWidget {
|
||||
const BuildAppointmentContainerForProvider({Key? key}) : super(key: key);
|
||||
|
||||
Widget showServices(String title, String icon) {
|
||||
return Row(
|
||||
children: [
|
||||
SvgPicture.asset(icon),
|
||||
8.width,
|
||||
title.toText(
|
||||
fontSize: 14,
|
||||
isBold: true,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.only(bottom: 21, left: 21, right: 21, top: 7),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
"Olaya Brach".toText(
|
||||
color: MyColors.lightTextColor,
|
||||
isBold: true,
|
||||
),
|
||||
"Abdullah Alhbas".toText(
|
||||
isBold: true,
|
||||
fontSize: 14,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
"Appt. On:".toText(
|
||||
color: MyColors.lightTextColor,
|
||||
),
|
||||
2.width,
|
||||
"19-Mar-2023 11:48 AM".toText(),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
"1+ Requests".toText(fontSize: 10).toContainer(
|
||||
borderRadius: 15,
|
||||
backgroundColor: MyColors.lightGreyEAColor,
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 6,
|
||||
horizontal: 12,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
8.height,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
showServices("Maintenance", MyAssets.maintenanceIcon ),
|
||||
2.height,
|
||||
showServices("Accessories and Modification", MyAssets.modificationsIcon,),
|
||||
],
|
||||
),
|
||||
),
|
||||
const Icon(
|
||||
Icons.arrow_forward,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
).toWhiteContainer(width: double.infinity, allPading: 12),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue