mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-31 00:22:30 +00:00
80 lines
2.1 KiB
TypeScript
80 lines
2.1 KiB
TypeScript
import type { QueryTab } from "@/types/database";
|
|
|
|
export interface SavedOpenTab {
|
|
id: string;
|
|
title: string;
|
|
connectionId: string;
|
|
database: string;
|
|
schema?: string;
|
|
sql: string;
|
|
savedSqlId?: string;
|
|
pinned?: boolean;
|
|
mode?: QueryTab["mode"];
|
|
objectBrowser?: QueryTab["objectBrowser"];
|
|
tableMeta?: QueryTab["tableMeta"];
|
|
}
|
|
|
|
export interface RestoredOpenTabs {
|
|
tabs: QueryTab[];
|
|
activeTabId: string | null;
|
|
}
|
|
|
|
export function serializeOpenTabs(tabs: QueryTab[]): SavedOpenTab[] {
|
|
return tabs.map((tab) => ({
|
|
id: tab.id,
|
|
title: tab.title,
|
|
connectionId: tab.connectionId,
|
|
database: tab.database,
|
|
schema: tab.schema,
|
|
sql: tab.sql,
|
|
savedSqlId: tab.savedSqlId,
|
|
pinned: tab.pinned,
|
|
mode: tab.mode,
|
|
objectBrowser: tab.objectBrowser,
|
|
tableMeta: tab.tableMeta,
|
|
}));
|
|
}
|
|
|
|
function isSavedOpenTab(value: unknown): value is SavedOpenTab {
|
|
if (!value || typeof value !== "object") return false;
|
|
const tab = value as Record<string, unknown>;
|
|
return (
|
|
typeof tab.id === "string" &&
|
|
typeof tab.title === "string" &&
|
|
typeof tab.connectionId === "string" &&
|
|
typeof tab.database === "string" &&
|
|
typeof tab.sql === "string"
|
|
);
|
|
}
|
|
|
|
export function restoreOpenTabsState(
|
|
rawTabs: string | null,
|
|
rawActiveTabId: string | null,
|
|
options: { queryOnly?: boolean } = {},
|
|
): RestoredOpenTabs {
|
|
if (!rawTabs) return { tabs: [], activeTabId: null };
|
|
|
|
try {
|
|
const parsed = JSON.parse(rawTabs);
|
|
if (!Array.isArray(parsed)) return { tabs: [], activeTabId: null };
|
|
|
|
const saved = parsed.filter(isSavedOpenTab);
|
|
const filtered = options.queryOnly ? saved.filter((tab) => (tab.mode ?? "query") === "query") : saved;
|
|
const tabs: QueryTab[] = filtered.map((tab) => ({
|
|
...tab,
|
|
mode: tab.mode ?? "query",
|
|
isExecuting: false,
|
|
isCancelling: false,
|
|
isExplaining: false,
|
|
}));
|
|
const activeTabId = rawActiveTabId || null;
|
|
|
|
return {
|
|
tabs,
|
|
activeTabId: tabs.some((tab) => tab.id === activeTabId) ? activeTabId : tabs[0]?.id || null,
|
|
};
|
|
} catch {
|
|
return { tabs: [], activeTabId: null };
|
|
}
|
|
}
|