diff options
| author | Adam <[email protected]> | 2026-02-04 07:59:42 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-04 07:59:46 -0600 |
| commit | c8622df762b953bfea4ba0dbc7097b123f29a288 (patch) | |
| tree | 970eeafe7029cea79a25afa65e8a058845da33f1 /packages/app/src/context/layout.tsx | |
| parent | c277ee8cbf7ff3ca5a86947d974c2b72f88398d4 (diff) | |
| download | opencode-c8622df762b953bfea4ba0dbc7097b123f29a288.tar.gz opencode-c8622df762b953bfea4ba0dbc7097b123f29a288.zip | |
fix(app): file tree not staying in sync across projects/sessions
Diffstat (limited to 'packages/app/src/context/layout.tsx')
| -rw-r--r-- | packages/app/src/context/layout.tsx | 46 |
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 |
