Files
ftb-project-management/apps/web/lib/optimistic-persistence.ts
2026-07-03 19:36:18 +08:00

29 lines
597 B
TypeScript

type OptimisticRollbackOptions<T> = {
save: () => Promise<void>;
expected: T;
getCurrent: () => T;
rollback: () => void;
};
export async function saveWithOptimisticRollback<T>({
save,
expected,
getCurrent,
rollback,
}: OptimisticRollbackOptions<T>): Promise<void> {
try {
await save();
} catch (error) {
if (Object.is(getCurrent(), expected)) {
rollback();
}
throw error;
}
}
export function scheduleSaveWithOptimisticRollback<T>(
options: OptimisticRollbackOptions<T>,
): void {
void saveWithOptimisticRollback(options).catch(() => undefined);
}