Refactor useLogin hook

Refactor the useLogin hook to separate login and table setup logic for better maintainability.
This commit is contained in:
gpt-engineer-app[bot]
2025-03-15 13:11:33 +00:00
parent f335a381e3
commit 9ab2bf722a
4 changed files with 126 additions and 44 deletions

View File

@@ -3,7 +3,12 @@ import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { useToast } from "@/hooks/useToast.wrapper";
import { useAuth } from "@/contexts/auth";
import { createRequiredTables } from "@/lib/supabase/setup";
import { useTableSetup } from "@/hooks/useTableSetup";
import {
getLoginErrorMessage,
showLoginErrorToast,
isCorsOrJsonError
} from "@/utils/auth/loginUtils";
export function useLogin() {
const [email, setEmail] = useState("");
@@ -11,10 +16,11 @@ export function useLogin() {
const [showPassword, setShowPassword] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const [loginError, setLoginError] = useState<string | null>(null);
const [isSettingUpTables, setIsSettingUpTables] = useState(false);
const navigate = useNavigate();
const { toast } = useToast();
const { signIn } = useAuth();
const { isSettingUpTables, setupTables } = useTableSetup();
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
@@ -36,50 +42,12 @@ export function useLogin() {
if (error) {
console.error("로그인 실패:", error);
let errorMessage = "로그인에 실패했습니다.";
// Supabase 오류 메시지 처리
if (error.message) {
if (error.message.includes("Invalid login credentials")) {
errorMessage = "이메일 또는 비밀번호가 올바르지 않습니다.";
} else if (error.message.includes("Email not confirmed")) {
errorMessage = "이메일 인증이 완료되지 않았습니다. 이메일을 확인해주세요.";
} else if (error.message.includes("JSON")) {
errorMessage = "서버 응답 오류: JSON 파싱 실패. 네트워크 연결이나 CORS 설정을 확인하세요.";
} else if (error.message.includes("CORS") || error.message.includes("프록시")) {
errorMessage = "CORS 오류: 프록시 설정을 확인하거나 다른 프록시를 시도해보세요.";
} else if (error.message.includes("fetch") || error.message.includes("네트워크")) {
errorMessage = "네트워크 오류: 서버 연결에 실패했습니다.";
} else {
errorMessage = `오류: ${error.message}`;
}
}
const errorMessage = getLoginErrorMessage(error);
setLoginError(errorMessage);
toast({
title: "로그인 실패",
description: errorMessage,
variant: "destructive"
});
showLoginErrorToast(errorMessage);
} else if (user) {
// 로그인 성공 시 필요한 테이블 설정
try {
setIsSettingUpTables(true);
const { success, message } = await createRequiredTables();
if (success) {
console.log("테이블 설정 성공:", message);
} else {
console.warn("테이블 설정 문제:", message);
// 테이블 설정 실패해도 로그인은 진행
}
} catch (setupError) {
console.error("테이블 설정 중 오류:", setupError);
} finally {
setIsSettingUpTables(false);
}
await setupTables();
navigate("/");
} else {
// user가 없지만 error도 없는 경우 (드문 경우)
@@ -117,6 +85,7 @@ export function useLogin() {
isSettingUpTables,
loginError,
setLoginError,
handleLogin
handleLogin,
isCorsOrJsonError: (msg: string | null) => isCorsOrJsonError(msg)
};
}