import { useEffect, useState } from "react"; import { Link, useNavigate, useParams } from "react-router-dom"; import axiosInstance, { baseURL } from "../api/axiosInstance"; import LoadingSpinner from "../components/LoadingSpinner"; import ArtistView from "../components/userProfile/ArtistView"; import ListenerView from "../components/userProfile/ListenerView"; import UserListModal from "../components/userProfile/UserListModal"; import { useAuth } from "../context/authContext"; import { getErrorMessage } from "../utils/error"; import type { ArtistContribution, BaseNonAdminUser, MusicalEntity, Playlist, } from "../utils/types"; import { useCreatedPlaylists } from "../context/playlistContext"; interface FollowStatus { isFollowing: boolean; followerCount: number; followingCount: number; } interface Artist extends BaseNonAdminUser { userType: "ARTIST"; contributions: ArtistContribution[]; } interface Listener extends BaseNonAdminUser { userType: "LISTENER"; likedEntities: MusicalEntity[]; createdPlaylists: Playlist[]; savedPlaylists: Playlist[]; } type UserProfile = Artist | Listener; const UserDetail = () => { const { username: usernameParam } = useParams(); const { user: currentUser } = useAuth(); const { createdPlaylists: currentUserCreatedPlaylists } = useCreatedPlaylists(); const navigate = useNavigate(); const [user, setUser] = useState(null); const [error, setError] = useState(null); const [showModal, setShowModal] = useState(false); const [modalTitle, setModalTitle] = useState(""); const [modalUsers, setModalUsers] = useState([]); const [isLoadingModal, setIsLoadingModal] = useState(false); const [isFollowing, setIsFollowing] = useState(false); const username = usernameParam || currentUser?.username; const isOwnProfile = currentUser?.username === username; if (!usernameParam && !currentUser) { return (

You must be logged in to view your profile.

); } const handleFollow = async () => { if (!user) return; setIsFollowing(true); try { const response = await axiosInstance.post( `/users/na/${username}/follow`, ); setUser((prev) => { if (!prev) return null; return { ...prev, isFollowedByCurrentUser: response.data.isFollowing, followers: response.data.followerCount, following: response.data.followingCount, }; }); } catch (err: any) { setError(getErrorMessage(err)); } finally { setIsFollowing(false); } }; const handleFollowInModal = async (targetUsername: string) => { try { const response = await axiosInstance.post( `/users/na/${targetUsername}/follow`, ); setModalUsers((prevUsers) => prevUsers.map((u) => u.username === targetUsername ? { ...u, isFollowedByCurrentUser: response.data.isFollowing } : u, ), ); } catch (err: any) { setError(getErrorMessage(err)); } }; const displayFollowers = async () => { setIsLoadingModal(true); try { const response = await axiosInstance.get( `/users/na/${username}/followers`, ); setModalUsers(response.data); setModalTitle("Followers"); setShowModal(true); } catch (err) { setError(getErrorMessage(err)); } finally { setIsLoadingModal(false); } }; const displayFollowing = async () => { setIsLoadingModal(true); try { const response = await axiosInstance.get( `/users/na/${username}/following`, ); setModalUsers(response.data); setModalTitle("Following"); setShowModal(true); } catch (err: any) { setError(getErrorMessage(err)); } finally { setIsLoadingModal(false); } }; useEffect(() => { const fetchUser = async () => { setError(null); setUser(null); try { const response = await axiosInstance.get(`/users/na/${username}`); setUser(response.data); } catch (err: any) { setError(getErrorMessage(err)); } }; fetchUser(); }, [username]); if (error) { return (

{error}

← Back to Home
); } if (!user) { return ; } return (
{isLoadingModal && (
)}
{/* Back link */} Back to Home {/* Hero section */}
{/* Profile photo */}
{user.profilePhoto ? ( {user.fullName} ) : (
{user.fullName.charAt(0).toUpperCase()}
)}
{/* User info */}
{user.userType === "ARTIST" ? "Artist" : "Listener"} • Profile

{user.fullName}

@{user.username}

{/* Stats */}
{user.followers} Followers
{user.following} Following
{/* Follow button - hidden on own profile */} {!isOwnProfile && (
)}
{/* Content */} {user.userType === "ARTIST" ? ( ) : ( )} {showModal && ( setShowModal(false)} onFollowToggle={handleFollowInModal} /> )}
); }; export default UserDetail;