import React, { useMemo, useRef, useState } from "react"; import { Dimensions, FlatList, Image, Pressable, Text, TextInput, View, } from "react-native"; import { SheetManager } from "react-native-actions-sheet"; import useMinuit from "react-native-minuit/src/hooks/useMinuit"; 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"; import { FONT_FAMILY } from "../../styles/Fonts"; import Style, { size } from "../../styles/Style"; import AppActionSheet from "../AppActionSheet"; import AppCheckbox from "../AppCheckbox"; import GradientButton from "../GradientButton"; const { width } = Dimensions.get("window"); const PlaylistModal = (props) => { const scrollRef = useRef(null); const [selectedId, setSelectedId] = useState(""); const [playlist, setPlaylist] = useState(""); const [isCreating, setIsCreating] = useState(false); const { currentUID, userPlaylists = [] } = useUserData(); const startAtCreate = props?.payload?.startAtCreate || false; const { setTooltip } = useMinuit(); const sanitizedPlaylists = useMemo( () => (Array.isArray(userPlaylists) ? userPlaylists : []), [userPlaylists], ); const isDuplicateName = useMemo(() => { const lower = (playlist || "").trim().toLowerCase(); if (!lower) return false; return sanitizedPlaylists.some( (p) => (p?.name || "").trim().toLowerCase() === lower, ); }, [playlist, sanitizedPlaylists]); const hideSheet = () => { SheetManager.hide("Playlist"); }; return ( Ajouter ce titre à une playlist item?.id || `playlist-${index}`} contentContainerStyle={{ gap: 20 }} ListHeaderComponent={ scrollRef.current?.scrollToIndex({ index: 1, animated: true, }) } > Créer une nouvelle playlist } renderItem={({ item }) => ( setSelectedId(item?.id)} selected={selectedId === item?.id} /> )} /> { try { const projectId = props?.payload?.projectId; if (!selectedId) return; if (projectId) { await playlistsRef.doc(selectedId).update({ musics: arrayUnion(projectId), updatedAt: new Date(), }); const addedPlaylist = sanitizedPlaylists.find( (p) => p?.id === selectedId, ); const name = addedPlaylist?.name || "la playlist"; setTooltip({ type: "success", text: `Ajouté à “${name}”`, }); } } catch (e) { console.log("Add to playlist error", e?.message); setTooltip({ type: "error", text: e?.message || "Ajout impossible", }); } finally { hideSheet(); } }} /> {!startAtCreate && ( { scrollRef.current?.scrollToIndex({ index: 0, animated: true, }); setPlaylist(""); }} > Annuler )} Nommer la playlist {isDuplicateName && ( Ce nom de playlist existe déjà )} { if (!playlist?.trim()?.length || !currentUID) return; try { setIsCreating(true); const name = playlist.trim(); const lower = name.toLowerCase(); const exists = sanitizedPlaylists.some( (p) => (p?.name || "").trim().toLowerCase() === lower, ); if (exists) { setTooltip({ type: "error", text: "Ce nom de playlist existe déjà", }); return; } await createPlaylist({ createdBy: currentUID, name, musics: props?.payload?.projectId ? [props.payload.projectId] : [], createdAt: new Date(), updatedAt: new Date(), }); setTooltip({ type: "success", text: props?.payload?.projectId ? `Playlist “${name}” créée et musique ajoutée` : `Playlist “${name}” créée`, }); setPlaylist(""); scrollRef.current?.scrollToIndex({ index: 0, animated: true, }); hideSheet(); } catch (e) { console.log(e); setTooltip({ type: "error", text: e?.message || "Création impossible", }); } finally { setIsCreating(false); } }} /> ); }; export default PlaylistModal;