Files
Fondex-Driver/lib/controllers/chat_controller.dart
2025-12-08 23:25:00 +05:00

111 lines
3.9 KiB
Dart

import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:driver/constant/send_notification.dart';
import 'package:driver/models/conversation_model.dart';
import 'package:driver/models/inbox_model.dart';
import 'package:driver/utils/fire_store_utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';
import 'package:uuid/uuid.dart';
class ChatController extends GetxController {
Rx<TextEditingController> messageController = TextEditingController().obs;
final ScrollController scrollController = ScrollController();
@override
void onInit() {
// TODO: implement onInit
if (scrollController.hasClients) {
Timer(const Duration(milliseconds: 500), () => scrollController.jumpTo(scrollController.position.maxScrollExtent));
}
getArgument();
super.onInit();
}
RxBool isLoading = true.obs;
RxString orderId = "".obs;
RxString customerId = "".obs;
RxString customerName = "".obs;
RxString customerProfileImage = "".obs;
RxString restaurantId = "".obs;
RxString restaurantName = "".obs;
RxString restaurantProfileImage = "".obs;
RxString token = "".obs;
RxString chatType = "".obs;
void getArgument() {
dynamic argumentData = Get.arguments;
if (argumentData != null) {
orderId.value = argumentData['orderId'];
customerId.value = argumentData['customerId'];
customerName.value = argumentData['customerName'];
customerProfileImage.value = argumentData['customerProfileImage'];
restaurantId.value = argumentData['restaurantId'];
restaurantName.value = argumentData['restaurantName'];
restaurantProfileImage.value = argumentData['restaurantProfileImage'];
token.value = argumentData['token'];
chatType.value = argumentData['chatType'];
}
isLoading.value = false;
}
Future<void> sendMessage(String message, Url? url, String videoThumbnail, String messageType) async {
InboxModel inboxModel = InboxModel(
lastSenderId: customerId.value,
customerId: customerId.value,
customerName: customerName.value,
restaurantId: restaurantId.value,
restaurantName: restaurantName.value,
createdAt: Timestamp.now(),
orderId: orderId.value,
customerProfileImage: customerProfileImage.value,
restaurantProfileImage: restaurantProfileImage.value,
lastMessage: messageController.value.text,
chatType: chatType.value);
await FireStoreUtils.addDriverInbox(inboxModel);
ConversationModel conversationModel = ConversationModel(
id: const Uuid().v4(),
message: message,
senderId: restaurantId.value,
receiverId: customerId.value,
createdAt: Timestamp.now(),
url: url,
orderId: orderId.value,
messageType: messageType,
videoThumbnail: videoThumbnail);
if (url != null) {
if (url.mime.contains('image')) {
conversationModel.message = "sent a message".tr;
} else if (url.mime.contains('video')) {
conversationModel.message = "Sent a video".tr;
} else if (url.mime.contains('audio')) {
conversationModel.message = "Sent a audio".tr;
}
}
await FireStoreUtils.addDriverChat(conversationModel);
print("Token Value ===> ${token.value}");
await SendNotification.sendChatFcmMessage(restaurantName.value, conversationModel.message.toString(), token.value, {});
}
final ImagePicker imagePicker = ImagePicker();
// Future pickFile({required ImageSource source}) async {
// try {
// XFile? image = await imagePicker.pickImage(source: source);
// if (image == null) return;
// Url url = await FireStoreUtils.uploadChatImageToFireStorage(File(image.path), Get.context!);
// sendMessage('', url, '', 'image');
// Get.back();
// } on PlatformException catch (e) {
// ShowToastDialog.showToast("${"failed_to_pick".tr} : \n $e");
// }
// }
}