mirror of
https://github.com/stackblitz/bolt.new
synced 2025-06-26 18:17:50 +00:00
56 lines
1.4 KiB
TypeScript
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 };
|
|
}
|