Files
openswarm/frontend/src/shared/browserFocus.ts
T

34 lines
1.4 KiB
TypeScript

// The browser card you last clicked into, so global shortcuts (Ctrl+R, zoom, Ctrl+Tab) target it; imperative + read on keydown so no re-render, and cleared the moment you click off any browser card.
let lastInteractedBrowserId: string | null = null;
// Recently-used browser ids, newest first; the top KEEP_ALIVE_CAP stay mounted across dashboard switches + off-screen so their sessionStorage (logins like Discord) survives, the rest get reclaimed by the normal suspend (LRU).
const KEEP_ALIVE_CAP = 4;
let recentBrowserIds: string[] = [];
export function setLastInteractedBrowser(browserId: string): void {
lastInteractedBrowserId = browserId;
recentBrowserIds = [browserId, ...recentBrowserIds.filter((id) => id !== browserId)].slice(0, 32);
}
export function clearLastInteractedBrowser(): void {
lastInteractedBrowserId = null;
}
export function getLastInteractedBrowser(): string | null {
return lastInteractedBrowserId;
}
export function getKeepAliveBrowserIds(): string[] {
return recentBrowserIds.slice(0, KEEP_ALIVE_CAP);
}
export function isKeepAliveBrowser(browserId: string): boolean {
return getKeepAliveBrowserIds().includes(browserId);
}
// Drop a closed browser from focus + keep-alive tracking so a dead id can't hog a slot.
export function forgetBrowser(browserId: string): void {
recentBrowserIds = recentBrowserIds.filter((id) => id !== browserId);
if (lastInteractedBrowserId === browserId) lastInteractedBrowserId = null;
}