import { useRoute } from "@react-navigation/native"; import { BlurView } from "expo-blur"; import { Image as ExpoImage } from "expo-image"; import React, { useEffect, useMemo, useState } from "react"; import { FlatList, Image, Platform, Pressable, ScrollView, StyleSheet, Text, View, } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; import { responsiveHeight } from "react-native-responsive-dimensions"; import { useGlobal } from "reactn"; import { background, icons, img } from "../../assets"; import BorderGradient from "../../components/BorderGradient/BorderGradient"; import MoreMenu from "../../components/MoreMenu"; import { projectsRef, usersRef } from "../../config/firebase"; import useDataFromRef from "../../hooks/useDataFromRef"; import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; import { navigate, push } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import Style, { gutters, size } from "../../styles/Style"; import MusicCard from "../Library/components/MusicCard"; const Profile = () => { const { params } = useRoute(); const [selected, setSelected] = useState("Chansons"); const { userProjects: selfProjects, userPlaybacks: selfPlaybacks, followingCount, currentUserData, getUserByUid, followUser, unfollowUser, } = useUser(); const [currentUID] = useGlobal("currentUID"); const targetUserId = params?.userId || currentUID || null; const isSelf = !!currentUID && targetUserId === currentUID; const [, setTooltip] = useGlobal("_tooltip"); const [userData, setUserData] = useState(null); const [isFollowing, setIsFollowing] = useState(false); const [followers, setFollowers] = useState(0); const [following, setFollowing] = useState(0); const [menuTop, setMenuTop] = useState(0); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); const onPressMenu = (item) => { setSelected(item); }; // Chargement des données utilisateur si on consulte un autre profil useEffect(() => { const fetch = async () => { if (!targetUserId) return; if (isSelf) { setUserData(currentUserData || null); setFollowers( Array.isArray(currentUserData?.followedBy) ? currentUserData.followedBy.length : 0, ); return; } const data = await getUserByUid(targetUserId); setUserData(data || null); const list = Array.isArray(data?.followedBy) ? data.followedBy : []; setFollowers(list.length); setIsFollowing(currentUID ? list.includes(currentUID) : false); }; fetch(); }, [targetUserId, isSelf, currentUserData?.followedBy?.length || 0]); // Live following count pour l'utilisateur consulté (autre que soi) const followingQueryRef = useMemo(() => { try { return targetUserId ? usersRef.where("followedBy", "array-contains", targetUserId) : null; } catch (e) { return null; } }, [targetUserId]); useDataFromRef({ ref: followingQueryRef, simpleRef: false, listener: true, condition: !!followingQueryRef && !isSelf, refreshArray: [targetUserId], onUpdate: (list) => setFollowing(Array.isArray(list) ? list.length : 0), }); const handleFollowUser = async () => { if (!currentUID || !targetUserId || isSelf) return; if (isFollowing) { await unfollowUser(targetUserId); setIsFollowing(false); setFollowers((v) => Math.max(0, (v || 0) - 1)); } else { await followUser(targetUserId); setIsFollowing(true); setFollowers((v) => (v || 0) + 1); } }; // Composant factorisé pour afficher la liste de musiques const MusicListSection = ({ data, emptyText }) => ( {Array.isArray(data) && data.length > 0 ? ( item.id} renderItem={({ item }) => ( navigate(Routes.MusicDetails, { projectId: item.id }) } onPressMore={(posTop) => { setSelectedProjectId(item.id); setMenuTop(posTop); setShowMenu((prev) => !prev || posTop !== menuTop); }} /> )} /> ) : ( )} setShowMenu(false)} inPlaylist={false} projectId={selectedProjectId} extraItems={ isSelf ? [ { label: "Supprimer", onPress: () => SheetManager.show("Delete", { payload: { title: "Supprimer le projet", message: "Cette action supprimera définitivement ce projet.", onConfirm: async () => { try { if (!selectedProjectId) return; await projectsRef.doc(selectedProjectId).delete(); setTooltip({ type: "success", text: "Projet supprimé", }); } catch (e) { setTooltip({ type: "error", text: e?.message || "Suppression impossible", }); } }, }, }), }, ] : [] } /> ); const EmptyText = ({ text }) => ( {text} ); // Données projets/profils selon si c'est soi ou un autre utilisateur const projectsQueryRef = useMemo(() => { try { if (!targetUserId || isSelf) return null; return projectsRef .where("userId", "==", targetUserId) .orderBy("updatedAt", "desc"); } catch (e) { return null; } }, [targetUserId, isSelf]); const { data: otherUserProjects = [] } = useDataFromRef({ ref: projectsQueryRef, simpleRef: false, listener: true, condition: !!projectsQueryRef, refreshArray: [targetUserId], }); const displayedProjects = isSelf ? selfProjects : otherUserProjects; const displayedPlaybacks = isSelf ? selfPlaybacks : []; return ( isSelf ? ( SheetManager.show("ProfileSettings")}> ) : null } > {(isSelf ? currentUserData?.userName : userData?.userName) || "Profil"} {Array.isArray(displayedProjects) ? displayedProjects.length : 0} projets push(Routes.Follows, { selected: "Abonnés", ...(isSelf ? {} : { userId: targetUserId }), }) } > {isSelf ? currentUserData?.followedBy?.length || 0 : followers} abonnés push(Routes.Follows, { selected: "Abonnements", ...(isSelf ? {} : { userId: targetUserId }), }) } > {isSelf ? followingCount : following} abonnements {!isSelf && ( {isFollowing ? "Ne plus suivre" : "Suivre"} )} {/*{["Chansons", "Playbacks", "Clips"].map((item, index) => (*/} {["Chansons", "Playbacks"].map((item, index) => ( onPressMenu(item)} style={{ flex: 1 }} > {item} ))} {selected === "Playbacks" && ( )} {selected === "Chansons" && ( )} {selected === "Clips" && ( )} ); }; export default Profile; const styles = StyleSheet.create({ value: { fontSize: 16, color: Palette.white, fontFamily: FONT_FAMILY.InterRegular, }, label: { fontSize: 12, color: Palette.white, fontFamily: FONT_FAMILY.InterRegular, }, menu: { fontSize: 12, color: Palette.white, fontFamily: FONT_FAMILY.InterRegular, }, borderGradient: { borderWidth: 1, borderRadius: 10, height: 33, position: "absolute", zIndex: 1, width: "100%", }, blurContainer: { height: 33, zIndex: -1, borderRadius: 10, overflow: "hidden", backgroundColor: Palette.glass, }, blurView: { width: "100%", height: "100%", paddingHorizontal: 10, ...Style.containerCenter, }, });