bolt.new/app/hooks/useAuth.ts

56 lines
1.4 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 navigate = useNavigate();
useEffect(() => {
const checkAuth = () => {
const token = localStorage.getItem('token');
const storedUser = localStorage.getItem('user');
if (token && storedUser) {
setIsAuthenticated(true);
setUser(JSON.parse(storedUser));
} else {
setIsAuthenticated(false);
setUser(null);
}
setIsLoading(false);
};
checkAuth();
window.addEventListener('storage', checkAuth);
return () => {
window.removeEventListener('storage', checkAuth);
};
}, []);
const login = (token: string, userData: User) => {
localStorage.setItem('token', token);
localStorage.setItem('user', JSON.stringify(userData));
setIsAuthenticated(true);
setUser(userData);
};
const logout = () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
setIsAuthenticated(false);
setUser(null);
navigate('/');
};
return { isAuthenticated, isLoading, user, login, logout };
}