import * as React from "react"; import {ReactElement, useContext, useEffect, useMemo, useState} from "react"; import useRequests, { ReadyState, RequestResponse } from "../../hooks/useRequests"; import styles from './App.module.scss'; import RequestDetails from "../RequestDetails/RequestDetails"; import {getHost} from "../../utils"; import {Container, ListGroup, Nav, Navbar, NavDropdown} from "react-bootstrap"; import classNames from "classnames"; import {Sliders} from "../Icons/Sliders"; import {Sun} from "../Icons/Sun"; import {Moon} from "../Icons/Moon"; import Trash from "../Icons/Trash"; import {DarkModeContext} from "../../contexts/DarkMode"; import RequestList from "../RequestList/RequestList"; interface Config { url: string } interface SettingsMenu { icon: ReactElement, label: string, onClick: () => void, } type ReadyStateMap = { [ReadyState.CONNECTING]: string, [ReadyState.OPEN]: string, [ReadyState.CLOSING]: string, [ReadyState.CLOSED]: string, } const statusIconMap: ReadyStateMap = { [ReadyState.CONNECTING]: '🔴', [ReadyState.OPEN]: '🟢', [ReadyState.CLOSING]: '🔴', [ReadyState.CLOSED]: '🔴', } const statusTextMap: ReadyStateMap = { [ReadyState.CONNECTING]: 'Connecting...', [ReadyState.OPEN]: 'Connected', [ReadyState.CLOSING]: 'Closing...', [ReadyState.CLOSED]: 'Closed', } export default function App() { const { darkMode, toggle } = useContext(DarkModeContext); const [config, setConfig]= useState(null) const { calls, readyState, clear } = useRequests({ onConnect: async () => { const response = await fetch(`http://${getHost()}/config/`) const config = await response.json() setConfig(config) } }); useEffect(() => { const url = new URL(config?.url ?? 'https://loading...'); document.title = `${statusIconMap[readyState]} ${url.host} | TTUN`; }, [readyState, config?.url]) const [selectedRequestIndex, setSelectedRequestIndex] = useState(null); const selectedRequest = useMemo(() => ( selectedRequestIndex === null ? null : calls[selectedRequestIndex] ), [selectedRequestIndex, calls]); const settingsMenu: (SettingsMenu | null)[] = [ { onClick: toggle, icon: darkMode ? : , label: darkMode ? "Light mode" : "Dark mode", }, null, { onClick: () => { setSelectedRequestIndex(null); clear(); }, icon: , label: "Clear" } ]; return config && (
TTUN {`${statusIconMap[readyState]} ${statusTextMap[readyState]}`}
{config.url}
); }