import * as React from 'react' import { Anchor, Button, Checkbox, Divider, Group, Paper, PasswordInput, Stack, Text, TextInput, Title, Container, type PaperProps, } from '@mantine/core' import { useToggle, upperFirst } from '@mantine/hooks' interface SocialButtonConfig { label: string icon?: React.ReactNode onClick?: () => void } interface ExtraFieldConfig { name: string label: string placeholder?: string required?: boolean } interface AuthFormSubmitValues { type: 'login' | 'register' email: string password: string [key: string]: unknown } interface AuthFormConfig { /** Título principal de la página */ title?: string /** Botones de autenticación social opcionales */ socialButtons?: SocialButtonConfig[] /** Campos adicionales que se muestran solo en el modo registro */ extraFields?: ExtraFieldConfig[] /** Callback invocado al enviar el formulario */ onSubmit?: (values: AuthFormSubmitValues) => void /** Modo inicial: 'login' (default) o 'register' */ defaultType?: 'login' | 'register' /** Props adicionales para el Paper contenedor */ paperProps?: PaperProps } function AuthForm({ title = 'Welcome', socialButtons = [], extraFields = [], onSubmit, defaultType = 'login', paperProps, }: AuthFormConfig): React.ReactElement { const [type, toggle] = useToggle<'login' | 'register'>([ defaultType, defaultType === 'login' ? 'register' : 'login', ]) const [email, setEmail] = React.useState('') const [password, setPassword] = React.useState('') const [terms, setTerms] = React.useState(true) const [extraValues, setExtraValues] = React.useState>({}) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() onSubmit?.({ type, email, password, ...extraValues }) } const handleExtraChange = (name: string, value: string) => { setExtraValues((prev) => ({ ...prev, [name]: value })) } return ( {title} {socialButtons.length > 0 && ( <> {socialButtons.map((btn) => ( ))} )}
{type === 'register' && extraFields.map((field) => ( handleExtraChange(field.name, e.currentTarget.value)} radius="md" /> ))} setEmail(e.currentTarget.value)} radius="md" /> setPassword(e.currentTarget.value)} radius="md" /> {type === 'register' && ( setTerms(e.currentTarget.checked)} /> )} toggle()} > {type === 'register' ? '¿Ya tienes cuenta? Inicia sesión' : '¿No tienes cuenta? Regístrate'}
{type === 'register' && ( Al registrarte aceptas nuestra{' '} política de privacidad . )}
) } export { AuthForm } export type { AuthFormConfig, AuthFormSubmitValues, SocialButtonConfig, ExtraFieldConfig }