fusero-app-boilerplate/frontend/src/hooks/useAuth.ts
2025-04-30 17:34:49 +02:00

68 lines
1.6 KiB
TypeScript

import { useEffect, useState } from 'react';
import { jwtDecode } from 'jwt-decode';
import { api } from '../services/api';
interface AuthHook {
user: User | null;
login: (username: string, password: string) => Promise<User>;
logout: () => void;
}
type DecodedToken = {
tenantId: string;
};
type Token = {
user: {
id: number;
name: string;
};
roles: string[];
exp: number;
iat: number;
};
const useAuth = (): AuthHook => {
const [user, setUser] = useState<User | null>(null);
useEffect(() => {
const storedUser = localStorage.getItem('user');
if (storedUser) {
setUser(JSON.parse(storedUser));
}
}, []);
const login = async (username: string, password: string): Promise<User> => {
const response = await api('post', '/login', { username, password });
const user = response;
const decodedToken: DecodedToken = jwtDecode(user.data.token);
user.data.tenantId = decodedToken.tenantId;
localStorage.setItem('user', JSON.stringify(user.data));
setUser(user.data.data);
return user.data;
};
const logout = (): void => {
localStorage.removeItem('user');
localStorage.removeItem('connectionId');
setUser(null);
};
return { user, login, logout };
};
export const getExpirationDateFromToken = (token: string) => {
const decoded: Token = jwtDecode(token);
if (decoded && decoded.exp) {
const expirationTimestamp = decoded.exp;
// Convert to miliseconds, Date constructs using miliseconds
return new Date(expirationTimestamp * 1000);
}
return null;
};
export { useAuth };