import { useForm } from "@tanstack/react-form"; import { Button, FieldError, Input, Label, Spinner, Surface, TextField, useToast, } from "heroui-native"; import { useRef } from "react"; import { Text, TextInput, View } from "react-native"; import z from "zod"; import { authClient } from "@/lib/auth-client"; const signUpSchema = z.object({ name: z.string().trim().min(1, "Name is required").min(2, "Name must be at least 2 characters"), email: z.string().trim().min(1, "Email is required").email("Enter a valid email address"), password: z.string().min(1, "Password is required").min(8, "Use at least 8 characters"), }); function getErrorMessage(error: unknown): string | null { if (!error) return null; if (typeof error === "string") { return error; } if (Array.isArray(error)) { for (const issue of error) { const message = getErrorMessage(issue); if (message) { return message; } } return null; } if (typeof error === "object" && error !== null) { const maybeError = error as { message?: unknown }; if (typeof maybeError.message === "string") { return maybeError.message; } } return null; } export function SignUp() { const emailInputRef = useRef(null); const passwordInputRef = useRef(null); const { toast } = useToast(); const form = useForm({ defaultValues: { name: "", email: "", password: "", }, validators: { onSubmit: signUpSchema, }, onSubmit: async ({ value, formApi }) => { await authClient.signUp.email( { name: value.name.trim(), email: value.email.trim(), password: value.password, }, { onError(error) { toast.show({ variant: "danger", label: error.error?.message || "Failed to sign up", }); }, onSuccess() { formApi.reset(); toast.show({ variant: "success", label: "Account created successfully", }); }, }, ); }, }); return ( Create Account ({ isSubmitting: state.isSubmitting, validationError: getErrorMessage(state.errorMap.onSubmit), })} > {({ isSubmitting, validationError }) => { const formError = validationError; return ( <> {formError} {(field) => ( { emailInputRef.current?.focus(); }} /> )} {(field) => ( { passwordInputRef.current?.focus(); }} /> )} {(field) => ( )} ); }} ); }