Files
timetracker/frontend/src/hooks/useAuth.ts
Vadim Sobinin fc886320e3 first commit
2026-02-02 16:14:57 +03:00

78 lines
1.8 KiB
TypeScript

import { useState, useEffect, useCallback } from 'react';
import { apiRequest, setToken, clearToken } from '../api/client';
interface User {
id: string;
username: string;
}
interface AuthState {
user: User | null;
isLoading: boolean;
isAuthenticated: boolean;
}
export function useAuth() {
const [state, setState] = useState<AuthState>({
user: null,
isLoading: true,
isAuthenticated: false,
});
const checkAuth = useCallback(async () => {
const token = localStorage.getItem('token');
if (!token) {
setState({ user: null, isLoading: false, isAuthenticated: false });
return;
}
try {
const user = await apiRequest<User>('/auth/me');
setState({ user, isLoading: false, isAuthenticated: true });
} catch {
clearToken();
setState({ user: null, isLoading: false, isAuthenticated: false });
}
}, []);
useEffect(() => {
checkAuth();
}, [checkAuth]);
const login = async (username: string, password: string) => {
const { token, user } = await apiRequest<{ token: string; user: User }>(
'/auth/login',
{
method: 'POST',
body: JSON.stringify({ username, password }),
}
);
setToken(token);
setState({ user, isLoading: false, isAuthenticated: true });
};
const register = async (username: string, password: string) => {
const { token, user } = await apiRequest<{ token: string; user: User }>(
'/auth/register',
{
method: 'POST',
body: JSON.stringify({ username, password }),
}
);
setToken(token);
setState({ user, isLoading: false, isAuthenticated: true });
};
const logout = () => {
clearToken();
setState({ user: null, isLoading: false, isAuthenticated: false });
};
return {
...state,
login,
register,
logout,
};
}