feat(store): add revision tracking to fileChangeStore
This commit is contained in:
@@ -31,6 +31,8 @@ interface AppFileState {
|
|||||||
initialized: boolean;
|
initialized: boolean;
|
||||||
/** Original order for each section: key is `${platform}:${fileType}`, value is ordered file IDs */
|
/** Original order for each section: key is `${platform}:${fileType}`, value is ordered file IDs */
|
||||||
originalSectionOrders: Record<string, string[]>;
|
originalSectionOrders: Record<string, string[]>;
|
||||||
|
/** Server revision string from Kintone API, used to detect remote changes */
|
||||||
|
serverRevision: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FileChangeState {
|
interface FileChangeState {
|
||||||
@@ -93,6 +95,15 @@ interface FileChangeState {
|
|||||||
hasPendingChanges: (domainId: string, appId: string) => boolean;
|
hasPendingChanges: (domainId: string, appId: string) => boolean;
|
||||||
|
|
||||||
isInitialized: (domainId: string, appId: string) => boolean;
|
isInitialized: (domainId: string, appId: string) => boolean;
|
||||||
|
|
||||||
|
/** Store the revision string from Kintone API */
|
||||||
|
setServerRevision: (domainId: string, appId: string, revision: string) => void;
|
||||||
|
|
||||||
|
/** Get the stored revision string */
|
||||||
|
getServerRevision: (domainId: string, appId: string) => string | null;
|
||||||
|
|
||||||
|
/** Check if the revision has changed (indicating remote modifications) */
|
||||||
|
hasRemoteChange: (domainId: string, appId: string, currentRevision: string) => boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const appKey = (domainId: string, appId: string) => `${domainId}:${appId}`;
|
const appKey = (domainId: string, appId: string) => `${domainId}:${appId}`;
|
||||||
@@ -125,7 +136,7 @@ export const useFileChangeStore = create<FileChangeState>()(
|
|||||||
set((state) => ({
|
set((state) => ({
|
||||||
appFiles: {
|
appFiles: {
|
||||||
...state.appFiles,
|
...state.appFiles,
|
||||||
[key]: { files: entries, initialized: true, originalSectionOrders },
|
[key]: { files: entries, initialized: true, originalSectionOrders, serverRevision: null },
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@@ -137,6 +148,7 @@ export const useFileChangeStore = create<FileChangeState>()(
|
|||||||
files: [],
|
files: [],
|
||||||
initialized: true,
|
initialized: true,
|
||||||
originalSectionOrders: {},
|
originalSectionOrders: {},
|
||||||
|
serverRevision: null,
|
||||||
};
|
};
|
||||||
return {
|
return {
|
||||||
appFiles: {
|
appFiles: {
|
||||||
@@ -244,6 +256,7 @@ export const useFileChangeStore = create<FileChangeState>()(
|
|||||||
files: [],
|
files: [],
|
||||||
initialized: false,
|
initialized: false,
|
||||||
originalSectionOrders: {},
|
originalSectionOrders: {},
|
||||||
|
serverRevision: null,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
@@ -295,6 +308,36 @@ export const useFileChangeStore = create<FileChangeState>()(
|
|||||||
const key = appKey(domainId, appId);
|
const key = appKey(domainId, appId);
|
||||||
return get().appFiles[key]?.initialized ?? false;
|
return get().appFiles[key]?.initialized ?? false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setServerRevision: (domainId, appId, revision) => {
|
||||||
|
const key = appKey(domainId, appId);
|
||||||
|
set((state) => {
|
||||||
|
const existing = state.appFiles[key] ?? {
|
||||||
|
files: [],
|
||||||
|
initialized: false,
|
||||||
|
originalSectionOrders: {},
|
||||||
|
serverRevision: null,
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
appFiles: {
|
||||||
|
...state.appFiles,
|
||||||
|
[key]: { ...existing, serverRevision: revision },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
getServerRevision: (domainId, appId) => {
|
||||||
|
const key = appKey(domainId, appId);
|
||||||
|
return get().appFiles[key]?.serverRevision ?? null;
|
||||||
|
},
|
||||||
|
|
||||||
|
hasRemoteChange: (domainId, appId, currentRevision) => {
|
||||||
|
const key = appKey(domainId, appId);
|
||||||
|
const storedRevision = get().appFiles[key]?.serverRevision;
|
||||||
|
if (storedRevision === null) return false;
|
||||||
|
return storedRevision !== currentRevision;
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
name: "file-change-storage",
|
name: "file-change-storage",
|
||||||
|
|||||||
Reference in New Issue
Block a user