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