"use client"; import React, { forwardRef, useState } from "react"; import { BaseComponentProps, User } from "../../types"; import { useAuth } from "../../hooks"; import { Button } from "../ui/Button"; export interface LoginButtonProps extends BaseComponentProps { provider: "google" | "kakao" | "naver" | "email"; variant?: "primary" | "secondary" | "outline"; size?: "sm" | "md" | "lg"; disabled?: boolean; onSuccess?: (user: User | null) => void; onError?: (error: Error) => void; callbackUrl?: string; } export const LoginButton = forwardRef( ( { className = "", provider, variant = "outline", size = "md", disabled = false, onSuccess, onError, callbackUrl, children, ...props }, ref ) => { const { signIn, isLoading } = useAuth(); const [isSigningIn, setIsSigningIn] = useState(false); const handleSignIn = async () => { if (isSigningIn || disabled) return; setIsSigningIn(true); try { await signIn(provider, { callbackUrl }); onSuccess?.(null); // We don't have user data immediately after sign in } catch (error) { console.error(`Sign in with ${provider} failed:`, error); onError?.(error as Error); } finally { setIsSigningIn(false); } }; const getProviderIcon = () => { switch (provider) { case "google": return ( ); case "kakao": return ( ); case "naver": return ( ); case "email": return ( ); default: return null; } }; const getProviderName = () => { switch (provider) { case "google": return "Google"; case "kakao": return "Kakao"; case "naver": return "Naver"; case "email": return "Email"; default: return "Provider"; } }; return ( ); } ); LoginButton.displayName = "LoginButton";