Fixed message deletion error and layout changes for the message input box.

This commit is contained in:
2026-09-30 09:19:36 +03:30
parent 58e89246d9
commit 298b3316b4
7 changed files with 176 additions and 76 deletions
+42 -24
View File
@@ -93,7 +93,11 @@ function isRememberedHidden(roomId: string, messageId: string): boolean {
return Boolean(hiddenIdsByRoom.get(roomId)?.has(messageId));
}
async function persistHiddenOnServer(externalRoomId: string, messageIds: string[]) {
async function persistHiddenOnServer(
externalRoomId: string,
messageIds: string[],
forEveryone = true,
) {
const ids = [...new Set(messageIds.map((id) => String(id || '').trim()).filter(Boolean))];
if (!externalRoomId || !ids.length) return ids;
rememberHidden(externalRoomId, ids);
@@ -102,6 +106,7 @@ async function persistHiddenOnServer(externalRoomId: string, messageIds: string[
await api.post('/conversations/messages/hide', {
externalRoomId,
messageIds: ids,
forEveryone,
});
} catch {
// local purge already applied; sync may retry via poll
@@ -726,7 +731,7 @@ function onSocketMessage(event: MessageEvent) {
const ids = [hideTarget, purgeId].filter(Boolean);
purgeMessageIds(ids);
rememberHidden(roomId, ids);
void persistHiddenOnServer(roomId, ids);
void persistHiddenOnServer(roomId, ids, true);
return;
}
if (purgeId && isDeletedContent(purgeContent)) {
@@ -1196,27 +1201,34 @@ export function useOrgChat() {
});
}
async function deleteMessage(roomId: string, messageId: string) {
async function deleteMessage(
roomId: string,
messageId: string,
opts?: { forEveryone?: boolean },
) {
if (!messageId) return;
await connectSocket();
if (!socket || socket.readyState !== WebSocket.OPEN) throw new Error('ws not open');
const forEveryone = opts?.forEveryone !== false;
// 1) Persist hide in CRM (survives refresh for everyone)
await persistHiddenOnServer(roomId, [messageId]);
// 1) Persist hide in CRM
await persistHiddenOnServer(roomId, [messageId], forEveryone);
// 2) Realtime: send a normal text command (text delivery is reliable on chat WS)
const controlId = crypto.randomUUID();
rememberHidden(roomId, [controlId]);
socket.send(
JSON.stringify({
id: controlId,
type: 'text',
room_id: roomId,
content: `${HIDE_CMD_PREFIX}${messageId}`,
}),
);
// Hide the control message itself so it never appears in history UI
void persistHiddenOnServer(roomId, [controlId]);
// 2) Realtime sync only when deleting for everyone
if (forEveryone) {
await connectSocket();
if (socket && socket.readyState === WebSocket.OPEN) {
const controlId = crypto.randomUUID();
rememberHidden(roomId, [controlId]);
socket.send(
JSON.stringify({
id: controlId,
type: 'text',
room_id: roomId,
content: `${HIDE_CMD_PREFIX}${messageId}`,
}),
);
void persistHiddenOnServer(roomId, [controlId], true);
}
}
const last = [...messages.value].reverse().find((m) => m.roomId === roomId);
emitRoomLive({
@@ -1227,10 +1239,16 @@ export function useOrgChat() {
});
}
async function deleteMessages(roomId: string, messageIds: string[]) {
const ids = [...new Set(messageIds.filter(Boolean))];
for (const id of ids) {
await deleteMessage(roomId, id);
async function deleteMessages(
roomId: string,
items: Array<{ id: string; forEveryone?: boolean }>,
) {
const seen = new Set<string>();
for (const item of items) {
const id = String(item.id || '').trim();
if (!id || seen.has(id)) continue;
seen.add(id);
await deleteMessage(roomId, id, { forEveryone: item.forEveryone !== false });
}
}