Ramble-FE / hooks / useAuth.ts
useAuth.ts
Raw
import { AuthService } from "@/services";
import { useAuthStore } from "@/stores";
import { tokenStorage, TokenUtils } from "@/utils";
import { useCallback, useEffect } from "react";

export function useAuth() {
    const { isAuthenticated, isLoading, setAuthenticated, setLoading, clear } = useAuthStore();

    useEffect(() => {
        (async () => {
            setLoading(true);

            try {
                const accessToken = await tokenStorage.getAccessToken();

                if (accessToken && accessToken.trim() !== "") {
                    if (!TokenUtils.isTokenExpired(accessToken)) {
                        setAuthenticated(true);
                    } else {
                        const reissueResult = await AuthService.reissueToken();
                        setAuthenticated(reissueResult.success);
                        
                        if (!reissueResult.success) {
                            console.warn("토큰 재발급 실패");
                            clear();
                        }
                    }
                }
            } catch (error) {
                console.error("Authentication error:", error);
                clear();
            } finally {
                setLoading(false);
            }
        })();
    }, [setAuthenticated, setLoading, clear]);

    const login = useCallback(
        async (success: boolean) => {
            setAuthenticated(success);
        },
        [setAuthenticated]
    );

    const logout = useCallback(async () => {
        await AuthService.logout();
        clear();
    }, [clear]);

    const loginError = useCallback((error: unknown) => {
        console.error("Login error:", error);
        clear();
    }, [clear]);

    return {
        isAuthenticated,
        isLoading,
        login,
        logout,
        loginError,
    };
}