diff --git a/src/components/modal/Modal.tsx b/src/components/modal/Modal.tsx new file mode 100644 index 0000000..98e850f --- /dev/null +++ b/src/components/modal/Modal.tsx @@ -0,0 +1,79 @@ +import React from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { cn } from "../../lib/cn"; +import { useClickOutside } from "../../hooks/useClickOutside"; + +type ModalBackdrop = "opaque" | "blur"; + +interface ModalProps { + className?: string; + children?: React.ReactNode; + backdrop?: ModalBackdrop; + open: boolean; + defaultOpen?: boolean; + onOpenChange: (state: boolean) => void; +} + +const modalbgVariants = { + closed: { opacity: 0 }, + open: { opacity: 1 }, +}; + +const modalVariants = { + closed: { opacity: 0, scale: 0.9 }, + open: { opacity: 1, scale: 1 }, +}; + +export const Modal: React.FC = ({ + children, + open, + backdrop, + className, + onOpenChange, +}) => { + const ref = React.useRef(null); + + useClickOutside(ref, () => { + onOpenChange(false); + }); + + return ( +
+ + {open && ( + + )} + +
+ + {open && ( + + {children} + + )} + +
+
+ ); +}; diff --git a/src/views/home/groups/Groups.tsx b/src/views/home/groups/Groups.tsx index 7b7c52e..a4664dc 100644 --- a/src/views/home/groups/Groups.tsx +++ b/src/views/home/groups/Groups.tsx @@ -1,12 +1,14 @@ -import { useEffect, useMemo } from "react"; +import { useEffect, useMemo, useState } from "react"; import { SecondaryButton } from "../../../components/button/SecondaryButton"; import { cn } from "../../../lib/cn"; import { useAppDispatch, useAppSelector } from "../../../redux/hooks"; import GroupsBlock from "./GroupsBlock"; import { setMenuActivePage } from "../../../redux/slices/store"; import { fetchMyGroups } from "../../../redux/slices/groups"; +import { Modal } from "../../../components/modal/Modal"; const Groups = () => { + const [modalActive, setModalActive] = useState(false); const dispatch = useAppDispatch(); // Берём группы из стора @@ -56,7 +58,7 @@ const Groups = () => { Группы {}} + onClick={() => {setModalActive(true);}} text="Создать группу" className="absolute right-0" /> @@ -80,6 +82,11 @@ const Groups = () => { groups={hiddenGroups} // пока пусто /> + + + +
modal
+
); };