diff --git a/src/components/settingsdialog/managementsettings/ManagementAdminLoginSettings.tsx b/src/components/settingsdialog/managementsettings/ManagementAdminLoginSettings.tsx index d154eb91..c45ff354 100644 --- a/src/components/settingsdialog/managementsettings/ManagementAdminLoginSettings.tsx +++ b/src/components/settingsdialog/managementsettings/ManagementAdminLoginSettings.tsx @@ -6,6 +6,7 @@ import CssBaseline from '@mui/material/CssBaseline'; import Container from '@mui/material/Container'; import { adminLogin } from '../../../store/actions/permissionsActions'; import { useAppDispatch } from '../../../store/hooks'; +import LoginButton from '../../controlbuttons/LoginButton'; export default function SignIn() { @@ -29,7 +30,7 @@ export default function SignIn() { return ( <> - + - +
+ + + +
import('./views/errorboundary/ErrorBoundary')); @@ -47,9 +46,7 @@ const router = createBrowserRouter( } errorElement={} /> - - - + } errorElement={} /> diff --git a/src/store/actions/mgmtActions.tsx b/src/store/actions/mgmtActions.tsx new file mode 100644 index 00000000..96933f0d --- /dev/null +++ b/src/store/actions/mgmtActions.tsx @@ -0,0 +1,38 @@ +import { AppThunk } from '../store'; +import { permissionsActions } from '../slices/permissionsSlice'; +import { Logger } from '../../utils/Logger'; + +const logger = new Logger('listenerActions'); + +let messageListener: (event: MessageEvent) => void; + +export const startMGMTListeners = (): AppThunk> => async ( + dispatch, + getState, + { signalingService, managementService } +): Promise => { + logger.debug('startListeners()'); + + messageListener = async ({ data }: MessageEvent) => { + if (data.type === 'edumeet-login') { + const { data: token } = data; + + await (await managementService).authentication.setAccessToken(token); + + dispatch(permissionsActions.setToken(token)); + dispatch(permissionsActions.setLoggedIn(true)); + + if (getState().signaling.state === 'connected') + await signalingService.sendRequest('updateToken', { token }).catch((e) => logger.error('updateToken request failed [error: %o]', e)); + } + }; + + window.addEventListener('message', messageListener); +}; + +export const stopMGMTListeners = (): AppThunk> => async ( + +): Promise => { + logger.debug('stopListeners()'); + window.removeEventListener('message', messageListener); +}; diff --git a/src/views/management/Management.tsx b/src/views/management/Management.tsx index 0d8df1b7..c147dafa 100644 --- a/src/views/management/Management.tsx +++ b/src/views/management/Management.tsx @@ -29,11 +29,14 @@ import PeopleOutlineIcon from '@mui/icons-material/PeopleOutline'; import PersonOutlineIcon from '@mui/icons-material/PersonOutline'; import MeetingRoomIcon from '@mui/icons-material/MeetingRoom'; import { getUserData } from '../../store/actions/managementActions'; -import { useAppDispatch } from '../../store/hooks'; +import { useAppDispatch, useAppSelector } from '../../store/hooks'; import PermissionTable from '../../components/managementservice/permisssion/Permission'; import InfoIcon from '@mui/icons-material/Info'; import TenantAdminTable from '../../components/managementservice/tenants/TenantAdmin'; import TenantOwnerTable from '../../components/managementservice/tenants/TenantOwner'; +import { checkJWT, logout } from '../../store/actions/permissionsActions'; +import SignIn from '../../components/settingsdialog/managementsettings/ManagementAdminLoginSettings'; +import { startMGMTListeners, stopMGMTListeners } from '../../store/actions/mgmtActions'; /* import InboxIcon from '@mui/icons-material/MoveToInbox'; */ /* import MailIcon from '@mui/icons-material/Mail'; */ @@ -41,6 +44,7 @@ import TenantOwnerTable from '../../components/managementservice/tenants/TenantO const drawerWidth = 300; export default function ManagementUI(/* props: Props */) { + const dispatch = useAppDispatch(); const [ mobileOpen, setMobileOpen ] = React.useState(false); @@ -51,8 +55,14 @@ export default function ManagementUI(/* props: Props */) { const [ selectedComponent, setSelectedComponent ] = useState(''); const [ username, setUsername ] = useState(''); + let loggedIn = useAppSelector((state) => state.permissions.loggedIn); useEffect(() => { + dispatch(startMGMTListeners()); + + dispatch(checkJWT()).then(() => { + loggedIn = useAppSelector((state) => state.permissions.loggedIn); + }); // eslint-disable-next-line @typescript-eslint/no-explicit-any dispatch(getUserData()).then((tdata: any) => { @@ -60,36 +70,48 @@ export default function ManagementUI(/* props: Props */) { setUsername(tdata.user.email); } }); - + + return () => { + dispatch(stopMGMTListeners()); + }; }, []); // Function to render the selected component in the placeholder const renderComponent = () => { - switch (selectedComponent) { - case 'tenant': - return <> - - - - - - ; - case 'tenant-fqdn': - return ; - case 'tenant-oauth': - return ; - case 'room': - return ; - case 'user': - return ; - case 'group': - return ; - case 'role': - return ; - case 'permission': - return ; - default: - return
Select an item to load a component
; + + if (loggedIn) { + switch (selectedComponent) { + case 'login': + return
+ +
; + case 'tenant': + return <> + + + + + + ; + case 'tenant-fqdn': + return ; + case 'tenant-oauth': + return ; + case 'room': + return ; + case 'user': + return ; + case 'group': + return ; + case 'role': + return ; + case 'permission': + return ; + default: + return Select an item to load a component ; + } + } else { + return ; } }; @@ -102,18 +124,22 @@ export default function ManagementUI(/* props: Props */) { - - + { if (!loggedIn) { setSelectedComponent('login'); } } + }> - + { - window.location.reload(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + dispatch(logout()).then(() => { + window.location.reload(); + }); } }> @@ -190,18 +216,6 @@ export default function ManagementUI(/* props: Props */) { - {/* - {[ 'General', 'Logs', 'About us' ].map((text, index) => ( - - - - {index % 2 === 0 ? : } - - - - - ))} - */} ); @@ -212,6 +226,7 @@ export default function ManagementUI(/* props: Props */) { -
+
{renderComponent()}