
zustand를 사용하기 위해 store.ts를 생성합니다. (store.ts는 깃허브 develop-front 브랜치에 푸시돼있습니다!)
import create from "zustand";
// 각 모달의 상태를 관리하기 위한 타입
interface ModalState {
modals: {
[key: string]: { isOpen: boolean };
};
openModal: (id: string) => void;
closeModal: (id: string) => void;
isAnyModalOpen: () => boolean;
}
// Zustand 스토어 생성
export const ModalStore = create<ModalState>((set) => ({
modals: {},
openModal: (id: string) => {
set((state) => ({
modals: {
...state.modals,
[id]: { isOpen: true },
},
}));
},
closeModal: (id: string) => {
set((state) => ({
modals: {
...state.modals,
[id]: { isOpen: false },
},
}));
},
isAnyModalOpen: (): boolean => {
const { modals } = ModalStore.getState();
return Object.values(modals).some((modal) => modal.isOpen);
},
}));
위 작성한 store.ts를 이용해 모달의 상태를 관리합니다.
import { ModalStore } from '../../store/store';
const {modals, openModal, closeModal} = ModalStore();
const handleModalClose = () => {
closeModal("customExerciseModal");
}
return(
<div>
<button onClick={() => openModal("customExerciseModal")}>직접 입력하기</button>
</button>
<CustomExerciseModal
isOpen={modals.customExerciseModal?.isOpen}
onClose={handleModalClose}
/>
)