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 (
{/* Header: title (rename) + Play all + delete */}
{renaming ? ( setName(e.target.value)} onKeyDown={(e) => e.key === "Enter" && rename()} onBlur={rename} className="glass-card min-w-0 flex-1 rounded-lg px-3 py-1.5 text-lg font-bold outline-none focus:border-accent" /> ) : (

{q.data?.title ?? " "}

)} {items.length > 0 && ( )}
{q.isLoading ? (

{t("plex.loading")}

) : items.length === 0 ? (

{t("plex.playlist.empty")}

) : (
    {items.map((it, idx) => (
  1. {idx + 1}
  2. ))}
)}
); }