|
1 | | -import { Container, Nav, Navbar } from "react-bootstrap"; |
2 | | -import { NavLink, useLocation } from 'react-router-dom'; |
3 | | -import { IconDarkEllipse } from '../shared/icons'; |
| 1 | +import { useMemo } from 'react'; |
| 2 | +import { Dropdown, Nav, Navbar } from "react-bootstrap"; |
| 3 | +import { NavLink, useLocation } from "react-router-dom"; |
| 4 | +import useAppParams from '../shared/hooks/useAppParams'; |
| 5 | +import { IconDarkEllipse } from "../shared/icons"; |
| 6 | +import { useGetVersionsQuery } from '../store/apiSlice'; |
4 | 7 |
|
5 | | -const TopNav = ({isConnected}: {isConnected: boolean}) => { |
| 8 | +const TopNav = ({ isConnected }: { isConnected: boolean }) => { |
6 | 9 | const location = useLocation(); |
| 10 | + const params = useAppParams(); |
| 11 | + |
| 12 | + // make a call to get the version for each appId and for every valid response add the appId to the dropdown options |
| 13 | + // this will ensure that only appIds with a running instance will be shown in the dropdown |
| 14 | + const { data: app01versions } = useGetVersionsQuery({ appId: "app01" }); |
| 15 | + const { data: app02versions } = useGetVersionsQuery({ appId: "app02" }); |
| 16 | + const { data: app03versions } = useGetVersionsQuery({ appId: "app03" }); |
| 17 | + const { data: app04versions } = useGetVersionsQuery({ appId: "app04" }); |
| 18 | + const { data: app05versions } = useGetVersionsQuery({ appId: "app05" }); |
| 19 | + const { data: app06versions } = useGetVersionsQuery({ appId: "app06" }); |
| 20 | + const { data: app07versions } = useGetVersionsQuery({ appId: "app07" }); |
| 21 | + const { data: app08versions } = useGetVersionsQuery({ appId: "app08" }); |
| 22 | + const { data: app09versions } = useGetVersionsQuery({ appId: "app09" }); |
| 23 | + const { data: app10versions } = useGetVersionsQuery({ appId: "app10" }); |
| 24 | + |
| 25 | + const appIdOptions = useMemo(() => { |
| 26 | + const options: appIds[] = []; |
| 27 | + if (app01versions) options.push("app01"); |
| 28 | + if (app02versions) options.push("app02"); |
| 29 | + if (app03versions) options.push("app03"); |
| 30 | + if (app04versions) options.push("app04"); |
| 31 | + if (app05versions) options.push("app05"); |
| 32 | + if (app06versions) options.push("app06"); |
| 33 | + if (app07versions) options.push("app07"); |
| 34 | + if (app08versions) options.push("app08"); |
| 35 | + if (app09versions) options.push("app09"); |
| 36 | + if (app10versions) options.push("app10"); |
| 37 | + return options; |
| 38 | + }, [app01versions, app02versions, app03versions, app04versions, app05versions, app06versions, app07versions, app08versions, app09versions, app10versions]); |
7 | 39 |
|
8 | 40 | return ( |
9 | | - <Navbar expand="md" variant="light" bg="white" className="user-select-none shadow-sm px-0"> |
10 | | - <Container fluid> |
11 | | - <Navbar.Brand>Essentials Debugger</Navbar.Brand> |
| 41 | + <Navbar |
| 42 | + expand="md" |
| 43 | + variant="light" |
| 44 | + bg="white" |
| 45 | + className="user-select-none shadow-sm px-0" |
| 46 | + > |
| 47 | + <div className='w-100 px-2 d-flex align-items-center gap-2'> |
| 48 | + <Navbar.Brand>Essentials Dev Tools</Navbar.Brand> |
| 49 | + <Dropdown> |
| 50 | + <Dropdown.Toggle |
| 51 | + variant="primary" |
| 52 | + id="dropdown-basic" |
| 53 | + > |
| 54 | + {params.appId} |
| 55 | + </Dropdown.Toggle> |
| 56 | + <Dropdown.Menu> |
| 57 | + {appIdOptions.map((id) => ( |
| 58 | + <Dropdown.Item |
| 59 | + key={id} |
| 60 | + as={NavLink} |
| 61 | + to={`/${id}/console`} |
| 62 | + > |
| 63 | + {id} |
| 64 | + </Dropdown.Item> |
| 65 | + ))} |
| 66 | + </Dropdown.Menu> |
| 67 | + </Dropdown> |
12 | 68 | <Nav className="me-auto"> |
13 | | - <NavLink className={ location.pathname.includes("/home") ? 'text-secondary me-3' : 'me-3' } to="/home">Home</NavLink> |
14 | | - <NavLink className={ location.pathname.includes("/console") ? 'text-secondary me-3' : 'me-3'} to="/console">Debug Console</NavLink> |
15 | | - <NavLink className={ location.pathname.includes("/versions") ? 'text-secondary me-3' : 'me-3' } to="/versions">Versions</NavLink> |
16 | | - <NavLink className={ location.pathname.includes("/config") ? 'text-secondary me-3' : 'me-3' } to="/config">Config File</NavLink> |
17 | | - <NavLink className={ location.pathname.includes("/devices") ? 'text-secondary me-3' : 'me-3' } to="/devices">Devices</NavLink> |
18 | | - <NavLink className={ location.pathname.includes("/types") ? 'text-secondary me-3' : 'me-3' } to="/types">Types</NavLink> |
| 69 | + <NavLink |
| 70 | + className={ |
| 71 | + location.pathname.includes(`/${params.appId}/console`) |
| 72 | + ? "text-secondary me-3" |
| 73 | + : "me-3" |
| 74 | + } |
| 75 | + to={`/${params.appId}/console`} |
| 76 | + > |
| 77 | + Debug Console |
| 78 | + </NavLink> |
| 79 | + <NavLink |
| 80 | + className={ |
| 81 | + location.pathname.includes(`/${params.appId}/versions`) |
| 82 | + ? "text-secondary me-3" |
| 83 | + : "me-3" |
| 84 | + } |
| 85 | + to={`/${params.appId}/versions`} |
| 86 | + > |
| 87 | + Versions |
| 88 | + </NavLink> |
| 89 | + <NavLink |
| 90 | + className={ |
| 91 | + location.pathname.includes(`/${params.appId}/config`) |
| 92 | + ? "text-secondary me-3" |
| 93 | + : "me-3" |
| 94 | + } |
| 95 | + to={`/${params.appId}/config`} |
| 96 | + > |
| 97 | + Config File |
| 98 | + </NavLink> |
| 99 | + <NavLink |
| 100 | + className={ |
| 101 | + location.pathname.includes(`/${params.appId}/devices`) |
| 102 | + ? "text-secondary me-3" |
| 103 | + : "me-3" |
| 104 | + } |
| 105 | + to={`/${params.appId}/devices`} |
| 106 | + > |
| 107 | + Devices |
| 108 | + </NavLink> |
| 109 | + <NavLink |
| 110 | + className={ |
| 111 | + location.pathname.includes(`/${params.appId}/types`) |
| 112 | + ? "text-secondary me-3" |
| 113 | + : "me-3" |
| 114 | + } |
| 115 | + to={`/${params.appId}/types`} |
| 116 | + > |
| 117 | + Types |
| 118 | + </NavLink> |
19 | 119 | </Nav> |
20 | | - <div className='d-flex align-items-center'> |
21 | | - <IconDarkEllipse className={isConnected ? 'text-success' : 'text-danger'} /> |
22 | | - <span className='ms-2'>{isConnected ? 'Connected' : 'Disconnected'}</span> |
| 120 | + <div className="d-flex align-items-center"> |
| 121 | + <IconDarkEllipse |
| 122 | + className={isConnected ? "text-success" : "text-danger"} |
| 123 | + /> |
| 124 | + <span className="ms-2"> |
| 125 | + {isConnected ? "Connected" : "Disconnected"} |
| 126 | + </span> |
23 | 127 | </div> |
24 | | - </Container> |
| 128 | + </div> |
25 | 129 | </Navbar> |
26 | 130 | ); |
27 | 131 | }; |
28 | 132 |
|
29 | 133 | export default TopNav; |
30 | 134 |
|
| 135 | +type appIds = |
| 136 | + | "app01" |
| 137 | + | "app02" |
| 138 | + | "app03" |
| 139 | + | "app04" |
| 140 | + | "app05" |
| 141 | + | "app06" |
| 142 | + | "app07" |
| 143 | + | "app08" |
| 144 | + | "app09" |
| 145 | + | "app10"; |
| 146 | + |
31 | 147 |
|
0 commit comments