import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useQuery, useQueryClient } from "@tanstack/react-query"; import { ArrowLeft, ChevronDown, ChevronUp, Pencil, Play, Trash2, X } from "lucide-react"; import { api, type PlexCard } from "../lib/api"; import { useConfirm } from "./ConfirmProvider"; // A playlist's ordered items — reorder (up/down), remove, rename, delete, and "Play all" (which opens // the player with the whole ordered list as its queue). Rendered as a PlexBrowse subview. export default function PlexPlaylistView({ playlistId, onBack, onPlay, }: { playlistId: number; onBack: () => void; onPlay: (itemRk: string, queue: string[]) => void; }) { const { t } = useTranslation(); const qc = useQueryClient(); const confirm = useConfirm(); const [renaming, setRenaming] = useState(false); const [name, setName] = useState(""); const [busy, setBusy] = useState(false); const q = useQuery({ queryKey: ["plex-playlist", playlistId], queryFn: () => api.plexPlaylist(playlistId) }); const items: PlexCard[] = q.data?.items ?? []; const order = items.map((i) => i.id); const invalidate = () => { qc.invalidateQueries({ queryKey: ["plex-playlist", playlistId] }); qc.invalidateQueries({ queryKey: ["plex-playlists"] }); }; async function move(idx: number, dir: -1 | 1) { const to = idx + dir; if (busy || to < 0 || to >= order.length) return; setBusy(true); const next = [...order]; [next[idx], next[to]] = [next[to], next[idx]]; try { await api.plexReorderPlaylist(playlistId, next); invalidate(); } finally { setBusy(false); } } async function remove(itemRk: string) { if (busy) return; setBusy(true); try { await api.plexPlaylistRemoveItem(playlistId, itemRk); invalidate(); } finally { setBusy(false); } } async function rename() { const title = name.trim(); if (!title) return; await api.plexRenamePlaylist(playlistId, title); setRenaming(false); invalidate(); } async function del() { if (!(await confirm({ message: t("plex.playlist.deleteConfirm", { title: q.data?.title }), danger: true }))) return; await api.plexDeletePlaylist(playlistId); qc.invalidateQueries({ queryKey: ["plex-playlists"] }); onBack(); } return (
{t("plex.loading")}
) : items.length === 0 ? ({t("plex.playlist.empty")}
) : (