import { Link, router } from "expo-router"; import { useState } from "react"; import { Alert, Image, KeyboardAvoidingView, Platform, ScrollView, Text, TouchableOpacity, View, } from "react-native"; import ReactNativeModal from "react-native-modal"; import { CustomButton } from "@/components/custom-button"; import { InputField } from "@/components/input-field"; import { OAuth } from "@/components/oauth"; import { icons, images } from "@/constants"; import { fetchAPI } from "@/lib/fetch"; import { useSession } from "@/lib/session"; const ROLES = [ { value: "rider", title: "I need a ride", description: "Book rides and get where you're going", }, { value: "driver", title: "I want to drive", description: "Offer rides and earn money with your car", }, ] as const; type Role = (typeof ROLES)[number]["value"]; const SignUp = () => { const { setSession } = useSession(); const [role, setRole] = useState("rider"); const [form, setForm] = useState({ name: "", email: "", phone: "", password: "", }); const [verification, setVerification] = useState({ state: "default", error: "", code: "", devCode: "", }); const onSignUpPress = async () => { if (!form.name.trim() || !form.email.trim() || !form.password) { Alert.alert( "Missing information", "Please fill in your name, email and password.", ); return; } if (form.phone.trim() && !/^[0-9\s\-()+.]+$/.test(form.phone)) { Alert.alert( "Invalid phone number", "Enter a valid Lebanese number, e.g. 70 123 456.", ); return; } try { const response = await fetchAPI("/(api)/auth/register", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name: form.name, email: form.email, phone: form.phone.trim(), password: form.password, role, }), }); setVerification((prevVerification) => ({ ...prevVerification, state: "pending", devCode: (response as { data?: { devCode?: string } })?.data?.devCode ?? "", })); setForm((prevForm) => ({ ...prevForm, password: "", })); } catch (err: any) { setForm((prevForm) => ({ ...prevForm, password: "", })); Alert.alert("Error", err?.message ?? "Could not create your account."); } }; const onPressVerify = async () => { try { const response = await fetchAPI("/(api)/auth/verify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email: form.email, code: verification.code }), }); await setSession(response.data); setVerification((prevVerification) => ({ ...prevVerification, state: "success", })); } catch (err: any) { setVerification((prevVerification) => ({ ...prevVerification, error: err?.message?.includes("400") ? "Invalid or expired verification code." : err?.message ?? "Verification failed.", state: "failed", })); } }; return ( Car Create Your Account How will you use Waseel? {ROLES.map((option) => { const selected = role === option.value; return ( setRole(option.value)} activeOpacity={0.8} className={`flex-1 justify-center rounded-2xl border p-4 ${ selected ? "border-primary-500 bg-primary-500/10" : "border-neutral-100 bg-neutral-100" }`} > {`${option.title} {option.title} {option.description} ); })} setForm((prevForm) => ({ ...prevForm, name: value, })) } autoCapitalize="words" /> setForm((prevForm) => ({ ...prevForm, email: value, })) } keyboardType="email-address" /> setForm((prevForm) => ({ ...prevForm, phone: value, })) } keyboardType="phone-pad" /> setForm((prevForm) => ({ ...prevForm, password: value, })) } /> Already have an account? Sign in setVerification((prevVerification) => ({ ...prevVerification, state: "success", })) } isVisible={verification.state === "pending"} > Verification We've sent a verification code to {form.email} {verification.devCode ? ( Email delivery is not configured on this server. Your verification code is{" "} {verification.devCode} ) : null} setVerification((prevVerification) => ({ ...prevVerification, code, })) } /> {verification.error && ( {verification.error} )} Check Verified You've succesfully verified your account. router.push("/")} className="mt-5" /> ); }; export default SignUp;