use the new session management

This commit is contained in:
Sven Czarnian
2022-11-04 21:04:45 +01:00
parent acea193aa0
commit fc05ae4546
8 changed files with 44 additions and 60 deletions

View File

@@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { useSearchParams } from 'react-router-dom'; import { useSearchParams } from 'react-router-dom';
import { Session } from '../services';
export const Auth: React.FC = () => { export const Auth: React.FC = () => {
const [searchParams] = useSearchParams(); const [searchParams] = useSearchParams();
@@ -7,11 +8,11 @@ export const Auth: React.FC = () => {
const baseUrl = `${window.location.protocol}//${window.location.host}` const baseUrl = `${window.location.protocol}//${window.location.host}`
if (token) { if (token) {
sessionStorage.setItem('token', token); Session.setBearerToken(token);
window.location.href = `${baseUrl}/overview`; window.location.replace(`${baseUrl}/overview`);
} else { } else {
sessionStorage.removeItem('token'); Session.reset();
window.location.href = `${baseUrl}`; window.location.replace(`${baseUrl}/`);
} }
return <></>; return <></>;

View File

@@ -1,11 +1,11 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import { Card } from 'primereact/card'; import { Card } from 'primereact/card';
import { Configuration } from '../services'; import { Configuration, Session } from '../services';
export const Login: React.FC = () => { export const Login: React.FC = () => {
// reset every old token // reset every old token
useEffect(() => sessionStorage.removeItem('token'), []); useEffect(() => Session.reset(), []);
const redirectToVatsim = () => { const redirectToVatsim = () => {
const url = [ const url = [

View File

@@ -1,22 +1,15 @@
import React, { useContext, useEffect } from 'react'; import React, { useContext, useEffect } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { AuthContext } from '../contexts'; import { AuthContext } from '../contexts';
import { Session } from '../services';
export const Logout: React.FC = () => { export const Logout: React.FC = () => {
const context = useContext(AuthContext); const context = useContext(AuthContext);
const navigate = useNavigate(); const navigate = useNavigate();
useEffect(() => { useEffect(() => {
sessionStorage.removeItem('token'); Session.reset();
context.setAuth({ context.resetAuth();
valid: false,
user: {
vatsimId: '',
fullName: '',
administrator: false,
airportConfigurationAccess: [],
},
});
navigate('/'); navigate('/');
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []); }, []);

View File

@@ -3,10 +3,12 @@ import { useNavigate } from 'react-router-dom';
import { Auth } from '../services'; import { Auth } from '../services';
import { User } from '../types'; import { User } from '../types';
const AuthContext = createContext<{ export interface IAuthState {
auth: { valid: boolean; user: User }; valid: boolean,
setAuth: Dispatch<SetStateAction<{ valid: boolean; user: User }>>; user: User,
}>({ auth: { };
const InitialAuthState: IAuthState = {
valid: false, valid: false,
user: { user: {
vatsimId: '', vatsimId: '',
@@ -14,33 +16,29 @@ const AuthContext = createContext<{
administrator: false, administrator: false,
airportConfigurationAccess: [], airportConfigurationAccess: [],
}, },
}, setAuth: () => {} }); };
const AuthContext = createContext<{
auth: IAuthState;
setAuth: Dispatch<SetStateAction<IAuthState>>;
resetAuth: () => void;
}>({ auth: InitialAuthState, setAuth: () => {}, resetAuth: () => {} });
export const AuthProvider = ({ children }: { children: any }) => { export const AuthProvider = ({ children }: { children: any }) => {
const [auth, setAuth] = useState<{ valid: boolean; user: User }>({ const [auth, setAuth] = useState<IAuthState>(InitialAuthState);
valid: false,
user: {
vatsimId: '',
fullName: '',
administrator: false,
airportConfigurationAccess: [],
},
});
const navigate = useNavigate(); const navigate = useNavigate();
const resetAuth = () => setAuth(InitialAuthState);
useEffect(() => { useEffect(() => {
Auth.user().then((user) => { Auth.user().then((user) => {
setAuth({ valid: true, user }); if (user !== undefined) {
setAuth({ valid: true, user });
} else {
setAuth(InitialAuthState);
}
}).catch(() => { }).catch(() => {
setAuth({ setAuth(InitialAuthState);
valid: false,
user: {
vatsimId: '',
fullName: '',
administrator: false,
airportConfigurationAccess: [],
},
});
navigate('/'); navigate('/');
}); });
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -48,7 +46,7 @@ export const AuthProvider = ({ children }: { children: any }) => {
return ( return (
<> <>
<AuthContext.Provider value={{ auth, setAuth }}> <AuthContext.Provider value={{ auth, setAuth, resetAuth }}>
{children} {children}
</AuthContext.Provider> </AuthContext.Provider>
</> </>

View File

@@ -1,10 +1,11 @@
import axios from 'axios'; import axios from 'axios';
import { Configuration } from './configuration'; import { Configuration } from './configuration';
import { Session } from './session';
import { AirportOverview } from '../types'; import { AirportOverview } from '../types';
export class Airport { export class Airport {
static async all(): Promise<AirportOverview[]> { static async all(): Promise<AirportOverview[]> {
const token = sessionStorage.getItem('token'); const token = Session.bearerToken();
if (!token) return []; if (!token) return [];
return axios return axios

View File

@@ -1,18 +1,12 @@
import axios from 'axios'; import axios from 'axios';
import { Configuration } from './configuration'; import { Configuration } from './configuration';
import { Session } from './session';
import { User } from '../types'; import { User } from '../types';
export class Auth { export class Auth {
static async user(): Promise<User> { static async user(): Promise<User | undefined> {
const token = sessionStorage.getItem('token'); const token = Session.bearerToken();
if (!token) { if (!token) return undefined;
return {
vatsimId: '',
fullName: '',
administrator: false,
airportConfigurationAccess: [],
};
}
return axios return axios
.get<User>(`${Configuration.resourceServer}/auth/user`, { .get<User>(`${Configuration.resourceServer}/auth/user`, {
@@ -21,11 +15,6 @@ export class Auth {
}, },
}) })
.then((response) => response.data) .then((response) => response.data)
.catch(() => ({ .catch(() => undefined);
vatsimId: '',
fullName: '',
administrator: false,
airportConfigurationAccess: [],
}));
} }
} }

View File

@@ -1,6 +1,7 @@
import { Airport } from "./airport"; import { Airport } from "./airport";
import { Auth } from './auth'; import { Auth } from './auth';
import { Configuration } from "./configuration"; import { Configuration } from "./configuration";
import { Session } from "./session";
import { System } from './system'; import { System } from './system';
export { Airport, Auth, Configuration, System }; export { Airport, Auth, Configuration, Session, System };

View File

@@ -1,9 +1,10 @@
import axios from 'axios'; import axios from 'axios';
import { Configuration } from './configuration'; import { Configuration } from './configuration';
import { Session } from './session';
export class System { export class System {
static async timestamp(): Promise<number> { static async timestamp(): Promise<number> {
const token = sessionStorage.getItem('token'); const token = Session.bearerToken();
if (!token) return 0; if (!token) return 0;
return axios return axios