import 'dart:io'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'chatmessage.dart'; class ChatController extends GetxController { final CollectionReference _messagesCollection = FirebaseFirestore.instance.collection('messages'); // Observable list of messages RxList messages = [].obs; void sendMessage(String messageContent, String messageType, bool isText) async { try { await _messagesCollection.add({ 'messageContent': messageContent, 'messageType': messageType, 'isText': isText, 'timestamp': Timestamp.now(), }); print("Message sent successfully"); } catch (e) { print('Error sending message: $e'); } } Future uploadImage(File image, String id) async { try { String fileName = DateTime.now().millisecondsSinceEpoch.toString(); Reference storageReference = FirebaseStorage.instance.ref().child('products/$fileName'); SettableMetadata metadata = SettableMetadata(contentType: 'image/jpeg'); UploadTask uploadTask = storageReference.putFile(image, metadata); String temporaryMessageId = UniqueKey().toString(); messages.add(ChatMessage( messageContent: 'Uploading...', messageType: id, isText: true, temporaryMessageId: temporaryMessageId, )); TaskSnapshot taskSnapshot = await uploadTask; String downloadURL = await storageReference.getDownloadURL(); // Replace the temporary message with the uploaded image int index = messages.indexWhere((message) => message.temporaryMessageId == temporaryMessageId); if (index != -1) { messages[index] = ChatMessage( messageContent: downloadURL, messageType: id, isText: false, temporaryMessageId: '', ); } print('Image uploaded successfully. Download URL: $downloadURL'); return downloadURL; } catch (e) { print('Error uploading image: $e'); throw e; } } Stream getMessagesStream() { return _messagesCollection.orderBy('timestamp').snapshots(); } @override void onInit() { super.onInit(); // Listen for changes in the messages collection and update the local list getMessagesStream().listen((QuerySnapshot snapshot) { messages.assignAll(snapshot.docs.map((doc) => ChatMessage( messageContent: doc['messageContent'], messageType: doc['messageType'], isText: doc['isText'], temporaryMessageId: '', ))); }); } }