summaryrefslogtreecommitdiffstats
path: root/src/components/App/App.tsx
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2024-08-30 11:19:30 +0200
committerGravatar Tom van der Lee <tom@vanderlee.io>2024-08-30 15:33:15 +0200
commit648b804e72d4831e41e02dfd7d6b5a9ac7660b58 (patch)
tree34c0e284df0510c868606a01833aa0e57f6678c2 /src/components/App/App.tsx
parentb19c1877d088fbe01bcdea9fbdef282e66ab114f (diff)
downloadclient-648b804e72d4831e41e02dfd7d6b5a9ac7660b58.tar.gz
client-648b804e72d4831e41e02dfd7d6b5a9ac7660b58.tar.bz2
client-648b804e72d4831e41e02dfd7d6b5a9ac7660b58.zip
Added ui
Diffstat (limited to 'src/components/App/App.tsx')
-rw-r--r--src/components/App/App.tsx39
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";
13import Trash from "~/components/Icons/Trash"; 13import Trash from "~/components/Icons/Trash";
14import { DarkModeContext } from "~/contexts/DarkMode"; 14import { DarkModeContext } from "~/contexts/DarkMode";
15import RequestList from "~/components/RequestList/RequestList"; 15import RequestList from "~/components/RequestList/RequestList";
16import { ReadyState, RequestResponse } from "~/types"; 16import { Call, ReadyState } from "~/types";
17import { ConnectionContext } from "~/contexts/Connection";
17 18
18interface Config { 19interface Config {
19 url: string; 20 url: string;
@@ -48,29 +49,14 @@ const statusTextMap: ReadyStateMap = {
48 49
49export default function App() { 50export 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>