import { useEffect, useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import { toast } from "react-toastify"; import axiosInstance, { scheduleTokenRefresh } from "../api/axiosInstance"; import { useAuth } from "../context/authContext"; import type { User, UserRegisterType } from "../utils/types"; const Register = () => { const { setUser } = useAuth(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [fullname, setFullname] = useState(""); const [userType, setUserType] = useState([]); const [email, setEmail] = useState(""); const [profilePhotoFile, setProfilePhotoFile] = useState(null); const [previewProfilePhoto, setPreviewProfilePhoto] = useState( null, ); const [error, setError] = useState(null); const navigate = useNavigate(); useEffect(() => { return () => { if (previewProfilePhoto) { URL.revokeObjectURL(previewProfilePhoto); } }; }, [previewProfilePhoto]); const handleRemoveFile = () => { if (previewProfilePhoto) { URL.revokeObjectURL(previewProfilePhoto); } setProfilePhotoFile(null); setPreviewProfilePhoto(null); }; const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); if (profilePhotoFile && profilePhotoFile.size > 5 * 1024 * 1024) { toast.error("Max file size is 5MB"); return; } if ( username === "" || password === "" || fullname === "" || email === "" || userType.length === 0 ) { setError("Please fill in all required fields."); return; } if (profilePhotoFile && !profilePhotoFile.type.startsWith("image/")) { toast.error("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); userType.forEach((type) => formData.append("userType", type)); try { const response = await axiosInstance.post<{ user: User; tokenExpiresIn: number; }>("/auth/register", formData); scheduleTokenRefresh(response.data.tokenExpiresIn); setUser(response.data.user); navigate("/"); toast.success("Registration successful!"); } catch (error: any) { const errorMessage = error.response?.data?.error || "Please try again."; setError(`Registration failed: ${errorMessage}`); } }; return (

Create Account

Join FinkWave and discover music

{error && (

{error}

)}
setUsername(e.target.value)} />
setPassword(e.target.value)} />
setFullname(e.target.value)} />
setEmail(e.target.value)} />
{/* Profile Photo - PublishSong style */}
{previewProfilePhoto ? (
Profile Preview
) : ( )} { if (e.target.files && e.target.files[0]) { setProfilePhotoFile(e.target.files[0]); setPreviewProfilePhoto( URL.createObjectURL(e.target.files[0]), ); } }} />

Max size: 2MB

JPG, PNG, or WebP

Already have an account?{" "} Log in

); }; export default Register;