Fix logout.

This commit is contained in:
Paulo Gustavo Veiga 2024-02-06 22:28:17 -08:00
parent cbca2e6184
commit 20c4ccc1ff
7 changed files with 48 additions and 8 deletions

View File

@ -91,7 +91,7 @@ export type ForgotPasswordResult = {
interface Client { interface Client {
login(auth: JwtAuth): Promise<void>; login(auth: JwtAuth): Promise<void>;
logout(): Promise<void>;
deleteAccount(): Promise<void>; deleteAccount(): Promise<void>;
importMap(model: ImportMapInfo): Promise<number>; importMap(model: ImportMapInfo): Promise<number>;
createMap(map: BasicMapInfo): Promise<number>; createMap(map: BasicMapInfo): Promise<number>;

View File

@ -128,6 +128,9 @@ class MockClient implements Client {
this.labels = [label1, label2, label3]; this.labels = [label1, label2, label3];
} }
logout(): Promise<void> {
return Promise.resolve();
}
login(auth: JwtAuth): Promise<void> { login(auth: JwtAuth): Promise<void> {
const cookies = new Cookies(); const cookies = new Cookies();

View File

@ -25,7 +25,7 @@ export default class RestClient implements Client {
response?: AxiosResponse<T>; response?: AxiosResponse<T>;
}): Promise<{ response?: AxiosResponse<T> }> => { }): Promise<{ response?: AxiosResponse<T> }> => {
// TODO: Improve session timeout response and response handling // TODO: Improve session timeout response and response handling
if (error.response && error.response.status === 405) { if (error.response && (error.response.status === 405 || error.response.status === 403)) {
this.sessionExpired(); this.sessionExpired();
} }
return Promise.reject(error); return Promise.reject(error);
@ -63,6 +63,14 @@ export default class RestClient implements Client {
); );
} }
logout(): Promise<void> {
// Set jwt token on cookie ...
const cookies = new Cookies();
cookies.remove('jwt-auth-token', { path: '/' });
return Promise.resolve();
}
login(model: JwtAuth): Promise<void> { login(model: JwtAuth): Promise<void> {
const handler = (success: () => void, reject: (error: ErrorInfo) => void) => { const handler = (success: () => void, reject: (error: ErrorInfo) => void) => {
this.axios this.axios

View File

@ -13,12 +13,18 @@ import ChangePasswordDialog from './change-password-dialog';
import LockOpenOutlined from '@mui/icons-material/LockOpenOutlined'; import LockOpenOutlined from '@mui/icons-material/LockOpenOutlined';
import Link from '@mui/material/Link'; import Link from '@mui/material/Link';
import ExitToAppOutlined from '@mui/icons-material/ExitToAppOutlined'; import ExitToAppOutlined from '@mui/icons-material/ExitToAppOutlined';
import { activeInstance } from '../../../redux/clientSlice';
import { useSelector } from 'react-redux';
import Client from '../../../classes/client';
import { useNavigate } from 'react-router-dom';
type ActionType = 'change-password' | 'account-info' | undefined; type ActionType = 'change-password' | 'account-info' | undefined;
const AccountMenu = (): React.ReactElement => { const AccountMenu = (): React.ReactElement => {
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null); const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
const open = Boolean(anchorEl); const open = Boolean(anchorEl);
const [action, setAction] = React.useState<ActionType>(undefined); const [action, setAction] = React.useState<ActionType>(undefined);
const client: Client = useSelector(activeInstance);
const navigate = useNavigate();
const handleMenu = (event: React.MouseEvent<HTMLElement>) => { const handleMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
@ -30,8 +36,9 @@ const AccountMenu = (): React.ReactElement => {
const handleLogout = (event: React.MouseEvent<HTMLElement>) => { const handleLogout = (event: React.MouseEvent<HTMLElement>) => {
event.preventDefault(); event.preventDefault();
const elem = document.getElementById('logoutFrom') as HTMLFormElement;
elem.submit(); client.logout();
navigate('/c/login');
}; };
const account = useFetchAccount(); const account = useFetchAccount();
@ -85,7 +92,6 @@ const AccountMenu = (): React.ReactElement => {
)} )}
<MenuItem onClick={handleClose}> <MenuItem onClick={handleClose}>
<form action="/c/logout" method="POST" id="logoutFrom"></form>
<Link color="textSecondary" href="/c/logout" onClick={(e) => handleLogout(e)}> <Link color="textSecondary" href="/c/logout" onClick={(e) => handleLogout(e)}>
<ListItemIcon> <ListItemIcon>
<ExitToAppOutlined fontSize="small" /> <ExitToAppOutlined fontSize="small" />

View File

@ -372,6 +372,7 @@ export const MapsList = (props: MapsListProps): React.ReactElement => {
); );
const handleStarred = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>, id: number) => { const handleStarred = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>, id: number) => {
event.stopPropagation();
event.preventDefault(); event.preventDefault();
starredMultation.mutate(id); starredMultation.mutate(id);
}; };

View File

@ -17,9 +17,6 @@ module.exports = merge(common, {
protocol: 'http:', protocol: 'http:',
port: 8080 port: 8080
}, },
pathRewrite: {
'^/api': ''
}
}, },
}, },
historyApiFallback: { historyApiFallback: {

View File

@ -4965,6 +4965,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/cookie@npm:^0.6.0":
version: 0.6.0
resolution: "@types/cookie@npm:0.6.0"
checksum: 5edce7995775b0b196b142883e4d4f71fd93c294eaec973670f1fa2540b70ea7390408ed513ddefef5fcb12a578100c76596e8f2a714b0c2ae9f70ee773f4510
languageName: node
linkType: hard
"@types/cypress-image-snapshot@npm:^3.1.6": "@types/cypress-image-snapshot@npm:^3.1.6":
version: 3.1.6 version: 3.1.6
resolution: "@types/cypress-image-snapshot@npm:3.1.6" resolution: "@types/cypress-image-snapshot@npm:3.1.6"
@ -6247,6 +6254,7 @@ __metadata:
react-redux: ^7.2.2 react-redux: ^7.2.2
react-router-dom: ^6.4.3 react-router-dom: ^6.4.3
styled-components: ^5.3.6 styled-components: ^5.3.6
universal-cookie: ^7.0.2
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -8883,6 +8891,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"cookie@npm:^0.6.0":
version: 0.6.0
resolution: "cookie@npm:0.6.0"
checksum: f56a7d32a07db5458e79c726b77e3c2eff655c36792f2b6c58d351fb5f61531e5b1ab7f46987150136e366c65213cbe31729e02a3eaed630c3bf7334635fb410
languageName: node
linkType: hard
"copy-concurrently@npm:^1.0.0": "copy-concurrently@npm:^1.0.0":
version: 1.0.5 version: 1.0.5
resolution: "copy-concurrently@npm:1.0.5" resolution: "copy-concurrently@npm:1.0.5"
@ -21904,6 +21919,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"universal-cookie@npm:^7.0.2":
version: 7.0.2
resolution: "universal-cookie@npm:7.0.2"
dependencies:
"@types/cookie": ^0.6.0
cookie: ^0.6.0
checksum: c2c20cc4918fae7c912e2e154e4bed33a8a150685fec737cfe62d89b95b19be1658c3224b9d523a9269a9c5571c5ad5eb702b9db04c0544ea1061925289d82d2
languageName: node
linkType: hard
"universal-user-agent@npm:^6.0.0": "universal-user-agent@npm:^6.0.0":
version: 6.0.0 version: 6.0.0
resolution: "universal-user-agent@npm:6.0.0" resolution: "universal-user-agent@npm:6.0.0"