Dir sync filesystem watching

This commit is contained in:
Gregory Schier
2025-01-06 09:24:07 -08:00
parent c72180bb59
commit c2ea2a5fe5
35 changed files with 525 additions and 482 deletions

View File

@@ -1,21 +1,48 @@
import { invoke } from '@tauri-apps/api/core';
import { Channel, invoke } from '@tauri-apps/api/core';
import { emit } from '@tauri-apps/api/event';
import { Workspace } from '@yaakapp-internal/models';
import { useEffect } from 'react';
import { SyncOp } from './bindings/sync';
import { WatchEvent, WatchResult } from './bindings/watch';
export const calculateSync = async (workspace: Workspace) => {
if (!workspace.settingSyncDir) throw new Error("Workspace sync dir not configured");
export async function calculateSync(workspace: Workspace) {
if (!workspace.settingSyncDir) throw new Error('Workspace sync dir not configured');
return invoke<SyncOp[]>('plugin:yaak-sync|calculate', {
workspaceId: workspace.id,
dir: workspace.settingSyncDir,
});
};
}
export const applySync = async (workspace: Workspace, syncOps: SyncOp[]) => {
export async function applySync(workspace: Workspace, syncOps: SyncOp[]) {
console.log('Applying sync', syncOps);
return invoke<void>('plugin:yaak-sync|apply', {
workspaceId: workspace.id,
dir: workspace.settingSyncDir,
syncOps: syncOps
syncOps: syncOps,
});
};
}
export function useWatchWorkspace(workspace: Workspace | null, cb: (e: WatchEvent) => void) {
const workspaceId = workspace?.id ?? null;
useEffect(() => {
if (workspaceId == null) return;
console.log('Watching workspace', workspaceId);
const channel = new Channel<WatchEvent>();
channel.onmessage = (event) => {
cb(event);
};
const promise = invoke<WatchResult>('plugin:yaak-sync|watch', { workspaceId, channel });
return () => {
promise
.then(({ unlistenEvent }) => {
console.log('Cancelling workspace watch', workspaceId, unlistenEvent);
return emit(unlistenEvent);
})
.catch(console.error);
};
}, [workspaceId]);
}