import React, { useState, useMemo } from "react"; import { E_PASSWORD_STRENGTH } from "@plane/constants"; import { Button } from "../button/button"; import { Spinner } from "../spinners/circular-spinner"; import { cn } from "../utils"; import { AuthConfirmPasswordInput } from "./auth-confirm-password-input"; import { AuthForgotPassword } from "./auth-forgot-password"; import { AuthInput } from "./auth-input"; import { AuthPasswordInput } from "./auth-password-input"; export type AuthMode = "sign-in" | "sign-up"; export interface AuthFormData { email: string; password: string; confirmPassword?: string; } export interface AuthFormProps { mode: AuthMode; initialData?: Partial; onSubmit?: (data: AuthFormData) => void; onForgotPassword?: () => void; onModeChange?: (mode: AuthMode) => void; loading?: boolean; disabled?: boolean; className?: string; showForgotPassword?: boolean; showPasswordStrength?: boolean; emailError?: string; passwordError?: string; confirmPasswordError?: string; submitButtonText?: string; alternateModeText?: string; alternateModeButtonText?: string; } export const AuthForm: React.FC = ({ mode, initialData = {}, onSubmit, onForgotPassword, onModeChange, loading = false, disabled = false, className = "", showForgotPassword = true, showPasswordStrength = true, emailError, passwordError, confirmPasswordError, submitButtonText, alternateModeText, alternateModeButtonText, }) => { const [formData, setFormData] = useState({ email: initialData.email || "", password: initialData.password || "", confirmPassword: initialData.confirmPassword || "", }); const [passwordStrength, setPasswordStrength] = useState(E_PASSWORD_STRENGTH.EMPTY); const [_passwordsMatch, setPasswordsMatch] = useState(false); const handleInputChange = (field: keyof AuthFormData) => (e: React.ChangeEvent) => { setFormData((prev) => ({ ...prev, [field]: e.target.value, })); }; const handlePasswordChange = (password: string) => { setFormData((prev) => ({ ...prev, password, })); }; const handlePasswordStrengthChange = (strength: E_PASSWORD_STRENGTH) => { setPasswordStrength(strength); }; const handleConfirmPasswordChange = (matches: boolean) => { setPasswordsMatch(matches); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (onSubmit && isFormValid) { onSubmit(formData); } }; const handleModeChange = () => { const newMode = mode === "sign-in" ? "sign-up" : "sign-in"; onModeChange?.(newMode); }; const isFormValid = useMemo(() => { const hasEmail = formData.email.length > 0; const hasPassword = formData.password.length > 0; if (mode === "sign-in") { return hasEmail && hasPassword && !loading && !disabled; } else { const isPasswordStrong = passwordStrength === E_PASSWORD_STRENGTH.STRENGTH_VALID; const passwordsMatch = formData.password === formData.confirmPassword && formData.password.length > 0; return hasEmail && hasPassword && isPasswordStrong && passwordsMatch && !loading && !disabled; } }, [mode, formData, passwordStrength, loading, disabled]); const getSubmitButtonText = () => { if (submitButtonText) return submitButtonText; return mode === "sign-in" ? "Sign In" : "Create Account"; }; const getAlternateModeText = () => { if (alternateModeText) return alternateModeText; return mode === "sign-in" ? "Don't have an account?" : "Already have an account?"; }; const getAlternateModeButtonText = () => { if (alternateModeButtonText) return alternateModeButtonText; return mode === "sign-in" ? "Sign Up" : "Sign In"; }; return (
{/* Email Input */} {/* Password Input */} {/* Confirm Password Input (Sign Up Only) */} {mode === "sign-up" && ( )} {/* Forgot Password Link (Sign In Only) */} {mode === "sign-in" && showForgotPassword && (
)} {/* Submit Button */}
{/* Alternate Mode Button */} {onModeChange && (
{getAlternateModeText()}
)}
); };