import React, { useCallback, useMemo, useState } from "react"; import { Pressable, ScrollView, Text, View } from "react-native"; import MoreMenu from "../../../components/MoreMenu"; import ProfilePicture from "../../../components/ProfilePicture"; import useNavigateToMusicDetails from "../../../hooks/useNavigateToMusicDetails"; import { Routes } from "../../../navigation"; import { navigate } from "../../../navigation/NavigationService"; import { Palette, Style } from "../../../styles"; import { FONT_FAMILY } from "../../../styles/Fonts"; import { getArtistDisplayName } from "../../../utils/artistName"; import { getProjectLikes, LIKE_TARGET } from "../../../utils/likes"; import CreateLyricsHeader from "../../Writing/components/CreateLyricsHeader"; import MusicCard from "./MusicCard"; import { defaultAvatar } from "../../../data/data"; const EmptyText = ({ text }) => ( {text} ); const SearchResultsList = ({ selected, musics = [], musicsLoading = false, playbacks = [], playbacksLoading = false, users = [], usersLoading = false, onResultSelected, contentContainerStyle, style, }) => { const [menuPosition, setMenuPosition] = useState(null); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); const navigateToMusicDetails = useNavigateToMusicDetails(); const resolveCoverUri = useCallback( (project, { preferThumbnail = false } = {}) => { const isValid = (value) => typeof value === "string" && value.trim().length > 0; if (!project) { return null; } const cover = project?.cover || {}; const thumbnailCandidates = [ project?.thumbnailUrl, project?.songThumbnailUrl, ].filter(isValid); if (preferThumbnail) { const preferredThumbnail = thumbnailCandidates.find(isValid); if (preferredThumbnail) { return preferredThumbnail; } } if (isValid(project?.coverUrl)) { return project.coverUrl; } const coverCandidates = [ cover?.result, cover?.finalUrl, cover?.generatedBackground, ]; if (Array.isArray(cover?.options)) { coverCandidates.push( ...cover.options.flatMap((option) => [ option?.finalUrl, option?.generatedUrl, ]), ); } return coverCandidates.find(isValid) || null; }, [], ); const handleMusicPress = (project) => { const didNavigate = navigateToMusicDetails({ projectId: project?.id, songUrl: project?.songUrl, project, }); if (didNavigate) { onResultSelected?.(); } }; const handlePlaybackPress = (project) => { if (!project?.id) { return; } navigate(Routes.Playbacks, { projectId: project.id }); onResultSelected?.(); }; const handleProfilePress = (userId) => { navigate(Routes.SingerProfile, { userId }); onResultSelected?.(); }; const musicItems = useMemo(() => { if (!Array.isArray(musics)) { return []; } if (selected === "Musiques") { return musics; } return musics.filter((project) => project?.hasPlayback !== true); }, [musics, selected]); const shouldShowMusics = (!selected && (musicItems.length > 0 || musicsLoading)) || selected === "Musiques"; const shouldShowPlaybacks = (!selected && (playbacks.length > 0 || playbacksLoading)) || selected === "Playback"; const shouldShowUsers = (!selected && (users.length > 0 || usersLoading)) || selected === "Profils"; return ( {shouldShowMusics && ( {musicItems.length > 0 && ( <> {Array.isArray(musicItems) && musicItems.slice(0, 6).map((project) => ( handleMusicPress(project)} onPressMore={(positionTop) => { setSelectedProjectId(project.id); setMenuPosition(positionTop); setShowMenu( (previous) => !previous || positionTop?.top !== (menuPosition?.top ?? null), ); }} /> ))} {musicsLoading && ( {"Chargement…"} )} )} {musicItems.length === 0 && !musicsLoading && ( )} )} {shouldShowPlaybacks && ( {playbacks.length > 0 && ( <> {Array.isArray(playbacks) && playbacks.slice(0, 6).map((project) => ( handlePlaybackPress(project)} onPressMore={(positionTop) => { setSelectedProjectId(project.id); setMenuPosition(positionTop); setShowMenu( (previous) => !previous || positionTop?.top !== (menuPosition?.top ?? null), ); }} /> ))} {playbacksLoading && ( {"Chargement…"} )} )} {playbacks.length === 0 && !playbacksLoading && ( )} )} {shouldShowUsers && ( {users.length > 0 && ( {Array.isArray(users) && users.slice(0, 5).map((user) => ( handleProfilePress(user.id)} > {getArtistDisplayName(user, "Utilisateur")} ))} {usersLoading && ( {"Chargement…"} )} )} {users.length === 0 && !usersLoading && ( )} )} {selected === "Clips" && ( )} setShowMenu(false)} inPlaylist={false} projectId={selectedProjectId} /> ); }; export default SearchResultsList;