Plan 3 of the web embedding SDK: @zseven-w/op-web-sdk-react and -vue — thin read-only framework adapters over the TS core. Each: <DesignView> (canvas + viewer lifecycle), provider/inject of OpViewer, and read-only useDocument/useViewport/useActivePage. React via useSyncExternalStore (cache-invalidate-on-event); Vue via an async shallowRef provider so children inject the viewer after load. Self-contained (no pen-* deps; framework peer); React 5/5 + Vue 4/4 tests; both tsc clean.
25 lines
1.2 KiB
TypeScript
25 lines
1.2 KiB
TypeScript
import { vi } from 'vitest';
|
|
// A controllable fake OpViewer for adapter tests. `emit(event)` fires listeners.
|
|
export function makeMockViewer() {
|
|
const listeners: Record<string, Set<() => void>> = { load: new Set(), viewportchange: new Set() };
|
|
let vp = { panX: 0, panY: 0, zoom: 1 };
|
|
const viewer = {
|
|
load: vi.fn(),
|
|
get document() { return { id: 'doc', pages: [] }; },
|
|
get pages() { return [{ id: 'p', name: 'P', children: [] }]; },
|
|
get pageCount() { return 1; },
|
|
get activePage() { return 0; },
|
|
get viewport() { return vp; },
|
|
setViewport: vi.fn((v: { panX: number; panY: number; zoom: number }) => { vp = v; }),
|
|
setZoom: vi.fn((z: number) => { vp = { ...vp, zoom: z }; }),
|
|
panTo: vi.fn(), zoomToFit: vi.fn(),
|
|
export: vi.fn(() => new Uint8Array([60, 115, 118, 103, 47, 62])),
|
|
on: vi.fn((e: string, cb: () => void) => { listeners[e].add(cb); return () => listeners[e].delete(cb); }),
|
|
off: vi.fn((e: string, cb: () => void) => { listeners[e].delete(cb); }),
|
|
destroy: vi.fn(),
|
|
};
|
|
const emit = (e: 'load' | 'viewportchange') => listeners[e].forEach((cb) => cb());
|
|
return { viewer, emit };
|
|
}
|
|
// Shared vi.mock factory: tests call vi.mock('@zseven-w/op-web-sdk', () => coreMock(current))
|