import { BlurView } from "expo-blur"; import React, { useCallback, useMemo, useState } from "react"; import { Image, Pressable, Text, View } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; import { useGlobal } from "reactn"; import { background, icons } from "../../assets"; import MoreMenu from "../../components/MoreMenu"; import { playlistsRef, projectsRef } from "../../config/firebase"; import useDataFromArrayDocId from "../../hooks/useDataFromArrayId"; import useDataFromRef from "../../hooks/useDataFromRef"; import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails"; import usePlayer from "../../hooks/usePlayer"; 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 MusicCard from "./components/MusicCard"; const AllMyPlaylist = ({ route }) => { const { playListId } = route?.params || {}; const [, setTooltip] = useGlobal("_tooltip"); const { userPlaylists = [] } = useUser(); const [selectedPlaylistId, setSelectedPlaylistId] = useState( playListId || null ); const { data: playlist } = useDataFromRef({ ref: selectedPlaylistId ? playlistsRef.doc(selectedPlaylistId) : null, simpleRef: true, listener: true, condition: !!selectedPlaylistId, refreshArray: [selectedPlaylistId], }); // Fetch projects by ids from playlist.musics const { data: musics } = useDataFromArrayDocId({ ref: projectsRef, arrayId: Array.isArray(playlist?.musics) ? playlist.musics : [], condition: Array.isArray(playlist?.musics) && playlist.musics.length > 0, refreshArray: [selectedPlaylistId, playlist?.musics?.length || 0], }); const [menuPosition, setMenuPosition] = useState(null); const [showMenu, setShowMenu] = useState(false); const [selectedProjectId, setSelectedProjectId] = useState(null); const navigateToMusicDetails = useNavigateToMusicDetails(); const { setQueue } = usePlayer() || {}; const playlistQueueItems = useMemo(() => { if (!Array.isArray(musics)) return []; return musics .map((project) => { const projectId = typeof project?.id === "string" ? project.id : project?.projectId ?? null; const songUrl = typeof project?.songUrl === "string" && project.songUrl.length > 0 ? project.songUrl : null; if (!songUrl) return null; const descriptorId = projectId ? `project-${projectId}` : songUrl; return { id: descriptorId, uri: songUrl, songUrl, title: project?.title || "Sans titre", artist: project?.userName || "", artwork: project?.coverUrl ?? null, coverUrl: project?.coverUrl ?? null, metadata: { projectId, playlistId: selectedPlaylistId ?? null, playlistName: playlist?.name ?? null, }, context: { projectId, playlistId: selectedPlaylistId ?? null, playlistName: playlist?.name ?? null, }, }; }) .filter(Boolean); }, [musics, playlist?.name, selectedPlaylistId]); const handlePlayFromPlaylist = useCallback( (project) => { if (!project?.id) return; if (Array.isArray(playlistQueueItems) && playlistQueueItems.length > 0) { const queueIndex = playlistQueueItems.findIndex( (item) => item?.metadata?.projectId === project.id ); if (queueIndex >= 0 && typeof setQueue === "function") { setQueue({ items: playlistQueueItems, id: selectedPlaylistId, type: "playlist", name: playlist?.name ?? null, index: queueIndex, }); } } navigateToMusicDetails({ projectId: project.id, songUrl: project?.songUrl, project, }); }, [ navigateToMusicDetails, playlist?.name, playlistQueueItems, selectedPlaylistId, setQueue, ] ); // delete playlist const confirmDelete = () => { SheetManager.show("Delete", { payload: { title: "Supprimer la playlist", message: "Es-tu sûr de vouloir supprimer cette playlist ?", onConfirm: async () => { try { if (selectedPlaylistId) { await playlistsRef.doc(selectedPlaylistId).delete(); setTooltip({ type: "success", text: "Playlist supprimée" }); } } catch (e) { console.log("Delete playlist error", e?.message); setTooltip({ type: "error", text: e?.message || "Suppression impossible", }); } }, }, }); }; return ( ( <> {selectedPlaylistId != null && ( )} )} > {(Array.isArray(userPlaylists) ? userPlaylists : []).map( (item) => { const isSelected = selectedPlaylistId === item?.id; return ( setSelectedPlaylistId(item?.id)} > {item?.name || "Sans nom"} ); } )} SheetManager.show("Playlist", { payload: { startAtCreate: true }, }) } > Ajouter une playlist {Array.isArray(musics) && musics.map((p) => ( handlePlayFromPlaylist(p)} onPressMore={(posTop) => { setSelectedProjectId(p.id); setMenuPosition(posTop); setShowMenu( (prev) => !prev || posTop?.top !== (menuPosition?.top ?? null) ); }} /> ))} setShowMenu(false)} inPlaylist playlistId={selectedPlaylistId} projectId={selectedProjectId} /> ); }; export default AllMyPlaylist;