diff --git a/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.stories.tsx b/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.stories.tsx index da92eed..f6946a8 100644 --- a/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.stories.tsx +++ b/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.stories.tsx @@ -24,7 +24,7 @@ const HomeNavigateConfirmModalStory = ({ isOpen, handleClose }: HomeNavigateConf setIsShowButtonChecked((prev) => !prev); }; return ( - +
홈으로 가시겠어요? diff --git a/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx b/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx index 20ad124..33daaa4 100644 --- a/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx +++ b/src/components/HomeNavigateConfirmModal/HomeNavigateConfirmModal.tsx @@ -42,7 +42,7 @@ const HomeNavigateConfirmModal = ({ isOpen, handleClose }: HomeNavigateConfirmMo }; return ( - +
홈으로 가시겠어요? diff --git a/src/components/SelectTag/TagSheet/TagSheet.tsx b/src/components/SelectTag/TagSheet/TagSheet.tsx index 18651ed..86d4050 100644 --- a/src/components/SelectTag/TagSheet/TagSheet.tsx +++ b/src/components/SelectTag/TagSheet/TagSheet.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; import * as Dialog from "@radix-ui/react-dialog"; import * as VisuallyHidden from "@radix-ui/react-visually-hidden"; @@ -10,6 +10,7 @@ import Icon from "@/components/ui/Icon/Icon"; import Input from "@/components/ui/Input/Input"; import Text from "@/components/ui/Text/Text"; +import useOnClickOutside from "@/hooks/common/useClickOutside"; import { useFocus } from "@/hooks/common/useFocus"; interface TagSheetProps { @@ -36,11 +37,16 @@ const TagSheet = ({ isOpen, handleClose, handleTagAdd }: TagSheetProps) => { setNewTag(e.target.value); }; + const modalRef = useRef(null); + + useOnClickOutside(modalRef, handleClose); + return ( void; isOpen: boolean; } -const Modal = ({ isOpen, children }: ModalProps) => { +const Modal = ({ isOpen, children, onClose }: ModalProps) => { useEffect(() => { document.body.style.overflow = "hidden"; @@ -19,6 +22,10 @@ const Modal = ({ isOpen, children }: ModalProps) => { }; }, []); + const modalRef = useRef(null); + + useClickOutside(modalRef, onClose); + return ( <> {isOpen && ( @@ -30,6 +37,7 @@ const Modal = ({ isOpen, children }: ModalProps) => { />
( + ref: RefObject, + handler: (event: Event) => void, +) { + useEffect(() => { + const listener = (event: Event) => { + if (!ref.current || ref.current.contains(event.target as Node)) { + return; + } + handler(event); + }; + + document.addEventListener("click", listener, true); + return () => { + document.removeEventListener("click", listener, true); + }; + }, [ref, handler]); +}