diff --git a/src/screens/Library/components/SearchResultsList.js b/src/screens/Library/components/SearchResultsList.js index bcf22b4..b040cb5 100644 --- a/src/screens/Library/components/SearchResultsList.js +++ b/src/screens/Library/components/SearchResultsList.js @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from "react"; +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"; @@ -44,6 +44,56 @@ const SearchResultsList = ({ 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, + ]) + ); + } + + const fallbackThumbnail = thumbnailCandidates.find(isValid); + if (fallbackThumbnail) { + coverCandidates.push(fallbackThumbnail); + } + + return coverCandidates.find(isValid) || null; + }, + [] + ); + const handleMusicPress = (project) => { const didNavigate = navigateToMusicDetails({ projectId: project?.id, @@ -109,7 +159,7 @@ const SearchResultsList = ({ key={project.id} title={project?.title || "Sans titre"} subtitle={project?.userName} - imageUri={project?.coverUrl || null} + imageUri={resolveCoverUri(project)} projectId={project?.id} likedBy={project?.likedBy || []} onPress={() => handleMusicPress(project)} @@ -153,7 +203,9 @@ const SearchResultsList = ({ key={project.id} title={project?.title || "Sans titre"} subtitle={project?.userName} - imageUri={project?.coverUrl || null} + imageUri={resolveCoverUri(project, { + preferThumbnail: true, + })} projectId={project?.id} likedBy={project?.likedBy || []} onPress={() => handlePlaybackPress(project)} diff --git a/src/screens/Profile/Profile.js b/src/screens/Profile/Profile.js index 2d76515..d06cfc2 100644 --- a/src/screens/Profile/Profile.js +++ b/src/screens/Profile/Profile.js @@ -321,7 +321,12 @@ const Profile = () => { }); const displayedProjects = isSelf ? selfProjects : otherUserProjects; - const displayedPlaybacks = isSelf ? selfPlaybacks : []; + const displayedPlaybacksSource = isSelf + ? selfPlaybacks + : otherUserProjects; + const displayedPlaybacks = Array.isArray(displayedPlaybacksSource) + ? displayedPlaybacksSource.filter((project) => project?.playbackUrl) + : []; return (