diff --git a/packages/cache/src/sync.tsx b/packages/cache/src/sync.tsx index 85c7870..b1c7a84 100644 --- a/packages/cache/src/sync.tsx +++ b/packages/cache/src/sync.tsx @@ -242,6 +242,14 @@ export default function CacheSync() { ); return; } + if (message.type === "MessageDeleteLive") { + const deleteData = message.data as { + ChatPartnerId: number; + SendTime: number; + }; + await removeMessage(deleteData.ChatPartnerId, deleteData.SendTime); + return; + } if (message.type === "MessageState") { await replaceMessage( Number(data.ChatPartnerId), @@ -257,7 +265,7 @@ export default function CacheSync() { ); } }, - [accountId, insertMessage, replaceMessage], + [accountId, insertMessage, removeMessage, replaceMessage], ); useEffect(() => { diff --git a/packages/chat/src/context.tsx b/packages/chat/src/context.tsx index 23c735c..c69cd9c 100644 --- a/packages/chat/src/context.tsx +++ b/packages/chat/src/context.tsx @@ -470,6 +470,52 @@ export default function Provider({ children }: { children: ReactNode }) { [currentChatSecret, userIdValue], ); + const removeMessage = useCallback( + (sendTime: number) => { + setLiveMessagesState((prev) => + prev.filter((message) => message.SendTime !== sendTime), + ); + const queryKey = [ + "chat-messages", + String(userIdValue), + currentChatSecret !== null, + ] as const; + + queryClient.setQueryData>( + queryKey, + (current) => { + if (!current) { + return current; + } + + let updated = false; + + const pages = current.pages.map((page) => { + const nextPage = page.filter((message) => { + const keep = message.SendTime !== sendTime; + if (!keep) { + updated = true; + } + return keep; + }); + + return nextPage; + }); + + if (!updated) { + return current; + } + + return { + ...current, + pages, + }; + }, + ); + }, + [currentChatSecret, userIdValue], + ); + const deleteMessage = useCallback( async (sendTime: number) => { try { @@ -479,53 +525,13 @@ export default function Provider({ children }: { children: ReactNode }) { }); assertProtocolSuccess("MessageDelete", response); - - setLiveMessagesState((prev) => - prev.filter((message) => message.SendTime !== sendTime), - ); - const queryKey = [ - "chat-messages", - String(userIdValue), - currentChatSecret !== null, - ] as const; - - queryClient.setQueryData>( - queryKey, - (current) => { - if (!current) { - return current; - } - - let updated = false; - - const pages = current.pages.map((page) => { - const nextPage = page.filter((message) => { - const keep = message.SendTime !== sendTime; - if (!keep) { - updated = true; - } - return keep; - }); - - return nextPage; - }); - - if (!updated) { - return current; - } - - return { - ...current, - pages, - }; - }, - ); + removeMessage(sendTime); } catch (err) { log(1, "chat", "red", "Failed to delete message", err); toast("error", "Failed to delete message", String(err)); } }, - [currentChatSecret, send, userIdValue], + [removeMessage, send, userIdValue], ); const setReaction = useCallback( @@ -717,6 +723,18 @@ export default function Provider({ children }: { children: ReactNode }) { return; } + if (message.type === "MessageDeleteLive") { + const data = message.data as { + ChatPartnerId: number; + SendTime: number; + }; + + if (data.ChatPartnerId !== userIdValue) return; + + removeMessage(data.SendTime); + return; + } + if (message.type !== "MessageState") return; const rawData = message.data as { @@ -762,7 +780,14 @@ export default function Provider({ children }: { children: ReactNode }) { MessageState: nextState.MessageState, }); }); - }, [currentChatSecret, editMessage, send, subscribePush, userIdValue]); + }, [ + currentChatSecret, + editMessage, + removeMessage, + send, + subscribePush, + userIdValue, + ]); // Replys const [replyTo, setReplyTo] = useState(undefined); diff --git a/packages/mtp/src/context.tsx b/packages/mtp/src/context.tsx index 7710510..bb6c925 100644 --- a/packages/mtp/src/context.tsx +++ b/packages/mtp/src/context.tsx @@ -212,6 +212,7 @@ export function Provider(props: { "MessageLive", "MessageEditLive", "MessageReactionLive", + "MessageDeleteLive", "MessageState", "CallInvite", "ErrorNoIota", diff --git a/packages/mtp/todo.md b/packages/mtp/todo.md deleted file mode 100644 index 5224278..0000000 --- a/packages/mtp/todo.md +++ /dev/null @@ -1 +0,0 @@ -- Get omikron url & public key from omega diff --git a/packages/shared/src/data.ts b/packages/shared/src/data.ts index 907f8a4..b810ad6 100644 --- a/packages/shared/src/data.ts +++ b/packages/shared/src/data.ts @@ -209,6 +209,13 @@ export const mtp = { }), response: z.object({}), }, + MessageDeleteLive: { + request: z.object({}), + response: z.object({ + ChatPartnerId: z.number(), + SendTime: z.number(), + }), + }, MessageEditLive: { request: z.object({}), response: z.object({ diff --git a/type-maps.yaml b/type-maps.yaml index 67aa0f3..01d28e7 100644 --- a/type-maps.yaml +++ b/type-maps.yaml @@ -149,6 +149,7 @@ type_maps: MessageReactionAdd: 146 MessageReactionRemove: 147 MessageReactionLive: 148 + MessageDeleteLive: 150 DataTypes: ErrorType: 32 ErrorProtocol: 33