import { useEffect, useState } from "react"; type ToolTipProps = { hovered: boolean; children: React.ReactNode; direction: "right" | "bottom" | "top" | "left"; offset: string; delayShow?: number; maxWidth?: "max-w-[10rem]" | "max-w-xs" | "max-w-sm" | "max-w-md"; }; export default function ToolTip(props: ToolTipProps): JSX.Element { const { children, hovered, direction, offset } = props; let { delayShow, maxWidth } = props; if (delayShow === undefined) delayShow = 300; if (maxWidth === undefined) maxWidth = "max-w-sm"; const [show, setShow] = useState(false); useEffect(() => { let timeout = setTimeout(() => {}); if (hovered) { timeout = setTimeout(() => hovered && setShow(true), delayShow); } else { setShow(false); } return () => clearTimeout(timeout); }, [delayShow, hovered]); let tooltipCSS = ""; let transformCSS = ""; let arrowParentCSS = ""; let arrowCSS = ""; switch (direction) { case "left": tooltipCSS = "[justify-self:end] [align-self:center]"; transformCSS = `translateX(-${offset})`; arrowParentCSS = "w-4 -right-4 top-0 bottom-0"; arrowCSS = "border-l-light"; break; case "right": tooltipCSS = "[justify-self:start] [align-self:center]"; transformCSS = `translateX(${offset})`; arrowParentCSS = "w-4 -left-4 top-0 bottom-0"; arrowCSS = "border-r-light"; break; case "top": tooltipCSS = "[align-self:end]"; transformCSS = `translateY(-${offset})`; arrowParentCSS = "h-4 -bottom-4 left-0 right-0"; arrowCSS = "border-t-light"; break; case "bottom": tooltipCSS = "[align-self:start]"; transformCSS = `translateY(${offset})`; arrowParentCSS = "h-4 -top-4 left-0 right-0"; arrowCSS = "border-b-light"; break; } return (
{children}
); }