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;
|
let mut txs = self.room_shutdown_txs.write().await;
|
||||||
for room_id in &idle_room_ids {
|
for room_id in &idle_room_ids {
|
||||||
@ -236,6 +243,10 @@ impl RoomConnectionManager {
|
|||||||
let mut map = self.room_inner.write().await;
|
let mut map = self.room_inner.write().await;
|
||||||
map.remove(&room_id);
|
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;
|
let mut txs = self.room_shutdown_txs.write().await;
|
||||||
txs.remove(&room_id);
|
txs.remove(&room_id);
|
||||||
|
|||||||
@ -852,16 +852,36 @@ export function RoomProvider({
|
|||||||
async (messageId: string, content: string) => {
|
async (messageId: string, content: string) => {
|
||||||
const client = wsClientRef.current;
|
const client = wsClientRef.current;
|
||||||
if (!client) return;
|
if (!client) return;
|
||||||
await client.messageUpdate(messageId, content);
|
|
||||||
setMessages((prev) =>
|
// Capture original content for rollback on server rejection
|
||||||
prev.map((m) => (m.id === messageId ? { ...m, content, display_content: content } : m)),
|
let rollbackContent: string | null = null;
|
||||||
);
|
|
||||||
// Persist to IndexedDB
|
|
||||||
setMessages((prev) => {
|
setMessages((prev) => {
|
||||||
const msg = prev.find((m) => m.id === messageId);
|
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;
|
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