veza/apps/web/dist_verification/assets/routes-BW8tCpD8.js

3 lines
60 KiB
JavaScript

import{a as m,j as e}from"./vendor-react-BHG7lGYR.js";import{u as J,a as z,b as $}from"./vendor-tanstack-BzWBL1hV.js";import{u as ze,d as Ke,r as Oe,a as Ue,b as Ve,c as Be,e as Je,f as He,g as Se,l as Ge,P as Ce,h as We,i as Xe,j as Ye,k as Ze}from"./PlaylistCard-z0bLl0kY.js";import{d as _,C as U,e as V,g as L,B as C,D as Z,l as te,u as Pe,I as es,f as je,j as ss,T as ts,a as as,M as rs,p as De,E as xe,L as is,b as ls,c as ns,y as ce}from"./index-BWcMVITa.js";import{p as ge}from"./playlists-C-Ora5VP.js";import{S as R}from"./Spinner-BIGPirtm.js";import{X as _e,aS as Ee,D as ve,T as ie,ad as de,aU as Ae,aV as os,L as cs,at as ds,i as Ie,ah as ae,n as Te,aW as us,aX as ms,aH as ps,aI as Me,ab as re,F as ye,aA as hs,U as xs,aO as ys,h as fs,aJ as gs,aY as js,a2 as vs,a3 as bs,A as Ns,ac as se,l as ws,C as be}from"./vendor-icons-DaGlTw4_.js";import{P as ks}from"./Pagination-i598iEQZ.js";import{G as Ss,H as Cs,I as Ne,J as Ps,K as Ds,L as _s,M as Es,N as As,O as Is,P as Ts,Q as Ms,R as qs,U as Qs,q as $s}from"./vendor-IYr-MHu4.js";import{t as Ls,o as Fs,b as Rs,s as we}from"./vendor-utils-CgOSfOkx.js";import{L as Y}from"./label-N1Bsuay_.js";import{T as zs}from"./textarea-If6sHLPh.js";import{C as fe}from"./checkbox-DUBsARHw.js";import{I as le}from"./input-BGBI2Wze.js";import{S as X}from"./select-laDQECdR.js";import{C as Ks}from"./confirmation-dialog-D8kbmfRa.js";import{u as Os,d as Us,R as Vs,b as W,N as ue}from"./vendor-router-D-s5vIeO.js";import{u as Bs}from"./useDebounce-Cc7fGPgq.js";import{A as Js}from"./avatar-B2y8ugWJ.js";import{T as Hs,a as Gs,b as me,c as pe}from"./tabs-DP-eavm_.js";import"./features-6vY6zDlz.js";import"./dropdown-BYn_8IId.js";function Ws(s){return J({queryKey:["playlist",s],queryFn:()=>Se(s),enabled:!!s})}function Xs(){const s=z();return $({mutationFn:({id:t,data:a})=>ze(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(c=>c.id===t.id?{...c,...t.data,updated_at:new Date().toISOString()}:c)),{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=z();return $({mutationFn:t=>Ke(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(c=>c.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 Ys(s=20,t=0,a,r){const c=Math.floor(t/s)+1;return J({queryKey:["playlists",s,t,a,r],queryFn:()=>Ge(c,s,void 0,a,r),enabled:!1})}function Zs(){const s=z();return $({mutationFn:({playlistId:t,data:a})=>He(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 et(){const s=z();return $({mutationFn:({playlistId:t,userId:a})=>Ue(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 st(){const s=z();return $({mutationFn:({playlistId:t,userId:a,data:r})=>Ve(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 Qe(){return $({mutationFn:s=>Je(s)})}function tt(){const s=z();return $({mutationFn:({playlistId:t,trackIds:a})=>Oe(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(c=>[c.track_id,c])),i=t.trackIds.map((c,p)=>{const l=r.get(c);return l?{...l,position:p+1}:void 0}).filter(c=>c!==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 at(){const s=z();return $({mutationFn:({playlistId:t,trackId:a})=>Be(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(c=>c.id===t.playlistId?{...c,track_count:(c.track_count||0)+1,updated_at:new Date().toISOString()}:c)),{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"]})}})}const Q=m.forwardRef(({variant:s="rectangular",width:t,height:a,className:r,...i},c)=>{const p="animate-pulse bg-kodo-steel/50",l={text:"rounded h-4 w-full",circular:"rounded-full",rectangular:"rounded-lg"},h={width:t,height:a};return e.jsx("div",{ref:c,className:_(p,l[s],r),style:h,...i})});Q.displayName="Skeleton";function rt({className:s,variant:t="grid"}){return t==="list"?e.jsx(U,{className:_("cursor-pointer",s),children:e.jsx(V,{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(Q,{variant:"rectangular",width:80,height:80,className:"rounded-lg"})}),e.jsxs("div",{className:"flex-1 space-y-2 min-w-0",children:[e.jsx(Q,{variant:"text",height:20,width:"70%"}),e.jsx(Q,{variant:"text",height:16,width:"50%"}),e.jsxs("div",{className:"flex gap-4 mt-2",children:[e.jsx(Q,{variant:"text",height:14,width:60}),e.jsx(Q,{variant:"text",height:14,width:80})]})]})]})})}):e.jsx(U,{className:_("cursor-pointer",s),children:e.jsxs(V,{className:"p-0",children:[e.jsx("div",{className:"aspect-square w-full",children:e.jsx(Q,{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(Q,{variant:"text",height:20,width:"80%"}),e.jsx(Q,{variant:"text",height:16,width:"100%"}),e.jsx(Q,{variant:"text",height:16,width:"60%"}),e.jsxs("div",{className:"flex justify-between items-center mt-2",children:[e.jsx(Q,{variant:"text",height:14,width:60}),e.jsx(Q,{variant:"text",height:14,width:80})]})]})]})})}function ke({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(l=>[l.id.toString(),l.title,l.description||"",l.is_public?"Oui":"Non",l.track_count.toString(),new Date(l.created_at).toLocaleDateString("fr-FR")]),r=[t.join(","),...a.map(l=>l.map(h=>`"${h.replace(/"/g,'""')}"`).join(","))].join(`
`),i=new Blob([`\uFEFF${r}`],{type:"text/csv;charset=utf-8;"}),c=URL.createObjectURL(i),p=document.createElement("a");p.href=c,p.download=`playlists-${new Date().toISOString().split("T")[0]}.csv`,document.body.appendChild(p),p.click(),document.body.removeChild(p),URL.revokeObjectURL(c)}function nt({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a,className:r}){const[i,c]=m.useState(!1),[p,l]=m.useState(!1),[h,n]=m.useState(!1),{success:d,error:u}=L(),y=qe(),x=Qe(),o=s.length;if(o===0)return null;const g=async()=>{l(!0);let j=0,k=0;try{for(const D of s)try{await y.mutateAsync(D.id),j++}catch(T){k++,te.error(`Failed to delete playlist ${D.id}:`,{error:T})}j>0&&(d(`${j} playlist${j>1?"s":""} supprimée${j>1?"s":""} avec succès.`),t(),a?.()),k>0&&u(`${k} playlist${k>1?"s":""} n'a${k>1?"ont":""} pas pu être supprimée${k>1?"s":""}.`)}finally{l(!1),c(!1)}},f=async()=>{n(!0);const j=[];try{for(const k of s)try{const D=await x.mutateAsync(k.id);if(D&&typeof D=="object"&&"share_token"in D){const T=`${window.location.origin}/playlists/shared/${D.share_token}`;j.push(T)}}catch(D){te.error(`Failed to create share link for playlist ${k.id}:`,{error:D})}if(j.length>0){const k=j.join(`
`);await navigator.clipboard.writeText(k),d(`${j.length} lien${j.length>1?"s":""} copié${j.length>1?"s":""} dans le presse-papiers.`),t()}else u("Impossible de créer les liens de partage.")}finally{n(!1)}},v=()=>{try{it(s),d(`${o} playlist${o>1?"s":""} exportée${o>1?"s":""} en JSON.`),t()}catch{u("Impossible d'exporter les playlists.")}},b=()=>{try{lt(s),d(`${o} playlist${o>1?"s":""} exportée${o>1?"s":""} en CSV.`),t()}catch{u("Impossible d'exporter les playlists.")}};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-kodo-steel/10 dark:bg-kodo-steel/20 border border-kodo-steel dark:border-kodo-steel rounded-lg","sticky top-0 z-10 backdrop-blur-sm",r),role:"region","aria-label":`Actions batch pour ${o} playlist${o>1?"s":""} sélectionnée${o>1?"s":""}`,children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("span",{className:"text-sm font-medium text-kodo-cyan dark:text-kodo-cyan",children:[o," playlist",o>1?"s":""," sélectionnée",o>1?"s":""]}),e.jsx(C,{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(_e,{className:"h-4 w-4","aria-hidden":"true"})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 w-full sm:w-auto",children:[e.jsx(C,{variant:"outline",size:"sm",onClick:f,disabled:h||p,className:"touch-manipulation min-h-[44px] sm:min-h-0 flex-1 sm:flex-initial","aria-label":"Partager les playlists sélectionnées",children:h?e.jsxs(e.Fragment,{children:[e.jsx(R,{size:"sm",className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Partage..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(Ee,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Partager"})]})}),e.jsxs(C,{variant:"outline",size:"sm",onClick:v,disabled:h||p,className:"touch-manipulation min-h-[44px] 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(C,{variant:"outline",size:"sm",onClick:b,disabled:h||p,className:"touch-manipulation min-h-[44px] 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(C,{variant:"destructive",size:"sm",onClick:()=>c(!0),disabled:h||p,className:"touch-manipulation min-h-[44px] sm:min-h-0 flex-1 sm:flex-initial","aria-label":"Supprimer les playlists sélectionnées",children:p?e.jsxs(e.Fragment,{children:[e.jsx(R,{size:"sm",className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Suppression..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(ie,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Supprimer"})]})})]}),e.jsx(Z,{open:i,onClose:()=>c(!1),title:"Supprimer les playlists ?",variant:"alert",onConfirm:g,onCancel:()=>c(!1),confirmLabel:p?"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:o})," ","playlist",o>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:s.map(j=>e.jsxs("li",{children:["• ",j.title]},j.id))})]})]})})]})}function ot({view:s="grid",limit:t=20,className:a,enableSelection:r=!1,searchQuery:i="",filterIsPublic:c,filterOwner:p="all",sortBy:l="created_at",sortOrder:h="desc"}){const[n,d]=m.useState(s),[u,y]=m.useState(0),[x,o]=m.useState(new Set),{data:g}=Pe(),f=Math.floor(u/t)+1,v=!!(i.trim()||c!==void 0||p!=="all"),{data:b,isLoading:j,error:k}=J({queryKey:["playlistSearch",i,c,p,f,t,l,h],queryFn:()=>ge.search({q:i.trim()||void 0,page:f,limit:t,is_public:c,user_id:p==="mine"&&g?.id?g.id:void 0,sort_by:l,sort_order:h}),enabled:v}),{data:D,isLoading:T,error:P}=Ys(t,u,l,h),w=v?b:D,S=v?j:T,q=v?k:P,M=m.useMemo(()=>{const I=w?.playlists||[];return I.length===0?[]:[...I].sort((H,K)=>{let G=0;switch(l){case"title":G=(H.title||"").localeCompare(K.title||"");break;case"track_count":G=(H.track_count||0)-(K.track_count||0);break;default:G=new Date(H.created_at).getTime()-new Date(K.created_at).getTime();break}return h==="asc"?G:-G})},[w?.playlists,l,h]),N=I=>{y((I-1)*t)},A=w?Math.ceil(w.total/t):0,E=w?Math.floor(u/t)+1:1,ee=(I,B)=>{o(H=>{const K=new Set(H);return B?K.add(I.id):K.delete(I.id),K})},ne=()=>{if(!w)return;const I=M.every(B=>x.has(B.id));o(I?new Set:new Set(M.map(B=>B.id)))},Fe=()=>{o(new Set)},Re=M.filter(I=>x.has(I.id))||[],oe=w&&M.length>0&&M.every(I=>x.has(I.id));return S&&!w?e.jsx("div",{className:_("space-y-4",a),role:"region","aria-live":"polite",children:e.jsx(ke,{count:t,view:n})}):q?e.jsxs("div",{className:_("text-center py-12",a),role:"alert",children:[e.jsx("p",{className:"text-destructive",children:"Erreur lors du chargement des playlists"}),q instanceof Error&&e.jsx("p",{className:"text-sm text-muted-foreground mt-2",children:q.message})]}):!S&&!w?.playlists.length&&!v?e.jsxs("div",{className:_("text-center py-12",a),role:"region","aria-live":"polite",children:[e.jsx(de,{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."})]}):i&&M.length===0?e.jsxs("div",{className:_("text-center py-12",a),role:"region","aria-live":"polite",children:[e.jsx(de,{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."})]}):!S&&M.length===0&&!i?e.jsxs("div",{className:_("text-center py-12",a),role:"region","aria-live":"polite",children:[e.jsx(de,{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:_("space-y-4",a),role:"region","aria-label":"Liste des playlists",children:[r&&x.size>0&&e.jsx(nt,{selectedPlaylists:Re,onSelectionClear:Fe}),e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[r&&M.length>0&&e.jsxs(C,{variant:"outline",size:"sm",onClick:ne,className:"touch-manipulation min-h-[44px] sm:min-h-0","aria-label":oe?"Désélectionner toutes":"Sélectionner toutes",children:[oe?e.jsx(Ae,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}):e.jsx(os,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:oe?"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-lg bg-kodo-void dark:bg-kodo-graphite border border-kodo-steel dark:border-kodo-steel",role:"group","aria-label":"Changer l'affichage des playlists",children:[e.jsxs("button",{type:"button",onClick:()=>d("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",n==="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":n==="list",children:[e.jsx(cs,{className:"h-4 w-4","aria-hidden":"true"}),e.jsx("span",{className:"hidden md:inline",children:"Liste"})]}),e.jsxs("button",{type:"button",onClick:()=>d("grid"),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",n==="grid"?"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 grille","aria-pressed":n==="grid",children:[e.jsx(ds,{className:"h-4 w-4","aria-hidden":"true"}),e.jsx("span",{className:"hidden md:inline",children:"Grille"})]})]})})]}),e.jsxs("div",{className:_(n==="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:[M.map(I=>e.jsx(Ce,{playlist:I,className:n==="list"?"flex-row":"",selectable:r,selected:x.has(I.id),onSelect:ee},I.id)),S&&e.jsx(ke,{count:4,view:n})]}),A>1&&e.jsx(ks,{currentPage:E,totalPages:A,onPageChange:N,totalItems:w?.total||0,itemsPerPage:t,showItemsInfo:!0,className:"pt-4 border-t"})]})}const ct=Fs({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:Rs().default(!0)});function dt({open:s,onOpenChange:t,onCreated:a}){const[r,i]=m.useState(!1),{success:c,error:p}=L(),{register:l,handleSubmit:h,formState:{errors:n},reset:d,watch:u}=Ss({resolver:Ls(ct),defaultValues:{title:"",description:"",is_public:!0}}),y=u("is_public"),x=async g=>{i(!0);try{await ge.create({title:g.title,description:g.description||void 0,is_public:g.is_public}),c("Playlist créée : Votre playlist a été créée avec succès."),d(),t(!1),a?.()}catch(f){te.error("Failed to create playlist:",{error:f}),p(f instanceof Error?f.message:"Impossible de créer la playlist")}finally{i(!1)}},o=()=>{d(),t(!1)};return e.jsx(Z,{open:s,onClose:o,title:"Créer une playlist",variant:"default","aria-label":"Dialogue de création de playlist",children:e.jsxs("form",{onSubmit:h(x),className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(es,{label:"Titre *",id:"title",...l("title"),placeholder:"Ma nouvelle playlist",disabled:r,"aria-invalid":n.title?"true":"false","aria-describedby":n.title?"create-title-error":void 0,"aria-required":"true"}),n.title&&e.jsx("p",{id:"create-title-error",className:"text-sm text-destructive",role:"alert",children:n.title.message})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Y,{htmlFor:"description",children:"Description"}),e.jsx(zs,{id:"description",...l("description"),placeholder:"Décrivez votre playlist...",rows:3,disabled:r,"aria-invalid":n.description?"true":"false","aria-describedby":n.description?"create-description-error":void 0}),n.description&&e.jsx("p",{id:"create-description-error",className:"text-sm text-destructive",role:"alert",children:n.description.message})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(fe,{id:"is_public",...l("is_public"),checked:y,disabled:r,"aria-checked":y}),e.jsx(Y,{htmlFor:"is_public",className:"cursor-pointer",children:"Playlist publique"})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(je,{type:"button",variant:"secondary",onClick:o,disabled:r,"aria-label":"Annuler la création de playlist",children:"Annuler"}),e.jsxs(je,{type:"submit",disabled:r,"aria-label":"Créer la playlist",children:[r&&e.jsx(Ie,{className:"w-4 h-4 mr-2 animate-spin","aria-hidden":"true"}),"Créer"]})]})]})})}function ut(){const[s,t]=m.useState(!1),[a,r]=m.useState(!1),[i,c]=m.useState(""),[p,l]=m.useState(!1),[h,n]=m.useState(void 0),[d,u]=m.useState("all"),[y,x]=m.useState("created_at"),[o,g]=m.useState("desc"),f=i||h!==void 0||d!=="all",v=()=>{c(""),n(void 0),u("all"),x("created_at"),g("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(C,{variant:"default",size:"sm",onClick:()=>r(!0),className:"touch-manipulation min-h-[44px] sm:min-h-0","aria-label":"Créer une nouvelle playlist","data-testid":"create-playlist-btn",children:[e.jsx(ae,{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(C,{variant:s?"default":"outline",size:"sm",onClick:()=>t(!s),className:"touch-manipulation min-h-[44px] 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(V,{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(Te,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-kodo-content-dim"}),e.jsx(le,{type:"text",value:i,onChange:b=>c(b.target.value),placeholder:"Rechercher des playlists...",className:"pl-10","data-testid":"playlist-search"})]}),e.jsxs(C,{variant:"outline",onClick:()=>l(!p),children:[e.jsx(us,{className:"mr-2 h-4 w-4"}),"Filters",f&&e.jsx("span",{className:"ml-2 bg-kodo-cyan text-white rounded-full px-2 py-0.5 text-xs",children:"Active"})]}),f&&e.jsxs(C,{variant:"ghost",onClick:v,children:[e.jsx(_e,{className:"mr-2 h-4 w-4"}),"Clear"]})]}),p&&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:h===void 0?"all":h?"public":"private",onChange:b=>{n(b==="all"?void 0:b==="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:d,onChange:b=>u(Array.isArray(b)?b[0]:b),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:y,onChange:b=>x(Array.isArray(b)?b[0]:b),options:[{value:"created_at",label:"Date"},{value:"title",label:"Title"},{value:"track_count",label:"Tracks"}],className:"flex-1"}),e.jsx(C,{variant:"outline",size:"sm",onClick:()=>g(b=>b==="asc"?"desc":"asc"),children:e.jsx(ms,{className:"h-4 w-4"})})]})]})]})]})})}),e.jsx(ot,{enableSelection:s,searchQuery:i,filterIsPublic:h,filterOwner:d,sortBy:y,sortOrder:o}),e.jsx(dt,{open:a,onOpenChange:r,onCreated:()=>{r(!1)}})]})}function $e(s){const{user:t}=ss();return m.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 mt({playlistId:s,initialFollowing:t=!1,initialFollowerCount:a=0,onFollowChange:r,className:i,size:c="default",variant:p,showCount:l=!1}){const{data:h}=Pe(),{success:n,error:d}=L(),u=z(),[y,x]=m.useState(t),[o,g]=m.useState(a),[f,v]=m.useState(!1),{data:b}=J({queryKey:["playlist",s],queryFn:()=>Se(s),enabled:!!s&&!!h,staleTime:3e4}),{data:j}=J({queryKey:["playlistFollowStatus",s],queryFn:()=>Ye(s),enabled:!!s&&!!h,staleTime:3e4,retry:!1});m.useEffect(()=>{j?(x(j.is_following),g(j.follower_count)):b&&b.is_following!==void 0?x(b.is_following):t!==void 0&&x(t),b&&b.follower_count!==void 0?g(b.follower_count):a!==void 0&&g(a)},[j,b,t,a]);const k=$({mutationFn:()=>We(s),onMutate:async()=>{x(!0),g(S=>S+1),v(!0)},onSuccess:()=>{n("Vous suivez maintenant cette playlist"),r?.(!0),u.invalidateQueries({queryKey:["playlist",s]}),u.invalidateQueries({queryKey:["playlistFollowStatus",s]}),u.invalidateQueries({queryKey:["playlists"]})},onError:S=>{x(!1),g(F=>Math.max(0,F-1));const q=S.response?.data?.error?.message||S.response?.data?.message||S.message||"Erreur lors de l'abonnement à la playlist";d(q)},onSettled:()=>{v(!1)}}),D=$({mutationFn:()=>Xe(s),onMutate:async()=>{x(!1),g(S=>Math.max(0,S-1)),v(!0)},onSuccess:()=>{n("Vous ne suivez plus cette playlist"),r?.(!1),u.invalidateQueries({queryKey:["playlist",s]}),u.invalidateQueries({queryKey:["playlistFollowStatus",s]}),u.invalidateQueries({queryKey:["playlists"]})},onError:S=>{x(!0),g(F=>F+1);const q=S.response?.data?.error?.message||S.response?.data?.message||S.message||"Erreur lors du désabonnement de la playlist";d(q)},onSettled:()=>{v(!1)}}),T=S=>{S.stopPropagation(),!(f||!h)&&(y?D.mutate():k.mutate())};if(!h||h.id===b?.user_id)return null;const P=k.isPending||D.isPending||f,w=p||(y?"outline":"default");return e.jsx(C,{onClick:T,disabled:P,variant:w,size:c,className:_(i,"min-w-[100px]"),children:P?e.jsxs(e.Fragment,{children:[e.jsx(R,{size:"sm",className:"mr-2"}),y?"Désabonnement...":"Abonnement..."]}):y?e.jsxs(e.Fragment,{children:[e.jsx(ps,{className:"h-4 w-4 mr-2"}),"Abonné",l&&o>0&&e.jsxs("span",{className:"ml-2 text-xs",children:["(",o,")"]})]}):e.jsxs(e.Fragment,{children:[e.jsx(Me,{className:"h-4 w-4 mr-2"}),"Suivre",l&&o>0&&e.jsxs("span",{className:"ml-2 text-xs",children:["(",o,")"]})]})})}const pt=s=>new Date(s).toLocaleDateString("fr-FR",{year:"numeric",month:"long",day:"numeric"});function ht({playlist:s,className:t}){return e.jsx(U,{className:_("mb-6",t),role:"region","aria-label":`Détails de la playlist ${s.title}`,children:e.jsx(V,{className:"p-4 sm:p-6",children:e.jsxs("div",{className:"flex flex-col md:flex-row gap-4 sm:gap-6",children:[e.jsxs("div",{className:"relative w-full md:w-64 h-48 sm:h-64 flex-shrink-0 rounded-lg overflow-hidden bg-gradient-to-br from-purple-500 to-pink-500",children:[s.cover_url?e.jsx("img",{src:s.cover_url,alt:`Couverture de la playlist ${s.title}`,className:"w-full h-full object-cover"}):e.jsx("div",{className:"w-full h-full flex items-center justify-center",role:"img","aria-label":`Pas de couverture pour la playlist ${s.title}`,children:e.jsx(re,{className:"w-24 h-24 text-white/50","aria-hidden":"true"})}),e.jsx("div",{className:"absolute top-3 right-3",children:s.is_public?e.jsxs("div",{className:"bg-kodo-lime/100/90 text-white px-4 py-1.5 rounded-full text-sm flex items-center gap-2","aria-label":"Playlist publique",children:[e.jsx(ye,{className:"w-4 h-4","aria-hidden":"true"}),"Public"]}):e.jsxs("div",{className:"bg-kodo-steel/90 text-white px-4 py-1.5 rounded-full text-sm flex items-center gap-2","aria-label":"Playlist privée",children:[e.jsx(hs,{className:"w-4 h-4","aria-hidden":"true"}),"Privé"]})})]}),e.jsxs("div",{className:"flex-1 space-y-4 sm:space-y-4",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold mb-2",id:"playlist-main-title",children:s.title}),s.description&&e.jsx("p",{className:"text-muted-foreground text-base sm:text-lg",id:"playlist-main-description",children:s.description})]}),e.jsx(mt,{playlistId:s.id,initialFollowerCount:s.follower_count,initialFollowing:s.is_following})]}),e.jsxs("div",{className:"flex flex-wrap gap-4 sm:gap-4 text-xs sm:text-sm text-muted-foreground","aria-labelledby":"playlist-main-title",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(re,{className:"w-4 h-4","aria-hidden":"true"}),e.jsxs("span",{children:[s.track_count," track",s.track_count!==1?"s":""]})]}),s.user&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(xs,{className:"w-4 h-4","aria-hidden":"true"}),e.jsxs("span",{"aria-label":`Créée par ${s.user.username}`,children:["par ",s.user.username]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ys,{className:"w-4 h-4","aria-hidden":"true"}),e.jsxs("span",{children:["Créée le ",pt(s.created_at)]})]})]})]})]})})})}function xt({playlist:s,onUpdated:t,onShareClick:a,canShare:r=!1,className:i}){const c=Os(),{success:p,error:l}=L(),h=p,n=$e(s),[d,u]=m.useState(!1),[y,x]=m.useState(!1),[o,g]=m.useState({title:s.title,description:s.description,is_public:s.is_public,cover_url:s.cover_url}),f=Xs(),v=qe(),[b,j]=m.useState(!1);if(m.useEffect(()=>{if(f.isSuccess&&!f.isPending){j(!0);const P=setTimeout(()=>{j(!1),f.reset()},2e3);return()=>clearTimeout(P)}},[f.isSuccess,f.isPending,f]),!n.canEdit&&!n.canDelete&&!r)return null;const k=async()=>{try{await f.mutateAsync({id:s.id,data:o}),h("Playlist mise à jour avec succès"),u(!1),t?.()}catch(P){l(P instanceof Error?P.message:"Erreur lors de la mise à jour")}},D=()=>{x(!0)},T=async()=>{try{await v.mutateAsync(s.id),h("Playlist supprimée avec succès"),x(!1),c("/playlists")}catch(P){l(P instanceof Error?P.message:"Erreur lors de la suppression")}};return e.jsxs("div",{className:i,role:"group","aria-label":"Actions de la playlist",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2 sm:gap-2 mb-4 sm:mb-6",children:[n.canEdit&&e.jsx(C,{variant:"outline",onClick:()=>u(!0),disabled:f.isPending||v.isPending,"aria-label":"Modifier la playlist",className:"touch-manipulation min-h-[44px] sm:min-h-0 w-full sm:w-auto",children:f.isPending?e.jsxs(e.Fragment,{children:[e.jsx(R,{size:"sm",className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Enregistrement..."})]}):b?e.jsxs(e.Fragment,{children:[e.jsx(fs,{className:"w-4 h-4 sm:mr-2 text-kodo-lime","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Enregistré"})]}):e.jsxs(e.Fragment,{children:[e.jsx(gs,{className:"w-4 h-4 sm:mr-2","aria-hidden":"true"}),"Modifier"]})}),r&&a&&e.jsxs(C,{variant:"outline",onClick:a,disabled:f.isPending||v.isPending,"aria-label":"Partager la playlist",className:"touch-manipulation min-h-[44px] sm:min-h-0 w-full sm:w-auto",children:[e.jsx(Ee,{className:"w-4 h-4 sm:mr-2","aria-hidden":"true"}),"Partager"]}),n.canDelete&&e.jsxs(C,{variant:"destructive",onClick:D,disabled:f.isPending||v.isPending,"aria-label":"Supprimer la playlist",className:"touch-manipulation min-h-[44px] sm:min-h-0 w-full sm:w-auto",children:[e.jsx(ie,{className:"w-4 h-4 sm:mr-2","aria-hidden":"true"}),"Supprimer"]})]}),e.jsx(Z,{open:d,onClose:()=>u(!1),title:"Modifier la playlist",variant:"default",onConfirm:k,onCancel:()=>u(!1),confirmLabel:f.isPending?"Enregistrement...":"Enregistrer",cancelLabel:"Annuler",showCancel:!0,size:"md","aria-label":"Dialogue de modification de playlist",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("input",{type:"text",id:"edit-title",value:o.title||"",onChange:P=>g({...o,title:P.target.value}),className:"w-full px-4 py-2 border rounded-md",placeholder:"Titre de la playlist","aria-required":"true"})]}),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:o.description||"",onChange:P=>g({...o,description:P.target.value}),className:"w-full px-4 py-2 border rounded-md",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("input",{type:"url",id:"edit-cover-url",value:o.cover_url||"",onChange:P=>g({...o,cover_url:P.target.value}),className:"w-full px-4 py-2 border rounded-md",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:o.is_public??!1,onChange:P=>g({...o,is_public:P.target.checked}),className:"w-4 h-4","aria-checked":o.is_public??!1}),e.jsx("label",{htmlFor:"edit-is_public",className:"text-sm font-medium",children:"Playlist publique"})]}),f.isPending&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",role:"status","aria-live":"assertive",children:[e.jsx(R,{size:"sm"}),e.jsx("span",{children:"Enregistrement en cours..."})]})]})}),e.jsx(Ks,{open:y,onClose:()=>x(!1),onConfirm:T,title:"Delete Playlist",description:`Are you sure you want to delete "${s.title}"? This action cannot be undone. All tracks in this playlist will be removed.`,confirmLabel:"Delete",cancelLabel:"Cancel",variant:"destructive",isLoading:v.isPending})]})}function yt({onRemove:s,className:t,disabled:a}){return e.jsx(ts,{content:e.jsx("p",{children:"Retirer de la playlist"}),children:e.jsx(C,{variant:"ghost",size:"icon",className:t,onClick:r=>{r.stopPropagation(),s()},disabled:a,"aria-label":"Retirer le titre de la playlist",children:e.jsx(ie,{className:"h-4 w-4 text-muted-foreground hover:text-destructive"})})})}function ft(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 Le({playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:c,onTrackRemoved:p,isPlaying:l=!1,className:h,dragHandleProps:n,canRemoveTracks:d=!0}){const[u,y]=m.useState(!1),x=()=>{i?.(t)},o=g=>{g.stopPropagation(),c?.(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",h),onClick:x,onMouseEnter:()=>y(!0),onMouseLeave:()=>y(!1),role:"listitem","aria-label":`Piste ${r}: ${t.title}`,children:[n&&e.jsx("div",{...n,className:"flex-shrink-0 cursor-grab active:cursor-grabbing text-muted-foreground hover:text-foreground transition-colors","aria-label":"Réorganiser",children:e.jsx(js,{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:u||l?e.jsx("button",{type:"button",onClick:o,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":l?`Mettre en pause ${t.title}`:`Lire ${t.title}`,children:l?e.jsx(vs,{className:"h-3 w-3 sm:h-4 sm:w-4 text-kodo-text-main dark:text-kodo-text-main"}):e.jsx(bs,{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(re,{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:ft(t.duration)}),e.jsx("div",{className:"flex items-center gap-2 flex-shrink-0",children:u&&d&&p&&e.jsx(yt,{onRemove:p,className:"h-8 w-8 text-muted-foreground hover:text-destructive"})})]})}function he(s){return[...s].sort((t,a)=>t.position-a.position)}function gt({playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:c,onTrackRemoved:p,isPlaying:l,canRemoveTracks:h}){const{attributes:n,listeners:d,setNodeRef:u,transform:y,transition:x,isDragging:o}=qs({id:s.id}),g={transform:Qs.Transform.toString(y),transition:x,opacity:o?.5:1};return e.jsx("div",{ref:u,style:g,children:e.jsx(Le,{playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:c,onTrackRemoved:p,isPlaying:l,dragHandleProps:{...n,...d},canRemoveTracks:h})})}function jt({playlistTracks:s,tracks:t,playlistId:a,onTrackClick:r,onTrackPlay:i,onTrackRemoved:c,onTracksReordered:p,isPlaying:l,currentPlayingId:h,className:n,emptyMessage:d="Aucun track dans cette playlist",emptyDescription:u="Ajoutez des tracks à cette playlist pour commencer.",enableDragAndDrop:y=!0,canRemoveTracks:x=!0}){const[o,g]=m.useState(()=>he(s));m.useEffect(()=>{g(he(s))},[s]);const f=new Map(t.map(w=>[w.id,w])),{toast:v,error:b}=L(),j=tt(),k=Cs(Ne(Ms,{activationConstraint:{distance:8}}),Ne(Ts,{coordinateGetter:Is})),D=w=>h===w?!0:l?.(w)??!1,T=async w=>{const{active:S,over:q}=w;if(!q||S.id===q.id)return;const F=o.findIndex(E=>E.id===S.id),M=o.findIndex(E=>E.id===q.id);if(F===-1||M===-1)return;const N=As(o,F,M);g(N);const A=N.map(E=>E.track_id);try{await j.mutateAsync({playlistId:String(a),trackIds:A}),v({message:"Playlist réorganisée",type:"success"}),p?.()}catch{g(he(s)),b("Impossible de réorganiser la playlist. Veuillez réessayer.")}};if(o.length===0)return e.jsxs("div",{className:_("flex flex-col items-center justify-center py-12 text-center",n),children:[e.jsx(re,{className:"h-12 w-12 text-muted-foreground mb-4 opacity-50"}),e.jsx("p",{className:"text-lg font-medium text-kodo-text-main dark:text-white mb-2",children:d}),u&&e.jsx("p",{className:"text-sm text-muted-foreground max-w-md",children:u})]});const P=o.map(w=>w.id);return y?e.jsx(Ps,{sensors:k,collisionDetection:Ds,onDragEnd:T,disabled:j.isPending,children:e.jsx(_s,{items:P,strategy:Es,children:e.jsx("div",{className:_("space-y-1",n),role:"list","aria-label":"Liste des tracks de la playlist",children:o.map(w=>{const S=f.get(w.track_id);return S?e.jsx(gt,{playlistTrack:w,track:S,playlistId:a,position:w.position,onTrackClick:r,onTrackPlay:i,onTrackRemoved:c,isPlaying:D(S.id),canRemoveTracks:x},w.id):null})})})}):e.jsx("div",{className:_("space-y-1",n),role:"list","aria-label":"Liste des tracks de la playlist",children:o.map(w=>{const S=f.get(w.track_id);return S?e.jsx(Le,{playlistTrack:w,track:S,playlistId:a,position:w.position,onTrackClick:r,onTrackPlay:i,onTrackRemoved:c,isPlaying:D(S.id),canRemoveTracks:x},w.id):null})})}class O extends Error{constructor(t,a,r=!1,i){super(t),this.code=a,this.retryable=r,this.originalError=i,this.name="TrackSearchError"}}function vt(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 bt(s={}){try{const a=vt(s).toString(),r=`/tracks/search${a?`?${a}`:""}`;return(await as.get(r)).data}catch(t){if(t instanceof $s){if(t.response?.status===400){const r=t.response?.data?.error||"Paramètres de recherche invalides";throw new O(r,"VALIDATION",!1,t)}if(t.response?.status===500)throw new O("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 O("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 O(a,"UNKNOWN",!1,t)}throw t instanceof O?t:new O("Erreur inconnue lors de la recherche","UNKNOWN",!1,t)}}function Nt({open:s,onClose:t,playlistId:a,onTracksAdded:r}){const[i,c]=m.useState(""),p=Bs(i,500),[l,h]=m.useState([]),[n,d]=m.useState(new Set),[u,y]=m.useState(!1),[x,o]=m.useState(null),[g,f]=m.useState(1),[v,b]=m.useState(0),[j,k]=m.useState(!1),{success:D,error:T}=L(),P=at(),w=m.useCallback(async()=>{y(!0),o(null);try{const N=await bt({query:p.trim()||void 0,page:g,limit:20});h(N.tracks),b(N.pagination.total)}catch(N){let A="Erreur lors de la recherche";(N instanceof O||N instanceof Error)&&(A=N.message),o(A),h([]),b(0)}finally{y(!1)}},[p,g]);m.useEffect(()=>{p.trim()||s?w():(h([]),b(0))},[p,s,w]),m.useEffect(()=>{s&&(c(""),d(new Set),f(1),o(null))},[s]);const S=N=>{d(A=>{const E=new Set(A);return E.has(N)?E.delete(N):E.add(N),E})},q=()=>{n.size===l.length?d(new Set):d(new Set(l.map(N=>N.id)))},F=async()=>{if(n.size===0){T("Aucun track sélectionné");return}k(!0);const N=Array.from(n);let A=0,E=0;try{for(const ee of N)try{await P.mutateAsync({playlistId:a,trackId:ee}),A++}catch(ne){E++,te.error(`Failed to add track ${ee}:`,{error:ne})}A>0&&(D(`${A} track${A>1?"s":""} ajouté${A>1?"s":""} à la playlist.`),d(new Set),r?.(),t()),E>0&&T(`${E} track${E>1?"s":""} n'a${E>1?"ont":""} pas pu être ajouté${E>1?"s":""}.`)}finally{k(!1)}},M=()=>{c(""),d(new Set),f(1),o(null),t()};return e.jsx(rs,{open:s,onClose:M,title:"Ajouter des tracks à la playlist",size:"xl",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"relative",children:[e.jsx(Te,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(le,{type:"text",placeholder:"Rechercher des tracks...",value:i,onChange:N=>c(N.target.value),className:"pl-10"})]}),e.jsx("div",{className:"border rounded-lg max-h-[400px] overflow-y-auto",children:u&&l.length===0?e.jsxs("div",{className:"flex items-center justify-center p-8",children:[e.jsx(Loader2,{className:"h-6 w-6 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-2 text-muted-foreground",children:"Recherche en cours..."})]}):x?e.jsx("div",{className:"p-8 text-center text-destructive",children:e.jsx("p",{children:x})}):l.length===0?e.jsx("div",{className:"p-8 text-center text-muted-foreground",children:e.jsx("p",{children:"Aucun track trouvé"})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"sticky top-0 bg-background border-b p-4 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(fe,{checked:l.length>0&&n.size===l.length,onCheckedChange:q,disabled:u}),e.jsx("span",{className:"text-sm font-medium",children:n.size>0?`${n.size} track${n.size>1?"s":""} sélectionné${n.size>1?"s":""}`:"Sélectionner tout"})]}),v>0&&e.jsxs("span",{className:"text-sm text-muted-foreground",children:[v," track",v>1?"s":""," trouvé",v>1?"s":""]})]}),e.jsx("div",{className:"divide-y",children:l.map(N=>{const A=n.has(N.id);return e.jsxs("div",{className:_("p-4 flex items-center space-x-4 hover:bg-muted/50 transition-colors",A&&"bg-muted/30"),children:[e.jsx(fe,{checked:A,onCheckedChange:()=>S(N.id)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium truncate",children:N.title}),e.jsxs("p",{className:"text-sm text-muted-foreground truncate",children:[N.artist,N.album&&`${N.album}`]})]}),e.jsxs("div",{className:"text-sm text-muted-foreground",children:[Math.floor(N.duration/60),":",String(N.duration%60).padStart(2,"0")]})]},N.id)})}),v>20&&e.jsxs("div",{className:"p-4 border-t flex items-center justify-between",children:[e.jsxs("span",{className:"text-sm text-muted-foreground",children:["Page ",g," sur ",Math.ceil(v/20)]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(C,{variant:"outline",size:"sm",onClick:()=>f(N=>Math.max(1,N-1)),disabled:g===1||u,children:"Précédent"}),e.jsx(C,{variant:"outline",size:"sm",onClick:()=>f(N=>N+1),disabled:g>=Math.ceil(v/20)||u,children:"Suivant"})]})]})]})}),e.jsxs("div",{className:"flex items-center justify-between pt-4 border-t",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:n.size>0?`${n.size} track${n.size>1?"s":""} sélectionné${n.size>1?"s":""}`:"Sélectionnez des tracks à ajouter"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(C,{variant:"outline",onClick:M,disabled:j,children:"Annuler"}),e.jsxs(C,{onClick:F,disabled:n.size===0||j,children:[j&&e.jsx(R,{size:"sm",className:"mr-2"}),e.jsx(ae,{className:"w-4 h-4 mr-2"}),"Ajouter ",n.size>0&&`(${n.size})`]})]})]})]})})}function wt({collaborators:s,playlistId:t,canManage:a=!1,className:r}){const{success:i,error:c}=L(),p=et(),l=st(),h=async(d,u)=>{if(confirm(`Êtes-vous sûr de vouloir retirer ${u} de cette playlist ?`))try{await p.mutateAsync({playlistId:t,userId:d}),i("Collaborateur retiré")}catch(y){c(y instanceof Error?y.message:"Impossible de retirer le collaborateur.")}},n=async(d,u,y)=>{try{await l.mutateAsync({playlistId:t,userId:d,data:{permission:u}}),i(`Permission mise à jour pour ${y}`)}catch(x){c(x instanceof Error?x.message:"Impossible de mettre à jour la permission.")}};return 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(d=>{const u=p?.isPending||!1,y=l?.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(Js,{src:d.user?.avatar_url,alt:d.user?.username||"User",size:"sm"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"font-medium truncate",children:d.user?.username||`User #${d.user_id}`}),d.user?.email&&e.jsx("p",{className:"text-sm text-muted-foreground truncate",children:d.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:d.permission,onChange:x=>n(d.user_id,x,d.user?.username||"User"),disabled:y,className:"w-32"}),e.jsx(C,{variant:"ghost",size:"icon",onClick:()=>h(d.user_id,d.user?.username||"User"),disabled:u,className:"text-destructive hover:text-destructive",children:u?e.jsx(R,{size:"sm"}):e.jsx(ie,{className:"h-4 w-4"})})]}):e.jsxs("span",{className:"text-sm text-muted-foreground capitalize",children:[d.permission==="read"&&"Lecture",d.permission==="write"&&"Écriture",d.permission==="admin"&&"Admin"]})})]},d.id)})})}const kt=({limit:s=20,minScore:t=.1,includeOwn:a=!1,onPlaylistClick:r,className:i})=>{const[c,p]=m.useState([]),[l,h]=m.useState(!0),[n,d]=m.useState(null),{error:u}=L();return m.useEffect(()=>{(async()=>{h(!0),d(null);try{const o=await Ze({limit:s,min_score:t,include_own:a});p(o.recommendations)}catch(x){const o=x instanceof Error?x.message:"Erreur lors du chargement des recommandations";d(o),u(o)}finally{h(!1)}})()},[s,t,a]),l?e.jsxs("div",{className:`flex items-center justify-center py-12 ${i}`,role:"region","aria-live":"polite",children:[e.jsx(Ie,{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..."})]}):n?e.jsxs("div",{className:`text-center py-12 ${i}`,role:"alert",children:[e.jsx(Ns,{className:"h-12 w-12 text-destructive mx-auto mb-4","aria-hidden":"true"}),e.jsx("p",{className:"text-destructive",children:n})]}):c.length===0?e.jsxs("div",{className:`text-center py-12 ${i}`,role:"region","aria-live":"polite",children:[e.jsx(se,{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(se,{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:[c.length," playlist",c.length>1?"s":""," recommandée",c.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:c.map(y=>e.jsxs("div",{className:"relative",role:"listitem",children:[e.jsx(Ce,{playlist:y.playlist,onClick:()=>r?.(y.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: ${(y.score*100).toFixed(0)}%`,children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(se,{className:"h-3 w-3 text-primary","aria-hidden":"true"}),e.jsxs("span",{className:"font-medium",children:[(y.score*100).toFixed(0),"%"]})]}),y.reason&&e.jsx("p",{className:"text-muted-foreground text-[10px] mt-1 max-w-[120px] truncate",title:y.reason,"aria-label":`Raison: ${y.reason}`,children:y.reason})]})]},y.playlist.id))})]})};function St({open:s,onClose:t,playlistId:a}){const[r,i]=m.useState(null),[c,p]=m.useState(!1),[l,h]=m.useState(null),[n,d]=m.useState(0),u=Qe(),y=L();m.useEffect(()=>{s&&!r&&!u.isPending&&x()},[s]);const x=async()=>{try{h(null);const f=await u.mutateAsync(a),v=`${window.location.origin}/playlists/shared/${f.share_token}`;i(v),d(0)}catch(f){const v=De(f);h(new Error(v.message))}},o=async()=>{if(!(n>=3)){d(f=>f+1);try{await x()}catch{}}},g=async()=>{if(r)try{await navigator.clipboard.writeText(r),p(!0),y.success("Link copied to clipboard"),setTimeout(()=>p(!1),2e3)}catch{y.error("Failed to copy link")}};return e.jsx(Z,{open:s,onClose:t,title:"Share Playlist",variant:"default",size:"md",children:e.jsxs("div",{className:"space-y-4",children:[l&&e.jsx(xe,{error:l,variant:"banner",severity:"error",context:{action:"creating share link",resource:"playlist",resourceId:a},onRetry:n<3?o:void 0,onDismiss:()=>{h(null),d(0)}}),u.isPending?e.jsxs("div",{className:"flex items-center justify-center py-8",children:[e.jsx(R,{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(Y,{children:"Share Link"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(le,{value:r,readOnly:!0,className:"flex-1"}),e.jsx(C,{onClick:g,variant:"outline",children:c?e.jsx(ws,{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(C,{variant:"outline",onClick:t,children:"Close"}),e.jsxs(C,{onClick:g,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 Ct({open:s,onClose:t,playlistId:a,onAdded:r}){const[i,c]=m.useState(""),[p,l]=m.useState("read"),[h,n]=m.useState(null),[d,u]=m.useState(null),[y,x]=m.useState(0),[o,g]=m.useState(null),f=Zs(),v=L(),b=async k=>{if(k.preventDefault(),n(null),u(null),!i.trim()){n("Username is required");return}const D={username:i.trim(),permission:p};g(D);try{await f.mutateAsync({playlistId:a,data:{user_id:D.username,permission:D.permission}}),v.success("Collaborator added successfully"),c(""),l("read"),u(null),x(0),g(null),r?.(),t()}catch(T){const P=De(T);u(new Error(P.message))}},j=async()=>{if(!(!o||y>=3)){x(k=>k+1);try{await f.mutateAsync({playlistId:a,data:{user_id:o.username,permission:o.permission}}),v.success("Collaborator added successfully"),c(""),l("read"),u(null),x(0),g(null),r?.(),t()}catch{}}};return e.jsx(Z,{open:s,onClose:t,title:"Add Collaborator",variant:"default",size:"md",children:e.jsxs("form",{onSubmit:b,className:"space-y-4",children:[d&&e.jsx(xe,{error:d,variant:"banner",severity:"error",context:{action:"adding collaborator",resource:"playlist",resourceId:a},onRetry:y<3?j:void 0,onDismiss:()=>{u(null),x(0),g(null)}}),h&&e.jsx(xe,{error:h,variant:"inline",severity:"error",size:"sm",dismissible:!1}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Y,{htmlFor:"username",children:"Username"}),e.jsx(le,{id:"username",value:i,onChange:k=>{c(k.target.value),n(null)},placeholder:"Enter username",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Y,{htmlFor:"permission",children:"Permission"}),e.jsx(X,{value:p,onChange:k=>l(Array.isArray(k)?k[0]:k),options:[{value:"read",label:"Read - Can view playlist"},{value:"write",label:"Write - Can add/remove tracks"},{value:"admin",label:"Admin - Can manage collaborators"}]})]}),e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(C,{type:"button",variant:"outline",onClick:t,children:"Cancel"}),e.jsx(C,{type:"submit",disabled:!i.trim()||f.isPending,children:f.isPending?e.jsxs(e.Fragment,{children:[e.jsx(R,{size:"sm",className:"mr-2"}),"Adding..."]}):e.jsxs(e.Fragment,{children:[e.jsx(Me,{className:"mr-2 h-4 w-4"}),"Add Collaborator"]})})]})]})})}function Pt(){const{id:s}=Us(),[t,a]=m.useState(!1),[r,i]=m.useState(!1),[c,p]=m.useState(!1),{data:l,isLoading:h,error:n,refetch:d}=Ws(s||""),u=$e(l),{data:y,refetch:x}=J({queryKey:["playlistCollaborators",s],queryFn:()=>ge.getCollaborators(s||""),enabled:!!s&&u.canRead});if(h)return e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx(is,{})})});if(n||!l)return e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx(U,{children:e.jsx(V,{className:"pt-6",children:e.jsxs("div",{className:"text-center",children:[e.jsx("h2",{className:"text-2xl font-bold text-destructive mb-2",children:"Error"}),e.jsx("p",{className:"text-muted-foreground",children:n instanceof Error?n.message:"Failed to load playlist"})]})})})});const o=l.tracks?.map(j=>j.track).filter(j=>!!j)||[],g=l.tracks||[],f=()=>{a(!1),d(),ce.success("Track added to playlist")},v=()=>{d(),ce.success("Track removed from playlist")},b=()=>{d(),ce.success("Playlist tracks reordered")};return e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[e.jsx(ht,{playlist:l}),e.jsx("div",{className:"mb-6",children:e.jsx(xt,{playlist:l,onUpdated:d,onShareClick:()=>i(!0),canShare:u.canRead})}),e.jsxs(Hs,{defaultValue:"tracks",className:"w-full",children:[e.jsxs(Gs,{children:[e.jsx(me,{value:"tracks",children:"Tracks"}),u.canRead&&e.jsxs(me,{value:"collaborators",children:[e.jsx(ye,{className:"mr-2 h-4 w-4"}),"Collaborators"]}),e.jsxs(me,{value:"recommendations",children:[e.jsx(se,{className:"mr-2 h-4 w-4"}),"Recommendations"]})]}),e.jsxs(pe,{value:"tracks",className:"mt-6",children:[e.jsxs("div",{className:"mb-4 flex justify-between items-center",children:[e.jsx("h2",{className:"text-2xl font-bold",children:"Tracks"}),u.canAddTracks&&e.jsxs(C,{onClick:()=>a(!0),className:"gap-2",children:[e.jsx(ae,{className:"h-4 w-4"}),"Ajouter des tracks"]})]}),e.jsx(jt,{playlistTracks:g,tracks:o,playlistId:l.id,onTrackRemoved:v,onTracksReordered:b,enableDragAndDrop:u.canEdit,canRemoveTracks:u.canRemoveTracks})]}),e.jsx(pe,{value:"collaborators",className:"mt-6",children:e.jsxs(U,{children:[e.jsx(ls,{children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(ns,{className:"flex items-center gap-2",children:[e.jsx(ye,{className:"h-5 w-5"}),"Collaborators"]}),u.canManageCollaborators&&e.jsxs(C,{onClick:()=>p(!0),size:"sm",children:[e.jsx(ae,{className:"mr-2 h-4 w-4"}),"Add Collaborator"]})]})}),e.jsx(V,{children:e.jsx(wt,{collaborators:y||[],playlistId:l.id,canManage:u.canManageCollaborators})})]})}),e.jsx(pe,{value:"recommendations",className:"mt-6",children:e.jsx(U,{children:e.jsx(V,{className:"pt-6",children:e.jsx(kt,{limit:12,minScore:.1,includeOwn:!1,onPlaylistClick:j=>{window.location.href=`/playlists/${j.id}`}})})})})]}),e.jsx(Nt,{open:t,onClose:()=>a(!1),playlistId:l.id,onTracksAdded:f}),l&&e.jsx(St,{open:r,onClose:()=>i(!1),playlistId:l.id}),l&&e.jsx(Ct,{open:c,onClose:()=>p(!1),playlistId:l.id,onAdded:()=>{x(),d()}})]})}function Wt(){return e.jsxs(Vs,{children:[e.jsx(W,{path:"/",element:e.jsx(ut,{})}),e.jsx(W,{path:"/new",element:e.jsx(ue,{to:"/playlists",replace:!0})}),e.jsx(W,{path:"/:id",element:e.jsx(Pt,{})}),e.jsx(W,{path:"/:id/edit",element:e.jsx(ue,{to:"/playlists/:id",replace:!0})}),e.jsx(W,{path:"*",element:e.jsx(ue,{to:"/playlists",replace:!0})})]})}export{Wt as PlaylistRoutes};