Refactored store

This commit is contained in:
cracklesparkle
2024-06-25 15:56:00 +09:00
parent 85f97e9e0e
commit 18fb120777
15 changed files with 205 additions and 113 deletions

View File

@ -1,50 +1,83 @@
import { create } from 'zustand';
import { TOKEN_AUTH_KEY, TOKEN_EXPIRY_DURATION, TOKEN_ISSUED_DATE_KEY, USER_DATA_KEY } from '../constants';
import { AuthState } from '../interfaces/auth';
import AuthService from '../services/AuthService';
export interface UserData {
id: number;
email: string;
login: string;
phone: string;
name: string;
surname: string;
is_active: boolean;
role_id: number;
}
interface AuthState {
isAuthenticated: boolean;
token: string | null;
login: (token: string) => void;
logout: () => void;
initializeAuth: () => void;
userData: UserData | {};
getUserData: () => UserData;
setUserData: (userData: string) => void;
}
export const useAuthStore = create<AuthState>((set) => ({
export const useAuthStore = create<AuthState>((set, get) => ({
isAuthenticated: false,
token: null,
login: (token: string) => {
localStorage.setItem('authToken', token);
set({ isAuthenticated: true, token });
},
logout: () => {
localStorage.removeItem('authToken');
set({ isAuthenticated: false, token: null });
},
initializeAuth: () => {
const token = localStorage.getItem('authToken');
if (token) {
set({ isAuthenticated: true, token });
}
},
userData: {},
setUserData: (userData: string) => {
localStorage.setItem('userData', userData)
},
getUserData: () => {
const userData = localStorage.getItem('userData')
return JSON.parse(userData || "")
}));
const login = (token: string) => {
const issuedDate = Date.now();
localStorage.setItem(TOKEN_AUTH_KEY, token);
localStorage.setItem(TOKEN_ISSUED_DATE_KEY, issuedDate.toString());
useAuthStore.setState(() => ({ isAuthenticated: true, token: token }))
}
const logout = () => {
localStorage.removeItem(TOKEN_AUTH_KEY);
localStorage.removeItem(USER_DATA_KEY);
localStorage.removeItem(TOKEN_ISSUED_DATE_KEY);
useAuthStore.setState(() => ({ isAuthenticated: false, token: null, userData: {} }));
}
const initAuth = async () => {
const token = localStorage.getItem(TOKEN_AUTH_KEY);
const issuedDate = parseInt(localStorage.getItem(TOKEN_ISSUED_DATE_KEY) || '0', 10);
const currentTime = Date.now();
if (token && issuedDate) {
if (currentTime - issuedDate < TOKEN_EXPIRY_DURATION) {
useAuthStore.setState(() => ({ isAuthenticated: true, token: token }))
} else {
console.log("refreshing token")
try {
await refreshToken();
} catch (error) {
console.error('Token refresh failed:', error);
logout();
}
}
} else {
logout()
}
}));
}
const refreshToken = async () => {
const token = useAuthStore.getState().token
if (!token) throw new Error('No token to refresh');
try {
const response = await AuthService.refreshToken(token)
const newToken = response.data.access_token;
const newIssuedDate = Date.now();
localStorage.setItem(TOKEN_AUTH_KEY, newToken);
localStorage.setItem(TOKEN_ISSUED_DATE_KEY, newIssuedDate.toString());
useAuthStore.setState(() => ({ token: newToken }))
} catch (error) {
console.error('Failed to refresh token:', error);
logout();
}
}
const getUserData = () => {
const userData = localStorage.getItem(USER_DATA_KEY)
return userData ? JSON.parse(userData) : {}
}
const setUserData = (userData: string) => {
const parsedData = JSON.parse(userData)
localStorage.setItem(USER_DATA_KEY, userData)
useAuthStore.setState(() => ({ userData: parsedData }))
}
export {
getUserData,
setUserData,
refreshToken,
initAuth,
login,
logout
}