Added Images support in ReqChat

master_new_changes
Faiz Hashmi 1 year ago
parent 56d6bc196b
commit 3bd72ef382

@ -17,6 +17,7 @@ class ChatMessageModel {
int? serviceProviderID; int? serviceProviderID;
int? offerStatus; int? offerStatus;
ReqOffer? reqOffer; ReqOffer? reqOffer;
List<MessageImageModel>? messageImages;
bool? isRead; bool? isRead;
String? readOn; String? readOn;
bool? isMyMessage; bool? isMyMessage;
@ -34,6 +35,7 @@ class ChatMessageModel {
this.serviceProviderID, this.serviceProviderID,
this.offerStatus, this.offerStatus,
this.reqOffer, this.reqOffer,
this.messageImages,
this.isRead, this.isRead,
this.readOn, this.readOn,
this.isMyMessage, this.isMyMessage,
@ -44,7 +46,7 @@ class ChatMessageModel {
return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: ${reqOffer.toString()}, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}'; return 'ChatMessageModel{id: $id, senderUserID: $senderUserID, senderName: $senderName, messageType: $messageType, chatMessageTypeEnum: $chatMessageTypeEnum, chatText: $chatText, requestID: $requestID, reqOfferID: $reqOfferID, serviceProviderID: $serviceProviderID, offerStatus: $offerStatus, reqOffer: ${reqOffer.toString()}, isRead: $isRead, readOn: $readOn, isMyMessage: $isMyMessage}';
} }
ChatMessageModel.fromJson(Map<String, dynamic> json) { ChatMessageModel.fromJson(Map<String, dynamic> json, {bool isFromNetwork = true}) {
final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase(); final myUserId = AppState().getUser.data!.userInfo!.userId.toString().toUpperCase();
id = json['id']; id = json['id'];
senderUserID = json['senderUserID']; senderUserID = json['senderUserID'];
@ -58,6 +60,12 @@ class ChatMessageModel {
serviceProviderID = json['serviceProviderID']; serviceProviderID = json['serviceProviderID'];
offerStatus = json['offerStatus']; offerStatus = json['offerStatus'];
reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer']) : null; reqOffer = json['reqOffer'] != null ? ReqOffer.fromJson(json['reqOffer']) : null;
if (json['reqOfferImages'] != null) {
messageImages = <MessageImageModel>[];
json['reqOfferImages'].forEach((v) {
messageImages!.add(MessageImageModel.fromJson(v, isFromNetwork));
});
}
isRead = json['isRead']; isRead = json['isRead'];
readOn = json['readOn']; readOn = json['readOn'];
isMyMessage = (json['senderUserID']).toString().toUpperCase() == myUserId; isMyMessage = (json['senderUserID']).toString().toUpperCase() == myUserId;
@ -121,3 +129,38 @@ class OfferRequestCommentModel {
OfferRequestCommentModel({this.index, this.title, this.isSelected}); OfferRequestCommentModel({this.index, this.title, this.isSelected});
} }
class MessageImageModel {
int? id;
String? imageUrl;
String? imageStr;
String? imagePath;
bool? isFromNetwork;
int? reqOfferID;
MessageImageModel({
this.id,
this.imageUrl,
this.imageStr,
this.imagePath,
this.reqOfferID,
this.isFromNetwork = false,
});
MessageImageModel.fromJson(Map<String, dynamic> json, bool fromNetwork) {
id = json['id'];
imageUrl = json['imageUrl'];
imageStr = json['imageStr'];
imagePath = json[''];
reqOfferID = json['reqOfferID'];
isFromNetwork = fromNetwork;
}
Map<String, dynamic> toJson() {
return {
'id': id,
'imageStr': imageStr,
'reqOfferID': reqOfferID, // We don't include 'isFromNetwork' since it's set manually when parsing JSON
};
}
}

@ -1,6 +1,8 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io';
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';
@ -13,8 +15,10 @@ import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/requests_models/provider_offers_model.dart'; import 'package:mc_common_app/models/requests_models/provider_offers_model.dart';
import 'package:mc_common_app/repositories/chat_repo.dart'; import 'package:mc_common_app/repositories/chat_repo.dart';
import 'package:mc_common_app/repositories/request_repo.dart'; import 'package:mc_common_app/repositories/request_repo.dart';
import 'package:mc_common_app/services/common_services.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart'; 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/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';
@ -23,8 +27,9 @@ import 'package:easy_localization/easy_localization.dart';
class ChatVM extends ChangeNotifier { class ChatVM extends ChangeNotifier {
final ChatRepo chatRepo; final ChatRepo chatRepo;
final RequestRepo requestRepo; final RequestRepo requestRepo;
final CommonAppServices commonServices;
ChatVM({required this.chatRepo, required this.requestRepo}); ChatVM({required this.chatRepo, required this.requestRepo, required this.commonServices});
HubConnection? hubConnection; HubConnection? hubConnection;
@ -295,15 +300,62 @@ class ChatVM extends ChangeNotifier {
return true; return true;
} }
Future<bool> onTextMessageSendForRequest({ MessageImageModel convertFileToMessageImageModel({required File file}) {
List<int> imageBytes = file.readAsBytesSync();
String image = base64Encode(imageBytes);
MessageImageModel vehiclePostingImages = MessageImageModel(imageStr: image,
id: 0,
isFromNetwork: false,
reqOfferID: latestOfferId,
imagePath: file.path);
return vehiclePostingImages;
}
List<MessageImageModel> getMessagesImageList() {
List<MessageImageModel> requestImages = [];
for (var image in pickedImagesForMessage) {
var value = convertFileToMessageImageModel(file: File(image.filePath!));
requestImages.add(value);
}
return requestImages;
}
List<ImageModel> pickedImagesForMessage = [];
void removeImageFromList(String filePath) {
int index = pickedImagesForMessage.indexWhere((element) => element.filePath == filePath);
if (index == -1) {
return;
}
pickedImagesForMessage.removeAt(index);
notifyListeners();
}
void pickMultipleImages() async {
List<ImageModel> imageModels = [];
List<File> images = await commonServices.pickMultipleImages();
for (var element in images) {
imageModels.add(ImageModel(filePath: element.path, isFromNetwork: false));
}
pickedImagesForMessage.addAll(imageModels);
notifyListeners();
}
void clearPickedImagesForMessage() {
pickedImagesForMessage.clear();
notifyListeners();
}
Future<bool> onMessageSendForRequest({
required String receiverId, required String receiverId,
required ChatMessageTypeEnum chatMessageType, required ChatMessageTypeEnum chatMessageType,
required String message, required String message,
required int requestId, required int requestId,
required String offerPrice,
required BuildContext context, required BuildContext context,
}) async { }) async {
if (message.isEmpty) return false; if (chatMessageType == ChatMessageTypeEnum.freeText && message.isEmpty) return false;
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) { if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
logger.i("Hub Not Connected!!"); logger.i("Hub Not Connected!!");
@ -313,7 +365,13 @@ class ChatVM extends ChangeNotifier {
if (hubConnection!.state == HubConnectionState.connected) { if (hubConnection!.state == HubConnectionState.connected) {
final userId = AppState().getUser.data!.userInfo!.userId.toString(); final userId = AppState().getUser.data!.userInfo!.userId.toString();
final name = AppState().getUser.data!.userInfo!.firstName.toString(); final name = AppState().getUser.data!.userInfo!.firstName.toString();
List<Map<String, dynamic>> requestImagesMap = [];
List<MessageImageModel> messageImages = getMessagesImageList();
if (messageImages.isNotEmpty && chatMessageType == ChatMessageTypeEnum.image) {
for (var element in messageImages) {
requestImagesMap.add(element.toJson());
}
}
final obj = <String, dynamic>{ final obj = <String, dynamic>{
"ReceiverUserID": receiverId, "ReceiverUserID": receiverId,
"SenderUserID": userId, "SenderUserID": userId,
@ -321,8 +379,11 @@ class ChatVM extends ChangeNotifier {
"ChatText": message, "ChatText": message,
"RequestID": requestId, "RequestID": requestId,
"ReqOfferID": latestOfferId, "ReqOfferID": latestOfferId,
// "ReqOffer": {}
}; };
if (chatMessageType == ChatMessageTypeEnum.image) {
obj.addAll({"ReqOfferImages": requestImagesMap});
}
logger.i(obj); logger.i(obj);
hubConnection!.invoke( hubConnection!.invoke(
@ -341,8 +402,9 @@ class ChatVM extends ChangeNotifier {
requestID: requestId, requestID: requestId,
senderName: name, senderName: name,
senderUserID: userId, senderUserID: userId,
chatMessageTypeEnum: ChatMessageTypeEnum.freeText, chatMessageTypeEnum: chatMessageType,
receiverUserID: receiverId, receiverUserID: receiverId,
messageImages: messageImages,
); );
if (AppState().currentAppType == AppType.customer) { if (AppState().currentAppType == AppType.customer) {
@ -351,7 +413,10 @@ class ChatVM extends ChangeNotifier {
serviceProviderOffersList[providerIndex].chatMessages!.add(chatMessageModel); serviceProviderOffersList[providerIndex].chatMessages!.add(chatMessageModel);
} }
} else { } else {
int providerIndex = context.read<RequestsVM>().myFilteredRequests.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId)); int providerIndex = context
.read<RequestsVM>()
.myFilteredRequests
.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId));
log("providerIndex2:$providerIndex"); log("providerIndex2:$providerIndex");
if (providerIndex != -1) { if (providerIndex != -1) {
context.read<RequestsVM>().addChatMessagesInRequestsModel(msg: chatMessageModel, index: providerIndex); context.read<RequestsVM>().addChatMessagesInRequestsModel(msg: chatMessageModel, index: providerIndex);
@ -594,8 +659,7 @@ class ChatVM extends ChangeNotifier {
notifyListeners(); notifyListeners();
if (AppState().currentAppType == AppType.customer) { if (AppState().currentAppType == AppType.customer) {} else {}
} else {}
return true; return true;
} }
return false; return false;

@ -97,13 +97,13 @@ class RequestsVM extends BaseVM {
requestStatusIdApi = requestStatusId.selectedId; requestStatusIdApi = requestStatusId.selectedId;
} }
log("requestTypeIdApi: $requestTypeIdApi"); // log("requestTypeIdApi: $requestTypeIdApi");
log("requestCityIdApi: $requestCityIdApi"); // log("requestCityIdApi: $requestCityIdApi");
log("requestConditionIdApi: $requestConditionIdApi"); // log("requestConditionIdApi: $requestConditionIdApi");
log("requestVehicleBrandApi: $brand"); // log("requestVehicleBrandApi: $brand");
log("requestVehicleModelApi: $model"); // log("requestVehicleModelApi: $model");
log("requestVehicleYearIdApi: $requestVehicleYearIdApi"); // log("requestVehicleYearIdApi: $requestVehicleYearIdApi");
log("requestStatusIdApi: $requestStatusIdApi"); // log("requestStatusIdApi: $requestStatusIdApi");
// try { // try {
myFilteredRequests = await requestRepo.getRequestsBasedOnFilters( myFilteredRequests = await requestRepo.getRequestsBasedOnFilters(

@ -1,5 +1,8 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart'; 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/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';
@ -9,9 +12,11 @@ import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.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/utils/utils.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/payment_view_model.dart'; import 'package:mc_common_app/view_models/payment_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/advertisement/components/picked_images_container_widget.dart';
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';
@ -62,16 +67,15 @@ class _ChatViewState extends State<ChatView> {
super.dispose(); super.dispose();
} }
Future<bool> onTextMessageSend() async { Future<bool> onMessageSend({required ChatMessageTypeEnum chatMessageType}) async {
bool status = false; bool status = false;
if (chatTypeEnum == ChatTypeEnum.requestOffer) { if (chatTypeEnum == ChatTypeEnum.requestOffer) {
status = await chatVM.onTextMessageSendForRequest( status = await chatVM.onMessageSendForRequest(
context: context, context: context,
receiverId: chatViewArgumentsForRequest!.receiverId, receiverId: chatViewArgumentsForRequest!.receiverId,
message: chatVM.chatMessageText, message: chatVM.chatMessageText,
requestId: chatViewArgumentsForRequest!.requestId ?? 0, requestId: chatViewArgumentsForRequest!.requestId ?? 0,
offerPrice: "0.0", chatMessageType: chatMessageType,
chatMessageType: ChatMessageTypeEnum.freeText,
); );
} else if (chatTypeEnum == ChatTypeEnum.ads) { } else if (chatTypeEnum == ChatTypeEnum.ads) {
status = await chatVM.onTextMessageSendForAds( status = await chatVM.onTextMessageSendForAds(
@ -81,8 +85,9 @@ class _ChatViewState extends State<ChatView> {
adId: chatViewArgumentsForAd!.adsID!, adId: chatViewArgumentsForAd!.adsID!,
context: context, context: context,
); );
} else if (chatTypeEnum == ChatTypeEnum.general) { } else if (chatTypeEnum == ChatTypeEnum.general) {}
} else {} Utils.hideLoading(context);
return status; return status;
} }
@ -161,7 +166,7 @@ class _ChatViewState extends State<ChatView> {
), ),
), ),
] else ...[ ] else ...[
if (AppState().currentAppType == AppType.provider && chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted) ...[ if (AppState().currentAppType == AppType.provider && chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted && chatVM.pickedImagesForMessage.isEmpty) ...[
Expanded( Expanded(
flex: 1, flex: 1,
child: const Icon( child: const Icon(
@ -176,28 +181,53 @@ class _ChatViewState extends State<ChatView> {
), ),
), ),
], ],
Expanded( if (chatVM.pickedImagesForMessage.isNotEmpty) ...[
flex: 8, Expanded(
child: TxtField( flex: 8,
value: chatVM.chatMessageText, child: PickedFilesContainer(
hint: LocaleKeys.typeMessageHere.tr(), pickedFiles: chatVM.pickedImagesForMessage,
keyboardType: TextInputType.text, onCrossPressedPrimary: chatVM.removeImageFromList,
isNeedBorder: false, onAddFilePressed: () => chatVM.pickMultipleImages(),
onChanged: (v) => chatVM.updateChatMessageText(v), ),
), ),
), ] else ...[
Expanded(
flex: 1,
child: const Icon(
Icons.photo_library_rounded,
color: MyColors.darkPrimaryColor,
size: 30,
).onPress(() => chatVM.pickMultipleImages()),
),
Expanded(
flex: 8,
child: TxtField(
value: chatVM.chatMessageText,
hint: LocaleKeys.typeMessageHere.tr(),
keyboardType: TextInputType.text,
isNeedBorder: false,
onChanged: (v) => chatVM.updateChatMessageText(v),
),
),
],
Expanded( Expanded(
flex: 1, flex: 1,
child: const Icon( child: const Icon(Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30).onPress(
Icons.send_rounded,
color: MyColors.darkPrimaryColor,
size: 30,
).onPress(
() async { () async {
final status = await onTextMessageSend(); ChatMessageTypeEnum chatMessageTypeEnum = ChatMessageTypeEnum.freeText;
if (chatVM.pickedImagesForMessage.isNotEmpty) {
chatMessageTypeEnum = ChatMessageTypeEnum.image;
}
final status = await onMessageSend(chatMessageType: chatMessageTypeEnum);
if (status) { if (status) {
chatVM.scrollChatDown(); chatVM.scrollChatDown();
chatVM.clearChatMessageText(); if (chatMessageTypeEnum == ChatMessageTypeEnum.freeText) {
chatVM.clearChatMessageText();
} else if (chatMessageTypeEnum == ChatMessageTypeEnum.image) {
chatVM.clearPickedImagesForMessage();
}
} }
}, },
), ),

@ -1,3 +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: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';
@ -221,7 +223,6 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
); );
} }
//offerNoLongerAvailable
switch (requestOfferStatusEnum) { switch (requestOfferStatusEnum) {
case RequestOfferStatusEnum.offer: case RequestOfferStatusEnum.offer:
return Column( return Column(
@ -405,6 +406,148 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
return widget.toCircle(borderRadius: 100); return widget.toCircle(borderRadius: 100);
} }
Widget buildFreeTextDetailsInMessage() {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Directionality(
textDirection: TextDirection.ltr,
child: (widget.chatMessageModel.chatText ?? "").toText(
color: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.white : MyColors.lightTextColor,
fontSize: 12,
// isBold: true,
),
),
),
],
);
}
Widget buildImageGridWidget(
{required List<MessageImageModel> messagesImages,
double gridItemSize = 50.0, // Default fixed size for each grid item
double spacing = 8.0,
double borderWidth = 1,
Color borderColor = MyColors.textColor}) {
int imageCount = messagesImages.length;
if (imageCount == 1) {
return Container(
width: double.infinity,
height: (gridItemSize * 4),
decoration: BoxDecoration(
border: Border.all(width: borderWidth, color: borderColor),
borderRadius: BorderRadius.circular(8),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: (messagesImages[0].isFromNetwork ?? false)
? messagesImages[0].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
)
: messagesImages[0].imagePath.buildFileImage(fit: BoxFit.cover),
),
);
}
return SizedBox(
// height: (gridItemSize * 2) + (spacing * 2), // Fixed height for 2 rows including spacing
child: GridView.builder(
physics: const NeverScrollableScrollPhysics(),
// Prevent scrolling inside grid
shrinkWrap: true,
// Shrink size to fit the content
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // Show 2 images per row
crossAxisSpacing: spacing,
mainAxisSpacing: spacing,
childAspectRatio: 1, // Keep items square
),
itemCount: imageCount > 4 ? 4 : imageCount,
itemBuilder: (context, index) {
if (index == 3 && imageCount > 4) {
return Stack(
fit: StackFit.expand,
children: [
(messagesImages[0].isFromNetwork ?? false)
? messagesImages[index].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
)
: messagesImages[index].imagePath.buildFileImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
Container(
decoration: BoxDecoration(
color: Colors.black.withOpacity(0.5),
border: Border.all(width: borderWidth, color: borderColor),
borderRadius: BorderRadius.circular(8), // Optional: Rounded corners
),
child: Center(
child: '+${imageCount - 4}'.toText(fontSize: 30, color: MyColors.white, fontWeight: MyFonts.Medium),
),
),
],
);
} else {
return Container(
width: gridItemSize,
height: gridItemSize,
decoration: BoxDecoration(
border: Border.all(width: borderWidth, color: borderColor),
borderRadius: BorderRadius.circular(8), // Optional: Rounded corners
),
child: ClipRRect(
borderRadius: BorderRadius.circular(8), // Apply same radius to image
child: messagesImages[index].imageUrl.buildNetworkImage(
fit: BoxFit.cover,
width: gridItemSize,
height: gridItemSize,
),
),
);
}
},
),
);
}
Widget messageWidgetBasedOnType({required ChatMessageTypeEnum? chatMessageTypeEnum}) {
Widget messageTypeWidget = const SizedBox();
if (chatMessageTypeEnum == null) {
return const SizedBox();
}
switch (chatMessageTypeEnum) {
case ChatMessageTypeEnum.freeText:
messageTypeWidget = Column(children: [buildFreeTextDetailsInMessage(), 10.height]);
break;
case ChatMessageTypeEnum.image:
messageTypeWidget = buildImageGridWidget(messagesImages: widget.chatMessageModel.messageImages ?? []);
break;
case ChatMessageTypeEnum.audio:
case ChatMessageTypeEnum.video:
case ChatMessageTypeEnum.file:
case ChatMessageTypeEnum.offer:
messageTypeWidget = Column(
children: [
buildFreeTextDetailsInMessage(),
10.height,
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum, chatMessageModel: widget.chatMessageModel, context: context),
],
);
break;
}
return messageTypeWidget.toContainer(
isShadowEnabled: !(widget.chatMessageModel.isMyMessage ?? false),
backgroundColor: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.darkIconColor : MyColors.white,
borderRadius: 0,
margin: EdgeInsets.fromLTRB((widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0, !(widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Directionality( return Directionality(
@ -437,34 +580,7 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
], ],
), ),
5.height, 5.height,
Column( messageWidgetBasedOnType(chatMessageTypeEnum: widget.chatMessageModel.chatMessageTypeEnum),
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Directionality(
textDirection: TextDirection.ltr,
child: (widget.chatMessageModel.chatText ?? "").toText(
color: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.white : MyColors.lightTextColor,
fontSize: 12,
// isBold: true,
),
),
),
],
),
10.height,
if (widget.chatMessageModel.chatMessageTypeEnum == ChatMessageTypeEnum.offer) ...[
buildOfferDetailsInChatMessage(requestStatusEnum: widget.requestStatusEnum, chatMessageModel: widget.chatMessageModel, context: context),
],
],
).toContainer(
isShadowEnabled: !(widget.chatMessageModel.isMyMessage ?? false),
backgroundColor: (widget.chatMessageModel.isMyMessage ?? false) ? MyColors.darkIconColor : MyColors.white,
borderRadius: 0,
margin: EdgeInsets.fromLTRB((widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0, !(widget.chatMessageModel.isMyMessage ?? false) ? 25 : 0, 0),
),
], ],
), ),
) )

@ -34,8 +34,9 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
//TODO: ONLY FOR DEVELOPMENT PURPOSE //TODO: ONLY FOR DEVELOPMENT PURPOSE
// String phoneNum = "966504278212", password = "Fa@1234"; // String phoneNum = "966504278212", password = "Fa@1234";
// String phoneNum = "966504278213", password = "Fa@1234"; String phoneNum = "966504278213", password = "Fa@1234";
String phoneNum = "", password = "";
// String phoneNum = "", password = "";
String email = ""; String email = "";
String countryCode = ""; String countryCode = "";
Country? _country; Country? _country;
@ -50,23 +51,23 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
scheduleMicrotask(() { scheduleMicrotask(() {
userVM = Provider.of(context, listen: false); userVM = Provider.of(context, listen: false);
context.read<UserVM>().getAvailBio(); context.read<UserVM>().getAvailBio();
// if (AppState().currentAppType == AppType.provider) { if (AppState().currentAppType == AppType.provider) {
// phoneNum = "966530896018"; phoneNum = "966530896018";
// password = "Amir@1234"; password = "Amir@1234";
// //
// // phoneNum = "966569755630"; // // phoneNum = "966569755630";
// // password = "Amir12345@"; //AAmir Sal // // password = "Amir12345@"; //AAmir Sal
// //
// // phoneNum = "966598646795"; // // phoneNum = "966598646795";
// // password = "Zahoor@123"; // // password = "Zahoor@123";
// //
// // User Details // // User Details
// // phoneNum = "966554870506"; // // phoneNum = "966554870506";
// // password = "Sikander123@"; // "lastName": "sik", // // password = "Sikander123@"; // "lastName": "sik",
// // "email": "sikander@gmail.com", // // "email": "sikander@gmail.com",
// // phoneNum = "966569755630"; // // phoneNum = "966569755630";
// // password = "Amir12345@"; // // password = "Amir12345@";
// } }
getCountryList(); getCountryList();
}); });

@ -5,6 +5,7 @@ import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'dart:io';
extension ExtendedText on Widget { extension ExtendedText on Widget {
showOverlay({double? width, double? height}) { showOverlay({double? width, double? height}) {
@ -233,8 +234,7 @@ extension WidgetExt on Widget {
); );
} }
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
// Widget onTap(VoidCallback onTap, {double corners = 0}) { // Widget onTap(VoidCallback onTap, {double corners = 0}) {
// return Clickable.widget(child: this, corners: corners, onTap: onTap); // return Clickable.widget(child: this, corners: corners, onTap: onTap);
@ -336,6 +336,24 @@ extension xDouble on int {
} }
extension BuildSVG on String? { extension BuildSVG on String? {
Widget buildFileImage({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) {
logger.i("!File(this!).existsSync(): ${!File(this!).existsSync()}");
if (this == null || this!.isEmpty || !File(this!).existsSync()) {
return SizedBox(
height: height,
width: width,
child: SvgPicture.asset(MyAssets.providersIcon, color: MyColors.darkPrimaryColor).paddingAll(15),
);
}
return Image.file(
File(this!),
fit: fit,
color: color,
height: height,
width: width,
);
}
Widget buildSvg({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) { Widget buildSvg({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) {
return SvgPicture.asset( return SvgPicture.asset(
this!, this!,
@ -385,13 +403,7 @@ extension BuildSVG on String? {
extension LocaleSetup on MultiProvider { extension LocaleSetup on MultiProvider {
Widget setupLocale() { Widget setupLocale() {
return EasyLocalization( return EasyLocalization(supportedLocales: MyLocales.supportedLocales, fallbackLocale: MyLocales.fallBackLocale, startLocale: MyLocales.startLocale, assetLoader: MyLocales.assetLoader, path: MyLocales.localesAssetPath, child: this);
supportedLocales: MyLocales.supportedLocales,
fallbackLocale: MyLocales.fallBackLocale,
startLocale: MyLocales.startLocale,
assetLoader: MyLocales.assetLoader,
path: MyLocales.localesAssetPath,
child: this);
} }
} }

Loading…
Cancel
Save