@@ -6,6 +6,7 @@ import { create } from "zustand";
66import { persist , createJSONStorage } from "zustand/middleware" ;
77
88interface IProgramStore {
9+ hasHydrated : boolean ;
910 selectedProgram : IRoutineDetail | null ;
1011 selectedMembers : IMember [ ] ;
1112 type : "customized" | "popular" | [ "thematic" , WorkoutKind ] | null ;
@@ -29,18 +30,21 @@ interface IProgramStore {
2930 ) => void ;
3031 setThematicWorkoutKind : ( kind : WorkoutKind | null ) => void ;
3132 setCustomizedForm : ( form : Partial < ICustomizedRoutineField > | null ) => void ;
33+ setHasHydrated : ( v : boolean ) => void ;
3234 clearStore : ( ) => void ;
3335}
3436
3537const useProgramStore = create < IProgramStore > ( ) (
3638 persist (
3739 ( set ) => ( {
40+ hasHydrated : false ,
3841 selectedProgram : null ,
3942 selectedMembers : [ ] ,
4043 type : null ,
4144 selectedRoutineRecord : null ,
4245 thematicWorkoutKind : null ,
4346 customizedForm : null ,
47+ setHasHydrated : ( v ) => set ( { hasHydrated : v } ) ,
4448 setSelectedRoutineRecord : ( record ) =>
4549 set ( { selectedRoutineRecord : record } ) ,
4650 setSelectedProgram : ( program ) => set ( { selectedProgram : program } ) ,
@@ -50,6 +54,7 @@ const useProgramStore = create<IProgramStore>()(
5054 setCustomizedForm : ( form ) => set ( { customizedForm : form } ) ,
5155 clearStore : ( ) =>
5256 set ( {
57+ hasHydrated : true , // clear 시에도 UI 입력 차단은 하지 않음
5358 selectedProgram : null ,
5459 selectedMembers : [ ] ,
5560 type : null ,
@@ -61,6 +66,9 @@ const useProgramStore = create<IProgramStore>()(
6166 {
6267 name : "program-store" ,
6368 storage : createJSONStorage ( ( ) => localStorage ) ,
69+ onRehydrateStorage : ( ) => ( state ) => {
70+ state ?. setHasHydrated ( true ) ;
71+ } ,
6472 } ,
6573 ) ,
6674) ;
0 commit comments