From 25ea37bb3db4fc137141b8fa22b16b0e4920ce44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Fri, 29 May 2026 11:46:04 +0800 Subject: [PATCH] feat(desktop): add previewBridge wrapper over tauri preview commands Co-Authored-By: Claude Opus 4.8 (1M context) --- desktop/src/lib/previewBridge.test.ts | 31 +++++++++++++++++++++++++++ desktop/src/lib/previewBridge.ts | 16 ++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 desktop/src/lib/previewBridge.test.ts create mode 100644 desktop/src/lib/previewBridge.ts diff --git a/desktop/src/lib/previewBridge.test.ts b/desktop/src/lib/previewBridge.test.ts new file mode 100644 index 00000000..8c2d2fab --- /dev/null +++ b/desktop/src/lib/previewBridge.test.ts @@ -0,0 +1,31 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import type { WebviewBounds } from '../components/browser/computeWebviewBounds' + +const invoke = vi.fn() +vi.mock('@tauri-apps/api/core', () => ({ invoke: (...a: unknown[]) => invoke(...a) })) +vi.mock('./desktopRuntime', () => ({ isTauriRuntime: () => true })) + +afterEach(() => { invoke.mockReset() }) + +describe('previewBridge', () => { + it('openPreview forwards url + bounds to preview_open', async () => { + const { previewBridge } = await import('./previewBridge') + const bounds: WebviewBounds = { x: 1, y: 2, width: 3, height: 4 } + await previewBridge.open('http://localhost/a', bounds) + expect(invoke).toHaveBeenCalledWith('preview_open', { url: 'http://localhost/a', bounds }) + }) + + it('setBounds forwards to preview_set_bounds', async () => { + const { previewBridge } = await import('./previewBridge') + await previewBridge.setBounds({ x: 0, y: 0, width: 10, height: 10 }) + expect(invoke).toHaveBeenCalledWith('preview_set_bounds', { bounds: { x: 0, y: 0, width: 10, height: 10 } }) + }) + + it('is a no-op outside the Tauri runtime', async () => { + vi.resetModules() + vi.doMock('./desktopRuntime', () => ({ isTauriRuntime: () => false })) + const { previewBridge } = await import('./previewBridge') + await previewBridge.open('http://localhost/a', { x: 0, y: 0, width: 1, height: 1 }) + expect(invoke).not.toHaveBeenCalled() + }) +}) diff --git a/desktop/src/lib/previewBridge.ts b/desktop/src/lib/previewBridge.ts new file mode 100644 index 00000000..b457577a --- /dev/null +++ b/desktop/src/lib/previewBridge.ts @@ -0,0 +1,16 @@ +import { invoke } from '@tauri-apps/api/core' +import { isTauriRuntime } from './desktopRuntime' +import type { WebviewBounds } from '../components/browser/computeWebviewBounds' + +async function call(cmd: string, args?: Record): Promise { + if (!isTauriRuntime()) return + await invoke(cmd, args) +} + +export const previewBridge = { + open: (url: string, bounds: WebviewBounds) => call('preview_open', { url, bounds }), + navigate: (url: string) => call('preview_navigate', { url }), + setBounds: (bounds: WebviewBounds) => call('preview_set_bounds', { bounds }), + setVisible: (visible: boolean) => call('preview_set_visible', { visible }), + close: () => call('preview_close'), +}