import { getRegisteredRuntimeAPIs } from '@/contexts/runtimeAPIRegistry'; /** * Utility for opening external URLs with Tauri shell support. * In desktop runtime, uses tauri.shell.open() for proper system browser handling. * Falls back to window.open() for web runtime. */ type TauriShell = { shell?: { open?: (url: string) => Promise; }; }; const parseUrlSafely = (value: string): URL | null => { try { return new URL(value); } catch { return null; } }; export const isExternalHttpUrl = (url: string): boolean => { const parsed = parseUrlSafely(url.trim()); if (!parsed) { return false; } return parsed.protocol === 'http:' || parsed.protocol === 'https:'; }; /** * Opens an external URL in the system browser. * In Tauri desktop runtime, uses tauri.shell.open() for proper handling. * Falls back to window.open() for web runtime. * * @param url - The URL to open * @returns Promise - true if the URL was opened successfully */ export const openExternalUrl = async (url: string): Promise => { if (typeof window === 'undefined') { return false; } const target = url.trim(); if (!target) { return false; } const parsed = parseUrlSafely(target); if (!parsed) { return false; } if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { return false; } const normalizedTarget = parsed.toString(); const runtimeApis = getRegisteredRuntimeAPIs(); if (runtimeApis?.runtime?.isVSCode && runtimeApis.vscode?.openExternalUrl) { try { await runtimeApis.vscode.openExternalUrl(normalizedTarget); return true; } catch { return false; } } const tauri = (window as unknown as { __TAURI__?: TauriShell }).__TAURI__; if (tauri?.shell?.open) { try { await tauri.shell.open(normalizedTarget); return true; } catch { // Fall through to window.open } } try { window.open(normalizedTarget, '_blank', 'noopener,noreferrer'); return true; } catch { return false; } };