import { type Component, createSignal, Show } from "solid-js"; import { useNavigate } from "@solidjs/router"; import { useAuth } from "@/context/AuthContext"; import { validatePassword, validateUsername } from "@/utils/userValidators"; import { authApi, type RegisterPatientRequest, type RegisterTherapistRequest, } from "@/api/auth"; type UserType = "patient" | "therapist"; interface RegisterProps { onSwitchToLogin: () => void; } const Register: Component = (props) => { const [userType, setUserType] = createSignal("patient"); const [error, setError] = createSignal(""); const [isLoading, setIsLoading] = createSignal(false); const navigate = useNavigate(); const { login } = useAuth(); const [regUsername, setRegUsername] = createSignal(""); const [regPassword, setRegPassword] = createSignal(""); const [regConfirmPassword, setRegConfirmPassword] = createSignal(""); const [regName, setRegName] = createSignal(""); const [regSurname, setRegSurname] = createSignal(""); const [regEmail, setRegEmail] = createSignal(""); const [regOfficeLocation, setRegOfficeLocation] = createSignal(""); const [regDegree, setRegDegree] = createSignal(""); const [regYearsExp, setRegYearsExp] = createSignal(""); const [regPhoneNumber, setRegPhoneNumber] = createSignal(""); const handleRegister = async (e: Event) => { e.preventDefault(); setError(""); const trimmedUsername = regUsername().trim(); const trimmedEmail = regEmail().trim(); const trimmedName = regName().trim(); const trimmedSurname = regSurname().trim(); const usernameValidation = validateUsername(trimmedUsername); if (!usernameValidation.isValid) { setError(usernameValidation.errors.join("\n")); return; } if (regPassword() !== regConfirmPassword()) { setError("Passwords do not match"); return; } const passwordValidation = validatePassword(regPassword()); if (!passwordValidation.isValid) { setError(passwordValidation.errors.join("\n")); return; } setIsLoading(true); try { let response; if (userType() === "patient") { const data: RegisterPatientRequest = { username: trimmedUsername, password: regPassword(), name: trimmedName, surname: trimmedSurname, email: trimmedEmail, }; response = await authApi.registerPatient(data); } else { const yearsExpNum = Number.parseInt(regYearsExp()); if (Number.isNaN(yearsExpNum) || yearsExpNum < 0) { setError("Please enter a valid number of years of experience"); setIsLoading(false); return; } const trimmedOfficeLocation = regOfficeLocation().trim(); const trimmedDegree = regDegree().trim(); const trimmedPhoneNumber = regPhoneNumber().trim(); const data: RegisterTherapistRequest = { username: trimmedUsername, password: regPassword(), name: trimmedName, surname: trimmedSurname, email: trimmedEmail, officeLocation: trimmedOfficeLocation, degree: trimmedDegree, yearsExp: yearsExpNum, phoneNumber: trimmedPhoneNumber, }; response = await authApi.registerTherapist(data); } login(response); navigate("/"); } catch (err) { setError( err instanceof Error ? err.message : "Error has occurred during registration. Please try again.", ); } finally { setIsLoading(false); } }; return (
{error() && (
{error()}
)}
setRegName(e.currentTarget.value)} />
setRegSurname(e.currentTarget.value)} />
setRegUsername(e.currentTarget.value)} />

3-50 characters. Letters, numbers, dots, hyphens, and underscores only.

setRegEmail(e.currentTarget.value)} />
setRegPassword(e.currentTarget.value)} />

Password must contain:

  • At least 8 characters (max 128)
  • One uppercase letter (A-Z)
  • One lowercase letter (a-z)
  • One number (0-9)
  • One special character (!@#$%^&*...)
setRegConfirmPassword(e.currentTarget.value)} />

Professional Information

setRegDegree(e.currentTarget.value)} />
setRegYearsExp(e.currentTarget.value)} />
setRegOfficeLocation(e.currentTarget.value)} />
setRegPhoneNumber(e.currentTarget.value)} />
Already have an account?
); }; export default Register;