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 { getProjectLikes, LIKE_TARGET } from '../../utils/likes' 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