import { webExtApi as api } from '../browser-api'; import type { WindowCreateData } from '../types'; import { getAliases } from '../core'; import { CommandGroup } from '../classes/CommandGroup'; import type { CommandEntry } from '../classes/CommandGroup'; import type { WindowsRenameArgs, WindowsCloseArgs, WindowsOpenArgs } from '../types'; export class WindowsCommands extends CommandGroup { readonly namespace = "windows"; readonly commands: Record = { "windows.list": () => this.windowsList(), "windows.rename": (a: WindowsRenameArgs) => this.windowsRename(a), "windows.close": (a: WindowsCloseArgs) => this.windowsClose(a), "windows.open": (a: WindowsOpenArgs) => this.windowsOpen(a), }; private async activeWindowIds(): Promise> { const windows = await api.windows.getAll({}); return new Set(windows.map(w => w.id).filter(id => typeof id === "number")); } private async pruneAliases(activeIds?: Set): Promise> { const aliases = await getAliases(); const liveIds = activeIds || await this.activeWindowIds(); const pruned: Record = {}; let changed = false; for (const [id, alias] of Object.entries(aliases)) { if (liveIds.has(Number(id))) { pruned[id] = alias; } else { changed = true; } } if (changed) await api.storage.local.set({ windowAliases: pruned }); return pruned; } private async windowsList() { const windows = await api.windows.getAll({ populate: true }); const activeIds = new Set(windows.map(w => w.id).filter(id => typeof id === "number")); const aliases = await this.pruneAliases(activeIds); return windows.map(w => ({ id: w.id, alias: aliases[w.id] || null, focused: w.focused, state: w.state, tabCount: (w.tabs || []).length, })); } private async windowsRename({ windowId, name }: WindowsRenameArgs) { const aliases = await this.pruneAliases(); aliases[windowId] = name; await api.storage.local.set({ windowAliases: aliases }); return { windowId, name }; } private async windowsClose({ windowId }: WindowsCloseArgs) { await api.windows.remove(windowId); const aliases = await this.pruneAliases(); if (windowId in aliases) { delete aliases[windowId]; await api.storage.local.set({ windowAliases: aliases }); } return { windowId }; } private async windowsOpen({ url }: WindowsOpenArgs) { const createData: WindowCreateData = { focused: true }; if (url) createData.url = url; const w = await api.windows.create(createData); return { id: w.id }; } }