|
|
@@ -3,12 +3,13 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
|
|
|
import { createStore, produce } from "solid-js/store"
|
|
|
import { Persist, persisted, removePersisted, draftPersistedKeys } from "@/utils/persist"
|
|
|
import { ServerConnection, useServer } from "./server"
|
|
|
-import { createEffect, startTransition } from "solid-js"
|
|
|
+import { createEffect, getOwner, onCleanup, startTransition } from "solid-js"
|
|
|
import { useLocation, useNavigate, useParams } from "@solidjs/router"
|
|
|
import { usePlatform } from "./platform"
|
|
|
import { uuid } from "@/utils/uuid"
|
|
|
import { SessionTabsRemovedDetail } from "@/components/titlebar-session-events"
|
|
|
import { sessionHref } from "@/utils/session-route"
|
|
|
+import { createTabMemory } from "./tab-memory"
|
|
|
|
|
|
export type SessionTab = {
|
|
|
type: "session"
|
|
|
@@ -66,6 +67,7 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|
|
const params = useParams()
|
|
|
const navigate = useNavigate()
|
|
|
const location = useLocation()
|
|
|
+ const memory = createTabMemory(getOwner())
|
|
|
|
|
|
const closing = new Set<string>()
|
|
|
let recentWrite = 0
|
|
|
@@ -89,11 +91,18 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|
|
for (const key of draftPersistedKeys()) removePersisted(Persist.draft(draftID, key), platform)
|
|
|
}
|
|
|
|
|
|
+ onCleanup(memory.dispose)
|
|
|
+
|
|
|
createEffect(() => {
|
|
|
if (!ready() || !recentReady()) return
|
|
|
const servers = new Set(server.list.map(ServerConnection.key))
|
|
|
const next = store.filter((tab) => servers.has(tab.server))
|
|
|
- if (next.length !== store.length) setStore(() => next)
|
|
|
+ if (next.length !== store.length) {
|
|
|
+ for (const tab of store) {
|
|
|
+ if (!servers.has(tab.server)) memory.remove(tabKey(tab))
|
|
|
+ }
|
|
|
+ setStore(() => next)
|
|
|
+ }
|
|
|
if (recent.key && !next.some((tab) => tabKey(tab) === recent.key)) setRecentKey(undefined)
|
|
|
})
|
|
|
|
|
|
@@ -151,6 +160,7 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|
|
if (recent.key === `draft:${draftID}`) setRecentKey(tabKey(next))
|
|
|
if (active) navigateTab(next)
|
|
|
})
|
|
|
+ memory.remove(`draft:${draftID}`)
|
|
|
removeDraftPersisted(draftID)
|
|
|
},
|
|
|
removeTab: (index: number) => {
|
|
|
@@ -170,12 +180,14 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|
|
if (nextTab) navigateTab(nextTab)
|
|
|
else navigate("/")
|
|
|
}).finally(() => closing.delete(key))
|
|
|
+ memory.remove(key)
|
|
|
if (draftID) removeDraftPersisted(draftID)
|
|
|
},
|
|
|
removeServer(key: ServerConnection.Key) {
|
|
|
const drafts = store.flatMap((tab) => (tab.type === "draft" && tab.server === key ? [tab.draftID] : []))
|
|
|
const removed = store.filter((tab) => tab.server === key).map(tabKey)
|
|
|
setStore((tabs) => tabs.filter((tab) => tab.server !== key))
|
|
|
+ for (const key of removed) memory.remove(key)
|
|
|
if (recent.key && removed.includes(recent.key)) setRecentKey(undefined)
|
|
|
for (const draftID of drafts) removeDraftPersisted(draftID)
|
|
|
if (server.key === key) navigate("/")
|
|
|
@@ -227,6 +239,7 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|
|
)
|
|
|
if (recent.key && removed.includes(recent.key)) setRecentKey(undefined)
|
|
|
})
|
|
|
+ for (const key of removed) memory.remove(key)
|
|
|
},
|
|
|
select: navigateTab,
|
|
|
remember(tab: Tab) {
|
|
|
@@ -246,6 +259,9 @@ export const { use: useTabs, provider: TabsProvider } = createSimpleContext({
|
|
|
}
|
|
|
navigate("/")
|
|
|
},
|
|
|
+ state<T>(tab: Tab, name: string, init: () => T) {
|
|
|
+ return memory.ensure(tabKey(tab), name, init)
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
return { ...actions, store, ready, recentReady }
|