Modal

"use client";

import React, { useEffect, useState } from "react";
import ReactDom from "react-dom";
import { MdClose } from "react-icons/md";
import Button from "../button/ButtonBackgroundShine";

type Props = {
  active: boolean;
  setActive: React.Dispatch<React.SetStateAction<boolean>>;
  children: React.ReactNode;
};

const Modal = ({ active, setActive, children }: Props) => {
  const [isVisible, setIsVisible] = useState(false);

  const closeModal = () => {
    setIsVisible(false);
    setTimeout(() => {
      setActive(false);
    }, 300);
  };

  useEffect(() => {
    if (active) {
      setIsVisible(true);
    }
  }, [active]);

  if (!active) return null;

  return ReactDom.createPortal(
    <div
      role="dialog"
      aria-modal="true"
      onClick={closeModal}
      className="fixed left-0 top-0 z-50 h-[100dvh] w-screen grid place-items-center bg-black/20 backdrop-blur-md transition-all duration-300">
      <div
        style={{
          opacity: isVisible ? "1" : "0",
          visibility: isVisible ? "visible" : "hidden",
        }}
        onClick={e => e.stopPropagation()}
        className="relative flex w-[350px] flex-col items-center justify-center rounded-md border-r border-b border-white/20 bg-white/05 backdrop-blur-md p-10 pt-12 font-bold transition-all duration-300">
        <button onClick={closeModal}>
          <MdClose className="absolute right-3 top-3 h-6 w-6" />
        </button>
        {children}
        <Button onClick={closeModal}>Ok</Button>
      </div>
    </div>,
    document.getElementById("modal") as HTMLElement

    // don't forget to add
    // <div id="modal"></div>
    // to index.html
  );
};

export default Modal;