-
Notifications
You must be signed in to change notification settings - Fork 1
/
chat.dart
90 lines (81 loc) · 2.96 KB
/
chat.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../firestore/chat_room.dart';
import '../firestore/message.dart';
import '../firestore/refs.dart';
///
final baseChatRepositoryProvider =
Provider.autoDispose<BaseChatRepository>((_) => throw UnimplementedError());
/// チャット機能関係のリポジトリのインターフェース。
abstract class BaseChatRepository {
/// ChatRoom 一覧を購読する。
Stream<List<ChatRoom>> subscribeChatRooms({
Query<ChatRoom>? Function(Query<ChatRoom> query)? queryBuilder,
int Function(ChatRoom lhs, ChatRoom rhs)? compare,
});
/// 最後に取得したドキュメント以降のメッセージ limit 件の QuerySnapshot を返す。
Future<QuerySnapshot<Message>> loadMoreMessagesQuerySnapshot({
required int limit,
required String chatRoomId,
required QueryDocumentSnapshot<Message>? lastReadQueryDocumentSnapshot,
});
/// Message 一覧を購読する。
Stream<List<Message>> subscribeMessages({
required String chatRoomId,
Query<Message>? Function(Query<Message> query)? queryBuilder,
int Function(Message lhs, Message rhs)? compare,
});
}
///
final chatRepositoryProvider = Provider.autoDispose<BaseChatRepository>((_) => ChatRepository());
/// チャット機能関係の、データソースが Firestore であるリポジトリの実装クラス。
class ChatRepository implements BaseChatRepository {
@override
Stream<List<ChatRoom>> subscribeChatRooms({
Query<ChatRoom>? Function(Query<ChatRoom> query)? queryBuilder,
int Function(ChatRoom lhs, ChatRoom rhs)? compare,
}) {
Query<ChatRoom> query = chatRoomsRef;
if (queryBuilder != null) {
query = queryBuilder(query)!;
}
return query.snapshots().map((qs) {
final result = qs.docs.map((qds) => qds.data()).toList();
if (compare != null) {
result.sort(compare);
}
return result;
});
}
@override
Future<QuerySnapshot<Message>> loadMoreMessagesQuerySnapshot({
required int limit,
required String chatRoomId,
required QueryDocumentSnapshot<Message>? lastReadQueryDocumentSnapshot,
}) {
var query = messagesRef(chatRoomId: chatRoomId).orderBy('createdAt', descending: true);
final qds = lastReadQueryDocumentSnapshot;
if (qds != null) {
query = query.startAfterDocument(qds);
}
return query.limit(limit).get();
}
@override
Stream<List<Message>> subscribeMessages({
required String chatRoomId,
Query<Message>? Function(Query<Message> query)? queryBuilder,
int Function(Message lhs, Message rhs)? compare,
}) {
Query<Message> query = messagesRef(chatRoomId: chatRoomId);
if (queryBuilder != null) {
query = queryBuilder(query)!;
}
return query.snapshots().map((qs) {
final result = qs.docs.map((qds) => qds.data()).toList();
if (compare != null) {
result.sort(compare);
}
return result;
});
}
}