chat moDULE ANd other testing before demo

aamir_dev
Faiz Hashmi 2 years ago
parent b00b93a7ab
commit 37ec048a2c

@ -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,
),
};
}

@ -98,6 +98,7 @@ Future<void> main() async {
ChangeNotifierProvider<ChatVM>(
create: (_) => ChatVM(
chatRepo: injector.get<ChatRepo>(),
requestRepo: injector.get<RequestRepo>(),
),
),
],

@ -56,7 +56,7 @@ class _DashboardPageState extends State<DashboardPage> {
await requestsVM.getRequests(appType: AppType.provider);
}
await chatVM.buildHubConnection();
await chatVM.buildHubConnection(context);
}
@override

@ -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;

@ -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)),
],
);
}
}

@ -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<ChatVM>();
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,
),
],
),
],
),

@ -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:

Loading…
Cancel
Save