veza/apps/web/dist_verification/assets/routes-CJBS24ox.js
2026-02-07 20:36:48 +01:00

3 lines
72 KiB
JavaScript

import{a as y,j as e}from"./vendor-react-YMhRUmcb.js";import{u as De,B as w,d as _,C as U,e as me,g as Q,l as ee,D as Y,j as Oe,T as Ke,a as Ue,M as Ve,p as he,E as pe,t as le}from"./index-D2uzyr9g.js";import{u as J,a as F,b as R}from"./vendor-tanstack-CoFNL2zy.js";import{g as _e,l as Be,r as Je,u as Ge,d as We,c as He,a as Xe,b as Ye,e as Ze,f as es,p as xe,P as Ee,h as ss,i as ts,j as as,k as rs}from"./PlaylistCard-Due74KZ6.js";import{aO as Ae,aP as is,L as ls,am as ns,a7 as je,X as Me,a1 as Te,al as ve,T as te,aa as se,S as ye,aQ as os,aR as cs,a6 as fe,aq as ds,w as Ie,f as us,aF as ms,an as hs,ao as Le,Y as qe,P as ps,$ as xs,V as ys,g as fs,A as gs,aS as Z,i as js,C as be}from"./vendor-icons-DINCNwpk.js";import{S as M}from"./skeleton-BPDNnZ8E.js";import{S as q}from"./Spinner-DMondT4l.js";import{P as vs}from"./Pagination-DXc0wGeY.js";import{I as bs,J as Ns,K as Ne,L as ws,M as Ss,N as ks,P as Cs,O as Ps,Q as Ds,R as _s,U as Es,V as As,W as Ms,q as Ts}from"./vendor-fFnFILYR.js";import{o as Is,b as Ls,s as we,t as qs,g as Rs}from"./vendor-utils-4BWoYre8.js";import{L as B,I as V}from"./input-DL1WY4HG.js";import{T as Qs}from"./textarea-DfK27c18.js";import{C as ge}from"./checkbox-Cwr-kRad.js";import{S as X}from"./Select-So_RP28r.js";import{A as Re}from"./avatar-DwZKme3D.js";import{C as $s}from"./confirmation-dialog-O1mUMh9e.js";import{u as Fs,L as zs,d as Os,R as Ks,b as H,N as ne}from"./vendor-router-DX94Iu-2.js";import{T as Us,a as Vs,b as oe,c as ce}from"./Tabs-C8UCeQNW.js";import{u as Bs}from"./useDebounce-zqwECu1l.js";import"./features-CKIBrJL0.js";import"./dropdown-DLDDI8f2.js";function Js(s){return J({queryKey:["playlist",s],queryFn:()=>_e(s),enabled:!!s})}function Gs(){const s=F();return R({mutationFn:({id:t,data:a})=>Xe(t,a),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t.id]}),await s.cancelQueries({queryKey:["playlists"]});const a=s.getQueryData(["playlist",t.id]),r=s.getQueryData(["playlists"]);return a&&s.setQueryData(["playlist",t.id],{...a,...t.data,updated_at:new Date().toISOString()}),r&&s.setQueryData(["playlists"],i=>i?.map(l=>l.id===t.id?{...l,...t.data,updated_at:new Date().toISOString()}:l)),{previousPlaylist:a,previousPlaylists:r}},onError:(t,a,r)=>{r?.previousPlaylist&&s.setQueryData(["playlist",a.id],r.previousPlaylist),r?.previousPlaylists&&s.setQueryData(["playlists"],r.previousPlaylists)},onSuccess:t=>{s.invalidateQueries({queryKey:["playlist",t.id]}),s.invalidateQueries({queryKey:["playlists"]})}})}function Qe(){const s=F();return R({mutationFn:t=>We(t),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t]}),await s.cancelQueries({queryKey:["playlists"]});const a=s.getQueryData(["playlist",t]),r=s.getQueryData(["playlists"]);return r&&s.setQueryData(["playlists"],i=>i?.filter(l=>l.id!==t)),s.removeQueries({queryKey:["playlist",t]}),{previousPlaylist:a,previousPlaylists:r}},onError:(t,a,r)=>{r?.previousPlaylist&&s.setQueryData(["playlist",a],r.previousPlaylist),r?.previousPlaylists&&s.setQueryData(["playlists"],r.previousPlaylists)},onSuccess:()=>{s.invalidateQueries({queryKey:["playlists"]})}})}function Ws(s=20,t=0,a,r){const l=Math.floor(t/s)+1;return J({queryKey:["playlists",s,t,a,r],queryFn:()=>Be(l,s,void 0,a,r),enabled:!1})}function Hs(){const s=F();return R({mutationFn:({playlistId:t,data:a})=>es(t,a),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t.playlistId,"collaborators"]}),await s.cancelQueries({queryKey:["playlist",t.playlistId]});const a=s.getQueryData(["playlist",t.playlistId,"collaborators"]),r=s.getQueryData(["playlist",t.playlistId]),i={id:`temp-${Date.now()}`,playlist_id:t.playlistId,user_id:t.data.user_id,permission:t.data.permission,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),user:{id:t.data.user_id,username:"",email:""}};return a&&s.setQueryData(["playlist",t.playlistId,"collaborators"],[...a,i]),{previousCollaborators:a,previousPlaylist:r}},onError:(t,a,r)=>{r?.previousCollaborators&&s.setQueryData(["playlist",a.playlistId,"collaborators"],r.previousCollaborators),r?.previousPlaylist&&s.setQueryData(["playlist",a.playlistId],r.previousPlaylist)},onSuccess:t=>{s.invalidateQueries({queryKey:["playlist",t.playlist_id]}),s.invalidateQueries({queryKey:["playlist",t.playlist_id,"collaborators"]}),s.invalidateQueries({queryKey:["playlists"]})}})}function Xs(){const s=F();return R({mutationFn:({playlistId:t,userId:a})=>Je(t,a),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t.playlistId,"collaborators"]}),await s.cancelQueries({queryKey:["playlist",t.playlistId]});const a=s.getQueryData(["playlist",t.playlistId,"collaborators"]),r=s.getQueryData(["playlist",t.playlistId]);return a&&s.setQueryData(["playlist",t.playlistId,"collaborators"],a.filter(i=>i.user_id!==t.userId)),{previousCollaborators:a,previousPlaylist:r}},onError:(t,a,r)=>{r?.previousCollaborators&&s.setQueryData(["playlist",a.playlistId,"collaborators"],r.previousCollaborators),r?.previousPlaylist&&s.setQueryData(["playlist",a.playlistId],r.previousPlaylist)},onSuccess:(t,a)=>{s.invalidateQueries({queryKey:["playlist",a.playlistId]}),s.invalidateQueries({queryKey:["playlist",a.playlistId,"collaborators"]}),s.invalidateQueries({queryKey:["playlists"]})}})}function Ys(){const s=F();return R({mutationFn:({playlistId:t,userId:a,data:r})=>Ge(t,a,r),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t.playlistId,"collaborators"]}),await s.cancelQueries({queryKey:["playlist",t.playlistId]});const a=s.getQueryData(["playlist",t.playlistId,"collaborators"]),r=s.getQueryData(["playlist",t.playlistId]);return a&&s.setQueryData(["playlist",t.playlistId,"collaborators"],a.map(i=>i.user_id===t.userId?{...i,permission:t.data.permission}:i)),{previousCollaborators:a,previousPlaylist:r}},onError:(t,a,r)=>{r?.previousCollaborators&&s.setQueryData(["playlist",a.playlistId,"collaborators"],r.previousCollaborators),r?.previousPlaylist&&s.setQueryData(["playlist",a.playlistId],r.previousPlaylist)},onSuccess:(t,a)=>{s.invalidateQueries({queryKey:["playlist",a.playlistId]}),s.invalidateQueries({queryKey:["playlist",a.playlistId,"collaborators"]}),s.invalidateQueries({queryKey:["playlists"]})}})}function $e(){return R({mutationFn:s=>He(s)})}function Zs(){const s=F();return R({mutationFn:({playlistId:t,trackIds:a})=>Ye(t,{track_ids:a}),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t.playlistId]});const a=s.getQueryData(["playlist",t.playlistId]);if(a&&a.tracks){const r=new Map(a.tracks.map(l=>[l.track_id,l])),i=t.trackIds.map((l,n)=>{const o=r.get(l);return o?{...o,position:n+1}:void 0}).filter(l=>l!==void 0);s.setQueryData(["playlist",t.playlistId],{...a,tracks:i,updated_at:new Date().toISOString()})}return{previousPlaylist:a}},onError:(t,a,r)=>{r?.previousPlaylist&&s.setQueryData(["playlist",a.playlistId],r.previousPlaylist)},onSuccess:(t,a)=>{s.invalidateQueries({queryKey:["playlist",a.playlistId]})}})}function et(){const s=F();return R({mutationFn:({playlistId:t,trackId:a})=>Ze(t,a),onMutate:async t=>{await s.cancelQueries({queryKey:["playlist",t.playlistId]}),await s.cancelQueries({queryKey:["playlists"]});const a=s.getQueryData(["playlist",t.playlistId]),r=s.getQueryData(["playlists"]);if(a){const i={id:`temp-${Date.now()}`,playlist_id:t.playlistId,track_id:t.trackId,position:(a.tracks?.length||0)+1,added_at:new Date().toISOString()};s.setQueryData(["playlist",t.playlistId],{...a,tracks:[...a.tracks||[],i],track_count:(a.track_count||0)+1,updated_at:new Date().toISOString()})}return r&&s.setQueryData(["playlists"],i=>i?.map(l=>l.id===t.playlistId?{...l,track_count:(l.track_count||0)+1,updated_at:new Date().toISOString()}:l)),{previousPlaylist:a,previousPlaylists:r}},onError:(t,a,r)=>{r?.previousPlaylist&&s.setQueryData(["playlist",a.playlistId],r.previousPlaylist),r?.previousPlaylists&&s.setQueryData(["playlists"],r.previousPlaylists)},onSuccess:(t,a)=>{s.invalidateQueries({queryKey:["playlist",a.playlistId]}),s.invalidateQueries({queryKey:["playlists"]})}})}function st({initialView:s,limit:t,searchQuery:a,filterIsPublic:r,filterOwner:i,sortBy:l,sortOrder:n}){const[o,m]=y.useState(s),[u,c]=y.useState(0),[p,d]=y.useState(new Set),{data:h}=De(),g=Math.floor(u/t)+1,x=!!(a.trim()||r!==void 0||i!=="all"),{data:j,isLoading:b,error:f}=J({queryKey:["playlistSearch",a,r,i,g,t,l,n],queryFn:()=>xe.search({q:a.trim()||void 0,page:g,limit:t,is_public:r,user_id:i==="mine"&&h?.id?h.id:void 0,sort_by:l,sort_order:n}),enabled:x}),{data:v,isLoading:N,error:k}=Ws(t,u,l,n),C=x?j:v,S=x?b:N,D=x?f:k,P=y.useMemo(()=>{const A=C?.playlists||[];return A.length===0?[]:[...A].sort((G,O)=>{let W=0;switch(l){case"title":W=(G.title||"").localeCompare(O.title||"");break;case"track_count":W=(G.track_count||0)-(O.track_count||0);break;default:W=new Date(G.created_at).getTime()-new Date(O.created_at).getTime();break}return n==="asc"?W:-W})},[C?.playlists,l,n]),L=C?Math.ceil(C.total/t):0,z=C?Math.floor(u/t)+1:1,ae=A=>{c((A-1)*t)},re=(A,$)=>{d(G=>{const O=new Set(G);return $?O.add(A.id):O.delete(A.id),O})},ie=()=>{if(!C)return;const A=P.every($=>p.has($.id));d(A?new Set:new Set(P.map($=>$.id)))},E=()=>{d(new Set)},T=P.filter(A=>p.has(A.id)),I=C&&P.length>0&&P.every(A=>p.has(A.id));return{currentView:o,setCurrentView:m,offset:u,sortedPlaylists:P,data:C,isLoading:S,error:D,hasSearchOrFilters:x,searchQuery:a,totalPages:L,currentPage:z,handlePageChange:ae,selectedPlaylists:p,selectedPlaylistsArray:T,isAllSelected:I,handlePlaylistSelect:re,handleSelectAll:ie,handleClearSelection:E,limit:t}}function tt({currentView:s,onViewChange:t,enableSelection:a,hasPlaylists:r,isAllSelected:i,onSelectAll:l}){return e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[a&&r&&e.jsxs(w,{variant:"outline",size:"sm",onClick:l,className:"touch-manipulation min-h-11 sm:min-h-0","aria-label":i?"Désélectionner toutes":"Sélectionner toutes",children:[i?e.jsx(Ae,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}):e.jsx(is,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:i?"Tout désélectionner":"Tout sélectionner"})]}),e.jsx("div",{className:"hidden sm:flex justify-end items-center gap-2 ml-auto",children:e.jsxs("div",{className:"inline-flex items-center gap-1 p-1 rounded-xl bg-muted border border-border",role:"group","aria-label":"Changer l'affichage des playlists",children:[e.jsxs("button",{type:"button",onClick:()=>t("list"),className:_("flex items-center gap-2 px-4 py-1.5 rounded-md text-sm font-medium transition-all duration-200","hover:bg-kodo-slate dark:hover:bg-kodo-steel","focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2","touch-manipulation",s==="list"?"bg-white dark:bg-kodo-steel text-kodo-cyan dark:text-kodo-cyan shadow-sm":"text-kodo-content-dim dark:text-kodo-content-dim"),"aria-label":"Affichage en liste","aria-pressed":s==="list",children:[e.jsx(ls,{className:"h-4 w-4","aria-hidden":"true"}),e.jsx("span",{className:"hidden md:inline",children:"Liste"})]}),e.jsxs("button",{type:"button",onClick:()=>t("grid"),className:_("flex items-center gap-2 px-4 py-1.5 rounded-md text-sm font-medium transition-all duration-200","hover:bg-muted","focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2","touch-manipulation",s==="grid"?"bg-card text-primary shadow-sm border border-border":"text-muted-foreground"),"aria-label":"Affichage en grille","aria-pressed":s==="grid",children:[e.jsx(ns,{className:"h-4 w-4","aria-hidden":"true"}),e.jsx("span",{className:"hidden md:inline",children:"Grille"})]})]})})]})}function de({variant:s,className:t}){return s==="no_playlists"?e.jsxs("div",{className:_("text-center py-12",t),role:"region","aria-live":"polite",children:[e.jsx(je,{className:"h-12 w-12 mx-auto mb-4 text-muted-foreground opacity-50"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"No playlists yet"}),e.jsx("p",{className:"text-muted-foreground",children:"Start by creating your first playlist to organize your tracks."})]}):e.jsxs("div",{className:_("text-center py-12",t),role:"region","aria-live":"polite",children:[e.jsx(je,{className:"h-12 w-12 mx-auto mb-4 text-muted-foreground opacity-50"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"No playlists found"}),e.jsx("p",{className:"text-muted-foreground mb-4",children:"No playlists match your search criteria. Try adjusting your filters or search terms."})]})}function at({error:s,className:t}){return e.jsxs("div",{className:_("text-center py-12",t),role:"alert",children:[e.jsx("p",{className:"text-destructive",children:"Erreur lors du chargement des playlists"}),s instanceof Error&&e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:s.message})]})}function rt({className:s,variant:t="grid"}){return t==="list"?e.jsx(U,{className:_("cursor-pointer",s),children:e.jsx(me,{className:"p-0",children:e.jsxs("div",{className:"flex flex-row gap-4 p-4 sm:p-4",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx(M,{variant:"rectangular",width:80,height:80,className:"rounded-lg"})}),e.jsxs("div",{className:"flex-1 space-y-2 min-w-0",children:[e.jsx(M,{variant:"text",height:20,width:"70%"}),e.jsx(M,{variant:"text",height:16,width:"50%"}),e.jsxs("div",{className:"flex gap-4 mt-2",children:[e.jsx(M,{variant:"text",height:14,width:60}),e.jsx(M,{variant:"text",height:14,width:80})]})]})]})})}):e.jsx(U,{className:_("cursor-pointer",s),children:e.jsxs(me,{className:"p-0",children:[e.jsx("div",{className:"aspect-square w-full",children:e.jsx(M,{variant:"rectangular",className:"w-full h-full rounded-t-lg"})}),e.jsxs("div",{className:"p-4 sm:p-4 space-y-2",children:[e.jsx(M,{variant:"text",height:20,width:"80%"}),e.jsx(M,{variant:"text",height:16,width:"100%"}),e.jsx(M,{variant:"text",height:16,width:"60%"}),e.jsxs("div",{className:"flex justify-between items-center mt-2",children:[e.jsx(M,{variant:"text",height:14,width:60}),e.jsx(M,{variant:"text",height:14,width:80})]})]})]})})}function Se({count:s=8,view:t="grid",className:a}){return e.jsxs("div",{className:_(t==="grid"?"grid grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 sm:gap-4":"flex flex-col gap-2 sm:gap-3",a),role:"status","aria-label":"Chargement des playlists",children:[Array.from({length:s}).map((r,i)=>e.jsx(rt,{variant:t},i)),e.jsx("span",{className:"sr-only",children:"Chargement des playlists en cours..."})]})}function it(s){const t=JSON.stringify(s,null,2),a=new Blob([t],{type:"application/json"}),r=URL.createObjectURL(a),i=document.createElement("a");i.href=r,i.download=`playlists-${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}function lt(s){const t=["ID","Titre","Description","Publique","Nombre de tracks","Créée le"],a=s.map(o=>[o.id.toString(),o.title,o.description||"",o.is_public?"Oui":"Non",o.track_count.toString(),new Date(o.created_at).toLocaleDateString("fr-FR")]),r=[t.join(","),...a.map(o=>o.map(m=>`"${m.replace(/"/g,'""')}"`).join(","))].join(`
`),i=new Blob([`\uFEFF${r}`],{type:"text/csv;charset=utf-8;"}),l=URL.createObjectURL(i),n=document.createElement("a");n.href=l,n.download=`playlists-${new Date().toISOString().split("T")[0]}.csv`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(l)}function nt({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a}){const[r,i]=y.useState(!1),[l,n]=y.useState(!1),[o,m]=y.useState(!1),{success:u,error:c}=Q(),p=Qe(),d=$e(),h=s.length;return{selectedCount:h,showDeleteDialog:r,setShowDeleteDialog:i,isDeleting:l,isSharing:o,handleDelete:async()=>{n(!0);let f=0,v=0;try{for(const N of s)try{await p.mutateAsync(N.id),f++}catch(k){v++,ee.error(`Failed to delete playlist ${N.id}:`,{error:k})}f>0&&(u(`${f} playlist${f>1?"s":""} supprimée${f>1?"s":""} avec succès.`),t(),a?.()),v>0&&c(`${v} playlist${v>1?"s":""} n'a${v>1?"ont":""} pas pu être supprimée${v>1?"s":""}.`)}finally{n(!1),i(!1)}},handleShare:async()=>{m(!0);const f=[];try{for(const v of s)try{const N=await d.mutateAsync(v.id);if(N&&typeof N=="object"&&"share_token"in N){const k=`${window.location.origin}/playlists/shared/${N.share_token}`;f.push(k)}}catch(N){ee.error(`Failed to create share link for playlist ${v.id}:`,{error:N})}if(f.length>0){const v=f.join(`
`);await navigator.clipboard.writeText(v),u(`${f.length} lien${f.length>1?"s":""} copié${f.length>1?"s":""} dans le presse-papiers.`),t()}else c("Impossible de créer les liens de partage.")}finally{m(!1)}},handleExportJSON:()=>{try{it(s),u(`${h} playlist${h>1?"s":""} exportée${h>1?"s":""} en JSON.`),t()}catch{c("Impossible d'exporter les playlists.")}},handleExportCSV:()=>{try{lt(s),u(`${h} playlist${h>1?"s":""} exportée${h>1?"s":""} en CSV.`),t()}catch{c("Impossible d'exporter les playlists.")}}}}function ot({selectedCount:s,onClear:t,className:a,children:r}){return e.jsxs("div",{className:_("flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 sm:gap-4","p-4 bg-muted/50 border border-border rounded-xl","sticky top-0 z-10 backdrop-blur-sm",a),role:"region","aria-label":`Actions batch pour ${s} playlist${s>1?"s":""} sélectionnée${s>1?"s":""}`,children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"text-sm font-medium text-primary",children:[s," playlist",s>1?"s":""," sélectionnée",s>1?"s":""]}),e.jsx(w,{variant:"ghost",size:"sm",onClick:t,className:"h-8 w-8 p-0 touch-manipulation","aria-label":"Désélectionner toutes les playlists",children:e.jsx(Me,{className:"h-4 w-4","aria-hidden":"true"})})]}),r]})}function ct({onShare:s,onExportJSON:t,onExportCSV:a,onDelete:r,isSharing:i,isDeleting:l}){const n=i||l;return e.jsxs("div",{className:"flex flex-wrap items-center gap-2 w-full sm:w-auto",children:[e.jsx(w,{variant:"outline",size:"sm",onClick:s,disabled:n,className:"touch-manipulation min-h-11 sm:min-h-0 flex-1 sm:flex-initial","aria-label":"Partager les playlists sélectionnées",children:i?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:"sm",className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Partage..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(Te,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Partager"})]})}),e.jsxs(w,{variant:"outline",size:"sm",onClick:t,disabled:n,className:"touch-manipulation min-h-11 sm:min-h-0 flex-1 sm:flex-initial","aria-label":"Exporter en JSON",children:[e.jsx(ve,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"JSON"})]}),e.jsxs(w,{variant:"outline",size:"sm",onClick:a,disabled:n,className:"touch-manipulation min-h-11 sm:min-h-0 flex-1 sm:flex-initial","aria-label":"Exporter en CSV",children:[e.jsx(ve,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"CSV"})]}),e.jsx(w,{variant:"destructive",size:"sm",onClick:r,disabled:n,className:"touch-manipulation min-h-11 sm:min-h-0 flex-1 sm:flex-initial","aria-label":"Supprimer les playlists sélectionnées",children:l?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:"sm",className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Suppression..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(te,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Supprimer"})]})})]})}function dt({open:s,onClose:t,onConfirm:a,selectedPlaylists:r,selectedCount:i,isDeleting:l}){return e.jsx(Y,{open:s,onClose:t,title:"Supprimer les playlists ?",variant:"alert",onConfirm:a,onCancel:t,confirmLabel:l?"Suppression...":"Supprimer",cancelLabel:"Annuler",showCancel:!0,size:"md","aria-label":"Dialogue de confirmation de suppression batch",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Vous êtes sur le point de supprimer ",e.jsx("strong",{children:i})," ","playlist",i>1?"s":"",". Cette action est irréversible."]}),e.jsxs("div",{className:"p-4 bg-muted rounded-md max-h-48 overflow-y-auto",children:[e.jsx("p",{className:"text-sm font-medium mb-2",children:"Playlists à supprimer :"}),e.jsx("ul",{className:"text-sm text-muted-foreground space-y-1",children:r.map(n=>e.jsxs("li",{children:["• ",n.title]},n.id))})]})]})})}function ut({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a,className:r}){const{selectedCount:i,showDeleteDialog:l,setShowDeleteDialog:n,isDeleting:o,isSharing:m,handleDelete:u,handleShare:c,handleExportJSON:p,handleExportCSV:d}=nt({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a});return i===0?null:e.jsxs(e.Fragment,{children:[e.jsx(ot,{selectedCount:i,onClear:t,className:r,children:e.jsx(ct,{onShare:c,onExportJSON:p,onExportCSV:d,onDelete:()=>n(!0),isSharing:m,isDeleting:o})}),e.jsx(dt,{open:l,onClose:()=>n(!1),onConfirm:u,selectedPlaylists:s,selectedCount:i,isDeleting:o})]})}function mt({view:s="grid",limit:t=20,className:a,enableSelection:r=!1,searchQuery:i="",filterIsPublic:l,filterOwner:n="all",sortBy:o="created_at",sortOrder:m="desc"}){const{currentView:u,setCurrentView:c,sortedPlaylists:p,data:d,isLoading:h,error:g,hasSearchOrFilters:x,totalPages:j,currentPage:b,handlePageChange:f,selectedPlaylists:v,selectedPlaylistsArray:N,isAllSelected:k,handlePlaylistSelect:C,handleSelectAll:S,handleClearSelection:D,limit:P}=st({initialView:s,limit:t,searchQuery:i,filterIsPublic:l,filterOwner:n,sortBy:o,sortOrder:m});return h&&!d?e.jsx("div",{className:_("space-y-4",a),role:"region","aria-live":"polite",children:e.jsx(Se,{count:P,view:u})}):g?e.jsx(at,{error:g,className:a}):!h&&!d?.playlists.length&&!x?e.jsx(de,{variant:"no_playlists",className:a}):i&&p.length===0?e.jsx(de,{variant:"no_search_results",className:a}):!h&&p.length===0&&!i?e.jsx(de,{variant:"no_playlists",className:a}):e.jsxs("div",{className:_("space-y-4",a),role:"region","aria-label":"Liste des playlists",children:[r&&v.size>0&&e.jsx(ut,{selectedPlaylists:N,onSelectionClear:D}),e.jsx(tt,{currentView:u,onViewChange:c,enableSelection:r,hasPlaylists:p.length>0,isAllSelected:!!k,onSelectAll:S}),e.jsxs("div",{className:_(u==="grid"?"grid grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 sm:gap-4":"flex flex-col gap-2 sm:gap-3"),role:"list","aria-label":"Playlists disponibles",children:[p.map(L=>e.jsx(Ee,{playlist:L,className:u==="list"?"flex-row":"",selectable:r,selected:v.has(L.id),onSelect:C},L.id)),h&&e.jsx(Se,{count:4,view:u})]}),j>1&&e.jsx(vs,{currentPage:b,totalPages:j,onPageChange:f,totalItems:d?.total||0,itemsPerPage:P,showItemsInfo:!0,className:"pt-4 border-t"})]})}const ht=Is({title:we().min(1,"Le titre est requis").max(200,"Le titre ne peut pas dépasser 200 caractères"),description:we().max(1e3,"La description ne peut pas dépasser 1000 caractères").optional(),is_public:Ls().default(!0)});function pt({onOpenChange:s,onCreated:t}){const[a,r]=y.useState(!1),{success:i,error:l}=Q(),n=bs({resolver:qs(ht),defaultValues:{title:"",description:"",is_public:!0}}),{handleSubmit:o,reset:m,watch:u}=n,c=u("is_public");return{form:n,onSubmit:async h=>{r(!0);try{await xe.create({title:h.title,description:h.description||void 0,is_public:h.is_public}),i("Playlist créée : Votre playlist a été créée avec succès."),m(),s(!1),t?.()}catch(g){ee.error("Failed to create playlist:",{error:g}),l(g instanceof Error?g.message:"Impossible de créer la playlist")}finally{r(!1)}},handleCancel:()=>{m(),s(!1)},isSubmitting:a,isPublic:c}}function xt({open:s,onClose:t,register:a,errors:r,handleSubmit:i,onSubmit:l,onCancel:n,isSubmitting:o,isPublic:m}){return e.jsx(Y,{open:s,onClose:t,title:"Créer une playlist",variant:"default","aria-label":"Dialogue de création de playlist",children:e.jsxs("form",{onSubmit:i(l),className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(B,{htmlFor:"title",children:"Titre *"}),e.jsx(V,{id:"title",...a("title"),placeholder:"Ma nouvelle playlist",disabled:o,"aria-invalid":r.title?"true":"false","aria-describedby":r.title?"create-title-error":void 0,"aria-required":"true"}),r.title&&e.jsx("p",{id:"create-title-error",className:"text-sm text-destructive",role:"alert",children:r.title.message})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(B,{htmlFor:"description",children:"Description"}),e.jsx(Qs,{id:"description",...a("description"),placeholder:"Décrivez votre playlist...",rows:3,disabled:o,"aria-invalid":r.description?"true":"false","aria-describedby":r.description?"create-description-error":void 0}),r.description&&e.jsx("p",{id:"create-description-error",className:"text-sm text-destructive",role:"alert",children:r.description.message})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(ge,{id:"is_public",...a("is_public"),checked:m,disabled:o,"aria-checked":m}),e.jsx(B,{htmlFor:"is_public",className:"cursor-pointer",children:"Playlist publique"})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(w,{type:"button",variant:"secondary",onClick:n,disabled:o,"aria-label":"Annuler la création de playlist",children:"Annuler"}),e.jsxs(w,{type:"submit",disabled:o,"aria-label":"Créer la playlist",children:[o&&e.jsx(q,{size:"sm",className:"mr-2","aria-hidden":"true"}),"Créer"]})]})]})})}function yt({open:s,onOpenChange:t,onCreated:a}){const{form:{register:r,formState:{errors:i},handleSubmit:l},onSubmit:n,handleCancel:o,isSubmitting:m,isPublic:u}=pt({onOpenChange:t,onCreated:a});return e.jsx(xt,{open:s,onClose:o,register:r,errors:i,handleSubmit:l,onSubmit:n,onCancel:o,isSubmitting:m,isPublic:u})}function ft(){const[s,t]=y.useState(!1),[a,r]=y.useState(!1),[i,l]=y.useState(""),[n,o]=y.useState(!1),[m,u]=y.useState(void 0),[c,p]=y.useState("all"),[d,h]=y.useState("created_at"),[g,x]=y.useState("desc"),j=i||m!==void 0||c!=="all",b=()=>{l(""),u(void 0),p("all"),h("created_at"),x("desc")};return e.jsxs("div",{className:"space-y-4 sm:space-y-6 playlist-container",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 sm:gap-0",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold tracking-tight",children:"Playlists"}),e.jsx("p",{className:"text-sm sm:text-base text-muted-foreground",children:"Découvrez et gérez vos playlists"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(w,{variant:"default",size:"sm",onClick:()=>r(!0),className:"touch-manipulation min-h-11 sm:min-h-0","aria-label":"Créer une nouvelle playlist","data-testid":"create-playlist-btn",children:[e.jsx(se,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Créer"}),e.jsx("span",{className:"sm:hidden",children:"Nouvelle"})]}),e.jsxs(w,{variant:s?"default":"outline",size:"sm",onClick:()=>t(!s),className:"touch-manipulation min-h-11 sm:min-h-0","aria-label":s?"Désactiver la sélection":"Activer la sélection",children:[e.jsx(Ae,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:s?"Annuler":"Sélectionner"})]})]})]}),e.jsx(U,{children:e.jsx(me,{className:"p-4",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(ye,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-kodo-content-dim"}),e.jsx(V,{type:"text",value:i,onChange:f=>l(f.target.value),placeholder:"Rechercher des playlists...",className:"pl-10","data-testid":"playlist-search"})]}),e.jsxs(w,{variant:"outline",onClick:()=>o(!n),children:[e.jsx(os,{className:"mr-2 h-4 w-4"}),"Filters",j&&e.jsx("span",{className:"ml-2 bg-kodo-cyan text-white rounded-full px-2 py-0.5 text-xs",children:"Active"})]}),j&&e.jsxs(w,{variant:"ghost",onClick:b,children:[e.jsx(Me,{className:"mr-2 h-4 w-4"}),"Clear"]})]}),n&&e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4 pt-4 border-t",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Visibility"}),e.jsx(X,{value:m===void 0?"all":m?"public":"private",onChange:f=>{u(f==="all"?void 0:f==="public")},options:[{value:"all",label:"All"},{value:"public",label:"Public"},{value:"private",label:"Private"}]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Owner"}),e.jsx(X,{value:c,onChange:f=>p(Array.isArray(f)?f[0]:f),options:[{value:"all",label:"All"},{value:"mine",label:"My Playlists"},{value:"others",label:"Others"}]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Sort By"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(X,{value:d,onChange:f=>h(Array.isArray(f)?f[0]:f),options:[{value:"created_at",label:"Date"},{value:"title",label:"Title"},{value:"track_count",label:"Tracks"}],className:"flex-1"}),e.jsx(w,{variant:"outline",size:"sm",onClick:()=>x(f=>f==="asc"?"desc":"asc"),children:e.jsx(cs,{className:"h-4 w-4"})})]})]})]})]})})}),e.jsx(mt,{enableSelection:s,searchQuery:i,filterIsPublic:m,filterOwner:c,sortBy:d,sortOrder:g}),e.jsx(yt,{open:a,onOpenChange:r,onCreated:()=>{r(!1)}})]})}function gt({playlist:s}){return e.jsxs("div",{className:"relative h-80 md:h-96 w-full overflow-hidden",children:[e.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-cyan-900/50 via-black to-magenta-900/50"}),s.cover_url&&e.jsx("div",{className:"absolute inset-0 opacity-30 blur-3xl scale-110",style:{backgroundImage:`url(${s.cover_url})`,backgroundSize:"cover",backgroundPosition:"center"}}),e.jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-background via-transparent to-transparent"}),e.jsx("div",{className:"absolute inset-0 noise opacity-30"})]})}function jt({playlist:s}){const t=s.follower_count??0;return e.jsxs("div",{className:"flex flex-col md:flex-row gap-8 items-end",children:[e.jsx(U,{variant:"glass",className:"w-52 h-52 md:w-64 md:h-64 flex-shrink-0 p-2 border-white/10 shadow-[0_20px_50px_rgba(0,0,0,0.5)] bg-black/40 backdrop-blur-3xl overflow-hidden rounded-2xl group",children:s.cover_url?e.jsx("img",{src:s.cover_url,alt:s.title,className:"w-full h-full object-cover rounded-xl shadow-inner group-hover:scale-105 transition-transform duration-700"}):e.jsx("div",{className:"w-full h-full bg-gradient-to-br from-cyan-900 to-magenta-900 rounded-xl flex items-center justify-center",children:e.jsx(fe,{className:"w-20 h-20 text-white/20"})})}),e.jsxs("div",{className:"flex-1 pb-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx("span",{className:_("px-3 py-1 rounded-full text-xs font-bold uppercase tracking-wider border",s.is_public?"bg-cyan-500/10 text-cyan-500 border-cyan-500/20":"bg-yellow-500/10 text-yellow-500 border-yellow-500/20"),children:s.is_public?"Public Signal":"Encrypted"}),e.jsxs("span",{className:"text-xs text-muted-foreground/80 font-mono flex items-center gap-1",children:[e.jsx(ds,{className:"w-3 h-3"})," Updated ",Rs(new Date(s.updated_at),"MMM d, yyyy")]})]}),e.jsx("h1",{className:"text-4xl md:text-6xl font-display font-bold text-white mb-4 tracking-tight drop-shadow-lg",children:s.title}),s.description&&e.jsx("p",{className:"text-lg text-white/70 max-w-2xl font-light leading-relaxed mb-6 font-sans",children:s.description}),e.jsxs("div",{className:"flex items-center gap-4 text-sm md:text-base",children:[e.jsxs("div",{className:"flex items-center gap-2 text-white/90",children:[e.jsx(Re,{className:"w-6 h-6 border border-white/20",fallback:"U",src:s.user?.avatar_url}),e.jsx("span",{className:"font-semibold",children:s.user?.username})]}),e.jsx("span",{className:"text-white/30",children:"•"}),e.jsxs("span",{className:"text-white/80",children:[s.track_count," tracks"]}),e.jsx("span",{className:"text-white/30",children:"•"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ie,{className:"w-4 h-4 text-muted-foreground"}),e.jsxs("span",{className:"text-white/80",children:[t," followers"]})]})]})]})]})}function Fe(s){const{user:t}=Oe();return y.useMemo(()=>{if(!s||!t)return{canEdit:!1,canDelete:!1,canAddTracks:!1,canRemoveTracks:!1,canManageCollaborators:!1,canRead:!1,isOwner:!1};const a=s.user_id===t.id;return{canEdit:a,canDelete:a,canAddTracks:a,canRemoveTracks:a,canManageCollaborators:a,canRead:!0,isOwner:a}},[s,t])}function vt({playlist:s,onUpdated:t,canShare:a=!1}){const r=Fs(),{success:i,error:l}=Q(),n=Fe(s),[o,m]=y.useState(!1),[u,c]=y.useState(!1),[p,d]=y.useState({title:s.title,description:s.description,is_public:s.is_public,cover_url:s.cover_url}),[h,g]=y.useState(!1),x=Gs(),j=Qe();y.useEffect(()=>{o&&d({title:s.title,description:s.description,is_public:s.is_public,cover_url:s.cover_url})},[o,s.title,s.description,s.is_public,s.cover_url]),y.useEffect(()=>{if(x.isSuccess&&!x.isPending){g(!0);const N=setTimeout(()=>{g(!1),x.reset()},2e3);return()=>clearTimeout(N)}},[x.isSuccess,x.isPending,x]);const b=async()=>{try{await x.mutateAsync({id:s.id,data:p}),i("Playlist mise à jour avec succès"),m(!1),t?.()}catch(N){l(N instanceof Error?N.message:"Erreur lors de la mise à jour")}},f=async()=>{try{await j.mutateAsync(s.id),i("Playlist supprimée avec succès"),c(!1),r("/playlists")}catch(N){l(N instanceof Error?N.message:"Erreur lors de la suppression")}},v=x.isPending||j.isPending;return{permissions:n,showEditDialog:o,setShowEditDialog:m,showDeleteDialog:u,setShowDeleteDialog:c,editForm:p,setEditForm:d,showSuccess:h,updateMutation:x,deleteMutation:j,handleUpdate:b,handleDeleteConfirm:f,isBusy:v}}function bt({canEdit:s,canDelete:t,canShare:a,onShareClick:r,onEditClick:i,onDeleteClick:l,isBusy:n,showSuccess:o}){return e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 sm:gap-2 mb-4 sm:mb-6",children:[s&&e.jsx(w,{variant:"outline",onClick:i,disabled:n,"aria-label":"Modifier la playlist",className:"touch-manipulation min-h-11 sm:min-h-0 w-full sm:w-auto",children:n?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:"sm",className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Enregistrement..."})]}):o?e.jsxs(e.Fragment,{children:[e.jsx(us,{className:"w-4 h-4 sm:mr-2 text-green-600 dark:text-green-400","aria-hidden":!0}),e.jsx("span",{className:"hidden sm:inline",children:"Enregistré"})]}):e.jsxs(e.Fragment,{children:[e.jsx(ms,{className:"w-4 h-4 sm:mr-2","aria-hidden":!0}),"Modifier"]})}),a&&r&&e.jsxs(w,{variant:"outline",onClick:r,disabled:n,"aria-label":"Partager la playlist",className:"touch-manipulation min-h-11 sm:min-h-0 w-full sm:w-auto",children:[e.jsx(Te,{className:"w-4 h-4 sm:mr-2","aria-hidden":!0}),"Partager"]}),t&&e.jsxs(w,{variant:"destructive",onClick:l,disabled:n,"aria-label":"Supprimer la playlist",className:"touch-manipulation min-h-11 sm:min-h-0 w-full sm:w-auto",children:[e.jsx(te,{className:"w-4 h-4 sm:mr-2","aria-hidden":!0}),"Supprimer"]})]})}function Nt({open:s,onClose:t,editForm:a,onFormChange:r,onConfirm:i,isPending:l}){return e.jsx(Y,{open:s,onClose:t,title:"Modifier la playlist",variant:"default",onConfirm:i,onCancel:t,confirmLabel:l?"Enregistrement...":"Enregistrer",cancelLabel:"Annuler",showCancel:!0,size:"md",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"edit-title",className:"block text-sm font-medium mb-2",children:"Titre"}),e.jsx(V,{id:"edit-title",value:a.title||"",onChange:n=>r({...a,title:n.target.value}),placeholder:"Titre de la playlist","aria-required":!0})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"edit-description",className:"block text-sm font-medium mb-2",children:"Description"}),e.jsx("textarea",{id:"edit-description",value:a.description||"",onChange:n=>r({...a,description:n.target.value}),className:"w-full px-4 py-2 border border-input rounded-md bg-background text-foreground min-h-24",rows:3,placeholder:"Description de la playlist"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"edit-cover-url",className:"block text-sm font-medium mb-2",children:"URL de la couverture"}),e.jsx(V,{id:"edit-cover-url",type:"url",value:a.cover_url||"",onChange:n=>r({...a,cover_url:n.target.value}),placeholder:"https://example.com/cover.jpg"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"checkbox",id:"edit-is_public",checked:a.is_public??!1,onChange:n=>r({...a,is_public:n.target.checked}),className:"w-4 h-4 rounded border-input","aria-checked":a.is_public??!1}),e.jsx("label",{htmlFor:"edit-is_public",className:"text-sm font-medium",children:"Playlist publique"})]}),l&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",role:"status","aria-live":"assertive",children:[e.jsx(q,{size:"sm"}),e.jsx("span",{children:"Enregistrement en cours..."})]})]})})}function wt({playlist:s,onUpdated:t,onShareClick:a,canShare:r=!1,className:i}){const{permissions:l,showEditDialog:n,setShowEditDialog:o,showDeleteDialog:m,setShowDeleteDialog:u,editForm:c,setEditForm:p,showSuccess:d,updateMutation:h,deleteMutation:g,handleUpdate:x,handleDeleteConfirm:j,isBusy:b}=vt({playlist:s,onUpdated:t,onShareClick:a,canShare:r});return!l.canEdit&&!l.canDelete&&!r?null:e.jsxs("div",{className:i,role:"group","aria-label":"Actions de la playlist",children:[e.jsx(bt,{canEdit:l.canEdit,canDelete:l.canDelete,canShare:r,onShareClick:a,onEditClick:()=>o(!0),onDeleteClick:()=>u(!0),isBusy:b,showSuccess:d}),e.jsx(Nt,{open:n,onClose:()=>o(!1),editForm:c,onFormChange:p,onConfirm:x,isPending:h.isPending}),e.jsx($s,{open:m,onClose:()=>u(!1),onConfirm:j,title:"Supprimer la playlist",description:`Êtes-vous sûr de vouloir supprimer « ${s.title} » ? Cette action est irréversible. Tous les titres de la playlist seront retirés.`,confirmLabel:"Supprimer",cancelLabel:"Annuler",variant:"destructive",isLoading:g.isPending})]})}function St({playlistId:s,initialFollowing:t=!1,initialFollowerCount:a=0,onFollowChange:r,className:i,size:l="default",variant:n,showCount:o=!1}){const{data:m}=De(),{success:u,error:c}=Q(),p=F(),[d,h]=y.useState(t),[g,x]=y.useState(a),[j,b]=y.useState(!1),{data:f}=J({queryKey:["playlist",s],queryFn:()=>_e(s),enabled:!!s&&!!m,staleTime:3e4}),{data:v}=J({queryKey:["playlistFollowStatus",s],queryFn:()=>ss(s),enabled:!!s&&!!m,staleTime:3e4,retry:!1});y.useEffect(()=>{v?(h(v.is_following),x(v.follower_count)):f&&f.is_following!==void 0?h(f.is_following):t!==void 0&&h(t),f&&f.follower_count!==void 0?x(f.follower_count):a!==void 0&&x(a)},[v,f,t,a]);const N=R({mutationFn:()=>ts(s),onMutate:async()=>{h(!0),x(P=>P+1),b(!0)},onSuccess:()=>{u("Vous suivez maintenant cette playlist"),r?.(!0),p.invalidateQueries({queryKey:["playlist",s]}),p.invalidateQueries({queryKey:["playlistFollowStatus",s]}),p.invalidateQueries({queryKey:["playlists"]})},onError:P=>{h(!1),x(z=>Math.max(0,z-1));const L=P.response?.data?.error?.message||P.response?.data?.message||P.message||"Erreur lors de l'abonnement à la playlist";c(L)},onSettled:()=>{b(!1)}}),k=R({mutationFn:()=>as(s),onMutate:async()=>{h(!1),x(P=>Math.max(0,P-1)),b(!0)},onSuccess:()=>{u("Vous ne suivez plus cette playlist"),r?.(!1),p.invalidateQueries({queryKey:["playlist",s]}),p.invalidateQueries({queryKey:["playlistFollowStatus",s]}),p.invalidateQueries({queryKey:["playlists"]})},onError:P=>{h(!0),x(z=>z+1);const L=P.response?.data?.error?.message||P.response?.data?.message||P.message||"Erreur lors du désabonnement de la playlist";c(L)},onSettled:()=>{b(!1)}}),C=P=>{P.stopPropagation(),!(j||!m)&&(d?k.mutate():N.mutate())};if(!m||m.id===f?.user_id)return null;const S=N.isPending||k.isPending||j,D=n||(d?"outline":"default");return e.jsx(w,{onClick:C,disabled:S,variant:D,size:l,className:_(i,"min-w-[100px]"),children:S?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:"sm",className:"mr-2"}),d?"Désabonnement...":"Abonnement..."]}):d?e.jsxs(e.Fragment,{children:[e.jsx(hs,{className:"h-4 w-4 mr-2"}),"Abonné",o&&g>0&&e.jsxs("span",{className:"ml-2 text-xs",children:["(",g,")"]})]}):e.jsxs(e.Fragment,{children:[e.jsx(Le,{className:"h-4 w-4 mr-2"}),"Suivre",o&&g>0&&e.jsxs("span",{className:"ml-2 text-xs",children:["(",g,")"]})]})})}function kt({playlist:s,permissions:t,onShareClick:a,onRefetch:r}){const i=s.follower_count??0,l=s.is_following??!1;return e.jsxs("div",{className:"mt-8 flex flex-wrap items-center gap-4 mb-8",children:[e.jsxs(w,{size:"lg",className:"rounded-full h-14 px-8 text-lg font-bold shadow-[0_0_30px_rgba(var(--primary),0.4)] hover:shadow-[0_0_50px_rgba(var(--primary),0.6)] hover:scale-105 transition-all bg-primary text-primary-foreground",children:[e.jsx(qe,{className:"w-5 h-5 mr-2 fill-current"})," Play All"]}),e.jsxs(w,{size:"lg",variant:"outline",className:"rounded-full h-14 px-6 border-white/10 hover:bg-white/5 backdrop-blur-sm",children:[e.jsx(ps,{className:"w-5 h-5 mr-2"})," Shuffle"]}),e.jsx("div",{className:"flex-1"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(St,{playlistId:s.id,initialFollowerCount:i,initialFollowing:l}),e.jsx(wt,{playlist:s,onUpdated:r,onShareClick:a,canShare:t.canRead})]})]})}function Ct({onRemove:s,className:t,disabled:a}){return e.jsx(Ke,{content:e.jsx("p",{children:"Retirer de la playlist"}),children:e.jsx(w,{variant:"ghost",size:"icon",className:t,onClick:r=>{r.stopPropagation(),s()},disabled:a,"aria-label":"Retirer le titre de la playlist",children:e.jsx(te,{className:"h-4 w-4 text-muted-foreground hover:text-destructive"})})})}function Pt(s){if(isNaN(s)||!isFinite(s)||s<0)return"0:00";const t=Math.floor(s/60),a=Math.floor(s%60);return`${t}:${a.toString().padStart(2,"0")}`}function ze({playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:l,onTrackRemoved:n,isPlaying:o=!1,className:m,dragHandleProps:u,canRemoveTracks:c=!0}){const[p,d]=y.useState(!1),h=()=>{i?.(t)},g=x=>{x.stopPropagation(),l?.(t)};return e.jsxs("div",{className:_("flex items-center gap-2 sm:gap-4 p-2 sm:p-3 rounded-lg","hover:bg-kodo-void dark:hover:bg-kodo-graphite","active:bg-kodo-slate dark:active:bg-kodo-steel","transition-colors touch-manipulation",i&&"cursor-pointer",m),onClick:h,onMouseEnter:()=>d(!0),onMouseLeave:()=>d(!1),role:"listitem","aria-label":`Piste ${r}: ${t.title}`,children:[u&&e.jsx("div",{...u,className:"flex-shrink-0 cursor-grab active:cursor-grabbing text-muted-foreground hover:text-foreground transition-colors","aria-label":"Réorganiser",children:e.jsx(xs,{className:"h-5 w-5"})}),e.jsx("div",{className:"flex-shrink-0 w-6 sm:w-8 text-center text-xs sm:text-sm text-muted-foreground",children:p||o?e.jsx("button",{type:"button",onClick:g,className:"p-1 rounded-full hover:bg-kodo-slate dark:hover:bg-kodo-steel active:bg-kodo-slate dark:active:bg-kodo-steel transition-colors touch-manipulation min-h-[32px] min-w-[32px] sm:min-h-0 sm:min-w-0","aria-label":o?`Mettre en pause ${t.title}`:`Lire ${t.title}`,children:o?e.jsx(ys,{className:"h-3 w-3 sm:h-4 sm:w-4 text-kodo-text-main dark:text-kodo-text-main"}):e.jsx(qe,{className:"h-3 w-3 sm:h-4 sm:w-4 text-kodo-text-main dark:text-kodo-text-main"})}):e.jsx("span",{children:r})}),e.jsx("div",{className:"flex-shrink-0",children:t.cover_art_path?e.jsx("img",{src:t.cover_art_path,alt:`Cover de ${t.title}`,className:"w-10 h-10 sm:w-12 sm:h-12 rounded-md object-cover"}):e.jsx("div",{className:"w-10 h-10 sm:w-12 sm:h-12 rounded-md bg-kodo-slate dark:bg-kodo-steel flex items-center justify-center",children:e.jsx(fe,{className:"h-5 w-5 sm:h-6 sm:w-6 text-kodo-content-dim dark:text-kodo-content-dim"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium text-sm sm:text-base text-kodo-text-main dark:text-white truncate",children:t.title}),e.jsxs("div",{className:"text-xs sm:text-sm text-kodo-content-dim dark:text-kodo-content-dim truncate",children:[t.artist,t.album&&e.jsxs("span",{className:"hidden sm:inline",children:[" • ",t.album]})]})]}),e.jsx("div",{className:"hidden sm:block text-sm text-kodo-content-dim dark:text-kodo-content-dim flex-shrink-0",children:Pt(t.duration)}),e.jsx("div",{className:"flex items-center gap-2 flex-shrink-0",children:p&&c&&n&&e.jsx(Ct,{onRemove:n,className:"h-8 w-8 text-muted-foreground hover:text-destructive"})})]})}function ue(s){return[...s].sort((t,a)=>t.position-a.position)}function Dt(s,t,a,r){const[i,l]=y.useState(()=>ue(s));y.useEffect(()=>{l(ue(s))},[s]);const n=y.useMemo(()=>new Map(t.map(d=>[d.id,d])),[t]),{toast:o,error:m}=Q(),u=Zs(),c=Ns(Ne(Cs,{activationConstraint:{distance:8}}),Ne(ks,{coordinateGetter:Ss})),p=y.useCallback(async d=>{const{active:h,over:g}=d;if(!g||h.id===g.id)return;const x=i.findIndex(v=>v.id===h.id),j=i.findIndex(v=>v.id===g.id);if(x===-1||j===-1)return;const b=ws(i,x,j);l(b);const f=b.map(v=>v.track_id);try{await u.mutateAsync({playlistId:String(a),trackIds:f}),o({message:"Playlist réorganisée",type:"success"}),r?.()}catch{l(ue(s)),m("Impossible de réorganiser la playlist. Veuillez réessayer.")}},[i,s,a,u,o,m,r]);return{sortedPlaylistTracks:i,trackMap:n,sensors:c,handleDragEnd:p}}function _t({message:s="Aucun track dans cette playlist",description:t="Ajoutez des tracks à cette playlist pour commencer.",className:a}){return e.jsxs("div",{className:_("flex flex-col items-center justify-center py-12 text-center",a),children:[e.jsx(fe,{className:"h-12 w-12 text-muted-foreground mb-4 opacity-50"}),e.jsx("p",{className:"text-lg font-medium text-foreground mb-2",children:s}),t&&e.jsx("p",{className:"text-sm text-muted-foreground max-w-md",children:t})]})}function Et({playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:l,onTrackRemoved:n,isPlaying:o,canRemoveTracks:m}){const{attributes:u,listeners:c,setNodeRef:p,transform:d,transition:h,isDragging:g}=Ps({id:s.id}),x={transform:Ds.Transform.toString(d),transition:h,opacity:g?.5:1};return e.jsx("div",{ref:p,style:x,children:e.jsx(ze,{playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:l,onTrackRemoved:n,isPlaying:o,dragHandleProps:{...u,...c},canRemoveTracks:m})})}function At({count:s=5,className:t}){return e.jsxs("div",{className:_("space-y-1",t),role:"status","aria-label":"Chargement des pistes",children:[Array.from({length:s}).map((a,r)=>e.jsxs("div",{className:"flex items-center gap-2 sm:gap-4 p-2 sm:p-3 rounded-lg",children:[e.jsx("div",{className:"flex-shrink-0 w-6 sm:w-8 flex items-center justify-center",children:e.jsx(M,{variant:"circular",width:24,height:24})}),e.jsx("div",{className:"flex-shrink-0",children:e.jsx(M,{variant:"rectangular",width:40,height:40,className:"rounded-md sm:w-12 sm:h-12"})}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[e.jsx(M,{variant:"text",height:16,className:"sm:h-4"}),e.jsx(M,{variant:"text",height:12,className:"sm:h-3"})]}),e.jsx("div",{className:"hidden sm:block flex-shrink-0",children:e.jsx(M,{variant:"text",height:14,width:40})})]},r)),e.jsx("span",{className:"sr-only",children:"Chargement des pistes en cours..."})]})}function Mt({playlistTracks:s,tracks:t,playlistId:a,onTrackClick:r,onTrackPlay:i,onTrackRemoved:l,onTracksReordered:n,isPlaying:o,currentPlayingId:m,className:u,emptyMessage:c="Aucun track dans cette playlist",emptyDescription:p="Ajoutez des tracks à cette playlist pour commencer.",enableDragAndDrop:d=!0,canRemoveTracks:h=!0,isLoading:g=!1}){const{sortedPlaylistTracks:x,trackMap:j,sensors:b,handleDragEnd:f}=Dt(s,t,a,n),v=S=>m===S?!0:o?.(S)??!1;if(g)return e.jsx(At,{className:u});if(x.length===0)return e.jsx(_t,{message:c,description:p,className:u});const N=x.map(S=>S.id),k=_("space-y-1",u),C={role:"list","aria-label":"Liste des tracks de la playlist"};return d?e.jsx(_s,{sensors:b,collisionDetection:Es,onDragEnd:f,children:e.jsx(As,{items:N,strategy:Ms,children:e.jsx("div",{className:k,...C,children:x.map(S=>{const D=j.get(S.track_id);return D?e.jsx(Et,{playlistTrack:S,track:D,playlistId:a,position:S.position,onTrackClick:r,onTrackPlay:i,onTrackRemoved:l,isPlaying:v(D.id),canRemoveTracks:h},S.id):null})})})}):e.jsx("div",{className:k,...C,children:x.map(S=>{const D=j.get(S.track_id);return D?e.jsx(ze,{playlistTrack:S,track:D,playlistId:a,position:S.position,onTrackClick:r,onTrackPlay:i,onTrackRemoved:l,isPlaying:v(D.id),canRemoveTracks:h},S.id):null})})}class K extends Error{constructor(t,a,r=!1,i){super(t),this.code=a,this.retryable=r,this.originalError=i,this.name="TrackSearchError"}}function Tt(s){const t=new URLSearchParams;return s.query&&t.append("q",s.query),s.tags&&s.tags.length>0&&t.append("tags",s.tags.join(",")),s.tagMode&&t.append("tag_mode",s.tagMode),s.minDuration!==void 0&&t.append("min_duration",s.minDuration.toString()),s.maxDuration!==void 0&&t.append("max_duration",s.maxDuration.toString()),s.minBPM!==void 0&&t.append("min_bpm",s.minBPM.toString()),s.maxBPM!==void 0&&t.append("max_bpm",s.maxBPM.toString()),s.genre&&t.append("genre",s.genre),s.format&&t.append("format",s.format),s.minDate&&t.append("min_date",s.minDate),s.maxDate&&t.append("max_date",s.maxDate),s.page!==void 0&&t.append("page",s.page.toString()),s.limit!==void 0&&t.append("limit",s.limit.toString()),s.sortBy&&t.append("sort_by",s.sortBy),s.sortOrder&&t.append("sort_order",s.sortOrder),t}async function It(s={}){try{const a=Tt(s).toString(),r=`/tracks/search${a?`?${a}`:""}`;return(await Ue.get(r)).data}catch(t){if(t instanceof Ts){if(t.response?.status===400){const r=t.response?.data?.error||"Paramètres de recherche invalides";throw new K(r,"VALIDATION",!1,t)}if(t.response?.status===500)throw new K("Erreur serveur: Impossible d'effectuer la recherche. Veuillez réessayer plus tard.","SERVER",!0,t);if(t.code==="ECONNABORTED"||t.code==="ETIMEDOUT"||!t.response)throw new K("Erreur réseau: Impossible de se connecter au serveur. Veuillez vérifier votre connexion.","NETWORK",!0,t);const a=t.response?.data?.error||t.message||"Échec de la recherche de tracks";throw new K(a,"UNKNOWN",!1,t)}throw t instanceof K?t:new K("Erreur inconnue lors de la recherche","UNKNOWN",!1,t)}}const ke=20;function Lt(s,t,a,r){const[i,l]=y.useState(""),n=Bs(i,500),[o,m]=y.useState([]),[u,c]=y.useState(new Set),[p,d]=y.useState(!1),[h,g]=y.useState(null),[x,j]=y.useState(1),[b,f]=y.useState(0),[v,N]=y.useState(!1),{success:k,error:C}=Q(),S=et(),D=y.useCallback(async()=>{d(!0),g(null);try{const E=await It({query:n.trim()||void 0,page:x,limit:ke});m(E.tracks),f(E.pagination.total)}catch(E){let T="Erreur lors de la recherche";(E instanceof K||E instanceof Error)&&(T=E.message),g(T),m([]),f(0)}finally{d(!1)}},[n,x]);y.useEffect(()=>{n.trim()||s?D():(m([]),f(0))},[n,s,D]),y.useEffect(()=>{s&&(l(""),c(new Set),j(1),g(null))},[s]);const P=y.useCallback(E=>{c(T=>{const I=new Set(T);return I.has(E)?I.delete(E):I.add(E),I})},[]),L=y.useCallback(()=>{c(E=>E.size===o.length?new Set:new Set(o.map(T=>T.id)))},[o]),z=y.useCallback(async()=>{if(u.size===0){C("Aucun track sélectionné");return}N(!0);const E=Array.from(u);let T=0,I=0;try{for(const A of E)try{await S.mutateAsync({playlistId:t,trackId:A}),T++}catch($){I++,ee.error(`Failed to add track ${A}:`,{error:$})}T>0&&(k(`${T} track${T>1?"s":""} ajouté${T>1?"s":""} à la playlist.`),c(new Set),r?.(),a()),I>0&&C(`${I} track${I>1?"s":""} n'a${I>1?"ont":""} pas pu être ajouté${I>1?"s":""}.`)}finally{N(!1)}},[u,t,S,k,C,r,a]),ae=y.useCallback(()=>{l(""),c(new Set),j(1),g(null),a()},[a]),re=Math.ceil(b/ke),ie=y.useCallback(E=>{j(E)},[]);return{searchQuery:i,setSearchQuery:l,tracks:o,selectedTracks:u,loading:p,error:h,page:x,total:b,totalPages:re,addingTracks:v,handleTrackToggle:P,handleSelectAll:L,handleAddTracks:z,handleClose:ae,setPage:ie}}function qt({value:s,onChange:t}){return e.jsxs("div",{className:"relative",children:[e.jsx(ye,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(V,{type:"text",placeholder:"Rechercher des tracks...",value:s,onChange:a=>t(a.target.value),className:"pl-10"})]})}function Rt({track:s,isSelected:t,onToggle:a}){const r=s.album,i=`${Math.floor(s.duration/60)}:${String(s.duration%60).padStart(2,"0")}`;return e.jsxs("div",{className:_("p-4 flex items-center space-x-4 hover:bg-muted/50 transition-colors",t&&"bg-muted/30"),children:[e.jsx(ge,{checked:t,onCheckedChange:a}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium truncate",children:s.title}),e.jsxs("p",{className:"text-sm text-muted-foreground truncate",children:[s.artist,r!=null&&r!==""?`${r}`:""]})]}),e.jsx("div",{className:"text-sm text-muted-foreground",children:i})]})}function Qt({loading:s,error:t,tracks:a,selectedTracks:r,total:i,page:l,totalPages:n,onTrackToggle:o,onSelectAll:m,onPagePrev:u,onPageNext:c}){if(s&&a.length===0)return e.jsxs("div",{className:"flex items-center justify-center p-8 max-h-96",children:[e.jsx(q,{className:"h-6 w-6 text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Recherche en cours..."})]});if(t)return e.jsx("div",{className:"p-8 text-center text-destructive max-h-96",children:e.jsx("p",{children:t})});if(a.length===0)return e.jsx("div",{className:"p-8 text-center text-muted-foreground max-h-96",children:e.jsx("p",{children:"Aucun track trouvé"})});const p=a.length>0&&r.size===a.length;return e.jsxs("div",{className:"border rounded-lg max-h-96 overflow-y-auto flex flex-col",children:[e.jsxs("div",{className:"sticky top-0 bg-background border-b p-4 flex items-center justify-between shrink-0",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(ge,{checked:p,onCheckedChange:m,disabled:s}),e.jsx("span",{className:"text-sm font-medium",children:r.size>0?`${r.size} track${r.size>1?"s":""} sélectionné${r.size>1?"s":""}`:"Sélectionner tout"})]}),i>0&&e.jsxs("span",{className:"text-sm text-muted-foreground",children:[i," track",i>1?"s":""," trouvé",i>1?"s":""]})]}),e.jsx("div",{className:"divide-y overflow-y-auto flex-1 min-h-0",children:a.map(d=>e.jsx(Rt,{track:d,isSelected:r.has(d.id),onToggle:()=>o(d.id)},d.id))}),n>1&&e.jsxs("div",{className:"p-4 border-t flex items-center justify-between shrink-0",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:["Page ",l," sur ",n]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(w,{variant:"outline",size:"sm",onClick:u,disabled:l<=1||s,children:"Précédent"}),e.jsx(w,{variant:"outline",size:"sm",onClick:c,disabled:l>=n||s,children:"Suivant"})]})]})]})}function $t({selectedCount:s,addingTracks:t,onCancel:a,onAdd:r}){return e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:s>0?`${s} track${s>1?"s":""} sélectionné${s>1?"s":""}`:"Sélectionnez des tracks à ajouter"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(w,{variant:"outline",onClick:a,disabled:t,children:"Annuler"}),e.jsxs(w,{onClick:r,disabled:s===0||t,children:[t&&e.jsx(q,{size:"sm",className:"mr-2"}),e.jsx(se,{className:"w-4 h-4 mr-2"}),"Ajouter ",s>0&&`(${s})`]})]})]})}function Ft({open:s,onClose:t,playlistId:a,onTracksAdded:r}){const{searchQuery:i,setSearchQuery:l,tracks:n,selectedTracks:o,loading:m,error:u,page:c,total:p,totalPages:d,addingTracks:h,handleTrackToggle:g,handleSelectAll:x,handleAddTracks:j,handleClose:b,setPage:f}=Lt(s,a,t,r);return e.jsx(Ve,{open:s,onClose:b,title:"Ajouter des tracks à la playlist",size:"xl",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx(qt,{value:i,onChange:l}),e.jsx(Qt,{loading:m,error:u,tracks:n,selectedTracks:o,total:p,page:c,totalPages:d,onTrackToggle:g,onSelectAll:x,onPagePrev:()=>f(v=>Math.max(1,v-1)),onPageNext:()=>f(v=>v+1)}),e.jsx($t,{selectedCount:o.size,addingTracks:h,onCancel:b,onAdd:j})]})})}function zt({collaborators:s,playlistId:t,canManage:a=!1,className:r}){const{success:i,error:l}=Q(),n=Xs(),o=Ys(),m=async(c,p)=>{if(confirm(`Êtes-vous sûr de vouloir retirer ${p} de cette playlist ?`))try{await n.mutateAsync({playlistId:t,userId:c}),i("Collaborateur retiré")}catch(d){l(d instanceof Error?d.message:"Impossible de retirer le collaborateur.")}},u=async(c,p,d)=>{try{await o.mutateAsync({playlistId:t,userId:c,data:{permission:p}}),i(`Permission mise à jour pour ${d}`)}catch(h){l(h instanceof Error?h.message:"Impossible de mettre à jour la permission.")}};return!s||s.length===0?e.jsx("div",{className:_("text-center py-8 text-muted-foreground",r),children:e.jsx("p",{children:"Aucun collaborateur pour le moment"})}):e.jsx("div",{className:_("space-y-2",r),children:s.map(c=>{const p=n?.isPending||!1,d=o?.isPending||!1;return e.jsxs("div",{className:"flex items-center justify-between p-4 border rounded-lg hover:bg-accent/50 transition-colors",children:[e.jsxs("div",{className:"flex items-center space-x-4 flex-1 min-w-0",children:[e.jsx(Re,{src:c.user?.avatar_url,alt:c.user?.username||"User",size:"sm"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium truncate",children:c.user?.username||`User #${c.user_id}`}),c.user?.email&&e.jsx("p",{className:"text-sm text-muted-foreground truncate",children:c.user.email})]})]}),e.jsx("div",{className:"flex items-center space-x-2",children:a?e.jsxs(e.Fragment,{children:[e.jsx(X,{options:[{value:"read",label:"Lecture"},{value:"write",label:"Écriture"},{value:"admin",label:"Admin"}],value:c.permission,onChange:h=>u(c.user_id,h,c.user?.username||"User"),disabled:d,className:"w-32"}),e.jsx(w,{variant:"ghost",size:"icon",onClick:()=>m(c.user_id,c.user?.username||"User"),disabled:p,className:"text-destructive hover:text-destructive",children:p?e.jsx(q,{size:"sm"}):e.jsx(te,{className:"h-4 w-4"})})]}):e.jsxs("span",{className:"text-sm text-muted-foreground capitalize",children:[c.permission==="read"&&"Lecture",c.permission==="write"&&"Écriture",c.permission==="admin"&&"Admin"]})})]},c.id)})})}const Ot=({limit:s=20,minScore:t=.1,includeOwn:a=!1,onPlaylistClick:r,className:i})=>{const[l,n]=y.useState([]),[o,m]=y.useState(!0),[u,c]=y.useState(null),{error:p}=Q();return y.useEffect(()=>{(async()=>{m(!0),c(null);try{const g=await rs({limit:s,min_score:t,include_own:a});n(g.recommendations)}catch(h){const g=h instanceof Error?h.message:"Erreur lors du chargement des recommandations";c(g),p(g)}finally{m(!1)}})()},[s,t,a]),o?e.jsxs("div",{className:`flex items-center justify-center py-12 ${i}`,role:"region","aria-live":"polite",children:[e.jsx(fs,{className:"h-8 w-8 animate-spin text-muted-foreground","aria-hidden":"true"}),e.jsx("span",{className:"ml-3 text-muted-foreground",children:"Chargement des recommandations..."})]}):u?e.jsxs("div",{className:`text-center py-12 ${i}`,role:"alert",children:[e.jsx(gs,{className:"h-12 w-12 text-destructive mx-auto mb-4","aria-hidden":"true"}),e.jsx("p",{className:"text-destructive",children:u})]}):l.length===0?e.jsxs("div",{className:`text-center py-12 ${i}`,role:"region","aria-live":"polite",children:[e.jsx(Z,{className:"h-12 w-12 text-muted-foreground mx-auto mb-4","aria-hidden":"true"}),e.jsx("p",{className:"text-muted-foreground",children:"Aucune recommandation disponible pour le moment"})]}):e.jsxs("div",{className:i,role:"region","aria-label":"Playlists recommandées",children:[e.jsxs("div",{className:"mb-6",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(Z,{className:"h-5 w-5 text-primary","aria-hidden":"true"}),e.jsx("h2",{className:"text-2xl font-bold",children:"Recommandations pour vous"})]}),e.jsxs("p",{className:"text-sm text-muted-foreground","aria-live":"polite",children:[l.length," playlist",l.length>1?"s":""," recommandée",l.length>1?"s":""]})]}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",role:"list","aria-label":"Liste des playlists recommandées",children:l.map(d=>e.jsxs("div",{className:"relative",role:"listitem",children:[e.jsx(Ee,{playlist:d.playlist,onClick:()=>r?.(d.playlist)}),e.jsxs("div",{className:"absolute top-2 right-2 bg-background/80 backdrop-blur-sm rounded-md px-2 py-1 text-xs","aria-label":`Score de recommandation: ${(d.score*100).toFixed(0)}%`,children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(Z,{className:"h-3 w-3 text-primary","aria-hidden":"true"}),e.jsxs("span",{className:"font-medium",children:[(d.score*100).toFixed(0),"%"]})]}),d.reason&&e.jsx("p",{className:"text-muted-foreground text-[10px] mt-1 max-w-[120px] truncate",title:d.reason,"aria-label":`Raison: ${d.reason}`,children:d.reason})]})]},d.playlist.id))})]})},Ce=3;function Kt(s,t){const[a,r]=y.useState(null),[i,l]=y.useState(!1),[n,o]=y.useState(null),[m,u]=y.useState(0),c=$e(),p=Q(),d=async()=>{try{o(null);const j=await c.mutateAsync(s),b=`${window.location.origin}/playlists/shared/${j.share_token}`;r(b),u(0)}catch(j){const b=he(j);o(new Error(b.message))}};y.useEffect(()=>{t&&!a&&!c.isPending&&d()},[t]);const h=async()=>{if(!(m>=Ce)){u(j=>j+1);try{await d()}catch{}}},g=async()=>{if(a)try{await navigator.clipboard.writeText(a),l(!0),p.success("Link copied to clipboard"),setTimeout(()=>l(!1),2e3)}catch{p.error("Failed to copy link")}},x=()=>{o(null),u(0)};return{shareLink:a,isCopied:i,mutationError:n,retryCount:m,isPending:c.isPending,handleRetry:h,handleCopy:g,handleDismissError:x,maxRetries:Ce}}function Ut({playlistId:s,mutationError:t,isPending:a,shareLink:r,isCopied:i,retryCount:l,maxRetries:n,onRetry:o,onDismissError:m,onCopy:u,onClose:c}){return e.jsxs("div",{className:"space-y-4",children:[t&&e.jsx(pe,{error:t,variant:"banner",severity:"error",context:{action:"creating share link",resource:"playlist",resourceId:s},onRetry:l<n?o:void 0,onDismiss:m}),a?e.jsxs("div",{className:"flex items-center justify-center py-8",children:[e.jsx(q,{size:"lg",className:"mr-2"}),e.jsx("span",{children:"Creating share link..."})]}):r?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(B,{children:"Share Link"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(V,{value:r,readOnly:!0,className:"flex-1"}),e.jsx(w,{onClick:u,variant:"outline",children:i?e.jsx(js,{className:"h-4 w-4"}):e.jsx(be,{className:"h-4 w-4"})})]})]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"Anyone with this link can view the playlist"}),e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(w,{variant:"outline",onClick:c,children:"Close"}),e.jsxs(w,{onClick:u,children:[e.jsx(be,{className:"mr-2 h-4 w-4"}),"Copy Link"]})]})]}):e.jsx("div",{className:"text-center text-destructive py-4",children:"Failed to create share link"})]})}function Vt({open:s,onClose:t,playlistId:a}){const{shareLink:r,isCopied:i,mutationError:l,retryCount:n,isPending:o,handleRetry:m,handleCopy:u,handleDismissError:c,maxRetries:p}=Kt(a,s);return e.jsx(Y,{open:s,onClose:t,title:"Share Playlist",variant:"default",size:"md",children:e.jsx(Ut,{playlistId:a,mutationError:l,isPending:o,shareLink:r,isCopied:i,retryCount:n,maxRetries:p,onRetry:m,onDismissError:c,onCopy:u,onClose:t})})}const Pe=3;function Bt(s,t,a){const[r,i]=y.useState(""),[l,n]=y.useState("read"),[o,m]=y.useState(null),[u,c]=y.useState(null),[p,d]=y.useState(0),[h,g]=y.useState(null),x=Hs(),j=Q(),b=async k=>{await x.mutateAsync({playlistId:s,data:{user_id:k.username,permission:k.permission}}),j.success("Collaborator added successfully"),i(""),n("read"),c(null),d(0),g(null),a?.(),t()},f=async k=>{if(k.preventDefault(),m(null),c(null),!r.trim()){m("Username is required");return}const C={username:r.trim(),permission:l};g(C);try{await b(C)}catch(S){const D=he(S);c(new Error(D.message))}},v=async()=>{if(!(!h||p>=Pe)){d(k=>k+1);try{await b(h)}catch(k){const C=he(k);c(new Error(C.message))}}},N=()=>{c(null),d(0),g(null)};return{username:r,setUsername:i,permission:l,setPermission:n,validationError:o,setValidationError:m,mutationError:u,retryCount:p,isPending:x.isPending,handleSubmit:f,handleRetry:v,handleDismissError:N,maxRetries:Pe}}const Jt=[{value:"read",label:"Read - Can view playlist"},{value:"write",label:"Write - Can add/remove tracks"},{value:"admin",label:"Admin - Can manage collaborators"}];function Gt({open:s,onClose:t,playlistId:a,username:r,onUsernameChange:i,permission:l,onPermissionChange:n,validationError:o,mutationError:m,retryCount:u,maxRetries:c,isPending:p,onSubmit:d,onRetry:h,onDismissError:g}){return e.jsx(Y,{open:s,onClose:t,title:"Add Collaborator",variant:"default",size:"md",children:e.jsxs("form",{onSubmit:d,className:"space-y-4",children:[m&&e.jsx(pe,{error:m,variant:"banner",severity:"error",context:{action:"adding collaborator",resource:"playlist",resourceId:a},onRetry:u<c?h:void 0,onDismiss:g}),o&&e.jsx(pe,{error:o,variant:"inline",severity:"error",size:"sm",dismissible:!1}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(B,{htmlFor:"username",children:"Username"}),e.jsx(V,{id:"username",value:r,onChange:x=>{i(x.target.value)},placeholder:"Enter username",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(B,{htmlFor:"permission",children:"Permission"}),e.jsx(X,{value:l,onChange:x=>n(Array.isArray(x)?x[0]:x),options:Jt})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(w,{type:"button",variant:"outline",onClick:t,children:"Cancel"}),e.jsx(w,{type:"submit",disabled:!r.trim()||p,children:p?e.jsxs(e.Fragment,{children:[e.jsx(q,{size:"sm",className:"mr-2"}),"Adding..."]}):e.jsxs(e.Fragment,{children:[e.jsx(Le,{className:"mr-2 h-4 w-4"}),"Add Collaborator"]})})]})]})})}function Wt({open:s,onClose:t,playlistId:a,onAdded:r}){const{username:i,setUsername:l,permission:n,setPermission:o,validationError:m,setValidationError:u,mutationError:c,retryCount:p,isPending:d,handleSubmit:h,handleRetry:g,handleDismissError:x,maxRetries:j}=Bt(a,t,r),b=f=>{l(f),u(null)};return e.jsx(Gt,{open:s,onClose:t,playlistId:a,username:i,onUsernameChange:b,permission:n,onPermissionChange:o,validationError:m,mutationError:c,retryCount:p,maxRetries:j,isPending:d,onSubmit:h,onRetry:g,onDismissError:x})}function Ht({playlist:s,playlistTracks:t,tracks:a,collaborators:r,permissions:i,isAddTrackModalOpen:l,setIsAddTrackModalOpen:n,isShareModalOpen:o,setIsShareModalOpen:m,isAddCollaboratorModalOpen:u,setIsAddCollaboratorModalOpen:c,onTrackRemoved:p,onTracksReordered:d,onTrackAdded:h,onCollaboratorAdded:g}){return e.jsxs(e.Fragment,{children:[e.jsxs(Us,{defaultValue:"tracks",className:"w-full",children:[e.jsxs(Vs,{className:"bg-transparent border-b border-white/10 w-full justify-start h-auto p-0 rounded-none gap-8 mb-6",children:[e.jsx(oe,{value:"tracks",className:"rounded-none border-b-2 border-transparent data-[state=active]:bg-transparent data-[state=active]:border-primary data-[state=active]:text-primary py-4 px-0 text-lg font-display bg-transparent",children:"Tracks"}),i.canRead&&e.jsx(oe,{value:"collaborators",className:"rounded-none border-b-2 border-transparent data-[state=active]:bg-transparent data-[state=active]:border-primary data-[state=active]:text-primary py-4 px-0 text-lg font-display bg-transparent",children:"Collaborators"}),e.jsx(oe,{value:"recommendations",className:"rounded-none border-b-2 border-transparent data-[state=active]:bg-transparent data-[state=active]:border-primary data-[state=active]:text-primary py-4 px-0 text-lg font-display bg-transparent",children:"Recommendations"})]}),e.jsx(ce,{value:"tracks",children:e.jsxs(U,{variant:"glass",className:"overflow-hidden border-white/5",children:[e.jsxs("div",{className:"p-4 border-b border-white/5 flex justify-between items-center bg-black/20",children:[e.jsxs("div",{className:"relative",children:[e.jsx(ye,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),e.jsx("input",{placeholder:"Filter tracks...",className:"bg-transparent border-none text-sm text-foreground placeholder:text-muted-foreground focus:outline-none pl-9 py-2 w-64"})]}),i.canAddTracks&&e.jsxs(w,{size:"sm",onClick:()=>n(!0),variant:"ghost",className:"text-primary hover:text-primary hover:bg-primary/10",children:[e.jsx(se,{className:"w-4 h-4 mr-2"})," Add Tracks"]})]}),e.jsx("div",{className:"p-0",children:e.jsx(Mt,{playlistTracks:t,tracks:a,playlistId:s.id,onTrackRemoved:p,onTracksReordered:d,enableDragAndDrop:i.canEdit,canRemoveTracks:i.canRemoveTracks,className:"divide-y divide-white/5"})})]})}),e.jsx(ce,{value:"collaborators",children:e.jsxs(U,{variant:"glass",className:"p-6",children:[e.jsxs("div",{className:"flex justify-between items-center mb-6",children:[e.jsxs("h3",{className:"text-xl font-bold flex items-center gap-2",children:[e.jsx(Ie,{className:"w-5 h-5 text-primary"})," Squad Members"]}),i.canManageCollaborators&&e.jsxs(w,{onClick:()=>c(!0),children:[e.jsx(se,{className:"w-4 h-4 mr-2"})," Invite"]})]}),e.jsx(zt,{collaborators:r,playlistId:s.id,canManage:i.canManageCollaborators})]})}),e.jsx(ce,{value:"recommendations",children:e.jsxs("div",{className:"bg-gradient-to-br from-primary/10 to-transparent p-6 rounded-2xl border border-primary/20",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-6",children:[e.jsx(Z,{className:"w-5 h-5 text-yellow-400 animate-pulse"}),e.jsx("h3",{className:"text-xl font-bold",children:"Suggested for you"})]}),e.jsx(Ot,{limit:8,minScore:.1,includeOwn:!1,onPlaylistClick:x=>{window.location.href=`/playlists/${x.id}`}})]})})]}),e.jsx(Ft,{open:l,onClose:()=>n(!1),playlistId:s.id,onTracksAdded:h}),e.jsx(Vt,{open:o,onClose:()=>m(!1),playlistId:s.id}),e.jsx(Wt,{open:u,onClose:()=>c(!1),playlistId:s.id,onAdded:g})]})}function Xt(){return e.jsxs("div",{className:"container mx-auto px-4 py-8 flex flex-col items-center justify-center min-h-layout-page text-center",children:[e.jsx("div",{className:"text-9xl mb-4",children:"👾"}),e.jsx("h2",{className:"text-3xl font-display font-bold text-destructive mb-2",children:"Playlist Not Found"}),e.jsx(w,{variant:"outline",className:"mt-8",asChild:!0,children:e.jsx(zs,{to:"/features/library",children:"Back to Library"})})]})}function Yt(){return e.jsxs("div",{className:"min-h-layout-page pb-24",children:[e.jsx("div",{className:"h-80 md:h-96 w-full bg-muted animate-pulse"}),e.jsxs("div",{className:"container mx-auto px-4 md:px-8 relative -mt-40 z-10",children:[e.jsxs("div",{className:"flex flex-col md:flex-row gap-8 items-end",children:[e.jsx(U,{variant:"glass",className:"w-52 h-52 md:w-64 md:h-64 flex-shrink-0 p-2 overflow-hidden rounded-2xl",children:e.jsx("div",{className:"w-full h-full bg-muted animate-pulse rounded-xl"})}),e.jsxs("div",{className:"flex-1 pb-4 space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("div",{className:"h-6 w-24 bg-muted animate-pulse rounded-full"}),e.jsx("div",{className:"h-6 w-32 bg-muted animate-pulse rounded"})]}),e.jsx("div",{className:"h-12 w-3/4 max-w-xl bg-muted animate-pulse rounded"}),e.jsx("div",{className:"h-5 w-full max-w-2xl bg-muted animate-pulse rounded"}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx("div",{className:"h-6 w-24 bg-muted animate-pulse rounded-full"}),e.jsx("div",{className:"h-6 w-16 bg-muted animate-pulse rounded"}),e.jsx("div",{className:"h-6 w-20 bg-muted animate-pulse rounded"})]})]})]}),e.jsxs("div",{className:"mt-8 flex flex-wrap gap-4 mb-8",children:[e.jsx("div",{className:"h-14 w-32 bg-muted animate-pulse rounded-full"}),e.jsx("div",{className:"h-14 w-28 bg-muted animate-pulse rounded-full"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"h-10 w-full max-w-md bg-muted animate-pulse rounded"}),e.jsx("div",{className:"h-64 w-full bg-muted animate-pulse rounded-2xl"})]})]})]})}function Zt(s){const{id:t}=Os(),a=s??t??"",[r,i]=y.useState(!1),[l,n]=y.useState(!1),[o,m]=y.useState(!1),{data:u,isLoading:c,error:p,refetch:d}=Js(a),h=Fe(u??void 0),{data:g,refetch:x}=J({queryKey:["playlistCollaborators",a],queryFn:()=>xe.getCollaborators(a),enabled:!!a&&h.canRead}),j=u?.tracks?.map(D=>D.track).filter(D=>!!D)??[],b=u?.tracks??[];return{id:a,playlist:u,isLoading:c,error:p,refetch:d,permissions:h,collaborators:g??[],refetchCollaborators:x,onCollaboratorAdded:()=>{x(),d()},tracks:j,playlistTracks:b,isAddTrackModalOpen:r,setIsAddTrackModalOpen:i,isShareModalOpen:l,setIsShareModalOpen:n,isAddCollaboratorModalOpen:o,setIsAddCollaboratorModalOpen:m,handleTrackAdded:()=>{i(!1),d(),le.success("Track added")},handleTrackRemoved:()=>{d(),le.success("Track removed")},handleTracksReordered:()=>{d(),le.success("Reordered")},openShareModal:()=>n(!0),openAddCollaboratorModal:()=>m(!0)}}function ea(s){const t=s?.playlistId,{playlist:a,isLoading:r,error:i,refetch:l,permissions:n,collaborators:o,tracks:m,playlistTracks:u,isAddTrackModalOpen:c,setIsAddTrackModalOpen:p,isShareModalOpen:d,setIsShareModalOpen:h,isAddCollaboratorModalOpen:g,setIsAddCollaboratorModalOpen:x,handleTrackAdded:j,handleTrackRemoved:b,handleTracksReordered:f,openShareModal:v,onCollaboratorAdded:N}=Zt(t);return r?e.jsx(Yt,{}):i||!a?e.jsx(Xt,{}):e.jsxs("div",{className:"min-h-layout-page pb-24",children:[e.jsx(gt,{playlist:a}),e.jsxs("div",{className:"container mx-auto px-4 md:px-8 relative -mt-40 z-10",children:[e.jsx(jt,{playlist:a}),e.jsx(kt,{playlist:a,permissions:n,onShareClick:v,onRefetch:l}),e.jsx(Ht,{playlist:a,playlistTracks:u,tracks:m,collaborators:o,permissions:n,isAddTrackModalOpen:c,setIsAddTrackModalOpen:p,isShareModalOpen:d,setIsShareModalOpen:h,isAddCollaboratorModalOpen:g,setIsAddCollaboratorModalOpen:x,onTrackRemoved:b,onTracksReordered:f,onTrackAdded:j,onCollaboratorAdded:N})]})]})}function Na(){return e.jsxs(Ks,{children:[e.jsx(H,{path:"/",element:e.jsx(ft,{})}),e.jsx(H,{path:"/new",element:e.jsx(ne,{to:"/playlists",replace:!0})}),e.jsx(H,{path:"/:id",element:e.jsx(ea,{})}),e.jsx(H,{path:"/:id/edit",element:e.jsx(ne,{to:"/playlists/:id",replace:!0})}),e.jsx(H,{path:"*",element:e.jsx(ne,{to:"/playlists",replace:!0})})]})}export{Na as PlaylistRoutes};