Skip to content

Commit 983f403

Browse files
authored
Merge pull request #31 from prgrms-web-devcourse-final-project/1-feature/global-modal-management
[Feature]: #1 Modal 전역 상태관리
2 parents a969ef5 + 8dd428f commit 983f403

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { useState } from 'react'
66
import { RouterProvider } from 'react-router-dom'
77
import styled, { ThemeProvider } from 'styled-components'
88
import { Helmet, HelmetProvider } from 'react-helmet-async'
9+
import ModalContainer from '~modals/ModalContainer'
910

1011
function App() {
1112
//* 다크모드 확장성 고려
@@ -28,6 +29,7 @@ function App() {
2829
<RouterProvider router={router} />
2930
</MobileWrapper>
3031
<PWABadge />
32+
<ModalContainer />
3133
</ThemeProvider>
3234
</HelmetProvider>
3335
</>

src/modals/ModalContainer/index.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import * as S from './styles'
2+
import { useModalStore } from '~stores/modalStore'
3+
4+
export default function ModalContainer() {
5+
const { modalList } = useModalStore()
6+
7+
return <>{modalList.length ? <S.ModalWrapper>{...modalList}</S.ModalWrapper> : null}</>
8+
}

src/modals/ModalContainer/styles.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { styled } from 'styled-components'
2+
3+
export const ModalWrapper = styled.div`
4+
position: fixed;
5+
top: 0;
6+
left: 0;
7+
width: 100dvw;
8+
height: 100dvh;
9+
background-color: rgba(0, 0, 0, 0.4);
10+
z-index: 999;
11+
`

src/stores/modalStore.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ReactNode } from 'react'
2+
import { create } from 'zustand'
3+
4+
interface ModalStore {
5+
modalList: ReactNode[]
6+
pushModal: (modal: ReactNode) => void
7+
popModal: () => void
8+
clearModal: () => void
9+
}
10+
11+
export const useModalStore = create<ModalStore>(set => ({
12+
modalList: [],
13+
pushModal: modal =>
14+
set(state => ({
15+
modalList: [...state.modalList, modal],
16+
})),
17+
popModal: () =>
18+
set(state => ({
19+
modalList: state.modalList.slice(0, -1),
20+
})),
21+
clearModal: () => set({ modalList: [] }),
22+
}))

0 commit comments

Comments
 (0)