import Tippy from "@tippyjs/react"; import { useCallback, useEffect, useRef, useState } from "react"; import { ToolbarButton, ToolbarButtonProps, } from "../../SharedComponents/Toolbar/components/ToolbarButton"; import { EditHyperlinkMenu } from "../../HyperlinkToolbar/EditHyperlinkMenu/components/EditHyperlinkMenu"; type HyperlinkButtonProps = ToolbarButtonProps & { hyperlinkIsActive: boolean; activeHyperlinkUrl: string; activeHyperlinkText: string; setHyperlink: (url: string, text?: string) => void; }; /** * The link menu button opens a tooltip on click */ export const LinkToolbarButton = (props: HyperlinkButtonProps) => { const [creationMenu, setCreationMenu] = useState(); const [creationMenuOpen, setCreationMenuOpen] = useState(false); const buttonRef = useRef(null); const menuRef = useRef(null); // TODO: review code; does this pattern still make sense? const updateCreationMenu = useCallback(() => { setCreationMenu( { props.setHyperlink(url, text); setCreationMenuOpen(false); }} ref={menuRef} /> ); }, [props]); const handleClick = useCallback( (event: MouseEvent) => { if (buttonRef.current?.contains(event.target as HTMLElement)) { setCreationMenuOpen(!creationMenuOpen); return; } if (menuRef.current?.contains(event.target as HTMLElement)) { return; } setCreationMenuOpen(false); }, [creationMenuOpen] ); useEffect(() => { document.body.addEventListener("click", handleClick); return () => document.body.removeEventListener("click", handleClick); }, [handleClick]); return ( ); }; export default LinkToolbarButton;