mirror of
https://github.com/JOYCEQL/magic-resume.git
synced 2026-06-01 23:38:48 +02:00
feat: implement debounced file sync
This commit is contained in:
@@ -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) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user