diff --git a/agent/agentUi/src/AgentUi.jsx b/agent/agentUi/src/AgentUi.jsx index e873196e..fd639cf6 100644 --- a/agent/agentUi/src/AgentUi.jsx +++ b/agent/agentUi/src/AgentUi.jsx @@ -5,38 +5,31 @@ import {useEffect, useState} from "react"; import {AgentApi, ApiClient} from "./api/src/index.js"; import buildOverview from "./model/overview.js"; import NavBar from "./NavBar.jsx"; -import {Box, Button, MenuItem, Modal, TextField} from "@mui/material"; -import {useFormik} from "formik"; +import NewShareModal from "./NewShareModal.jsx"; +import NewAccessModal from "./NewAccessModal.jsx"; +import {accessHandler, releaseAccess, releaseShare, shareHandler} from "./model/handler.js"; const AgentUi = () => { const [version, setVersion] = useState(""); const [overview, setOverview] = useState(new Map()); - const [newShare, setNewShare] = useState(false); - const [newAccess, setNewAccess] = useState(false); - let api = new AgentApi(new ApiClient(window.location.protocol+'//'+window.location.host)); + const [newShare, setNewShare] = useState(false); const openNewShare = () => { setNewShare(true); } const closeNewShare = () => { setNewShare(false); } + + const [newAccess, setNewAccess] = useState(false); const openNewAccess = () => { setNewAccess(true); } const closeNewAccess = () => { setNewAccess(false); } - const modalStyle = { - position: 'absolute', - top: '25%', - left: '50%', - transform: 'translate(-50%, -50%)', - width: 600, - bgcolor: 'background.paper', - boxShadow: 24, - p: 4, - }; + + let api = new AgentApi(new ApiClient(window.location.protocol+'//'+window.location.host)); useEffect(() => { let mounted = true; @@ -49,6 +42,11 @@ const AgentUi = () => { useEffect(() => { let mounted = true; + api.agentStatus((err, data) => { + if(mounted) { + setOverview(buildOverview(data)); + } + }); let interval = setInterval(() => { api.agentStatus((err, data) => { if(mounted) { @@ -62,18 +60,6 @@ const AgentUi = () => { } }); - const releaseShare = (opts) => { - api.agentReleaseShare(opts, (err, data) => { - console.log(data); - }); - } - - const releaseAccess = (opts) => { - api.agentReleaseAccess(opts, (err, data) => { - console.log(data); - }); - } - const router = createBrowserRouter([ { path: "/", @@ -92,138 +78,12 @@ const AgentUi = () => { } ]); - const shareHandler = (values) => { - switch(values.shareMode) { - case "public": - api.agentSharePublic({ - target: values.target, - backendMode: values.backendMode, - }, (err, data) => { - closeNewShare(); - }); - break; - - case "private": - api.agentSharePrivate({ - target: values.target, - backendMode: values.backendMode, - }, (err, data) => { - closeNewShare(); - }); - break; - } - } - - const accessHandler = (values) => { - api.agentAccessPrivate({ - token: values.token, - bindAddress: values.bindAddress, - }, (err, data) => { - closeNewAccess(); - }); - } - - const newShareForm = useFormik({ - initialValues: { - shareMode: "public", - backendMode: "proxy", - target: "", - }, - onSubmit: shareHandler, - }); - - const newAccessForm = useFormik({ - initialValues: { - token: "", - bindAddress: "", - }, - onSubmit: accessHandler, - }) - return ( <> - - - -

Share...

-
- - public - private - - - proxy - web - - - - -
-
- - -

Access...

-
- - - - -
-
+ + ); } diff --git a/agent/agentUi/src/NewAccessModal.jsx b/agent/agentUi/src/NewAccessModal.jsx new file mode 100644 index 00000000..eca5c188 --- /dev/null +++ b/agent/agentUi/src/NewAccessModal.jsx @@ -0,0 +1,52 @@ +import {Box, Button, Modal, TextField} from "@mui/material"; +import {useFormik} from "formik"; +import {modalStyle} from "./model/theme.js"; + +const NewAccessModal = (props) => { + const newAccessForm = useFormik({ + initialValues: { + token: "", + bindAddress: "", + }, + onSubmit: (v) => { + props.handler(v); + props.close(); + }, + }); + + return ( + + +

Access...

+
+ + + + +
+
+ ); +} + +export default NewAccessModal; \ No newline at end of file diff --git a/agent/agentUi/src/NewShareModal.jsx b/agent/agentUi/src/NewShareModal.jsx new file mode 100644 index 00000000..bfe0dc58 --- /dev/null +++ b/agent/agentUi/src/NewShareModal.jsx @@ -0,0 +1,70 @@ +import {Box, Button, MenuItem, Modal, TextField} from "@mui/material"; +import {useFormik} from "formik"; +import {modalStyle} from "./model/theme.js"; + +const NewShareModal = (props) => { + const newShareForm = useFormik({ + initialValues: { + shareMode: "public", + backendMode: "proxy", + target: "", + }, + onSubmit: (v) => { + props.handler(v); + props.close(); + }, + }); + + return ( + + +

Share...

+
+ + public + private + + + proxy + web + + + + +
+
+ ) +} + +export default NewShareModal; \ No newline at end of file diff --git a/agent/agentUi/src/Overview.jsx b/agent/agentUi/src/Overview.jsx index 33e5978b..bf1974c6 100644 --- a/agent/agentUi/src/Overview.jsx +++ b/agent/agentUi/src/Overview.jsx @@ -11,11 +11,11 @@ const Overview = (props) => { props.overview.forEach((row) => { switch(row.type) { case "share": - cards.push(); + cards.push(); break; case "access": - cards.push(); + cards.push(); break; } }); diff --git a/agent/agentUi/src/main.jsx b/agent/agentUi/src/main.jsx index 578e9dae..5a61cd44 100644 --- a/agent/agentUi/src/main.jsx +++ b/agent/agentUi/src/main.jsx @@ -3,40 +3,7 @@ import {StrictMode} from "react"; import {createRoot} from "react-dom/client"; import AgentUi from "./AgentUi.jsx"; import {createTheme, ThemeProvider} from "@mui/material"; - -export const themeOptions = { - components: { - MuiCard: { - styleOverrides: { - root: ({theme}) => theme.unstable_sx({ - mt: 5, - p: 2.5, - pt: 3.25, - borderRadius: 2, - }), - } - }, - MuiAppBar: { - styleOverrides: { - root : ({theme}) => theme.unstable_sx({ - borderRadius: 2, - }), - } - } - }, - palette: { - mode: 'light', - primary: { - main: '#241775', - }, - secondary: { - main: '#9bf316', - }, - }, - typography: { - fontFamily: 'Poppins', - } -}; +import {themeOptions} from "./model/theme.js"; createRoot(document.getElementById('root')).render( @@ -44,4 +11,4 @@ createRoot(document.getElementById('root')).render( , -) +); diff --git a/agent/agentUi/src/model/handler.js b/agent/agentUi/src/model/handler.js new file mode 100644 index 00000000..97a003c1 --- /dev/null +++ b/agent/agentUi/src/model/handler.js @@ -0,0 +1,46 @@ +import {AgentApi, ApiClient} from "../api/src/index.js"; + +let api = new AgentApi(new ApiClient(window.location.protocol+'//'+window.location.host)); + +export const shareHandler = (values) => { + switch(values.shareMode) { + case "public": + api.agentSharePublic({ + target: values.target, + backendMode: values.backendMode, + }, (err, data) => { + console.log(err, data); + }); + break; + + case "private": + api.agentSharePrivate({ + target: values.target, + backendMode: values.backendMode, + }, (err, data) => { + console.log(err, data); + }); + break; + } +} + +export const accessHandler = (values) => { + api.agentAccessPrivate({ + token: values.token, + bindAddress: values.bindAddress, + }, (err, data) => { + console.log(err, data); + }); +} + +export const releaseShare = (opts) => { + api.agentReleaseShare(opts, (err, data) => { + console.log(data); + }); +} + +export const releaseAccess = (opts) => { + api.agentReleaseAccess(opts, (err, data) => { + console.log(data); + }); +} \ No newline at end of file diff --git a/agent/agentUi/src/model/overview.js b/agent/agentUi/src/model/overview.js index 9a396ec7..9f85632b 100644 --- a/agent/agentUi/src/model/overview.js +++ b/agent/agentUi/src/model/overview.js @@ -1,17 +1,19 @@ const buildOverview = (status) => { let overview = new Map(); - status.accesses.map(acc => { - overview.set(acc.frontendToken, { - type: "access", - v: acc + if(status) { + status.accesses.map(acc => { + overview.set(acc.frontendToken, { + type: "access", + v: acc + }); }); - }); - status.shares.map(shr => { - overview.set(shr.token, { - type: "share", - v: shr - }) - }); + status.shares.map(shr => { + overview.set(shr.token, { + type: "share", + v: shr + }) + }); + } return overview; } diff --git a/agent/agentUi/src/model/theme.js b/agent/agentUi/src/model/theme.js new file mode 100644 index 00000000..bfe456e5 --- /dev/null +++ b/agent/agentUi/src/model/theme.js @@ -0,0 +1,46 @@ +const componentOptions = { + MuiCard: { + styleOverrides: { + root: ({theme}) => theme.unstable_sx({ + mt: 5, + p: 2.5, + pt: 3.25, + borderRadius: 2, + }), + } + }, + MuiAppBar: { + styleOverrides: { + root : ({theme}) => theme.unstable_sx({ + borderRadius: 2, + }), + } + } +} + +export const themeOptions = { + components: componentOptions, + palette: { + mode: 'light', + primary: { + main: '#241775', + }, + secondary: { + main: '#9bf316', + }, + }, + typography: { + fontFamily: 'Poppins', + } +}; + +export const modalStyle = { + position: 'absolute', + top: '25%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 600, + bgcolor: 'background.paper', + boxShadow: 24, + p: 4, +}; \ No newline at end of file