import React, { useRef, useState, useEffect } from 'react' import './styles.scss' import { OffsetAnnotation } from './offsetAnnotation' import { AnnotationLayerTypes } from './types' /** * Displays an SVG with the provided annotations above an wrapper or svg. * */ export const AnnotationLayer = ({ id, annotations, AnnotationComponent, lineHeight = 17, linePadding = 2, hideMarker = false, locator = false, lineFlow = 'flows', marker = ['none', 'dot'], children }: AnnotationLayerTypes) => { const wrapper = useRef(null) const svg = useRef(null) const [loaded, setLoaded] = useState(false) const [svgSize, setSvgSize] = useState<[number, number]>([0, 0]) const [locatorPos, setLocatorPos] = useState<[number, number]>([0, 0]) const [locatorValue, setLocatorValue] = useState( undefined ) const [viewBox, setviewBox] = useState('0 0 0 0') // steps for grid values const gridValues = [10, 20, 30, 40, 50, 60, 70, 80, 90] // function to change height of the content const changeHeight = (wrapper: React.RefObject) => { if (wrapper && wrapper.current) { if (wrapper.current.clientHeight > 0) { setSvgSize([ wrapper.current.clientWidth || 0, wrapper.current.clientHeight || 0 ]) setviewBox( '0 0 ' + wrapper.current.clientWidth + ' ' + wrapper.current.clientHeight ) } } else { changeHeight(wrapper) } } // handler for mouseevents in locator-mode const handleMouseOut = () => { setLocatorPos([2000, 2000]) } const handleMouseover = (e: MouseEvent) => { if (e) { if (e.buttons === 0) { setLocatorPos([e.offsetX, e.offsetY]) setLocatorValue( ((e.offsetX * 100) / svgSize[0]).toFixed(0) + ',' + ((e.offsetY * 100) / svgSize[1]).toFixed(0) ) } } } // if content-element ist loaded and sized adjust the size of the ovberlay useEffect(() => { if (wrapper && wrapper.current) { if (wrapper.current.clientHeight > 0) { changeHeight(wrapper) } else { changeHeight(wrapper) } } }, [loaded]) // Add and remove eventlistener for locator mode useEffect(() => { if (svg && svg.current) { if (locator) { svg.current.addEventListener('mousemove', handleMouseover) svg.current.addEventListener('mouseleave', handleMouseOut) } } return () => { if (svg && svg.current) { svg.current.removeEventListener('mousemove', handleMouseover) svg.current.addEventListener('mouseleave', handleMouseOut) } } }, [svgSize]) return (
{ setLoaded(true) }} ><> {children}
{svgSize[1] !== 0 && annotations && annotations.map((anno, i) => { return ( ) })} {locator && ( <> {gridValues.map((g, i) => { return ( {g} {g} ) })} {locatorValue && ( {locatorValue} )} )}
) }