From 37ec048a2cea46f272252da8a93af1e258f1617c Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Thu, 28 Dec 2023 17:12:44 +0300 Subject: [PATCH] chat moDULE ANd other testing before demo --- lib/config/provider_routes.dart | 13 +- lib/main.dart | 1 + lib/views/dashboard/dashboard_page.dart | 2 +- .../fragments/my_requests_fragment.dart | 5 +- .../widget/request_list_card_widget.dart | 104 -------------- lib/views/requests/request_detail_page.dart | 130 +++++++++++++++--- pubspec.lock | 8 ++ 7 files changed, 134 insertions(+), 129 deletions(-) delete mode 100644 lib/views/dashboard/widget/request_list_card_widget.dart diff --git a/lib/config/provider_routes.dart b/lib/config/provider_routes.dart index b01bc76..ea02133 100644 --- a/lib/config/provider_routes.dart +++ b/lib/config/provider_routes.dart @@ -1,5 +1,6 @@ import 'package:car_provider_app/views/appoinments/appoinment_detail_list_page.dart'; import 'package:car_provider_app/views/appoinments/update_appointment_page.dart'; +import 'package:car_provider_app/views/dashboard/dashboard_page.dart'; import 'package:car_provider_app/views/requests/request_detail_page.dart'; import 'package:car_provider_app/views/requests/send_offer_page.dart'; import 'package:car_provider_app/views/settings/branch/branch_detail_page.dart'; @@ -21,11 +22,9 @@ 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/provider_branches_models/branch_detail_model.dart'; -import 'package:mc_common_app/models/requests_models/request_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/dashboard/dashboard_page.dart'; +import 'package:mc_common_app/views/chat/chat_view.dart'; class ProviderAppRoutes { //settings @@ -73,7 +72,9 @@ class ProviderAppRoutes { updateAppointmentPage: (context) => const UpdateAppointmentPage(), //Requests - AppRoutes.requestsDetailPage: (context) => RequestDetailPage(requestDetail: ModalRoute.of(context)!.settings.arguments as RequestModel), + AppRoutes.requestsDetailPage: (context) => RequestDetailPage( + requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments, + ), AppRoutes.sendOfferPage: (context) => const SendOfferPage(), //Subscriptions @@ -95,5 +96,9 @@ class ProviderAppRoutes { //Branch Duplication 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 cb3db33..ca3228f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -98,6 +98,7 @@ Future main() async { ChangeNotifierProvider( create: (_) => ChatVM( chatRepo: injector.get(), + requestRepo: injector.get(), ), ), ], diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index 8869ae1..c9bd724 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -56,7 +56,7 @@ class _DashboardPageState extends State { await requestsVM.getRequests(appType: AppType.provider); } - await chatVM.buildHubConnection(); + await chatVM.buildHubConnection(context); } @override diff --git a/lib/views/dashboard/fragments/my_requests_fragment.dart b/lib/views/dashboard/fragments/my_requests_fragment.dart index 7b9faf5..04e9cf3 100644 --- a/lib/views/dashboard/fragments/my_requests_fragment.dart +++ b/lib/views/dashboard/fragments/my_requests_fragment.dart @@ -1,3 +1,5 @@ +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'; @@ -25,7 +27,6 @@ class MyRequestsFragment extends StatelessWidget { width: double.infinity, height: double.infinity, child: Consumer(builder: (BuildContext context, RequestsVM requestsVM, Widget? child) { - return Column( children: [ 16.height, @@ -50,7 +51,7 @@ class MyRequestsFragment extends StatelessWidget { ) : ListView.separated( itemBuilder: (context, index) { - return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider,); + return RequestItem(request: requestsVM.myFilteredRequests[index], appType: AppType.provider, requestIndex: index); }, separatorBuilder: (context, index) { return 16.height; 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 3a2183e..0000000 --- a/lib/views/dashboard/widget/request_list_card_widget.dart +++ /dev/null @@ -1,104 +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/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/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, AppRoutes.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 4a1d22a..605d514 100644 --- a/lib/views/requests/request_detail_page.dart +++ b/lib/views/requests/request_detail_page.dart @@ -1,9 +1,14 @@ 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/models/requests_models/request_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/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'; @@ -13,11 +18,12 @@ import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:provider/provider.dart'; class RequestDetailPage extends StatelessWidget { - final RequestModel requestDetail; + final RequestDetailPageArguments requestDetailPageArguments; - const RequestDetailPage({Key? key, required this.requestDetail}) : super(key: key); + const RequestDetailPage({Key? key, required this.requestDetailPageArguments}) : super(key: key); Future buildSendOfferBottomSheet(BuildContext context) { + final requestDetail = requestDetailPageArguments.requestModel; return showModalBottomSheet( context: context, isScrollControlled: true, @@ -63,6 +69,9 @@ class RequestDetailPage extends StatelessWidget { message: requestsVM.offerDescription, requestId: requestDetail.id, offerPrice: requestsVM.offerPrice, + requestModel: requestDetail, + requestIndex: requestDetailPageArguments.requestIndex, + isFromChatScreen: false, ); }, maxWidth: double.infinity, @@ -76,6 +85,41 @@ class RequestDetailPage extends StatelessWidget { ); } + 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) { return Scaffold( @@ -103,15 +147,52 @@ class RequestDetailPage extends StatelessWidget { left: 21, ), ), - ShowFillButton( - title: "Send Offer", - maxWidth: double.infinity, - margin: const EdgeInsets.all(21), - onPressed: () { - buildSendOfferBottomSheet(context); - // navigateWithName(context, AppRoutes.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, + ), + ); + }, + ), + ], ], ), ), @@ -119,6 +200,7 @@ class RequestDetailPage extends StatelessWidget { } Widget buildRequestContainer(BuildContext context) { + final requestDetail = requestDetailPageArguments.requestModel; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -149,20 +231,32 @@ class RequestDetailPage extends StatelessWidget { ), ], ), - showItem("Customer Name", "${requestDetail.customer}"), + 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: [ - "${requestDetail.price.toInt()}".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/pubspec.lock b/pubspec.lock index 862cabb..37cad2a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -716,6 +716,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.7" + percent_indicator: + dependency: transitive + description: + name: percent_indicator + sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c + url: "https://pub.dev" + source: hosted + version: "4.2.3" permission_handler: dependency: transitive description: