Files
fcs/lib/pages/chat/model/message_model.dart

97 lines
2.8 KiB
Dart
Raw Normal View History

2020-09-20 05:34:49 +06:30
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
2020-10-07 02:33:06 +06:30
import 'package:fcs/data/services/services.dart';
import 'package:fcs/domain/constants.dart';
import 'package:fcs/domain/vo/message.dart';
import 'package:fcs/pages/main/model/base_model.dart';
2020-09-20 05:34:49 +06:30
import 'package:logging/logging.dart';
class MessageModel extends BaseModel {
final log = Logger('MessageModel');
2021-09-10 16:33:52 +06:30
List<Message> messages = [];
2020-09-20 05:34:49 +06:30
@override
logout() async {
2021-09-10 16:33:52 +06:30
if (listener != null) await listener!.cancel();
2020-09-20 05:34:49 +06:30
messages = [];
}
2021-09-10 16:33:52 +06:30
late Query query;
DocumentSnapshot? prevSnap;
late bool isEnded;
late bool isLoading;
String? userID;
StreamSubscription<QuerySnapshot>? listener;
2020-09-20 05:34:49 +06:30
static const int rowPerLoad = 20;
2021-09-10 15:15:20 +06:30
void initQuery(String? userID) {
2021-09-10 16:33:52 +06:30
if (userID == null) return;
2020-09-20 05:34:49 +06:30
this.messages = [];
this.userID = userID;
this.prevSnap = null;
2021-09-10 16:33:52 +06:30
query = FirebaseFirestore.instance
2020-09-20 05:34:49 +06:30
.collection("$user_collection/$userID/$messages_collection")
.orderBy('date', descending: true);
load();
}
Future<void> load() async {
2021-10-11 17:09:47 +06:30
// if (prevSnap == null) return;
2020-09-20 05:34:49 +06:30
Query _query =
2021-09-10 16:33:52 +06:30
prevSnap != null ? query.startAfterDocument(prevSnap!) : query;
2020-09-20 05:34:49 +06:30
QuerySnapshot snapshot =
2021-09-10 16:33:52 +06:30
await _query.limit(rowPerLoad).get(GetOptions(source: Source.server));
2020-09-20 05:34:49 +06:30
2021-09-10 16:33:52 +06:30
int count = snapshot.docs.length;
2020-09-20 05:34:49 +06:30
isEnded = count < rowPerLoad;
2021-09-10 16:33:52 +06:30
prevSnap = count > 0 ? snapshot.docs[count - 1] : prevSnap;
2020-09-20 05:34:49 +06:30
2021-09-10 16:33:52 +06:30
snapshot.docs.forEach((e) {
messages.add(Message.fromMap(e.data() as Map<String, dynamic>, e.id));
2020-09-20 05:34:49 +06:30
if (messages.length == 1) {
_initListener(e);
}
});
notifyListeners();
}
void _initListener(DocumentSnapshot snap) {
2021-09-10 16:33:52 +06:30
if (listener != null) listener!.cancel();
2020-09-20 05:34:49 +06:30
2021-09-10 16:33:52 +06:30
listener = FirebaseFirestore.instance
2020-09-20 05:34:49 +06:30
.collection("$user_collection/$userID/$messages_collection")
.orderBy('date', descending: true)
2021-10-11 17:09:47 +06:30
.endBeforeDocument(snap)
2020-09-20 05:34:49 +06:30
.snapshots(includeMetadataChanges: true)
.listen((qs) {
2021-09-10 16:33:52 +06:30
qs.docChanges.forEach((c) {
2020-09-20 05:34:49 +06:30
switch (c.type) {
case DocumentChangeType.added:
log.info("added!! $c");
messages.insert(
2021-09-10 16:33:52 +06:30
0,
Message.fromMap(
c.doc.data() as Map<String, dynamic>, c.doc.id));
2020-09-20 05:34:49 +06:30
notifyListeners();
break;
case DocumentChangeType.modified:
log.info("modified!! $c");
break;
default:
}
});
});
}
Future<void> sendMessage(String msg, String receiverID) {
Message message = Message(message: msg, receiverID: receiverID);
return Services.instance.commonService.sendMessage(message);
}
Future<void> seenMessages(String ownerID, bool seenByOwner) {
return Services.instance.commonService.seenMessage(ownerID, seenByOwner);
}
}