import { useEffect, useState } from "react"; import { useNavigate } from "react-router"; import axiosInstance, { scheduleTokenRefresh } from "./api/axiosInstance"; import { useAuth } from "./context/authContext"; import type { User } from "./types"; const Register = () => { const { setUser } = useAuth(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [fullname, setFullname] = useState(""); const [email, setEmail] = useState(""); const [profilePhotoFile, setProfilePhotoFile] = useState(null); const [previewProfilePhoto, setPreviewProfilePhoto] = useState( null, ); const navigate = useNavigate(); useEffect(() => { return () => { if (previewProfilePhoto) { URL.revokeObjectURL(previewProfilePhoto); } }; }, [previewProfilePhoto]); const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); // todo: add proper error handling if (profilePhotoFile && profilePhotoFile.size > 5 * 1024 * 1024) { alert("Max file size is 5MB"); return; } if (profilePhotoFile && !profilePhotoFile.type.startsWith("image/")) { alert("Only images allowed"); return; } const formData = new FormData(); if (profilePhotoFile) formData.append("profilePhoto", profilePhotoFile); formData.append("username", username); formData.append("fullname", fullname); formData.append("email", email); formData.append("password", password); try { const response = await axiosInstance.post<{ user: User; tokenExpiresIn: number; }>("/auth/register", formData); scheduleTokenRefresh(response.data.tokenExpiresIn); setUser(response.data.user); navigate("/"); } catch (error) { console.error("Registration failed:", error); } }; return (

Register

setUsername(e.target.value)} />
setPassword(e.target.value)} />
setFullname(e.target.value)} />
setEmail(e.target.value)} />
{profilePhotoFile ? profilePhotoFile.name : "No file chosen"}
{ if (e.target.files && e.target.files[0]) { setProfilePhotoFile(e.target.files[0]); setPreviewProfilePhoto(URL.createObjectURL(e.target.files[0])); } }} />
{previewProfilePhoto && (

Profile Photo Preview:

Profile Preview
)}
); }; export default Register;