feat(v2.4): 完成领域主写迁移
This commit is contained in:
@@ -1,6 +1,11 @@
|
||||
'use client';
|
||||
import { create } from 'zustand';
|
||||
import type { TaskWorklog } from '@/lib/task-worklog';
|
||||
import {
|
||||
createTaskWorklogDomain,
|
||||
deleteTaskWorklogDomain,
|
||||
listTaskWorklogsDomain,
|
||||
} from '@/lib/domain-api';
|
||||
import { scheduleSaveWithOptimisticRollback } from '@/lib/optimistic-persistence';
|
||||
import { loadServerData, saveServerData, SERVER_DATA_CACHE_MS } from '@/lib/server-data';
|
||||
|
||||
@@ -28,7 +33,7 @@ export const useTaskWorklogStore = create<TaskWorklogState>((set, get) => ({
|
||||
|
||||
fetchWorklogs: async (options) => {
|
||||
if (!options?.force && get().loaded && Date.now() - lastWorklogsFetchAt < SERVER_DATA_CACHE_MS) return;
|
||||
const cached = await loadStored();
|
||||
const cached = await listTaskWorklogsDomain().catch(loadStored);
|
||||
if (!options?.force && get().loaded && Date.now() - lastWorklogsFetchAt < SERVER_DATA_CACHE_MS) return;
|
||||
lastWorklogsFetchAt = Date.now();
|
||||
set({ worklogs: cached ?? [], loaded: true });
|
||||
@@ -44,7 +49,17 @@ export const useTaskWorklogStore = create<TaskWorklogState>((set, get) => ({
|
||||
const updated = [...previous, item];
|
||||
set({ worklogs: updated, loaded: true });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveServerData('task-worklogs', updated),
|
||||
save: async () => {
|
||||
try {
|
||||
const created = await createTaskWorklogDomain(item);
|
||||
set({
|
||||
worklogs: get().worklogs.map((worklog) => (worklog.id === item.id ? { ...item, ...created } : worklog)),
|
||||
loaded: true,
|
||||
});
|
||||
} catch {
|
||||
await saveTaskWorklogsFallback(updated);
|
||||
}
|
||||
},
|
||||
expected: updated,
|
||||
getCurrent: () => get().worklogs,
|
||||
rollback: () => set({ worklogs: previous, loaded: true }),
|
||||
@@ -56,7 +71,13 @@ export const useTaskWorklogStore = create<TaskWorklogState>((set, get) => ({
|
||||
const updated = previous.filter((w) => w.id !== id);
|
||||
set({ worklogs: updated, loaded: true });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveServerData('task-worklogs', updated),
|
||||
save: async () => {
|
||||
try {
|
||||
await deleteTaskWorklogDomain(id);
|
||||
} catch {
|
||||
await saveTaskWorklogsFallback(updated);
|
||||
}
|
||||
},
|
||||
expected: updated,
|
||||
getCurrent: () => get().worklogs,
|
||||
rollback: () => set({ worklogs: previous, loaded: true }),
|
||||
@@ -69,3 +90,7 @@ export const useTaskWorklogStore = create<TaskWorklogState>((set, get) => ({
|
||||
.reduce((sum, w) => sum + w.hours, 0);
|
||||
},
|
||||
}));
|
||||
|
||||
async function saveTaskWorklogsFallback(worklogs: TaskWorklog[]) {
|
||||
await saveServerData('task-worklogs', worklogs);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user