import ReactDOM from 'react-dom' import { useRouter } from 'next/router' import { useState, useEffect, useRef, Fragment } from 'react' import { arrow, autoPlacement, autoUpdate, FloatingPortal, offset, shift, useDismiss, useFloating, useHover, useInteractions, useRole, } from '@floating-ui/react-dom-interactions' import getAbsolutePath from '../utils/absolutePath' import documentExtract from '../utils/documentExtract' import { Tooltip } from './Tooltip' // TODO cancel request on mouseleave when it hasn't been fulfilled yet export const Anchor = (props) => { const { href } = props; const router = useRouter(); const arrowRef = useRef(null); const [ showTooltip, setShowTooltip ] = useState(false); const [ preview, setPreview ] = useState(""); const [ previewLoaded, setPreviewLoaded ] = useState(false); const { x, y, reference, floating, placement, strategy, context, middlewareData: { arrow: { x: arrowX, y: arrowY } = {}} } = useFloating({ open: showTooltip, onOpenChange: setShowTooltip, whileElementsMounted: autoUpdate, middleware: [ offset(5), autoPlacement({ padding: 5 }), shift({ padding: 5 }), arrow({ element: arrowRef, padding: 4 }) ] }); const { getReferenceProps, getFloatingProps } = useInteractions([ useHover(context, { delay: { open: 100, close: 0 } }), useRole(context, { role: 'tooltip' }), useDismiss(context, { ancestorScroll: true }) ]); useEffect(() => { if (showTooltip) { fetchPreview(); } }, [showTooltip]) const fetchPreview = async () => { console.log("Fetching...") setPreviewLoaded(false); const basePath = "http://localhost:3000"; // TODO const currentPath = router.asPath; const relativePath = props.href.split(".")[0]; // TBD temp remove .md const absolutePath = getAbsolutePath({ currentPath, basePath, relativePath }); const response = await fetch(absolutePath); if (response.status !== 200) { // TODO console.log(`Looks like there was a problem. Status Code: ${response.status}`) return } const html = await response.text(); const extract = documentExtract(html); setPreview(extract); setPreviewLoaded(true); } if ( href && href.indexOf("http:") !== 0 && href.indexOf("https:") !== 0 && href.includes(".md") ) { return { preview } ; } return ; };