src/components/SwipeableTemporaryDrawer.tsx
"use client";
import * as React from "react";
import Box from "@mui/material/Box";
import SwipeableDrawer from "@mui/material/SwipeableDrawer";
import { Typography } from "@mui/material";
import { useDrawerStore } from "@/store/ui/drawerStore";
type Anchor = "top" | "left" | "bottom" | "right";
export default function SwipeableTemporaryDrawer() {
const { anchor, isOpen, setIsOpen } = useDrawerStore();
// 하위 컴포넌트
const DrawerContent = (anchor: Anchor) => (
<Box
sx={{ width: anchor === "top" || anchor === "bottom" ? "auto" : 250 }}
role="presentation"
onClick={()=>{setIsOpen(false)}}
onKeyDown={()=>{setIsOpen(false)}}
>
<Typography variant="h5">1</Typography>
<Typography variant="h5">2</Typography>
<Typography variant="h5">3</Typography>
<Typography variant="h5">4</Typography>
</Box>
);
return (
<div>
<React.Fragment key={anchor}>
<SwipeableDrawer
anchor={anchor}
open={isOpen}
onClose={()=>{setIsOpen(false)}}
onOpen={()=>{setIsOpen(true)}}
>
{DrawerContent(anchor)}
</SwipeableDrawer>
</React.Fragment>
</div>
);
}
src/store/ui/drawerStore.ts
import { create } from "zustand";
type Anchor = "top" | "left" | "bottom" | "right";
interface DrawerState {
// 상태
anchor: Anchor;
isOpen: boolean;
// 액션
setAnchor: (anchor: Anchor) => void;
setIsOpen: (isOpen: boolean) => void;
}
export const useDrawerStore = create<DrawerState>((set) => ({
// 상태
anchor: "top",
isOpen: false,
// 액션
setAnchor: (anchor: Anchor) => set({ anchor }),
setIsOpen: (isOpen: boolean) => set({ isOpen }),
}));
사용 예시
"use client";
import { mixinContainer } from "@/styles/mixins";
import { AddCircleOutlineRounded } from "@mui/icons-material";
import { Box, Button, Typography } from "@mui/material";
import { styled } from "@mui/material";
// import { useState } from "react";
import SwipeableTemporaryDrawer from "./drawer/SwipeableTemporaryDrawer";
import { useDrawerStore } from "@/store";
const TemplatesMakeContainer = () => {
// const [templateBlocks, setTemplateBlocks] = useState<BlockType[]>([]);
const {isOpen, setIsOpen} = useDrawerStore();
return (
<Container>
<Typography variant="h5">템플릿 만들기</Typography>
<SwipeableTemporaryDrawer/>
<Button onClick={()=>{setIsOpen(true);}} variant="outlined" fullWidth endIcon={<AddCircleOutlineRounded />}>
블럭 생성
</Button>
</Container>
);
};
export default TemplatesMakeContainer;
const Container = styled(Box)`
${mixinContainer()}
`;
'라이브러리 > MUI' 카테고리의 다른 글
[MUI] 컴포넌트에 스타일 프롭스 추가하는 방법 (0) | 2025.04.22 |
---|---|
[MUI] 캘린더 달력 한국 시간으로 변경하기 (0) | 2025.04.17 |
[MUI] <TextField/> 포커싱 아닐 때도 테두리 메인 색상 적용하기 (0) | 2025.04.12 |
[MUI] 로딩 컴포넌트 코드 예시 (0) | 2025.04.10 |
[MUI] <Drawer/> 애니메이션 버그 해결 방법 | MUI <Drawer /> 애니메이션이 적용되지 않는 이유 (0) | 2025.03.18 |