opencode/packages/desktop/src/main/window-registry.ts

47 lines
1.5 KiB
TypeScript

// Tracks open windows and the persisted window id list used to restore
// windows (and their per-window persisted state) across app launches.
export function createWindowRegistry<W>(persistence: {
read: () => unknown
write: (ids: string[]) => void
cleanup: (id: string) => void
}) {
const windows = new Map<string, W>()
let quitting = false
let lastFocusedID: string | undefined
const persisted = () => {
const value = persistence.read()
if (!Array.isArray(value)) return []
return value.filter((id): id is string => typeof id === "string" && id.length > 0)
}
return {
persisted,
setQuitting(value = true) {
quitting = value
},
register(id: string, window: W) {
windows.set(id, window)
const ids = persisted()
if (!ids.includes(id)) persistence.write([...ids, id])
},
focused(id: string) {
lastFocusedID = id
},
lastFocused() {
if (!lastFocusedID) return
return windows.get(lastFocusedID)
},
closed(id: string) {
windows.delete(id)
if (lastFocusedID === id) lastFocusedID = windows.keys().next().value
// Only a deliberate close (app keeps running with other windows open)
// forgets a window. Closing the last window quits the app and fires
// `closed` before `before-quit`, so treat it as a quit and keep the id
// for restore on next launch.
if (quitting || windows.size === 0) return
persistence.write(persisted().filter((item) => item !== id))
persistence.cleanup(id)
},
}
}