diff --git a/lib/config/provider_routes.dart b/lib/config/provider_routes.dart index ab27297..1016923 100644 --- a/lib/config/provider_routes.dart +++ b/lib/config/provider_routes.dart @@ -1,5 +1,4 @@ import 'package:car_provider_app/views/appoinments/appoinment_detail_list_page.dart'; -import 'package:car_provider_app/views/appoinments/merge_appointment_page.dart'; import 'package:car_provider_app/views/appoinments/update_appointment_page.dart'; import 'package:car_provider_app/views/requests/request_detail_page.dart'; import 'package:car_provider_app/views/requests/send_offer_page.dart'; @@ -25,14 +24,11 @@ import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:flutter/material.dart'; -import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; - +import 'package:mc_common_app/models/model/provider_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/views/advertisement/ads_detail_view.dart'; import 'package:mc_common_app/views/advertisement/create_ad_view.dart'; -import '../views/appoinments/add_new_service_appointment_page.dart'; -import '../views/appoinments/appointment_page.dart'; import '../views/dashboard/dashboard_page.dart'; class ProviderAppRoutes { @@ -73,9 +69,7 @@ class ProviderAppRoutes { static final Map routes = { //Home page AppRoutes.dashboard: (context) => const DashboardPage(), - AppRoutes.adsDetailView: (context) => AdsDetailView( - adDetails: - ModalRoute.of(context)!.settings.arguments as AdDetailsModel), + AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel), AppRoutes.createAdView: (context) => const CreateAdView(), //setting @@ -101,8 +95,10 @@ class ProviderAppRoutes { mergeAppointments: (context) => MergeAppointmentListPage(), //Requests - requestsDetailPage: (context) => const RequestDetailPage(), - sendOfferPage: (context) => const SendOfferPage(), + AppRoutes.requestsDetailPage: (context) => RequestDetailPage( + requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments, + ), + AppRoutes.sendOfferPage: (context) => const SendOfferPage(), //Subscriptions AppRoutes.mySubscriptionsPage: (context) => const MySubscriptionsPage(), @@ -130,10 +126,10 @@ class ProviderAppRoutes { addSchedule: (context) => AddSchedulesPage(), //Branch Duplication - matchServices: (context) => MatchedServicesPage( - (ModalRoute.of(context)!.settings.arguments) == null - ? null - : (ModalRoute.of(context)!.settings.arguments - as MatchServicesArguments)), + matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)), + + AppRoutes.chatView: (context) => ChatView( + chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments, + ), }; } diff --git a/lib/main.dart b/lib/main.dart index 60d85d8..17e02b6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,18 +15,15 @@ import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/routes.dart'; -import 'package:mc_common_app/models/general_models/post_params_model.dart'; +import 'package:mc_common_app/models/post_params_model.dart'; import 'package:mc_common_app/repositories/ads_repo.dart'; -import 'package:mc_common_app/repositories/appointment_repo.dart'; import 'package:mc_common_app/repositories/common_repo.dart'; -import 'package:mc_common_app/repositories/provider_repo.dart'; import 'package:mc_common_app/repositories/request_repo.dart'; import 'package:mc_common_app/repositories/user_repo.dart'; import 'package:mc_common_app/services/common_services.dart'; import 'package:mc_common_app/theme/app_theme.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; -import 'package:mc_common_app/view_models/appointments_view_model.dart'; 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/user_view_model.dart'; @@ -71,8 +68,7 @@ Future main() async { ), ), ChangeNotifierProvider( - create: (_) => - SubscriptionsVM(subscriptionRepo: injector.get()), + create: (_) => SubscriptionsVM(subscriptionRepo: injector.get()), ), ChangeNotifierProvider( create: (_) => ItemsVM( @@ -92,13 +88,13 @@ Future main() async { commonRepo: injector.get(), ), ), - // ChangeNotifierProvider( - // create: (_) => RequestsVM( - // commonServices: injector.get(), - // commonRepo: injector.get(), - // requestRepo: injector.get(), - // ), - // ), + ChangeNotifierProvider( + create: (_) => RequestsVM( + commonServices: injector.get(), + commonRepo: injector.get(), + requestRepo: injector.get(), + ), + ), ChangeNotifierProvider( create: (_) => AppointmentsVM( scheduleRepo: injector.get(), @@ -107,6 +103,12 @@ Future main() async { commonRepo: injector.get(), ), ), + ChangeNotifierProvider( + create: (_) => ChatVM( + chatRepo: injector.get(), + requestRepo: injector.get(), + ), + ), ], child: const MyApp(), ).setupLocale()); @@ -128,19 +130,12 @@ class MyApp extends StatelessWidget { injector.get().setAppType(AppType.provider); AppState().setPostParamsModel( PostParamsModel( - languageID: - EasyLocalization.of(context)?.locale.languageCode == "ar" - ? 1 - : 2, + languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2, ), ); - ThemeData data = AppTheme.getTheme( - isArabic: - EasyLocalization.of(context)?.locale.languageCode == "ar"); + ThemeData data = AppTheme.getTheme(isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar"); return MaterialApp( - theme: AppTheme.getTheme( - isArabic: - EasyLocalization.of(context)?.locale.languageCode == "ar"), + theme: AppTheme.getTheme(isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar"), debugShowCheckedModeBanner: false, localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, diff --git a/lib/repositories/subscription_repo.dart b/lib/repositories/subscription_repo.dart index 11f5162..9617155 100644 --- a/lib/repositories/subscription_repo.dart +++ b/lib/repositories/subscription_repo.dart @@ -4,6 +4,7 @@ import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; +import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; abstract class SubscriptionRepo { diff --git a/lib/view_models/dashboard_view_model.dart b/lib/view_models/dashboard_view_model.dart index b984981..f5095dc 100644 --- a/lib/view_models/dashboard_view_model.dart +++ b/lib/view_models/dashboard_view_model.dart @@ -61,7 +61,7 @@ class DashboardVM extends BaseVM { String userName = await SharedPrefManager.getPhoneOrEmail(); Location.getCurrentLocation( (LatLng? latlng) { - AppState().currentLocation = latlng ?? new LatLng(0, 0); + AppState().currentLocation = latlng ?? const LatLng(0, 0); }, ); notifyListeners(); diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index 27d84bc..dadd544 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -11,13 +11,10 @@ import 'package:car_provider_app/views/dashboard/widget/drawer_widget.dart'; import 'package:car_provider_app/views/settings/branch/branch_list_page.dart'; 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/dependencies.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart'; -import 'package:mc_common_app/view_models/appointments_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/bottom_nav_bar.dart'; @@ -42,26 +39,29 @@ class _DashboardPageState extends State { super.initState(); dashboardVM = Provider.of(context, listen: false); scheduleMicrotask(() { - // context.read().populateRequestsFilterList(); + context.read().populateRequestsFilterList(); _onRefresh(); }); } Future _onRefresh() async { + final requestsVM = context.read(); + final chatVM = context.read(); + // context.read().populateAdsFilterList(); context.read().getBranchAndServices(); AdVM adVm = Provider.of(context, listen: false); AppointmentsVM appointmentsVM = - Provider.of(context, listen: false); + Provider.of(context, listen: false); if (appointmentsVM.myAppointments.isEmpty) { await appointmentsVM.getProviderMyAppointments({ "ServiceProviderID": injector - .get() - .getUser - .data - ?.userInfo - ?.providerId - .toString() ?? + .get() + .getUser + .data + ?.userInfo + ?.providerId + .toString() ?? "0" }); } @@ -71,6 +71,13 @@ class _DashboardPageState extends State { if (adVm.exploreAds.isEmpty) { await adVm.getExploreAds(); } + + if (requestsVM.myRequests.isEmpty) { + await requestsVM.getRequests(appType: AppType.provider); + } + + await chatVM.buildHubConnection(context); + } @override @@ -102,11 +109,7 @@ class _DashboardPageState extends State { dashboardVM.updateIndex(2); }, ), - RequestListFragment( - onBackButtonTapped: () { - dashboardVM.updateIndex(2); - }, - ), + const MyRequestsFragment(), ]; return Scaffold( diff --git a/lib/views/dashboard/fragments/ads_fragment.dart b/lib/views/dashboard/fragments/ads_fragment.dart index 56ec012..86733f2 100644 --- a/lib/views/dashboard/fragments/ads_fragment.dart +++ b/lib/views/dashboard/fragments/ads_fragment.dart @@ -6,6 +6,7 @@ import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/theme/colors.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/requests_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'; @@ -116,6 +117,7 @@ class AdsFragment extends StatelessWidget { floatingActionButton: FloatingActionButton( onPressed: () { context.read().getVehicleTypes(); + context.read().populateRequestsFilterList(); navigateWithName(context, AppRoutes.createAdView); }, diff --git a/lib/views/dashboard/fragments/my_requests_fragment.dart b/lib/views/dashboard/fragments/my_requests_fragment.dart new file mode 100644 index 0000000..04e9cf3 --- /dev/null +++ b/lib/views/dashboard/fragments/my_requests_fragment.dart @@ -0,0 +1,69 @@ +import 'dart:developer'; + +import 'package:car_provider_app/generated/locale_keys.g.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 { + final bool isNeedAppBar; + + const MyRequestsFragment({super.key, this.isNeedAppBar = true}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: !isNeedAppBar ? null : CustomAppBar(title: LocaleKeys.myServiceBranches.tr()), + 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: [ + "No Requests to show.".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), + ), + )) + ], + ); + }), + ), + ); + } +} diff --git a/lib/views/dashboard/fragments/request_list_fragment.dart b/lib/views/dashboard/fragments/request_list_fragment.dart deleted file mode 100644 index cc1a054..0000000 --- a/lib/views/dashboard/fragments/request_list_fragment.dart +++ /dev/null @@ -1,110 +0,0 @@ -import 'package:car_provider_app/config/provider_routes.dart'; -import 'package:flutter/material.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/view_models/requests_view_model.dart'; -import 'package:mc_common_app/views/requests/widget/request_item.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/dropdown/dropdow_field.dart'; - -import 'package:mc_common_app/widgets/tab/menu_tabs.dart'; - -import 'package:provider/provider.dart'; - -class RequestListFragment extends StatelessWidget { - VoidCallback onBackButtonTapped; - - RequestListFragment({required this.onBackButtonTapped, Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: CustomAppBar( - profileImageUrl: MyAssets.carBanner, - title: "Requests", - onBackButtonTapped: onBackButtonTapped, - actions: [ - IconButton( - onPressed: () {}, - icon: const Icon(Icons.search), - ), - 10.width, - ], - ), - body: SizedBox( - width: double.infinity, - height: double.infinity, - child: Column( - children: [ - 21.height, - MenuTabs( - 0, - [ - DropValue(0, "Special Request", ""), - DropValue(1, "My Offers", ""), - ], - onSelect: (DropValue dropValue) {}, - selectedColor: MyColors.darkPrimaryColor, - ), - 12.height, - // Expanded( - // child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { - // return Column( - // children: [ - // ShowFillButton( - // title: "title", - // onPressed: () { - // context.read().getRequests(); - // }), - // 16.height, - // FiltersList( - // filterList: requestsVM.requestsFilterOptions, - // onFilterTapped: (index, selectedFilterId) => requestsVM.applyFilterOnRequestsVM(index: index), - // ), - // 8.height, - // Expanded( - // child: requestsVM.isRequestLoading - // ? const Center(child: CircularProgressIndicator()) - // : requestsVM.requests.isEmpty - // ? Center( - // child: "No Request Available".toText( - // isBold: true, - // ), - // ) - // : ListView.separated( - // itemBuilder: (context, index) { - // return RequestItem(requestsVM.requests[index]); - // }, - // separatorBuilder: (context, index) { - // return 16.height; - // }, - // itemCount: requestsVM.requests.length, - // padding: const EdgeInsets.only( - // left: 16, - // right: 16, - // bottom: 16, - // top: 8, - // ), - // ), - // ) - // ], - // ); - // }), - // ), - // const Padding( - // padding: EdgeInsets.symmetric(horizontal: 21), - // child: RequestListCardWidget( - // count: 12, - // ), - // ) - ], - ), - ), - ); - } -} diff --git a/lib/views/dashboard/widget/request_list_card_widget.dart b/lib/views/dashboard/widget/request_list_card_widget.dart deleted file mode 100644 index 512d18c..0000000 --- a/lib/views/dashboard/widget/request_list_card_widget.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:car_provider_app/config/provider_routes.dart'; -import 'package:flutter/material.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/utils/navigator.dart'; -import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; - -class RequestListCardWidget extends StatelessWidget { - final int count; - - const RequestListCardWidget({Key? key, required this.count}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ListView.builder( - itemCount: count, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.only(bottom: 15), - child: buildRequestContainer(context), - ); - }); - } - - Widget buildRequestContainer(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - "Toyota Crolla".toText(fontSize: 16, isBold: true), - showItem("Model:", "2019"), - ], - ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - "Riyadh".toText( - color: MyColors.lightTextColor, - ), - "9 Hours Ago".toText(color: MyColors.lightTextColor), - ], - ), - ], - ), - showItem("Customer Name", "Abdullah"), - showItem("Description", "Looking for the car as soon as possible"), - showItem("Price Range:", ""), - Row( - children: [ - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - "30,000".toText(fontSize: 16, isBold: true), - 2.width, - "SAR:".toText( - color: MyColors.lightTextColor, - ), - ], - ), - ), - const Icon(Icons.arrow_forward) - ], - ), - ], - ).toWhiteContainer( - width: double.infinity, - allPading: 12, - onTap: () { - navigateWithName(context, ProviderAppRoutes.requestsDetailPage); - }, - ); - } - - Widget showItem(String title, String value) { - return Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (title.isNotEmpty) - title.toText( - color: MyColors.lightTextColor, - ), - if (title.isNotEmpty) 2.width, - if (value.isNotEmpty) Expanded(child: value.toText(isBold: true)), - ], - ); - } -} diff --git a/lib/views/requests/request_detail_page.dart b/lib/views/requests/request_detail_page.dart index b6e753d..605d514 100644 --- a/lib/views/requests/request_detail_page.dart +++ b/lib/views/requests/request_detail_page.dart @@ -1,19 +1,124 @@ -import 'package:flutter/cupertino.dart'; 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/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/theme/colors.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/utils/utils.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/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/info_bottom_sheet.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; - -import '../../config/provider_routes.dart'; -import '../dashboard/widget/request_list_card_widget.dart'; +import 'package:mc_common_app/widgets/txt_field.dart'; +import 'package:provider/provider.dart'; class RequestDetailPage extends StatelessWidget { - const RequestDetailPage({Key? key}) : super(key: key); + final RequestDetailPageArguments requestDetailPageArguments; + + const RequestDetailPage({Key? key, required this.requestDetailPageArguments}) : super(key: key); + + Future buildSendOfferBottomSheet(BuildContext context) { + final requestDetail = requestDetailPageArguments.requestModel; + return showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: true, + builder: (BuildContext context) { + return Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { + return InfoBottomSheet( + title: "Make an offer".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, + TxtField( + value: requestsVM.offerPrice, + errorValue: requestsVM.offerPriceError, + keyboardType: TextInputType.number, + hint: "Enter amount", + onChanged: (v) => requestsVM.updateOfferPrice(v), + ), + 12.height, + TxtField( + maxLines: 5, + value: requestsVM.offerDescription, + errorValue: requestsVM.offerDescriptionError, + keyboardType: TextInputType.text, + hint: "Description", + onChanged: (v) => requestsVM.updateOfferDescription(v), + ), + ], + ), + 25.height, + ShowFillButton( + title: "Submit", + onPressed: () { + requestsVM.onSendOfferPressed( + context: context, + receiverId: requestDetail.customerID, + message: requestsVM.offerDescription, + requestId: requestDetail.id, + offerPrice: requestsVM.offerPrice, + requestModel: requestDetail, + requestIndex: requestDetailPageArguments.requestIndex, + isFromChatScreen: false, + ); + }, + maxWidth: double.infinity, + ), + 19.height, + ], + ), + )); + }); + }, + ); + } + + Widget buildBottomButton({required RequestStatus requestStatus, required String statusText, required BuildContext context, required Function() onViewChatTapped}) { + switch (requestStatus) { + case RequestStatus.submitted: + case RequestStatus.inProgress: + case RequestStatus.paid: + case RequestStatus.shipping: + return ShowFillButton( + maxWidth: double.infinity, + margin: const EdgeInsets.all(15), + maxHeight: 55, + title: "View Chat", + isBold: false, + onPressed: onViewChatTapped, + ); + case RequestStatus.completed: + case RequestStatus.cancelled: + case RequestStatus.expired: + case RequestStatus.pending: + return buildDisabledButton(statusText); + } + } + + Widget buildDisabledButton(String text) { + return ShowFillButton( + backgroundColor: MyColors.grey98Color.withOpacity(0.3), + txtColor: MyColors.lightTextColor, + maxWidth: double.infinity, + margin: const EdgeInsets.all(15), + maxHeight: 55, + title: text, + isBold: false, + onPressed: () {}, + ); + } @override Widget build(BuildContext context) { @@ -42,14 +147,52 @@ class RequestDetailPage extends StatelessWidget { left: 21, ), ), - ShowFillButton( - title: "Send Offer", - maxWidth: double.infinity, - margin: const EdgeInsets.all(21), - onPressed: () { - navigateWithName(context, ProviderAppRoutes.sendOfferPage); - }, - ), + if (!requestDetailPageArguments.requestModel.isChatted) ...[ + ShowFillButton( + maxWidth: double.infinity, + margin: const EdgeInsets.all(15), + maxHeight: 55, + title: "Send Offer", + isBold: false, + fontSize: 18, + onPressed: () => buildSendOfferBottomSheet(context), + ), + ] else ...[ + buildBottomButton( + requestStatus: requestDetailPageArguments.requestModel.requestStatus, + statusText: "Offer ${requestDetailPageArguments.requestModel.requestStatusName}", + context: context, + onViewChatTapped: () async { + ChatViewArguments chatViewArguments = ChatViewArguments( + chatTypeEnum: ChatTypeEnum.requestOffer, + receiverId: requestDetailPageArguments.requestModel.customerID, + senderId: AppState().getUser.data!.userInfo!.userId.toString(), + requestId: requestDetailPageArguments.requestModel.id, + providerIndex: -1, + // This will be only sent in case of customer + requestModel: requestDetailPageArguments.requestModel, + requestIndex: requestDetailPageArguments.requestIndex, // This will be only sent in case of provider + ); + + final chatVM = context.read(); + await chatVM + .getUsersChatMessagesForProvider( + customerId: requestDetailPageArguments.requestModel.customerId, + context: context, + requestOfferId: 0, + requestId: requestDetailPageArguments.requestModel.id, + customerRequestIndex: requestDetailPageArguments.requestIndex, + ) + .whenComplete( + () => navigateWithName( + context, + AppRoutes.chatView, + arguments: chatViewArguments, + ), + ); + }, + ), + ], ], ), ), @@ -57,6 +200,7 @@ class RequestDetailPage extends StatelessWidget { } Widget buildRequestContainer(BuildContext context) { + final requestDetail = requestDetailPageArguments.requestModel; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -69,8 +213,9 @@ class RequestDetailPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Toyota Crolla".toText(fontSize: 16, isBold: true), - showItem("Model:", "2019"), + requestDetail.vehicleTypeName.toText(fontSize: 16, isBold: true), + showItem("Manufacturer:", requestDetail.brand), + showItem("Model:", "${requestDetail.year}"), ], ), ), @@ -78,28 +223,40 @@ class RequestDetailPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.start, children: [ - "Riyadh".toText( + "${requestDetail.city ?? ""} ${requestDetail.countryName}".toText( color: MyColors.lightTextColor, ), - "9 Hours Ago".toText(color: MyColors.lightTextColor), + requestDetail.createdOn.getTimeAgo().toText(color: MyColors.lightTextColor), ], ), ], ), - showItem("Customer Name", "Abdullah"), - showItem("Description", "Looking for the car as soon as possible"), + showItem("Customer Name", requestDetail.customerName), + showItem("Description", requestDetail.description), showItem("Price Range:", ""), Row( children: [ Expanded( child: Row( - mainAxisAlignment: MainAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.end, children: [ - "30,000".toText(fontSize: 16, isBold: true), - 2.width, - "SAR:".toText( - color: MyColors.lightTextColor, + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + "${requestDetail.price.toInt()}".toText(fontSize: 25, isBold: true), + 2.width, + "SAR".toText(color: MyColors.lightTextColor, fontSize: 16, height: 2.3), + ], + ), + Row( + children: [ + Utils.statusContainerChip( + text: "Offer ${requestDetail.requestStatusName}", + chipColor: MyColors.grey98Color.withOpacity(0.3), + textColor: MyColors.lightTextColor, + ), + ], ), ], ), diff --git a/lib/views/settings/branch/dealer/dealer_user_page.dart b/lib/views/settings/branch/dealer/dealer_user_page.dart index c8896e3..cef765d 100644 --- a/lib/views/settings/branch/dealer/dealer_user_page.dart +++ b/lib/views/settings/branch/dealer/dealer_user_page.dart @@ -1,4 +1,4 @@ -import 'package:car_provider_app/views/settings/branch/dealer/widget/add_phone_num_wiget.dart'; +import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:car_provider_app/views/settings/branch/dealer/widget/assign_dealer_user_sheet.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state.dart'; @@ -14,8 +14,6 @@ import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; -import '../../../../view_models/service_view_model.dart'; - class DealerUserPage extends StatefulWidget { String branchId; diff --git a/lib/views/settings/branch/dealer/widget/add_phone_num_wiget.dart b/lib/views/settings/branch/dealer/widget/add_phone_num_wiget.dart index 8ffc86e..0c8b416 100644 --- a/lib/views/settings/branch/dealer/widget/add_phone_num_wiget.dart +++ b/lib/views/settings/branch/dealer/widget/add_phone_num_wiget.dart @@ -12,7 +12,6 @@ import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; -import 'package:mc_common_app/widgets/tab/login_email_tab.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:provider/provider.dart'; @@ -88,10 +87,11 @@ class _AddPhoneNumWidgetState extends State { onPressed: () { //User Role: Dealer|Manager for a branch FocusScope.of(context).unfocus(); - if (validation()) + if (validation()) { userVM.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: 7, isNeedToPassToken: true, reloadPage: () { pop(context); }); + } }, ), ), diff --git a/lib/views/settings/branch/dealer/widget/assign_dealer_user_sheet.dart b/lib/views/settings/branch/dealer/widget/assign_dealer_user_sheet.dart index caee9ff..b477352 100644 --- a/lib/views/settings/branch/dealer/widget/assign_dealer_user_sheet.dart +++ b/lib/views/settings/branch/dealer/widget/assign_dealer_user_sheet.dart @@ -14,6 +14,7 @@ import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; +// ignore: must_be_immutable class AssignDealerUserSheet extends StatefulWidget { String branchId; VoidCallback callBackFunc; @@ -179,11 +180,11 @@ class _AssignDealerUserSheetState extends State { bool validation() { bool isValid = false; - provider.allProviderDealersList.forEach((element) { + for (var element in provider.allProviderDealersList) { if (element.isBranchUser) { isValid = true; } - }); + } return isValid; } } diff --git a/lib/views/settings/define_license_page.dart b/lib/views/settings/define_license_page.dart index 7e328ef..7c4bec7 100644 --- a/lib/views/settings/define_license_page.dart +++ b/lib/views/settings/define_license_page.dart @@ -1,12 +1,7 @@ -import 'dart:convert'; -import 'dart:io'; import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; - -import 'package:car_provider_app/view_models/branch_view_model.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; diff --git a/lib/views/settings/schedule/add_schedules_page.dart b/lib/views/settings/schedule/add_schedules_page.dart index a4324e7..63cee01 100644 --- a/lib/views/settings/schedule/add_schedules_page.dart +++ b/lib/views/settings/schedule/add_schedules_page.dart @@ -1,10 +1,9 @@ + import 'package:car_provider_app/view_models/schedule_view_model.dart'; -import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/select_services_sheet.dart'; import 'package:flutter/material.dart'; -import 'package:mc_common_app/classes/app_state.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/appointments_models/schedule_model.dart'; diff --git a/lib/views/settings/schedule/schedules_list_page.dart b/lib/views/settings/schedule/schedules_list_page.dart index d92166e..f4f0b5e 100644 --- a/lib/views/settings/schedule/schedules_list_page.dart +++ b/lib/views/settings/schedule/schedules_list_page.dart @@ -28,8 +28,6 @@ class _SchedulesListPageState extends State { void initState() { // TODO: implement initState super.initState(); - print("fffffffffkk"); - print(widget.branchId); context.read().getSchedules(widget.branchId ?? ""); } diff --git a/lib/views/settings/services/duplication/matched_services_page.dart b/lib/views/settings/services/duplication/matched_services_page.dart index fa57837..62f106b 100644 --- a/lib/views/settings/services/duplication/matched_services_page.dart +++ b/lib/views/settings/services/duplication/matched_services_page.dart @@ -46,9 +46,6 @@ class _MatchedServicesPageState extends State { @override Widget build(BuildContext context) { - print(widget.matchServicesArguments!.oldBranch); - print(widget.matchServicesArguments!.newBranch); - print(widget.matchServicesArguments!.categoryId); return Scaffold( appBar: const CustomAppBar( title: "Select Services", diff --git a/lib/views/settings/services/duplication/sheet/items_selection_sheet.dart b/lib/views/settings/services/duplication/sheet/items_selection_sheet.dart index 0454fbf..0b88dc3 100644 --- a/lib/views/settings/services/duplication/sheet/items_selection_sheet.dart +++ b/lib/views/settings/services/duplication/sheet/items_selection_sheet.dart @@ -1,4 +1,3 @@ -import 'package:car_provider_app/view_models/service_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'; @@ -8,7 +7,6 @@ import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; -import 'package:provider/provider.dart'; class ItemsSelectionSheet extends StatefulWidget { final List serviceItems; @@ -151,6 +149,5 @@ class _ItemsSelectionSheetState extends State { updateTempItem(int index, bool value) { tempItems![index].isUpdateOrSelected = value; setState(() {}); - ; } } diff --git a/lib/views/subscriptions/my_subscritions_page.dart b/lib/views/subscriptions/my_subscritions_page.dart index df26870..7b2ac1f 100644 --- a/lib/views/subscriptions/my_subscritions_page.dart +++ b/lib/views/subscriptions/my_subscritions_page.dart @@ -6,8 +6,6 @@ import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; -import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; -import 'package:mc_common_app/widgets/tab/menu_tabs.dart'; import 'package:provider/provider.dart'; class MySubscriptionsPage extends StatelessWidget { diff --git a/lib/views/subscriptions/subscriptions_page.dart b/lib/views/subscriptions/subscriptions_page.dart index 38cd5a1..bbfa64b 100644 --- a/lib/views/subscriptions/subscriptions_page.dart +++ b/lib/views/subscriptions/subscriptions_page.dart @@ -1,8 +1,8 @@ import 'package:car_provider_app/view_models/subscriptions_view_model.dart'; import 'package:car_provider_app/views/subscriptions/widget/subscriptions_card.dart'; import 'package:flutter/material.dart'; -import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; diff --git a/lib/views/subscriptions/widget/subscriptions_card.dart b/lib/views/subscriptions/widget/subscriptions_card.dart index cc675fb..bf4fb82 100644 --- a/lib/views/subscriptions/widget/subscriptions_card.dart +++ b/lib/views/subscriptions/widget/subscriptions_card.dart @@ -5,9 +5,9 @@ import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/date_helper.dart'; -import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + class SubscriptionsCard extends StatelessWidget { Subscription subscription; bool isSubscribed; diff --git a/pubspec.yaml b/pubspec.yaml index 65073f7..055878a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions