import React, { useEffect, useState } from 'react'; import { Loader } from './Components'; import Graph from './Graph'; import Inspector from './Inspector'; import sharedStateHook from './sharedStateHook'; import Store from './Store'; import { GraphState } from './types'; import { LoadActivity } from './util'; import '/css/App.scss'; export const usePane = sharedStateHook('info', 'pane'); export const useInspectorOpen = sharedStateHook(true, 'inspectorOpen'); export const useQuery = sharedStateHook(queryFromLocation(), 'query'); export const useModule = sharedStateHook([], 'module'); export const useGraph = sharedStateHook(null as GraphState, 'graph'); export const useColorize = sharedStateHook('', 'colorize'); export const useIncludeDev = sharedStateHook(false, 'includeDev'); export const useExcludes = sharedStateHook([], 'excludes'); function Splitter({ onClick, isOpen }) { return (
{isOpen ? '\u{25b6}' : '\u{25c0}'}
); } // Parse `q` query param from browser location function queryFromLocation() { const q = new URL(location.href).searchParams.get('q'); return (q ?? '') .split(',') .map(v => v.trim()) .filter(Boolean); } export const activity = new LoadActivity(); export const store = new Store(activity); export function useActivity() { const [bool, setBool] = useState(true); activity.onChange = () => setBool(!bool); return activity; } export default function App() { const activity = useActivity(); const [, setQuery] = useQuery(); useEffect(() => { function handlePopState() { setQuery(queryFromLocation()); } window.addEventListener('popstate', handlePopState); return () => { window.removeEventListener('popstate', handlePopState); }; }, []); const [inspectorOpen, setInspectorOpen] = useInspectorOpen(); return ( <> {activity.total > 0 ? : null} setInspectorOpen(!inspectorOpen)} /> ); }