import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import axiosInstance from "../api/axiosInstance"; import ArtistView from "../components/userProfile/ArtistView"; import ListenerView from "../components/userProfile/ListenerView"; import UserListModal from "../components/userProfile/UserListModal"; import { handleError } from "../utils/error"; import type { MusicalEntity, Playlist, ArtistContribution, BaseNonAdminUser, } from "../utils/types"; 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 = () => { // user refers to the selected user NOT to the user from context const baseURL = import.meta.env.VITE_API_BASE_URL; const { username } = useParams(); 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 handleFollow = async () => { if (!user) return; setIsFollowing(true); try { const response = await axiosInstance.post( `/users/${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(handleError(err)); } finally { setIsFollowing(false); } }; const handleFollowInModal = async (targetUsername: string) => { try { const response = await axiosInstance.post( `/users/${username}/follow`, ); setModalUsers((prevUsers) => prevUsers.map((u) => u.username === targetUsername ? { ...u, isFollowedByCurrentUser: response.data.isFollowing } : u, ), ); // if (user && user.id === targetId) { // setUser((prev) => { // if (!prev) return null; // return { // ...prev, // isFollowedByCurrentUser: response.data.isFollowing, // followers: response.data.followerCount, // }; // }); // } } catch (err: any) { setError(handleError(err)); } }; const displayFollowers = async () => { setIsLoadingModal(true); try { const response = await axiosInstance.get(`/users/${username}/followers`); setModalUsers(response.data); setModalTitle("Followers"); setShowModal(true); } catch (err) { setError(handleError(err)); } finally { setIsLoadingModal(false); } }; const displayFollowing = async () => { setIsLoadingModal(true); try { const response = await axiosInstance.get(`/users/${username}/following`); setModalUsers(response.data); setModalTitle("Following"); setShowModal(true); } catch (err: any) { setError(handleError(err)); } finally { setIsLoadingModal(false); } }; useEffect(() => { const fetchUser = async () => { setError(null); try { const response = await axiosInstance.get(`/users/${username}`); console.log(response.data); setUser(response.data); } catch (err: any) { setError(handleError(err)); } }; fetchUser(); }, [username]); if (error) { return (

Error

{error}

); } if (!user) return
Loading...
; return (
{isLoadingModal && (
)}
{user.profilePhoto ? ( {user.fullName} ) : ( user.fullName.charAt(0).toUpperCase() )}

{user.fullName}

{user.userType}
{user.followers} Followers
{user.following} Following
{user.userType === "ARTIST" ? ( ) : ( )} {showModal && ( setShowModal(false)} onFollowToggle={handleFollowInModal} /> )}
); }; export default UserDetail;