"use client"; import { useRef, useState } from "react"; import { createPortal } from "react-dom"; import { GoogleLogin } from "@react-oauth/google"; import { useEscapeKey, useFocusTrap, useBodyScrollLock } from "@/lib/hooks/useModalA11y"; interface LoginMenuProps { onGoogleSuccess: (credential: string) => void; } export default function LoginMenu({ onGoogleSuccess }: LoginMenuProps) { const [open, setOpen] = useState(false); const [errorMsg, setErrorMsg] = useState(null); const dialogRef = useRef(null); const titleId = "login-dialog-title"; // #283 — 모달 접근성: ESC / focus trap / body scroll lock useEscapeKey(open, () => setOpen(false)); useFocusTrap(open, dialogRef); useBodyScrollLock(open); const handleSuccess = (res: { credential?: string }) => { setErrorMsg(null); if (res.credential) { onGoogleSuccess(res.credential); setOpen(false); } }; return ( <> {open && createPortal(
{ if (e.target === e.currentTarget) setOpen(false); }} >

로그인

소셜 계정으로 간편 로그인

{errorMsg && (

{errorMsg}

)}
setErrorMsg("Google 로그인에 실패했습니다. 팝업 차단 또는 네트워크 상태를 확인해주세요.")} size="large" width="260" text="signin_with" />
, document.body, )} ); }