// Thin wrapper over Tauri IPC. When the UI runs in a normal browser // (vite dev / screenshots), calls go to an in-memory mock instead. import { invoke as tauriInvoke } from '@tauri-apps/api/core'; import { listen as tauriListen, type UnlistenFn } from '@tauri-apps/api/event'; export const inTauri = typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window; type Handler = (payload: any) => void; const mockListeners = new Map>(); export function mockEmit(event: string, payload: unknown) { mockListeners.get(event)?.forEach((h) => h(payload)); } export async function invoke(cmd: string, args?: Record): Promise { if (inTauri) return tauriInvoke(cmd, args); const { mockInvoke } = await import('./mock'); return mockInvoke(cmd, args ?? {}) as Promise; } export async function listen(event: string, handler: (payload: T) => void): Promise { if (inTauri) return tauriListen(event, (e) => handler(e.payload)); const set = mockListeners.get(event) ?? new Set(); set.add(handler as Handler); mockListeners.set(event, set); return () => set.delete(handler as Handler); } export async function windowAction(action: 'minimize' | 'maximize' | 'close' | 'drag') { if (!inTauri) return; const { getCurrentWindow } = await import('@tauri-apps/api/window'); const w = getCurrentWindow(); if (action === 'minimize') await w.minimize(); else if (action === 'maximize') await w.toggleMaximize(); else if (action === 'close') await w.close(); else await w.startDragging(); } export async function openUrl(url: string) { if (!inTauri) { window.open(url, '_blank'); return; } const { openUrl } = await import('@tauri-apps/plugin-opener'); await openUrl(url); } export async function pickFile(title: string, filters?: { name: string; extensions: string[] }[]): Promise { if (!inTauri) return null; const { open } = await import('@tauri-apps/plugin-dialog'); const r = await open({ title, multiple: false, directory: false, filters }); return typeof r === 'string' ? r : null; } export function errorText(e: unknown): string { return typeof e === 'string' ? e : e instanceof Error ? e.message : JSON.stringify(e); }