import type { ContextMenuItem, LocalApi } from "@t3tools/contracts"; import { resetGitStatusStateForTests } from "./lib/gitStatusState"; import { resetRequestLatencyStateForTests } from "./rpc/requestLatencyState"; import { resetServerStateForTests } from "./rpc/serverState"; import { resetWsConnectionStateForTests } from "./rpc/wsConnectionState"; import { resetSavedEnvironmentRegistryStoreForTests, resetSavedEnvironmentRuntimeStoreForTests, } from "./environments/runtime"; import { getPrimaryEnvironmentConnection, resetEnvironmentServiceForTests, } from "./environments/runtime"; import { type WsRpcClient } from "./rpc/wsRpcClient"; import { showContextMenuFallback } from "./contextMenuFallback"; import { readBrowserClientSettings, readBrowserSavedEnvironmentRegistry, readBrowserSavedEnvironmentSecret, removeBrowserSavedEnvironmentSecret, writeBrowserClientSettings, writeBrowserSavedEnvironmentRegistry, writeBrowserSavedEnvironmentSecret, } from "./clientPersistenceStorage"; let cachedApi: LocalApi | undefined; export function createLocalApi(rpcClient: WsRpcClient): LocalApi { return { dialogs: { pickFolder: async (options) => { if (!window.desktopBridge) return null; return window.desktopBridge.pickFolder(options); }, confirm: async (message) => { if (window.desktopBridge) { return window.desktopBridge.confirm(message); } return window.confirm(message); }, }, shell: { openInEditor: (cwd, editor) => rpcClient.shell.openInEditor({ cwd, editor }), openExternal: async (url) => { if (window.desktopBridge) { const opened = await window.desktopBridge.openExternal(url); if (!opened) { throw new Error("Unable to open link."); } return; } window.open(url, "_blank", "noopener,noreferrer"); }, }, contextMenu: { show: async ( items: readonly ContextMenuItem[], position?: { x: number; y: number }, ): Promise => { if (window.desktopBridge) { return window.desktopBridge.showContextMenu(items, position) as Promise; } return showContextMenuFallback(items, position); }, }, persistence: { getClientSettings: async () => { if (window.desktopBridge) { return window.desktopBridge.getClientSettings(); } return readBrowserClientSettings(); }, setClientSettings: async (settings) => { if (window.desktopBridge) { return window.desktopBridge.setClientSettings(settings); } writeBrowserClientSettings(settings); }, getSavedEnvironmentRegistry: async () => { if (window.desktopBridge) { return window.desktopBridge.getSavedEnvironmentRegistry(); } return readBrowserSavedEnvironmentRegistry(); }, setSavedEnvironmentRegistry: async (records) => { if (window.desktopBridge) { return window.desktopBridge.setSavedEnvironmentRegistry(records); } writeBrowserSavedEnvironmentRegistry(records); }, getSavedEnvironmentSecret: async (environmentId) => { if (window.desktopBridge) { return window.desktopBridge.getSavedEnvironmentSecret(environmentId); } return readBrowserSavedEnvironmentSecret(environmentId); }, setSavedEnvironmentSecret: async (environmentId, secret) => { if (window.desktopBridge) { return window.desktopBridge.setSavedEnvironmentSecret(environmentId, secret); } return writeBrowserSavedEnvironmentSecret(environmentId, secret); }, removeSavedEnvironmentSecret: async (environmentId) => { if (window.desktopBridge) { return window.desktopBridge.removeSavedEnvironmentSecret(environmentId); } removeBrowserSavedEnvironmentSecret(environmentId); }, }, server: { getConfig: rpcClient.server.getConfig, refreshProviders: rpcClient.server.refreshProviders, upsertKeybinding: rpcClient.server.upsertKeybinding, getSettings: rpcClient.server.getSettings, updateSettings: rpcClient.server.updateSettings, }, }; } export function readLocalApi(): LocalApi | undefined { if (typeof window === "undefined") return undefined; if (cachedApi) return cachedApi; if (window.nativeApi) { cachedApi = window.nativeApi; return cachedApi; } cachedApi = createLocalApi(getPrimaryEnvironmentConnection().client); return cachedApi; } export function ensureLocalApi(): LocalApi { const api = readLocalApi(); if (!api) { throw new Error("Local API not found"); } return api; } export async function __resetLocalApiForTests() { cachedApi = undefined; const { __resetClientSettingsPersistenceForTests } = await import("./hooks/useSettings"); __resetClientSettingsPersistenceForTests(); await resetEnvironmentServiceForTests(); resetGitStatusStateForTests(); resetRequestLatencyStateForTests(); resetSavedEnvironmentRegistryStoreForTests(); resetSavedEnvironmentRuntimeStoreForTests(); resetServerStateForTests(); resetWsConnectionStateForTests(); }