import { Box, Button, Container, Link, Stack } from '@chakra-ui/react'; import { ArrowBackIcon, AtSignIcon, DownloadIcon } from '@chakra-ui/icons'; import { GlobalHeader } from '../../components/global-header'; import { OpensourceBanner } from '../../components/opensource-banner'; import { UpdatesBanner } from '../../components/updates-banner'; import { Footer } from '../../components/footer'; import { PageHeader } from '../../components/page-header'; import { getAllRoadmaps, getRoadmapById, RoadmapType } from '../../lib/roadmap'; import Helmet from '../../components/helmet'; import { useEffect, useRef, useState } from 'react'; import { wireframeJSONToSVG } from '../../lib/renderer'; type RoadmapProps = { roadmap: RoadmapType; json: any; }; function RoadmapRenderer(props: RoadmapProps) { const { json, roadmap } = props; const roadmapRef = useRef(null); const [hasError, setHasError] = useState(false); useEffect(() => { window.addEventListener('click', (event: MouseEvent) => { const targetGroup = (event?.target as HTMLElement)?.closest('g'); const groupName = targetGroup?.dataset?.groupName; if (!targetGroup || !groupName) { return; } alert(groupName); }); }); useEffect(() => { wireframeJSONToSVG(json) .then((svgElement) => { const container: HTMLElement = roadmapRef.current!; if (!container) { return; } if (container.firstChild) { container.removeChild(container.firstChild); } container.appendChild(svgElement); }) .catch((err) => { setHasError(true); }); }, [json]); return (
); } export default function InteractiveRoadmap(props: RoadmapProps) { const { roadmap, json } = props; return ( {roadmap.pdfUrl && ( )}