diff --git a/wahlfang_web/src/api/index.js b/wahlfang_web/src/api/index.js index 926ac6c9f6a4408a5911c746ef0d50389ef44d14..40d4281b1a96e1770c08fd7fe22f7cf0f8e95518 100644 --- a/wahlfang_web/src/api/index.js +++ b/wahlfang_web/src/api/index.js @@ -85,6 +85,11 @@ export const logoutVoter = async () => { return true; } +export const logoutManager = async () => { + localStorage.removeItem("managerToken"); + return true; +} + export const fetchSpectatorInfo = async (uuid) => { const response = await makeRequest(`/vote/spectator/${uuid}/`, 'GET'); if (response.status === 200) { diff --git a/wahlfang_web/src/pages/ManagementApp.js b/wahlfang_web/src/pages/ManagementApp.js index 21347e4ac4fd8a1785216d8618bf58ed5b07b6b5..a7a09f67a91af885dd725314bd4dc25757d8b60f 100644 --- a/wahlfang_web/src/pages/ManagementApp.js +++ b/wahlfang_web/src/pages/ManagementApp.js @@ -9,6 +9,8 @@ import {loadManagerToken, refreshManagerToken} from "../api/management"; import Help from "./management/Help"; import {managementWS} from "../websocket"; import Header from "../components/Header"; +import Logout from "./vote/Logout"; +import AuthenticatedRoute from "../components/AuthenticatedRoute"; export default function ManagementApp() { @@ -56,6 +58,13 @@ export default function ManagementApp() { <Route exact path={`${path}/help`}> <Help/> </Route> + <AuthenticatedRoute> + <Route exact path="/logout"> + <Suspense fallback={<Loading/>}> + <Logout/> + </Suspense> + </Route> + </AuthenticatedRoute> </Switch> </div> )} diff --git a/wahlfang_web/src/pages/management/Logout.js b/wahlfang_web/src/pages/management/Logout.js new file mode 100644 index 0000000000000000000000000000000000000000..b5b5c162ca4cafd4141834f87b08696cb0ffc278 --- /dev/null +++ b/wahlfang_web/src/pages/management/Logout.js @@ -0,0 +1,26 @@ +import React, {useEffect} from "react"; +import Layout from "../../components/Layout"; +import {useSetRecoilState} from "recoil"; +import {isManagerAuthenticated} from "../../state/management"; +import Loading from "../../components/Loading"; +import {logoutVoter} from "../../api"; + + +export default function Logout() { + const setAuthenticated = useSetRecoilState(isManagerAuthenticated); + + useEffect(() => { + logoutVoter().then(result => { + setAuthenticated(false); + // TODO: this is a very hacky way of reloading the whole app such that the recoil app state is reset. + // TODO: find a saner way of resetting the recoil state without having to force reload the whole page. + window.location.assign('/'); + }); + }) + + return ( + <Layout title="logout"> + <Loading/> + </Layout> + ); +}