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>
40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
import type { SessionTab, Tab } from "./tabs"
|
|
|
|
export type ClosedTab = {
|
|
tab: SessionTab
|
|
index: number
|
|
}
|
|
|
|
const CLOSED_TAB_LIMIT = 25
|
|
|
|
// Only session tabs are recorded; closing a draft tab deletes its persisted
|
|
// state, so a reopened draft would come back empty anyway.
|
|
export function pushClosedTab(stack: ClosedTab[], tab: Tab, index: number): ClosedTab[] {
|
|
if (tab.type !== "session") return stack
|
|
return [...stack, { tab: { ...tab }, index }].slice(-CLOSED_TAB_LIMIT)
|
|
}
|
|
|
|
// Pops the most recently closed tab that is not open again,
|
|
// discarding stale entries along the way.
|
|
export function takeClosedTab(stack: ClosedTab[], tabs: Tab[]): { entry?: ClosedTab; stack: ClosedTab[] } {
|
|
const remaining = [...stack]
|
|
while (remaining.length) {
|
|
const entry = remaining.pop()
|
|
if (entry && !isOpen(tabs, entry.tab)) return { entry, stack: remaining }
|
|
}
|
|
return { stack: remaining }
|
|
}
|
|
|
|
export function removeClosedTabs(stack: ClosedTab[], server: SessionTab["server"], sessionIDs: string[]) {
|
|
const removed = new Set(sessionIDs)
|
|
return stack.filter((entry) => entry.tab.server !== server || !removed.has(entry.tab.sessionId))
|
|
}
|
|
|
|
export function nextTabAfterClose(tabs: Tab[], index: number, active: boolean) {
|
|
if (!active) return undefined
|
|
return tabs[index + 1] ?? tabs[index - 1] ?? null
|
|
}
|
|
|
|
function isOpen(tabs: Tab[], tab: SessionTab) {
|
|
return tabs.some((item) => item.type === "session" && item.server === tab.server && item.sessionId === tab.sessionId)
|
|
}
|