From f1874042bab54de3b922db5c491275c1a6d15f09 Mon Sep 17 00:00:00 2001 From: Alois Date: Fri, 31 Jul 2026 00:29:48 +0200 Subject: [PATCH] (fix): live reactions, message and call invites (fix): call ui --- apps/web/src/index.tsx | 4 +- packages/cache/src/sync.tsx | 41 ++++---- packages/call/src/components/invitePopup.tsx | 9 +- packages/call/src/components/modals/base.tsx | 2 +- packages/call/src/store.tsx | 42 ++++---- packages/call/src/views/main/focused.tsx | 2 +- packages/chat/src/context.tsx | 101 +++++++++++++++++-- packages/mtp/src/context.tsx | 61 ++++++----- packages/notifications/src/context.tsx | 14 ++- packages/shared/src/data.ts | 15 ++- 10 files changed, 203 insertions(+), 88 deletions(-) diff --git a/apps/web/src/index.tsx b/apps/web/src/index.tsx index c0b5ecb..6782f73 100644 --- a/apps/web/src/index.tsx +++ b/apps/web/src/index.tsx @@ -332,7 +332,7 @@ function createCallTrayIcon(color: string, speaking: boolean) { } function CallInit() { - useInitializeCall(); + const callInvitePopup = useInitializeCall(); const { load } = useStorage(); const { @@ -395,7 +395,7 @@ function CallInit() { }); }, [inCall, primaryColor, speaking]); - return null; + return callInvitePopup; } const rootRoute = createRootRoute({ diff --git a/packages/cache/src/sync.tsx b/packages/cache/src/sync.tsx index b1c7a84..9477b8b 100644 --- a/packages/cache/src/sync.tsx +++ b/packages/cache/src/sync.tsx @@ -18,7 +18,6 @@ export default function CacheSync() { const { load } = useStorage(); const [accountId, setAccountId] = useState(0); const queueRef = useRef(Promise.resolve()); - const reactionPartnersRef = useRef(new Map()); useEffect(() => { void load("user_id").then(setAccountId); @@ -195,23 +194,6 @@ export default function CacheSync() { ); return; } - - if (type === "MessageGet") { - const message = result as unknown as CachedMessage; - const mappedPartner = reactionPartnersRef.current.get(message.SendTime); - reactionPartnersRef.current.delete(message.SendTime); - if (mappedPartner) { - await insertMessage(mappedPartner, message); - return; - } - const windows = await secureCache().conversations.list(); - const window = windows.find((candidate) => - candidate.Messages.some( - (cached) => cached.SendTime === message.SendTime, - ), - ); - if (window) await insertMessage(window.UserId, message); - } }, [accountId, insertMessage, removeMessage, replaceMessage, secureCache], ); @@ -259,13 +241,28 @@ export default function CacheSync() { return; } if (message.type === "MessageReactionLive") { - reactionPartnersRef.current.set( - Number(data.SendTime), - Number(data.ChatPartnerId), + const partnerId = Number(data.ChatPartnerId); + const sendTime = Number(data.SendTime); + const senderId = Number(data.SenderId); + const reaction = String(data.Reaction); + const cache = secureCache(); + const window = await cache.conversations.get(partnerId); + const target = window?.Messages.find( + (candidate) => candidate.SendTime === sendTime, ); + if (!window || !target) return; + + const reactions = (target.Reactions ?? []).filter( + (candidate) => + candidate.SenderId !== senderId || candidate.Reaction !== reaction, + ); + if (data.Accepted === true) { + reactions.push({ SenderId: senderId, Reaction: reaction }); + } + await replaceMessage(partnerId, sendTime, { Reactions: reactions }); } }, - [accountId, insertMessage, removeMessage, replaceMessage], + [accountId, insertMessage, removeMessage, replaceMessage, secureCache], ); useEffect(() => { diff --git a/packages/call/src/components/invitePopup.tsx b/packages/call/src/components/invitePopup.tsx index 16675e4..ed26a1a 100644 --- a/packages/call/src/components/invitePopup.tsx +++ b/packages/call/src/components/invitePopup.tsx @@ -26,7 +26,10 @@ export default function InvitePopup({ loading={null} component={(user) => ( - + @@ -36,14 +39,14 @@ export default function InvitePopup({

{user.Display}