import { AuthService } from "@/services";
import { useAuthStore } from "@/stores";
import { tokenStorage, TokenUtils } from "@/utils";
import { cookieStorage } from "@/utils/cookieStorage";
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();
const refreshToken = await cookieStorage.getRefreshToken();
if (accessToken && refreshToken) {
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,
};
}