import { ComponentType, FC, useCallback, useEffect, useMemo, useRef, useState } from "react" // eslint-disable-next-line no-restricted-imports import { Image, ImageStyle, TextInput, TextStyle, View, ViewStyle } from "react-native" import { useFocusEffect } from "@react-navigation/native" import { Button } from "@/components/Button" import { Icon, PressableIcon } from "@/components/Icon" import { Screen } from "@/components/Screen" import { Text } from "@/components/Text" import { TextField, type TextFieldAccessoryProps } from "@/components/TextField" import { useAuth } from "@/context/AuthContext" import type { AppStackScreenProps } from "@/navigators/navigationTypes" import { useAppTheme } from "@/theme/context" import type { ThemedStyle } from "@/theme/types" import { s } from "@/utils/responsive" interface RegisterScreenProps extends AppStackScreenProps<"Register"> {} export const RegisterScreen: FC = ({ navigation }) => { const usernameInput = useRef(null) const emailInput = useRef(null) const passwordInput = useRef(null) const verificationCodeInput = useRef(null) const [username, setUsername] = useState("") const [email, setEmail] = useState("") const [password, setPassword] = useState("") const [verificationCode, setVerificationCode] = useState("") const [isPasswordHidden, setIsPasswordHidden] = useState(true) const [resendCountdown, setResendCountdown] = useState(0) const { registerStep, pendingEmail, isLoading, error, preRegister, resendRegisterCode, verifyRegister, resetRegisterStep, googleLogin, clearError, } = useAuth() const { themed, theme: { colors }, } = useAppTheme() // Validation const usernameError = useMemo(() => { if (!username || username.length === 0) return "" if (username.length < 3) return "Username must be at least 3 characters" if (username.length > 30) return "Username must be less than 30 characters" return "" }, [username]) const emailError = useMemo(() => { if (!email || email.length === 0) return "" if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return "Please enter a valid email" return "" }, [email]) // Password validation - requires uppercase, lowercase, number, and special character const passwordError = useMemo(() => { if (!password || password.length === 0) return "" if (password.length < 8) return "Password must be at least 8 characters" if (!/[A-Z]/.test(password)) return "Password must contain an uppercase letter" if (!/[a-z]/.test(password)) return "Password must contain a lowercase letter" if (!/[0-9]/.test(password)) return "Password must contain a number" if (!/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/.test(password)) return "Password must contain a special character" return "" }, [password]) // Countdown timer for resend button useEffect(() => { if (resendCountdown > 0) { const timer = setTimeout(() => setResendCountdown(resendCountdown - 1), 1000) return () => clearTimeout(timer) } return undefined }, [resendCountdown]) // Clear error when screen comes into focus (e.g., navigating from login screen) useFocusEffect( useCallback(() => { clearError() }, [clearError]), ) // Clear error when inputs change (not when error changes) const prevInputsRef = useRef({ username, email, password, verificationCode }) useEffect(() => { const prev = prevInputsRef.current // Only clear error if one of the input fields actually changed if ( prev.username !== username || prev.email !== email || prev.password !== password || prev.verificationCode !== verificationCode ) { if (error) clearError() prevInputsRef.current = { username, email, password, verificationCode } } }, [username, email, password, verificationCode, error, clearError]) // Handle pre-register (step 1) const handlePreRegister = useCallback(async () => { if (!username || usernameError || !email || emailError || !password || passwordError) return const success = await preRegister(username, password, email) if (success) { setResendCountdown(60) } }, [username, usernameError, email, emailError, password, passwordError, preRegister]) // Handle verify register (step 2) const handleVerifyRegister = useCallback(async () => { if (!verificationCode || verificationCode.length !== 6) return await verifyRegister(verificationCode) }, [verificationCode, verifyRegister]) // Handle resend code const handleResendCode = useCallback(async () => { if (resendCountdown > 0) return const success = await resendRegisterCode() if (success) { setResendCountdown(60) } }, [resendCountdown, resendRegisterCode]) // Handle back to credentials step const handleBackToCredentials = useCallback(() => { resetRegisterStep() setVerificationCode("") }, [resetRegisterStep]) // Navigate to login const handleGoToLogin = useCallback(() => { navigation.navigate("Login") }, [navigation]) // Handle Google login const handleGoogleLogin = useCallback(async () => { await googleLogin() }, [googleLogin]) // Password visibility toggle const PasswordRightAccessory: ComponentType = useMemo( () => function PasswordRightAccessory(props: TextFieldAccessoryProps) { return ( setIsPasswordHidden(!isPasswordHidden)} /> ) }, [isPasswordHidden, colors.palette.neutral800], ) // Render credentials step (step 1) const renderCredentialsStep = () => ( <> {error ? : null} emailInput.current?.focus()} /> passwordInput.current?.focus()} />