diff --git a/src/common/component/BottomSheet/BottomSheet.tsx b/src/common/component/BottomSheet/BottomSheet.tsx index 292fb11d..ebf181eb 100644 --- a/src/common/component/BottomSheet/BottomSheet.tsx +++ b/src/common/component/BottomSheet/BottomSheet.tsx @@ -8,7 +8,11 @@ interface BottomSheetPropTypes { } //화면 전체를 차지하는 바텀시트 틀 (children 필요) -const BottomSheet = ({ isOpen, children, handleOpen }: BottomSheetPropTypes) => { +const BottomSheet = ({ + isOpen, + children, + handleOpen, +}: BottomSheetPropTypes) => { if (!isOpen) return; const handleClose = () => { @@ -20,12 +24,19 @@ const BottomSheet = ({ isOpen, children, handleOpen }: BottomSheetPropTypes) => }; return ( -
+
-
+
- {children}
diff --git a/src/page/community/[postId]/Post.ts b/src/page/community/[postId]/Post.ts new file mode 100644 index 00000000..11d9e549 --- /dev/null +++ b/src/page/community/[postId]/Post.ts @@ -0,0 +1,2 @@ +import { style } from "@vanilla-extract/css"; +import { color } from "@style/styles.css.ts"; diff --git a/src/page/community/[postId]/Post.tsx b/src/page/community/[postId]/Post.tsx index 20f5b177..92167169 100644 --- a/src/page/community/[postId]/Post.tsx +++ b/src/page/community/[postId]/Post.tsx @@ -1,5 +1,25 @@ +import MoreModal from "@shared/component/MoreModal/MoreModal.tsx"; +import useMoreModal from "@shared/hook/useMoreModal"; + const PostDetail = () => { - return
Postid
; + const { isOpen, openModal, closeModal, toggleModal } = useMoreModal(); + + const handleDelete = () => { + alert("삭제되었습니다!"); + toggleModal(); + }; + + return ( +
+ alert("수정하기")} + /> +
+ ); }; export default PostDetail; diff --git a/src/shared/component/MoreModal/MoreModal.css.ts b/src/shared/component/MoreModal/MoreModal.css.ts new file mode 100644 index 00000000..9ce500b1 --- /dev/null +++ b/src/shared/component/MoreModal/MoreModal.css.ts @@ -0,0 +1,92 @@ +import { createVar, style } from "@vanilla-extract/css"; +import { recipe, RecipeVariants } from "@vanilla-extract/recipes"; +import { button } from "@common/component/Button/styles.css.ts"; +import { color, font } from "@style/styles.css.ts"; + +export const iconSizeVar = createVar(); + +export const container = style({ + position: "relative", + width: iconSizeVar, + height: iconSizeVar, +}); + +export const moreIcon = style({ + width: iconSizeVar, + height: iconSizeVar, +}); + +export const moreModal = recipe({ + base: { + position: "absolute", + top: "calc(100% + 0.8rem)", + left: "-16rem", + display: "flex", + flexDirection: "column", + borderRadius: "1.2rem", + backgroundColor: "white", + boxShadow: "0px 2px 10px 0px rgba(0, 0, 0, 0.15)", + width: "18.4rem", + zIndex: 10, + }, + variants: { + onEdit: { + true: { + // 수정하기가 있을 때 + height: "11.2rem", + }, + false: { + // 수정하기가 없을 때 + height: "5.6rem", + }, + }, + }, + defaultVariants: { + onEdit: false, // 기본값 + }, +}); + +export const moreModalItem = recipe({ + base: [ + font.body01, + { + background: "none", + border: "none", + textAlign: "left", + width: "100%", + padding: "1.8rem 3.2rem", + color: color.red.warning_red200, + ":hover": { + backgroundColor: color.gray.gray300, + }, + ":active": { + backgroundColor: color.gray.gray300, + }, + }, + ], + variants: { + position: { + first: { + // 수정하기가 들어간 경우의 삭제하기 border + borderRadius: "1.2rem 1.2rem 0 0", + }, + last: { + // 수정하기가 들어간 경우의 수정하기 border + borderRadius: "0 0 1.2rem 1.2rem", + }, + default: { + // 수정하기가 없는 경우의 border + borderRadius: "1.2rem", + }, + }, + }, + defaultVariants: { + position: "default", + }, +}); + +export const moreModalDivider = style({ + height: "1px", + backgroundColor: color.gray.gray300, + margin: "0", +}); diff --git a/src/shared/component/MoreModal/MoreModal.tsx b/src/shared/component/MoreModal/MoreModal.tsx new file mode 100644 index 00000000..8514cacf --- /dev/null +++ b/src/shared/component/MoreModal/MoreModal.tsx @@ -0,0 +1,67 @@ +import React from "react"; +import { IcEllipses } from "@asset/svg"; +import { + container, + iconSizeVar, + moreIcon, + moreModal, + moreModalDivider, + moreModalItem, +} from "@shared/component/MoreModal/MoreModal.css.ts"; +import { assignInlineVars } from "@vanilla-extract/dynamic"; + +interface MoreModalParams { + isOpen: boolean; + onToggleModal: () => void; + onDelete: () => void; + iconSize: number; + onEdit?: () => void; +} + +const MoreModal = ({ + isOpen, + onToggleModal, + onDelete, + iconSize, + onEdit, +}: MoreModalParams) => { + return ( +
+ + {isOpen && ( +
+ + {onEdit && ( + <> +
+ + + )} +
+ )} +
+ ); +}; + +export default MoreModal; diff --git a/src/shared/constant/.gitkeep b/src/shared/constant/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/shared/hook/.gitkeep b/src/shared/hook/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/shared/hook/useMoreModal.ts b/src/shared/hook/useMoreModal.ts new file mode 100644 index 00000000..8048be16 --- /dev/null +++ b/src/shared/hook/useMoreModal.ts @@ -0,0 +1,13 @@ +import { useState } from "react"; + +const useMoreModal = () => { + const [isOpen, setIsOpen] = useState(false); + + const openModal = () => setIsOpen(true); + const closeModal = () => setIsOpen(false); + const toggleModal = () => setIsOpen((prev) => !prev); + + return { isOpen, openModal, closeModal, toggleModal }; +}; + +export default useMoreModal;