fix: prevent duplicate persona entries (race condition in hydrate), remove accidental 54MB file
CI/CD / test-and-build (push) Waiting to run
CI/CD / deploy (push) Blocked by required conditions

This commit is contained in:
Najjar\NajjarV02
2026-04-20 15:59:17 +04:00
parent 2ff21c5b54
commit 1e128466f3
4 changed files with 146 additions and 6 deletions
+19 -6
View File
@@ -124,15 +124,25 @@ export const personaStore = createStore<PersonaStore>((set, get) => ({
},
hydrate: () => {
const stored = loadFromStorage();
if (stored && stored.length > 0) {
// Guard: only hydrate once — prevents race condition duplicates when
// called from multiple components at the same time.
if (get().isHydrated) return;
set({ isHydrated: true });
const raw = loadFromStorage();
// Deduplicate stored personas (keep last occurrence of each id)
const deduped = raw
? [...new Map(raw.map((p) => [p.id, p])).values()]
: null;
if (deduped && deduped.length > 0) {
// Only re-inject truly built-in personas (those still in DEFAULT_PERSONAS) if missing.
// Dynamic/uploaded personas that were deleted via the dashboard must NOT be re-added.
const storedIds = new Set(stored.map((s) => s.id));
const storedIds = new Set(deduped.map((s) => s.id));
const missing = DEFAULT_PERSONAS.filter((d) => !storedIds.has(d.id));
set({ personas: [...stored, ...missing], isHydrated: true });
set({ personas: [...deduped, ...missing] });
} else {
set({ personas: [...DEFAULT_PERSONAS], isHydrated: true });
set({ personas: [...DEFAULT_PERSONAS] });
}
// Fetch pricing items from server DB and auto-register personas for all attire items
@@ -173,7 +183,10 @@ export const personaStore = createStore<PersonaStore>((set, get) => ({
if (newPersonas.length > 0) {
set((state) => {
const updated = [...state.personas, ...newPersonas];
// Deduplicate: merge by id, new personas take precedence for modelPath
const merged = new Map(state.personas.map((p) => [p.id, p]));
newPersonas.forEach((p) => { if (!merged.has(p.id)) merged.set(p.id, p); });
const updated = [...merged.values()];
saveToStorage(updated);
return { personas: updated };
});