summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/layout.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/src/context/layout.tsx')
-rw-r--r--packages/app/src/context/layout.tsx46
1 files changed, 46 insertions, 0 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index 71f3f6cff..e2fd0a7f4 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -33,6 +33,8 @@ type SessionTabs = {
type SessionView = {
scroll: Record<string, SessionScroll>
reviewOpen?: string[]
+ pendingMessage?: string
+ pendingMessageAt?: number
}
type TabHandoff = {
@@ -128,6 +130,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
)
const MAX_SESSION_KEYS = 50
+ const PENDING_MESSAGE_TTL_MS = 2 * 60 * 1000
const meta = { active: undefined as string | undefined, pruned: false }
const used = new Map<string, number>()
@@ -555,6 +558,49 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
setStore("mobileSidebar", "opened", (x) => !x)
},
},
+ pendingMessage: {
+ set(sessionKey: string, messageID: string) {
+ const at = Date.now()
+ touch(sessionKey)
+ const current = store.sessionView[sessionKey]
+ if (!current) {
+ setStore("sessionView", sessionKey, {
+ scroll: {},
+ pendingMessage: messageID,
+ pendingMessageAt: at,
+ })
+ prune(meta.active ?? sessionKey)
+ return
+ }
+
+ setStore(
+ "sessionView",
+ sessionKey,
+ produce((draft) => {
+ draft.pendingMessage = messageID
+ draft.pendingMessageAt = at
+ }),
+ )
+ },
+ consume(sessionKey: string) {
+ const current = store.sessionView[sessionKey]
+ const message = current?.pendingMessage
+ const at = current?.pendingMessageAt
+ if (!message || !at) return
+
+ setStore(
+ "sessionView",
+ sessionKey,
+ produce((draft) => {
+ delete draft.pendingMessage
+ delete draft.pendingMessageAt
+ }),
+ )
+
+ if (Date.now() - at > PENDING_MESSAGE_TTL_MS) return
+ return message
+ },
+ },
view(sessionKey: string | Accessor<string>) {
const key = typeof sessionKey === "function" ? sessionKey : () => sessionKey