summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/layout.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-04 07:59:42 -0600
committerAdam <[email protected]>2026-02-04 07:59:46 -0600
commitc8622df762b953bfea4ba0dbc7097b123f29a288 (patch)
tree970eeafe7029cea79a25afa65e8a058845da33f1 /packages/app/src/context/layout.tsx
parentc277ee8cbf7ff3ca5a86947d974c2b72f88398d4 (diff)
downloadopencode-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.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