frontend/src/contexts/CASProvider.tsx

62 lines
1.9 KiB
TypeScript
Raw Normal View History

import React, { useState, useEffect, createContext, ReactNode } from 'react';
2020-12-08 19:25:52 +01:00
import { User, Token } from '../types';
2020-11-21 12:57:30 +01:00
import { axiosInstance } from '../utils/axiosInstance';
2020-08-12 04:13:14 +02:00
export interface CASContext {
user?: User;
2020-08-12 04:13:14 +02:00
logout: () => void;
2020-11-21 04:02:38 +01:00
token?: string | null;
2020-08-12 04:13:14 +02:00
}
export const CASContext = createContext<CASContext | undefined>(undefined);
2020-08-12 04:13:14 +02:00
export interface CASProviderProps {
children: ReactNode;
2020-08-12 04:13:14 +02:00
}
export const CASProvider = ({ children }: CASProviderProps) => {
const [user, setUser] = useState<User | undefined>(undefined);
2020-11-21 04:02:38 +01:00
const [token, setToken] = useState<string | null>(null);
2020-08-12 04:13:14 +02:00
useEffect(() => {
2020-11-22 18:22:07 +01:00
const login = async () => {
const urlParams = new URLSearchParams(window.location.search);
const ticket = urlParams.get('ticket');
if (!ticket) {
redirectToCASLoginService();
}
try {
2020-12-12 17:54:13 +01:00
if (!localStorage.getItem('userToken')) {
2020-11-22 18:22:07 +01:00
const { data: token } = await axiosInstance.get(`${process.env.REACT_APP_API_URL}/token?ticket=${ticket}`);
2020-12-12 17:54:13 +01:00
localStorage.setItem('userToken', token.token);
localStorage.setItem('userPrivilige', token.authorityRole);
2020-11-22 18:22:07 +01:00
}
2020-12-12 17:54:13 +01:00
const tokenTMP: any = JSON.parse(localStorage.getItem('userToken') as string);
2020-12-08 19:25:52 +01:00
const token: Token = {
2020-12-10 21:51:01 +01:00
authorityRole: tokenTMP.authorityRole,
email: tokenTMP.email,
id: tokenTMP.id,
token: tokenTMP.token,
2020-12-08 19:25:52 +01:00
};
setToken(token.token);
2020-11-22 18:22:07 +01:00
} catch (e) {
console.log(e);
}
};
2020-08-12 04:13:14 +02:00
login();
}, []);
function logout() {
redirectToCASLogoutService();
}
function redirectToCASLogoutService() {
window.location.replace(`https://cas.amu.edu.pl/cas/logout?service=${window.origin}`);
}
function redirectToCASLoginService() {
window.location.replace(`https://cas.amu.edu.pl/cas/login?service=${window.origin}&locale=pl`);
}
2020-11-21 04:02:38 +01:00
return <CASContext.Provider value={{ user, token, logout }}>{children}</CASContext.Provider>;
2020-08-12 04:13:14 +02:00
};