feat: implement debounced file sync

This commit is contained in:
JOYCEQL
2026-03-23 00:27:12 +08:00
parent 9e35a5e370
commit 52d65ecd87
+24 -8
View File
@@ -80,13 +80,11 @@ const syncResumeToFile = async (
try { try {
const handle = await getFileHandle("syncDirectory"); const handle = await getFileHandle("syncDirectory");
if (!handle) { if (!handle) {
console.warn("No directory handle found");
return; return;
} }
const hasPermission = await verifyPermission(handle); const hasPermission = await verifyPermission(handle);
if (!hasPermission) { if (!hasPermission) {
console.warn("No permission to write to directory");
return; return;
} }
@@ -116,6 +114,19 @@ const syncResumeToFile = async (
} }
}; };
// 防抖同步:合并高频写入,1.5秒内多次编辑只触发一次文件写入
let syncTimer: ReturnType<typeof setTimeout> | null = null;
const debouncedSyncToFile = (
resumeData: ResumeData,
prevResume?: ResumeData
) => {
if (syncTimer) clearTimeout(syncTimer);
syncTimer = setTimeout(() => {
syncResumeToFile(resumeData, prevResume);
syncTimer = null;
}, 1500);
};
export const useResumeStore = create( export const useResumeStore = create(
persist<ResumeStore>( persist<ResumeStore>(
(set, get) => ({ (set, get) => ({
@@ -182,7 +193,7 @@ export const useResumeStore = create(
...data, ...data,
}; };
syncResumeToFile(updatedResume, resume); debouncedSyncToFile(updatedResume, resume);
return { return {
resumes: { resumes: {
@@ -288,6 +299,7 @@ export const useResumeStore = create(
}, },
updateBasicInfo: (data) => { updateBasicInfo: (data) => {
const prevResume = get().activeResume;
set((state) => { set((state) => {
if (!state.activeResume) return state; if (!state.activeResume) return state;
@@ -299,18 +311,20 @@ export const useResumeStore = create(
}, },
}; };
const newState = { return {
resumes: { resumes: {
...state.resumes, ...state.resumes,
[state.activeResume.id]: updatedResume, [state.activeResume.id]: updatedResume,
}, },
activeResume: updatedResume, activeResume: updatedResume,
}; };
syncResumeToFile(updatedResume, state.activeResume);
return newState;
}); });
// 在 set() 外部处理副作用
const updatedResume = get().activeResume;
if (updatedResume) {
debouncedSyncToFile(updatedResume, prevResume || undefined);
}
}, },
updateEducation: (education) => { updateEducation: (education) => {
@@ -674,6 +688,8 @@ export const useResumeStore = create(
}, },
activeResume: updatedResume, activeResume: updatedResume,
}); });
debouncedSyncToFile(updatedResume);
}, },
addResume: (resume: ResumeData) => { addResume: (resume: ResumeData) => {
set((state) => ({ set((state) => ({