1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import { useCallback, useEffect, useState } from "react";
import { apiGetMe, apiLogin, apiLogout } from "../api/client";
import type { User } from "../auth";
export function useAuth(): {
user: User | null;
isLoggedIn: boolean;
isLoading: boolean;
login: (username: string, password: string) => Promise<void>;
logout: () => Promise<void>;
} {
const [user, setUser] = useState<User | null>(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
apiGetMe()
.then((data) => setUser(data?.user ?? null))
.catch(() => setUser(null))
.finally(() => setIsLoading(false));
}, []);
const login = useCallback(async (username: string, password: string) => {
const { user } = await apiLogin(username, password);
setUser(user);
}, []);
const logout = useCallback(async () => {
await apiLogout();
setUser(null);
}, []);
return { user, isLoggedIn: user !== null, isLoading, login, logout };
}
|