✨ Chat summary realtime updates
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:island/models/chat.dart';
|
import 'package:island/models/chat.dart';
|
||||||
import 'package:island/pods/network.dart';
|
import 'package:island/pods/network.dart';
|
||||||
|
import 'package:island/pods/websocket.dart';
|
||||||
|
|
||||||
part 'chat_summary.g.dart';
|
part 'chat_summary.g.dart';
|
||||||
|
|
||||||
@@ -12,9 +13,27 @@ class ChatSummary extends _$ChatSummary {
|
|||||||
final resp = await client.get('/sphere/chat/summary');
|
final resp = await client.get('/sphere/chat/summary');
|
||||||
|
|
||||||
final Map<String, dynamic> data = resp.data;
|
final Map<String, dynamic> data = resp.data;
|
||||||
return data.map(
|
final summaries = data.map(
|
||||||
(key, value) => MapEntry(key, SnChatSummary.fromJson(value)),
|
(key, value) => MapEntry(key, SnChatSummary.fromJson(value)),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
final ws = ref.watch(websocketProvider);
|
||||||
|
final subscription = ws.dataStream.listen((WebSocketPacket pkt) {
|
||||||
|
if (!pkt.type.startsWith('messages')) return;
|
||||||
|
if (pkt.type == 'messages.new') {
|
||||||
|
final message = SnChatMessage.fromJson(pkt.data!);
|
||||||
|
updateLastMessage(message.chatRoomId, message);
|
||||||
|
} else if (pkt.type == 'messages.update') {
|
||||||
|
final message = SnChatMessage.fromJson(pkt.data!);
|
||||||
|
updateMessageContent(message.chatRoomId, message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ref.onDispose(() {
|
||||||
|
subscription.cancel();
|
||||||
|
});
|
||||||
|
|
||||||
|
return summaries;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> clearUnreadCount(String chatId) async {
|
Future<void> clearUnreadCount(String chatId) async {
|
||||||
@@ -61,4 +80,19 @@ class ChatSummary extends _$ChatSummary {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateMessageContent(String chatId, SnChatMessage message) {
|
||||||
|
state.whenData((summaries) {
|
||||||
|
final summary = summaries[chatId];
|
||||||
|
if (summary != null && summary.lastMessage?.id == message.id) {
|
||||||
|
state = AsyncData({
|
||||||
|
...summaries,
|
||||||
|
chatId: SnChatSummary(
|
||||||
|
unreadCount: summary.unreadCount,
|
||||||
|
lastMessage: message,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user