Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com>
47 lines
1.5 KiB
TypeScript
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)
|
|
},
|
|
}
|
|
}
|