From 023177ea22f2318369af8a12237d2a95963969fe Mon Sep 17 00:00:00 2001 From: leon-morival Date: Fri, 29 Aug 2025 11:54:41 +0200 Subject: [PATCH] playlist details --- src/components/modal/PlaylistModal.js | 24 ++++++- src/navigation/MainStack.js | 5 ++ src/navigation/Routes.js | 1 + src/screens/Library/AllMyLikedMusic.js | 22 ++++--- src/screens/Library/AllMyPlaylist.js | 68 +++++++++++--------- src/screens/Library/MusicDetails.js | 6 +- src/screens/Library/PlaylistDetails.js | 62 ++++++++++++++++++ src/screens/Library/components/MyPlaylist.js | 28 ++++---- 8 files changed, 160 insertions(+), 56 deletions(-) create mode 100644 src/screens/Library/PlaylistDetails.js diff --git a/src/components/modal/PlaylistModal.js b/src/components/modal/PlaylistModal.js index 2a9b1e2..79902d9 100644 --- a/src/components/modal/PlaylistModal.js +++ b/src/components/modal/PlaylistModal.js @@ -11,6 +11,7 @@ import { import { SheetManager } from "react-native-actions-sheet"; import SwiperFlatList from "react-native-swiper-flatlist"; import { icons } from "../../assets"; +import { arrayUnion, playlistsRef } from "../../config/firebase"; import { useUserData } from "../../providers/UserDataProvider"; import { createPlaylist } from "../../screens/Library/Playlists/playlist"; import { Palette } from "../../styles"; @@ -91,8 +92,25 @@ const PlaylistModal = (props) => { containerStyle={{ width: "80%", alignSelf: "center", + opacity: selectedId ? 1 : 0.5, + }} + disabled={!selectedId} + onPress={async () => { + try { + const projectId = props?.payload?.projectId; + if (!selectedId) return; + if (projectId) { + await playlistsRef.doc(selectedId).update({ + musics: arrayUnion(projectId), + updatedAt: new Date(), + }); + } + } catch (e) { + console.log("Add to playlist error", e?.message); + } finally { + SheetManager.hide("Playlist"); + } }} - onPress={() => SheetManager.hide("Playlist")} /> @@ -160,7 +178,9 @@ const PlaylistModal = (props) => { await createPlaylist({ createdBy: currentUID, name: playlist.trim(), - musics: [], + musics: props?.payload?.projectId + ? [props.payload.projectId] + : [], createdAt: new Date(), updatedAt: new Date(), }); diff --git a/src/navigation/MainStack.js b/src/navigation/MainStack.js index 7ceda17..e979b96 100644 --- a/src/navigation/MainStack.js +++ b/src/navigation/MainStack.js @@ -50,6 +50,7 @@ import AllMyPlaylist from "../screens/Library/AllMyPlaylist"; import AllMyLikedMusic from "../screens/Library/AllMyLikedMusic"; import Research from "../screens/Library/Research"; import MusicDetails from "../screens/Library/MusicDetails"; +import PlaylistDetails from "../screens/Library/PlaylistDetails"; import SingerProfile from "../screens/Profile/SingerProfile"; import EditProfile from "../screens/Profile/EditProfile"; import Settings from "../screens/Profile/Settings"; @@ -226,6 +227,10 @@ const screens = [ name: Routes.AllMyPlaylist, component: AllMyPlaylist, }, + { + name: Routes.PlaylistDetails, + component: PlaylistDetails, + }, { name: Routes.AllMyLikedMusic, component: AllMyLikedMusic, diff --git a/src/navigation/Routes.js b/src/navigation/Routes.js index 8aa610b..e9cc154 100644 --- a/src/navigation/Routes.js +++ b/src/navigation/Routes.js @@ -65,6 +65,7 @@ export const Routes = { Library: "Library", AllMyMusic: "AllMyMusic", AllMyPlaylist: "AllMyPlaylist", + PlaylistDetails: "PlaylistDetails", AllMyLikedMusic: "AllMyLikedMusic", Research: "Research", MusicDetails: "MusicDetails", diff --git a/src/screens/Library/AllMyLikedMusic.js b/src/screens/Library/AllMyLikedMusic.js index b63bd55..fce7263 100644 --- a/src/screens/Library/AllMyLikedMusic.js +++ b/src/screens/Library/AllMyLikedMusic.js @@ -1,16 +1,16 @@ -import { View, Text, Pressable, Platform } from "react-native"; -import React, { useState } from "react"; -import Page from "../../layouts/Page"; -import { background } from "../../assets"; -import { gutters, Palette } from "../../styles"; -import MusicCard from "./components/MusicCard"; -import Animated, { Easing, FadeIn, FadeOut } from "react-native-reanimated"; import { BlurView } from "expo-blur"; -import { FONT_FAMILY } from "../../styles/Fonts"; +import React, { useState } from "react"; +import { Platform, Pressable, Text, View } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; -import { navigate } from "../../navigation/NavigationService"; +import Animated, { Easing, FadeIn, FadeOut } from "react-native-reanimated"; +import { background } from "../../assets"; +import Page from "../../layouts/Page"; import { Routes } from "../../navigation"; +import { navigate } from "../../navigation/NavigationService"; import { useUser } from "../../providers/UserDataProvider"; +import { gutters, Palette } from "../../styles"; +import { FONT_FAMILY } from "../../styles/Fonts"; +import MusicCard from "./components/MusicCard"; const AllMyLikedMusic = () => { const [top, setTop] = useState(0); @@ -35,7 +35,9 @@ const AllMyLikedMusic = () => { subtitle={"MusicLand"} projectId={item?.id} likedBy={item?.likedBy || []} - onPress={() => navigate(Routes.MusicDetails, { projectId: item.id })} + onPress={() => + navigate(Routes.MusicDetails, { projectId: item.id }) + } onPressMore={(posTop) => { setTop(posTop); if (showMenu) { diff --git a/src/screens/Library/AllMyPlaylist.js b/src/screens/Library/AllMyPlaylist.js index 108da33..caca0b4 100644 --- a/src/screens/Library/AllMyPlaylist.js +++ b/src/screens/Library/AllMyPlaylist.js @@ -4,10 +4,12 @@ import { Image, Platform, Pressable, Text, View } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; import { background, icons } from "../../assets"; import Page from "../../layouts/Page"; +import { useUser } from "../../providers/UserDataProvider"; import { gutters, Palette, Style } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import { size } from "../../styles/Style"; -import { useUser } from "../../providers/UserDataProvider"; +import { navigate } from "../../navigation/NavigationService"; +import { Routes } from "../../navigation"; const AllMyPlaylist = () => { const { userPlaylists = [] } = useUser(); return ( @@ -23,7 +25,7 @@ const AllMyPlaylist = () => { > @@ -35,42 +37,46 @@ const AllMyPlaylist = () => { {(Array.isArray(userPlaylists) ? userPlaylists : []).map((item) => ( - + navigate(Routes.PlaylistDetails, { playlistId: item?.id }) + } > - - + - {item?.name || "Sans nom"} - - - - - - + > + {item?.name || "Sans nom"} + + + + + + + ))} diff --git a/src/screens/Library/MusicDetails.js b/src/screens/Library/MusicDetails.js index a237d2e..39d0208 100644 --- a/src/screens/Library/MusicDetails.js +++ b/src/screens/Library/MusicDetails.js @@ -233,7 +233,11 @@ const MusicDetails = () => { resizeMode="contain" /> - SheetManager.show("Playlist")}> + + SheetManager.show("Playlist", { payload: { projectId } }) + } + > { + const route = useRoute(); + const playlistId = route?.params?.playlistId; + + // Fetch the playlist document + const { data: playlist } = useDataFromRef({ + ref: playlistId ? playlistsRef.doc(playlistId) : null, + simpleRef: true, + listener: true, + condition: !!playlistId, + refreshArray: [playlistId], + }); + + // Fetch projects by ids from playlist.musics + const { data: musics } = useDataFromArrayId({ + ref: projectsRef, + arrayId: Array.isArray(playlist?.musics) ? playlist.musics : [], + condition: Array.isArray(playlist?.musics) && playlist.musics.length > 0, + refreshArray: [playlistId, playlist?.musics?.length || 0], + }); + + return ( + + + {Array.isArray(musics) && + musics.map((p) => ( + navigate(Routes.MusicDetails, { projectId: p.id })} + onPressMore={() => {}} + /> + ))} + + + ); +}; + +export default PlaylistDetails; + diff --git a/src/screens/Library/components/MyPlaylist.js b/src/screens/Library/components/MyPlaylist.js index e2df378..44bb92a 100644 --- a/src/screens/Library/components/MyPlaylist.js +++ b/src/screens/Library/components/MyPlaylist.js @@ -22,7 +22,13 @@ const MyPlaylist = () => { > {playlists.map((item) => ( - + + navigate(Routes.PlaylistDetails, { playlistId: item.id }) + } + > { > {item?.name || "Sans nom"} - - - + - + ))}