fix: prevent duplicate persona entries (race condition in hydrate), remove accidental 54MB file
This commit is contained in:
@@ -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 };
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user