You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.7 KiB
89 lines
2.7 KiB
6 months ago
|
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<ChatMessage> messages = <ChatMessage>[].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<String> 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<QuerySnapshot> 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: '',
|
||
|
)));
|
||
|
});
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|