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< number | null >(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}
) ); }