feat(v2.4): 完成领域主写迁移
This commit is contained in:
@@ -3,6 +3,12 @@ import { create } from 'zustand';
|
||||
import type { OvertimeRecord } from '@/lib/overtime';
|
||||
import type { DictItem } from '@/lib/requirement';
|
||||
import { calcDuration } from '@/lib/overtime';
|
||||
import {
|
||||
createOvertimeRecordDomain,
|
||||
deleteOvertimeRecordDomain,
|
||||
listOvertimeRecordsDomain,
|
||||
updateOvertimeRecordDomain,
|
||||
} from '@/lib/domain-api';
|
||||
import { scheduleSaveWithOptimisticRollback } from '@/lib/optimistic-persistence';
|
||||
import { loadServerData, saveServerData, SERVER_DATA_CACHE_MS } from '@/lib/server-data';
|
||||
|
||||
@@ -52,10 +58,17 @@ export const useOvertimeStore = create<OvertimeState>((set, get) => ({
|
||||
|
||||
fetchRecords: async (options) => {
|
||||
if (!options?.force && get().loaded && Date.now() - lastOvertimeFetchAt < SERVER_DATA_CACHE_MS) return;
|
||||
const cached = await loadStored();
|
||||
const [cached, domainRecords] = await Promise.all([
|
||||
loadStored(),
|
||||
listOvertimeRecordsDomain().catch(() => null),
|
||||
]);
|
||||
if (!options?.force && get().loaded && Date.now() - lastOvertimeFetchAt < SERVER_DATA_CACHE_MS) return;
|
||||
lastOvertimeFetchAt = Date.now();
|
||||
set({ records: cached?.records ?? MOCK_RECORDS, reasons: cached?.reasons ?? PRESET_REASONS, loaded: true });
|
||||
set({
|
||||
records: domainRecords && domainRecords.length > 0 ? domainRecords : cached?.records ?? MOCK_RECORDS,
|
||||
reasons: cached?.reasons ?? PRESET_REASONS,
|
||||
loaded: true,
|
||||
});
|
||||
},
|
||||
|
||||
createRecord: (data) => {
|
||||
@@ -70,7 +83,17 @@ export const useOvertimeStore = create<OvertimeState>((set, get) => ({
|
||||
const records = [...previous, record];
|
||||
set({ records, loaded: true });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveServerData('overtime', { records, reasons: get().reasons }),
|
||||
save: async () => {
|
||||
try {
|
||||
const created = await createOvertimeRecordDomain(record);
|
||||
set({
|
||||
records: get().records.map((item) => (item.id === record.id ? { ...record, ...created } : item)),
|
||||
loaded: true,
|
||||
});
|
||||
} catch {
|
||||
await saveOvertimeFallback(records, get().reasons);
|
||||
}
|
||||
},
|
||||
expected: records,
|
||||
getCurrent: () => get().records,
|
||||
rollback: () => set({ records: previous, loaded: true }),
|
||||
@@ -89,7 +112,13 @@ export const useOvertimeStore = create<OvertimeState>((set, get) => ({
|
||||
});
|
||||
set({ records, loaded: true });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveServerData('overtime', { records, reasons: get().reasons }),
|
||||
save: async () => {
|
||||
try {
|
||||
await updateOvertimeRecordDomain(id, records.find((record) => record.id === id) ?? {});
|
||||
} catch {
|
||||
await saveOvertimeFallback(records, get().reasons);
|
||||
}
|
||||
},
|
||||
expected: records,
|
||||
getCurrent: () => get().records,
|
||||
rollback: () => set({ records: previous, loaded: true }),
|
||||
@@ -101,7 +130,13 @@ export const useOvertimeStore = create<OvertimeState>((set, get) => ({
|
||||
const records = previous.filter((r) => r.id !== id);
|
||||
set({ records, loaded: true });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveServerData('overtime', { records, reasons: get().reasons }),
|
||||
save: async () => {
|
||||
try {
|
||||
await deleteOvertimeRecordDomain(id);
|
||||
} catch {
|
||||
await saveOvertimeFallback(records, get().reasons);
|
||||
}
|
||||
},
|
||||
expected: records,
|
||||
getCurrent: () => get().records,
|
||||
rollback: () => set({ records: previous, loaded: true }),
|
||||
@@ -145,3 +180,7 @@ export const useOvertimeStore = create<OvertimeState>((set, get) => ({
|
||||
});
|
||||
},
|
||||
}));
|
||||
|
||||
async function saveOvertimeFallback(records: OvertimeRecord[], reasons: DictItem[]) {
|
||||
await saveServerData('overtime', { records, reasons });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user