Files
bolt.new/app/hooks/useAuth.ts

61 lines
1.6 KiB
TypeScript

import { useState, useEffect } from 'react';
import { useNavigate } from '@remix-run/react';
export interface User {
id: number;
phone: string;
nickname: string;
avatarUrl: string;
}
export function useAuth() {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [user, setUser] = useState<User | null>(null);
const [token, setToken] = useState<string | null>(null);
const navigate = useNavigate();
useEffect(() => {
const checkAuth = () => {
const storedToken = localStorage.getItem('token');
const storedUser = localStorage.getItem('user');
if (storedToken && storedUser) {
setIsAuthenticated(true);
setUser(JSON.parse(storedUser));
setToken(storedToken);
} else {
setIsAuthenticated(false);
setUser(null);
setToken(null);
}
setIsLoading(false);
};
checkAuth();
window.addEventListener('storage', checkAuth);
return () => {
window.removeEventListener('storage', checkAuth);
};
}, []);
const login = (newToken: string, userData: User) => {
localStorage.setItem('token', newToken);
localStorage.setItem('user', JSON.stringify(userData));
setIsAuthenticated(true);
setUser(userData);
setToken(newToken);
};
const logout = () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
setIsAuthenticated(false);
setUser(null);
setToken(null);
navigate('/');
};
return { isAuthenticated, isLoading, user, token, login, logout };
}