feat: persist presets

This commit is contained in:
MAZE 2024-02-28 20:19:36 +03:30
parent 2484e01273
commit 38a9a23790
2 changed files with 37 additions and 17 deletions

View File

@ -1,6 +1,6 @@
import { useEffect } from 'react';
import { useSoundStore, useNoteStore } from '@/store';
import { useSoundStore, useNoteStore, usePresetStore } from '@/store';
interface StoreConsumerProps {
children: React.ReactNode;
@ -10,6 +10,7 @@ export function StoreConsumer({ children }: StoreConsumerProps) {
useEffect(() => {
useSoundStore.persist.rehydrate();
useNoteStore.persist.rehydrate();
usePresetStore.persist.rehydrate();
}, []);
return <>{children}</>;

View File

@ -1,4 +1,6 @@
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
import merge from 'deepmerge';
interface PresetStore {
addPreset: (label: string, sounds: Record<string, number>) => void;
@ -10,24 +12,41 @@ interface PresetStore {
}>;
}
export const usePresetStore = create<PresetStore>()((set, get) => ({
addPreset(label: string, sounds: Record<string, number>) {
set({ presets: [{ label, sounds }, ...get().presets] });
},
export const usePresetStore = create<PresetStore>()(
persist(
(set, get) => ({
addPreset(label: string, sounds: Record<string, number>) {
set({ presets: [{ label, sounds }, ...get().presets] });
},
changeName(index: number, newName: string) {
const presets = get().presets.map((preset, i) => {
if (i === index) return { ...preset, label: newName };
changeName(index: number, newName: string) {
const presets = get().presets.map((preset, i) => {
if (i === index) return { ...preset, label: newName };
return preset;
});
return preset;
});
set({ presets });
},
set({ presets });
},
deletePreset(index: number) {
set({ presets: get().presets.filter((_, i) => index !== i) });
},
deletePreset(index: number) {
set({ presets: get().presets.filter((_, i) => index !== i) });
},
presets: [],
}));
presets: [],
}),
{
merge: (persisted, current) =>
merge(
current,
// @ts-ignore
persisted,
),
name: 'moodist-presets',
partialize: state => ({ presets: state.presets }),
skipHydration: true,
storage: createJSONStorage(() => localStorage),
version: 0,
},
),
);