Fixed message deletion error and layout changes for the message input box.
This commit is contained in:
@@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user