fix(room): add edit rollback, clean stream channels on room shutdown/idle
This commit is contained in:
parent
c89f01b718
commit
677e88980b
@ -185,6 +185,13 @@ impl RoomConnectionManager {
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
let mut stream_map = self.room_stream_inner.write().await;
|
||||
for room_id in &idle_room_ids {
|
||||
stream_map.remove(room_id);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
let mut txs = self.room_shutdown_txs.write().await;
|
||||
for room_id in &idle_room_ids {
|
||||
@ -236,6 +243,10 @@ impl RoomConnectionManager {
|
||||
let mut map = self.room_inner.write().await;
|
||||
map.remove(&room_id);
|
||||
}
|
||||
{
|
||||
let mut stream_map = self.room_stream_inner.write().await;
|
||||
stream_map.remove(&room_id);
|
||||
}
|
||||
{
|
||||
let mut txs = self.room_shutdown_txs.write().await;
|
||||
txs.remove(&room_id);
|
||||
|
||||
@ -852,16 +852,36 @@ export function RoomProvider({
|
||||
async (messageId: string, content: string) => {
|
||||
const client = wsClientRef.current;
|
||||
if (!client) return;
|
||||
await client.messageUpdate(messageId, content);
|
||||
setMessages((prev) =>
|
||||
prev.map((m) => (m.id === messageId ? { ...m, content, display_content: content } : m)),
|
||||
);
|
||||
// Persist to IndexedDB
|
||||
|
||||
// Capture original content for rollback on server rejection
|
||||
let rollbackContent: string | null = null;
|
||||
setMessages((prev) => {
|
||||
const msg = prev.find((m) => m.id === messageId);
|
||||
if (msg) saveMessage({ ...msg, content, display_content: content }).catch(() => {});
|
||||
rollbackContent = msg?.content ?? null;
|
||||
return prev.map((m) =>
|
||||
m.id === messageId ? { ...m, content, display_content: content } : m,
|
||||
);
|
||||
});
|
||||
|
||||
try {
|
||||
await client.messageUpdate(messageId, content);
|
||||
// Persist updated content to IndexedDB
|
||||
setMessages((prev) => {
|
||||
const msg = prev.find((m) => m.id === messageId);
|
||||
if (msg) saveMessage(msg).catch(() => {});
|
||||
return prev;
|
||||
});
|
||||
} catch (err) {
|
||||
// Rollback optimistic update on server rejection
|
||||
if (rollbackContent !== null) {
|
||||
setMessages((prev) =>
|
||||
prev.map((m) =>
|
||||
m.id === messageId ? { ...m, content: rollbackContent!, display_content: rollbackContent! } : m,
|
||||
),
|
||||
);
|
||||
}
|
||||
handleRoomError('Edit message', err);
|
||||
}
|
||||
},
|
||||
[],
|
||||
);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user