diff options
Diffstat (limited to 'src/components/App')
| -rw-r--r-- | src/components/App/App.tsx | 40 |
1 files changed, 12 insertions, 28 deletions
diff --git a/src/components/App/App.tsx b/src/components/App/App.tsx index b1a4501..ad36add 100644 --- a/src/components/App/App.tsx +++ b/src/components/App/App.tsx | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | import * as React from "react"; | 1 | import * as React from "react"; |
| 2 | import { ReactElement, useContext, useEffect, useMemo, useState } from "react"; | 2 | import { ReactElement, useContext, useEffect, useMemo, useState } from "react"; |
| 3 | import useRequests, { ReadyState, RequestResponse } from "~/hooks/useRequests"; | 3 | import useRequests from "~/hooks/useRequests"; |
| 4 | 4 | ||
| 5 | import styles from "~/components/App/App.module.scss"; | 5 | import styles from "~/components/App/App.module.scss"; |
| 6 | import RequestDetails from "~/components/RequestDetails/RequestDetails"; | 6 | import RequestDetails from "~/components/RequestDetails/RequestDetails"; |
| @@ -13,6 +13,8 @@ import Moon from "~/components/Icons/Moon"; | |||
| 13 | import Trash from "~/components/Icons/Trash"; | 13 | import Trash from "~/components/Icons/Trash"; |
| 14 | import { DarkModeContext } from "~/contexts/DarkMode"; | 14 | import { DarkModeContext } from "~/contexts/DarkMode"; |
| 15 | import RequestList from "~/components/RequestList/RequestList"; | 15 | import RequestList from "~/components/RequestList/RequestList"; |
| 16 | import { Call, ReadyState } from "~/types"; | ||
| 17 | import { ConnectionContext } from "~/contexts/Connection"; | ||
| 16 | 18 | ||
| 17 | interface Config { | 19 | interface Config { |
| 18 | url: string; | 20 | url: string; |
| @@ -47,29 +49,14 @@ const statusTextMap: ReadyStateMap = { | |||
| 47 | 49 | ||
| 48 | export default function App() { | 50 | export default function App() { |
| 49 | const { darkMode, toggle } = useContext(DarkModeContext); | 51 | const { darkMode, toggle } = useContext(DarkModeContext); |
| 50 | const [config, setConfig] = useState<Config | null>(null); | 52 | const { config, selectedCall, setSelectedCall, readyState, clear } = |
| 51 | 53 | useContext(ConnectionContext); | |
| 52 | const { calls, readyState, clear } = useRequests({ | ||
| 53 | onConnect: async () => { | ||
| 54 | const response = await fetch(`http://${getHost()}/config/`); | ||
| 55 | const config = await response.json(); | ||
| 56 | setConfig(config); | ||
| 57 | }, | ||
| 58 | }); | ||
| 59 | 54 | ||
| 60 | useEffect(() => { | 55 | useEffect(() => { |
| 61 | const url = new URL(config?.url ?? "https://loading..."); | 56 | const url = new URL(config?.url ?? "https://loading..."); |
| 62 | document.title = `${statusIconMap[readyState]} ${url.host} | TTUN`; | 57 | document.title = `${statusIconMap[readyState]} ${url.host} | TTUN`; |
| 63 | }, [readyState, config?.url]); | 58 | }, [readyState, config?.url]); |
| 64 | 59 | ||
| 65 | const [selectedRequestIndex, setSelectedRequestIndex] = useState< | ||
| 66 | number | null | ||
| 67 | >(null); | ||
| 68 | const selectedRequest = useMemo<RequestResponse | null>( | ||
| 69 | () => (selectedRequestIndex === null ? null : calls[selectedRequestIndex]), | ||
| 70 | [selectedRequestIndex, calls] | ||
| 71 | ); | ||
| 72 | |||
| 73 | const settingsMenu: (SettingsMenu | null)[] = [ | 60 | const settingsMenu: (SettingsMenu | null)[] = [ |
| 74 | { | 61 | { |
| 75 | onClick: toggle, | 62 | onClick: toggle, |
| @@ -79,7 +66,7 @@ export default function App() { | |||
| 79 | null, | 66 | null, |
| 80 | { | 67 | { |
| 81 | onClick: () => { | 68 | onClick: () => { |
| 82 | setSelectedRequestIndex(null); | 69 | setSelectedCall(null); |
| 83 | clear(); | 70 | clear(); |
| 84 | }, | 71 | }, |
| 85 | icon: <Trash />, | 72 | icon: <Trash />, |
| @@ -105,14 +92,15 @@ export default function App() { | |||
| 105 | </a> | 92 | </a> |
| 106 | </Navbar.Text> | 93 | </Navbar.Text> |
| 107 | <Navbar.Toggle aria-controls="settings" /> | 94 | <Navbar.Toggle aria-controls="settings" /> |
| 108 | <Navbar.Collapse id="settings" className="ms-2"> | 95 | <Navbar.Collapse id="settings" className="ms-2" role="button"> |
| 109 | <Nav> | 96 | <Nav> |
| 110 | <NavDropdown align="end" title={<Sliders />}> | 97 | <NavDropdown align="end" title={<Sliders />}> |
| 111 | {settingsMenu.map((item) => { | 98 | {settingsMenu.map((item, index) => { |
| 112 | if (item !== null) { | 99 | if (item !== null) { |
| 113 | const { onClick, icon, label } = item; | 100 | const { onClick, icon, label } = item; |
| 114 | return ( | 101 | return ( |
| 115 | <NavDropdown.Item | 102 | <NavDropdown.Item |
| 103 | key={label} | ||
| 116 | onClick={onClick} | 104 | onClick={onClick} |
| 117 | className="d-flex align-items-center" | 105 | className="d-flex align-items-center" |
| 118 | > | 106 | > |
| @@ -121,7 +109,7 @@ export default function App() { | |||
| 121 | </NavDropdown.Item> | 109 | </NavDropdown.Item> |
| 122 | ); | 110 | ); |
| 123 | } else { | 111 | } else { |
| 124 | return <NavDropdown.Divider />; | 112 | return <NavDropdown.Divider key={`item-${index}`} />; |
| 125 | } | 113 | } |
| 126 | })} | 114 | })} |
| 127 | </NavDropdown> | 115 | </NavDropdown> |
| @@ -133,14 +121,10 @@ export default function App() { | |||
| 133 | 121 | ||
| 134 | <main className={styles.main}> | 122 | <main className={styles.main}> |
| 135 | <div className={classNames("border-end", styles.sidebar)}> | 123 | <div className={classNames("border-end", styles.sidebar)}> |
| 136 | <RequestList | 124 | <RequestList /> |
| 137 | requests={calls} | ||
| 138 | selectedRequestIndex={selectedRequestIndex} | ||
| 139 | setSelectedRequestIndex={setSelectedRequestIndex} | ||
| 140 | /> | ||
| 141 | </div> | 125 | </div> |
| 142 | <div className={styles.details}> | 126 | <div className={styles.details}> |
| 143 | <RequestDetails requestResponse={selectedRequest} /> | 127 | <RequestDetails /> |
| 144 | </div> | 128 | </div> |
| 145 | </main> | 129 | </main> |
| 146 | </div> | 130 | </div> |
