Phase 4 complete (MVP ship): - SessionDb (rusqlite, WAL mode): sessions + layout_state tables, CRUD - FileWatcherManager (notify v6): watch files, emit Tauri change events - MarkdownPane: marked.js rendering with Catppuccin styles, live reload - Layout store wired to persistence (addPane/removePane/setPreset persist) - restoreFromDb() on startup restores panes in layout order - Sidebar "M" button opens file picker for markdown files - New adapters: session-bridge.ts, file-bridge.ts - Deps: rusqlite (bundled), dirs 5, notify 6, marked
29 lines
831 B
TypeScript
29 lines
831 B
TypeScript
import { invoke } from '@tauri-apps/api/core';
|
|
import { listen, type UnlistenFn } from '@tauri-apps/api/event';
|
|
|
|
export interface FileChangedPayload {
|
|
pane_id: string;
|
|
path: string;
|
|
content: string;
|
|
}
|
|
|
|
/** Start watching a file; returns initial content */
|
|
export async function watchFile(paneId: string, path: string): Promise<string> {
|
|
return invoke('file_watch', { paneId, path });
|
|
}
|
|
|
|
export async function unwatchFile(paneId: string): Promise<void> {
|
|
return invoke('file_unwatch', { paneId });
|
|
}
|
|
|
|
export async function readFile(path: string): Promise<string> {
|
|
return invoke('file_read', { path });
|
|
}
|
|
|
|
export async function onFileChanged(
|
|
callback: (payload: FileChangedPayload) => void
|
|
): Promise<UnlistenFn> {
|
|
return listen<FileChangedPayload>('file-changed', (event) => {
|
|
callback(event.payload);
|
|
});
|
|
}
|