veza/apps/web/dist_verification/assets/routes-DOpzcRDM.js
senke 04c25aa24f Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales

Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config

Bloc C - Backend:
- Extraction routes_auth.go depuis router.go

Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 17:23:32 +01:00

3 lines
73 KiB
JavaScript

import{a as f,j as e}from"./vendor-react-yWUy5XPk.js";import{v as Ee,B as w,c as _,C as U,f as pe,S as k,n as Q,l as se,L,D as G,F as Ue,T as Ve,g as Be,p as xe,i as fe,w as oe}from"./index-CYK_b1Uz.js";import{C as Je}from"./ContentFadeIn-DAssD8gZ.js";import{a as V,u as z,b as R}from"./vendor-tanstack-kPY9uK0s.js";import{n as Ae,l as Ge,k as We,m as He,g as Xe,r as Ze,d as Ye,e as es,c as ss,h as ts,j as as,b as rs,f as is,u as ls,a as ns}from"./playlistService-Ibr1CVA5.js";import{p as ye,P as Me}from"./PlaylistCard-C4g5-M9j.js";import{z as Te,B as os,aE as cs,aR as ds,L as be,X as Ie,af as qe,aa as Ne,i as ae,P as te,S as ge,O as us,a$ as ms,s as je,y as hs,U as Le,a6 as ps,$ as xs,ab as fs,a0 as Re,r as Qe,b0 as ys,w as gs,q as js,g as vs,e as bs,J as ee,C as Ns,a3 as we}from"./vendor-icons-DJFb1Tiw.js";import{P as ws}from"./Pagination-OD6LbhK5.js";import{ai as Ss,aj as ks,ak as Se,al as Cs,am as Ps,an as Ds,ao as _s,ap as Es,aq as As,ar as Ms,as as Ts,at as Is,au as qs}from"./vendor-CveO81sn.js";import{o as Ls,b as Rs,s as ke,t as Qs,f as $s}from"./vendor-utils-DtoSyhX2.js";import{L as J,I as B}from"./input-CGdBHtsQ.js";import{T as Fs}from"./textarea-Dn-lpNpV.js";import{C as ve}from"./checkbox-DgTIon8S.js";import{S as Y}from"./Select-DA2I33Xz.js";import{A as $e}from"./avatar-iUZRi_fz.js";import{C as zs}from"./confirmation-dialog-DS4X89Bi.js";import{a as Os,L as Ks,b as Us,R as Vs,c as Z,N as ce}from"./vendor-router-BNNHboN9.js";import{T as Bs,a as Js,b as de,c as ue}from"./Tabs-jry2MOtG.js";import{u as Gs}from"./useDebounce-B1fFOcpX.js";import{A as Ws}from"./vendor-http-Cz8wfb0q.js";import"./vendor-motion-B3XPS3Jc.js";import"./vendor-i18n-CMcqpBLz.js";import"./features-DItyhINc.js";import"./vendor-security-DsrNJhpn.js";import"./dropdown-CA3EXRNb.js";function Hs(s){return V({queryKey:["playlist",s],queryFn:()=>Ae(s),enabled:!!s})}function Xs(){const s=z();return R({mutationFn:({id:t,data:a})=>He(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 Fe(){const s=z();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 Zs(s=20,t=0,a,r){const l=Math.floor(t/s)+1;return V({queryKey:["playlists",s,t,a,r],queryFn:()=>Ge(l,s,void 0,a,r),enabled:!1})}function Ys(){const s=z();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 et(){const s=z();return R({mutationFn:({playlistId:t,userId:a})=>Ze(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 R({mutationFn:({playlistId:t,userId:a,data:r})=>Ye(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 tt(s){return V({queryKey:["playlist",s,"collaborators"],queryFn:()=>Xe(s),enabled:!!s})}function ze(){return R({mutationFn:s=>ss(s)})}function at(){const s=z();return R({mutationFn:({playlistId:t,trackIds:a})=>ts(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 rt(){const s=z();return R({mutationFn:({playlistId:t,trackId:a})=>as(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 it({initialView:s,limit:t,searchQuery:a,filterIsPublic:r,filterOwner:i,sortBy:l,sortOrder:n}){const[o,m]=f.useState(s),[u,d]=f.useState(0),[p,c]=f.useState(new Set),{data:h}=Ee(),g=Math.floor(u/t)+1,x=!!(a.trim()||r!==void 0||i!=="all"),{data:j,isLoading:b,error:y}=V({queryKey:["playlistSearch",a,r,i,g,t,l,n],queryFn:()=>ye.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:P}=Zs(t,u,l,n),D=x?j:v,C=x?b:N,E=x?y:P,S=f.useMemo(()=>{const M=D?.playlists||[];return M.length===0?[]:[...M].sort((H,O)=>{let X=0;switch(l){case"title":X=(H.title||"").localeCompare(O.title||"");break;case"track_count":X=(H.track_count||0)-(O.track_count||0);break;default:X=new Date(H.created_at).getTime()-new Date(O.created_at).getTime();break}return n==="asc"?X:-X})},[D?.playlists,l,n]),q=D?Math.ceil(D.total/t):0,$=D?Math.floor(u/t)+1:1,ie=M=>{d((M-1)*t)},le=(M,F)=>{c(H=>{const O=new Set(H);return F?O.add(M.id):O.delete(M.id),O})},ne=()=>{if(!D)return;const M=S.every(F=>p.has(F.id));c(M?new Set:new Set(S.map(F=>F.id)))},A=()=>{c(new Set)},T=S.filter(M=>p.has(M.id)),I=D&&S.length>0&&S.every(M=>p.has(M.id));return{currentView:o,setCurrentView:m,offset:u,sortedPlaylists:S,data:D,isLoading:C,error:E,hasSearchOrFilters:x,searchQuery:a,totalPages:q,currentPage:$,handlePageChange:ie,selectedPlaylists:p,selectedPlaylistsArray:T,isAllSelected:I,handlePlaylistSelect:le,handleSelectAll:ne,handleClearSelection:A,limit:t}}function lt({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(Te,{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: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-[var(--duration-fast)]","hover:bg-muted dark:hover:bg-muted","focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2","touch-manipulation",s==="list"?"bg-white dark:bg-muted text-primary dark:text-primary shadow-sm":"text-muted-foreground dark:text-muted-foreground"),"aria-label":"Affichage en liste","aria-pressed":s==="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:()=>t("grid"),className:_("flex items-center gap-2 px-4 py-1.5 rounded-md text-sm font-medium transition-all duration-[var(--duration-fast)]","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(ds,{className:"h-4 w-4","aria-hidden":"true"}),e.jsx("span",{className:"hidden md:inline",children:"Grille"})]})]})})]})}function me({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(be,{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(be,{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 nt({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 ot({className:s,variant:t="grid"}){return t==="list"?e.jsx(U,{className:_("cursor-pointer min-h-24",s),children:e.jsx(pe,{className:"p-0",children:e.jsxs("div",{className:"flex flex-row gap-4 p-4",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx(k,{className:"h-20 w-20 rounded-lg shrink-0"})}),e.jsxs("div",{className:"flex-1 space-y-2 min-w-0 min-h-14",children:[e.jsx(k,{className:"h-5 w-4/5 rounded-md"}),e.jsx(k,{className:"h-4 w-3/5 rounded-md"}),e.jsxs("div",{className:"flex gap-4 mt-2",children:[e.jsx(k,{className:"h-3 w-16 rounded-md"}),e.jsx(k,{className:"h-3 w-24 rounded-md"})]})]})]})})}):e.jsx(U,{className:_("cursor-pointer overflow-hidden",s),children:e.jsxs(pe,{className:"p-0",children:[e.jsx("div",{className:"aspect-square w-full min-h-0",children:e.jsx(k,{className:"w-full h-full rounded-t-lg rounded-b-none"})}),e.jsxs("div",{className:"p-4 space-y-2 min-h-20",children:[e.jsx(k,{className:"h-5 w-4/5 rounded-md"}),e.jsx(k,{className:"h-4 w-full rounded-md"}),e.jsx(k,{className:"h-4 w-3/5 rounded-md"}),e.jsxs("div",{className:"flex justify-between items-center pt-2",children:[e.jsx(k,{className:"h-3 w-16 rounded-md"}),e.jsx(k,{className:"h-3 w-20 rounded-md"})]})]})]})})}function Ce({count:s=8,view:t="grid",className:a}){return e.jsxs("div",{className:_("w-full max-w-layout-content mx-auto",t==="grid"?"grid grid-cols-2 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4":"flex flex-col gap-3",a),role:"status","aria-label":"Chargement des playlists",children:[Array.from({length:s}).map((r,i)=>e.jsx(ot,{variant:t},i)),e.jsx("span",{className:"sr-only",children:"Chargement des playlists en cours..."})]})}function ct(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 dt(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 ut({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a}){const[r,i]=f.useState(!1),[l,n]=f.useState(!1),[o,m]=f.useState(!1),{success:u,error:d}=Q(),p=Fe(),c=ze(),h=s.length;return{selectedCount:h,showDeleteDialog:r,setShowDeleteDialog:i,isDeleting:l,isSharing:o,handleDelete:async()=>{n(!0);let y=0,v=0;try{for(const N of s)try{await p.mutateAsync(N.id),y++}catch(P){v++,se.error(`Failed to delete playlist ${N.id}:`,{error:P})}y>0&&(u(`${y} playlist${y>1?"s":""} supprimée${y>1?"s":""} avec succès.`),t(),a?.()),v>0&&d(`${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 y=[];try{for(const v of s)try{const N=await c.mutateAsync(v.id);if(N&&typeof N=="object"&&"share_token"in N){const P=`${window.location.origin}/playlists/shared/${N.share_token}`;y.push(P)}}catch(N){se.error(`Failed to create share link for playlist ${v.id}:`,{error:N})}if(y.length>0){const v=y.join(`
`);await navigator.clipboard.writeText(v),u(`${y.length} lien${y.length>1?"s":""} copié${y.length>1?"s":""} dans le presse-papiers.`),t()}else d("Impossible de créer les liens de partage.")}finally{m(!1)}},handleExportJSON:()=>{try{ct(s),u(`${h} playlist${h>1?"s":""} exportée${h>1?"s":""} en JSON.`),t()}catch{d("Impossible d'exporter les playlists.")}},handleExportCSV:()=>{try{dt(s),u(`${h} playlist${h>1?"s":""} exportée${h>1?"s":""} en CSV.`),t()}catch{d("Impossible d'exporter les playlists.")}}}}function mt({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(Ie,{className:"h-4 w-4","aria-hidden":"true"})})]}),r]})}function ht({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(L,{size:"sm",inline:!0,className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Partage..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(qe,{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(Ne,{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(Ne,{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(L,{size:"sm",inline:!0,className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Suppression..."})]}):e.jsxs(e.Fragment,{children:[e.jsx(ae,{className:"h-4 w-4 sm:mr-2","aria-hidden":"true"}),e.jsx("span",{className:"hidden sm:inline",children:"Supprimer"})]})})]})}function pt({open:s,onClose:t,onConfirm:a,selectedPlaylists:r,selectedCount:i,isDeleting:l}){return e.jsx(G,{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 xt({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a,className:r}){const{selectedCount:i,showDeleteDialog:l,setShowDeleteDialog:n,isDeleting:o,isSharing:m,handleDelete:u,handleShare:d,handleExportJSON:p,handleExportCSV:c}=ut({selectedPlaylists:s,onSelectionClear:t,onPlaylistsDeleted:a});return i===0?null:e.jsxs(e.Fragment,{children:[e.jsx(mt,{selectedCount:i,onClear:t,className:r,children:e.jsx(ht,{onShare:d,onExportJSON:p,onExportCSV:c,onDelete:()=>n(!0),isSharing:m,isDeleting:o})}),e.jsx(pt,{open:l,onClose:()=>n(!1),onConfirm:u,selectedPlaylists:s,selectedCount:i,isDeleting:o})]})}function ft({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:d,sortedPlaylists:p,data:c,isLoading:h,error:g,hasSearchOrFilters:x,totalPages:j,currentPage:b,handlePageChange:y,selectedPlaylists:v,selectedPlaylistsArray:N,isAllSelected:P,handlePlaylistSelect:D,handleSelectAll:C,handleClearSelection:E,limit:S}=it({initialView:s,limit:t,searchQuery:i,filterIsPublic:l,filterOwner:n,sortBy:o,sortOrder:m});return h&&!c?e.jsx("div",{className:_("space-y-4",a),role:"region","aria-live":"polite",children:e.jsx(Ce,{count:S,view:u})}):g?e.jsx(nt,{error:g,className:a}):!h&&!c?.playlists.length&&!x?e.jsx(me,{variant:"no_playlists",className:a}):i&&p.length===0?e.jsx(me,{variant:"no_search_results",className:a}):!h&&p.length===0&&!i?e.jsx(me,{variant:"no_playlists",className:a}):e.jsx(Je,{className:_("space-y-4",a),children:e.jsxs("div",{role:"region","aria-label":"Liste des playlists",children:[r&&v.size>0&&e.jsx(xt,{selectedPlaylists:N,onSelectionClear:E}),e.jsx(lt,{currentView:u,onViewChange:d,enableSelection:r,hasPlaylists:p.length>0,isAllSelected:!!P,onSelectAll:C}),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-3 sm:gap-4"),role:"list","aria-label":"Playlists disponibles",children:[p.map((q,$)=>e.jsx("div",{className:"animate-stagger-in",style:{animationDelay:`${Math.min($*50,500)}ms`},children:e.jsx(Me,{playlist:q,className:u==="list"?"flex-row":"",selectable:r,selected:v.has(q.id),onSelect:D})},q.id)),h&&e.jsx(Ce,{count:4,view:u})]}),j>1&&e.jsx(ws,{currentPage:b,totalPages:j,onPageChange:y,totalItems:c?.total||0,itemsPerPage:S,showItemsInfo:!0,className:"pt-4 border-t"})]})})}const yt=Ls({title:ke().min(1,"Le titre est requis").max(200,"Le titre ne peut pas dépasser 200 caractères"),description:ke().max(1e3,"La description ne peut pas dépasser 1000 caractères").optional(),is_public:Rs().default(!0)});function gt({onOpenChange:s,onCreated:t}){const[a,r]=f.useState(!1),{success:i,error:l}=Q(),n=Ss({resolver:Qs(yt),defaultValues:{title:"",description:"",is_public:!0}}),{reset:o,watch:m}=n,u=m("is_public");return{form:n,onSubmit:async c=>{r(!0);try{await ye.create({title:c.title,description:c.description||void 0,is_public:c.is_public}),i("Playlist créée : Votre playlist a été créée avec succès."),o(),s(!1),t?.()}catch(h){se.error("Failed to create playlist:",{error:h}),l(h instanceof Error?h.message:"Impossible de créer la playlist")}finally{r(!1)}},handleCancel:()=>{o(),s(!1)},isSubmitting:a,isPublic:u}}function jt({open:s,onClose:t,register:a,errors:r,handleSubmit:i,onSubmit:l,onCancel:n,isSubmitting:o,isPublic:m}){return e.jsx(G,{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(J,{htmlFor:"title",children:"Titre *"}),e.jsx(B,{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(J,{htmlFor:"description",children:"Description"}),e.jsx(Fs,{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(ve,{id:"is_public",...a("is_public"),checked:m,disabled:o,"aria-checked":m}),e.jsx(J,{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(L,{size:"sm",inline:!0,className:"mr-2"}),"Créer"]})]})]})})}function vt({open:s,onOpenChange:t,onCreated:a}){const{form:{register:r,formState:{errors:i},handleSubmit:l},onSubmit:n,handleCancel:o,isSubmitting:m,isPublic:u}=gt({onOpenChange:t,onCreated:a});return e.jsx(jt,{open:s,onClose:o,register:r,errors:i,handleSubmit:l,onSubmit:n,onCancel:o,isSubmitting:m,isPublic:u})}function bt(){const[s,t]=f.useState(!1),[a,r]=f.useState(!1),[i,l]=f.useState(""),[n,o]=f.useState(!1),[m,u]=f.useState(void 0),[d,p]=f.useState("all"),[c,h]=f.useState("created_at"),[g,x]=f.useState("desc"),j=i||m!==void 0||d!=="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-heading-1 font-heading text-foreground",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(te,{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(Te,{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(pe,{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(ge,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(B,{type:"text",value:i,onChange:y=>l(y.target.value),placeholder:"Rechercher des playlists...",className:"pl-10","data-testid":"playlist-search"})]}),e.jsxs(w,{variant:"outline",onClick:()=>o(!n),children:[e.jsx(us,{className:"mr-2 h-4 w-4"}),"Filters",j&&e.jsx("span",{className:"ml-2 bg-primary text-foreground rounded-full px-2 py-0.5 text-xs",children:"Active"})]}),j&&e.jsxs(w,{variant:"ghost",onClick:b,children:[e.jsx(Ie,{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(Y,{value:m===void 0?"all":m?"public":"private",onChange:y=>{u(y==="all"?void 0:y==="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(Y,{value:d,onChange:y=>p(Array.isArray(y)?y[0]:y),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(Y,{value:c,onChange:y=>h(Array.isArray(y)?y[0]:y),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(y=>y==="asc"?"desc":"asc"),children:e.jsx(ms,{className:"h-4 w-4"})})]})]})]})]})})}),e.jsx(ft,{enableSelection:s,searchQuery:i,filterIsPublic:m,filterOwner:d,sortBy:c,sortOrder:g}),e.jsx(vt,{open:a,onOpenChange:r,onCreated:()=>{r(!1)}})]})}function Nt({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-primary/30 via-background to-secondary/30"}),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 wt({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-modal bg-black/40 backdrop-blur-3xl overflow-hidden rounded-2xl group transition-shadow duration-[var(--sumi-duration-normal)]",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-[var(--sumi-duration-slower)]"}):e.jsx("div",{className:"w-full h-full bg-gradient-to-br from-primary/30 to-secondary/30 rounded-xl flex items-center justify-center",children:e.jsx(je,{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-primary/10 text-primary border-primary/20":"bg-warning/10 text-warning border-warning/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(hs,{className:"w-3 h-3"})," Updated ",$s(new Date(s.updated_at),"MMM d, yyyy")]})]}),e.jsx("h1",{className:"text-4xl md:text-6xl font-heading font-bold text-foreground 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($e,{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(Le,{className:"w-4 h-4 text-muted-foreground"}),e.jsxs("span",{className:"text-white/80",children:[t," followers"]})]})]})]})]})}function re(s,t=[]){return s==null?null:t.find(r=>String(r.user_id)===String(s))?.permission??null}function W(s,t){return t==null?!1:String(s.user_id)===String(t)}function St(s,t,a=[]){if(t==null)return!1;if(W(s,t))return!0;const r=re(t,a);return r==="write"||r==="admin"}function kt(s,t){return W(s,t)}function Ct(s,t,a=[]){if(t==null)return!1;if(W(s,t))return!0;const r=re(t,a);return r==="write"||r==="admin"}function Pt(s,t,a=[]){if(t==null)return!1;if(W(s,t))return!0;const r=re(t,a);return r==="write"||r==="admin"}function Dt(s,t){return W(s,t)}function _t(s,t,a=[]){if(s.is_public)return!0;if(t==null)return!1;if(W(s,t))return!0;const r=re(t,a);return r==="read"||r==="write"||r==="admin"}function Oe(s){const{user:t}=Ue(),{data:a=[]}=tt(s?String(s.id):"");return f.useMemo(()=>{if(!s||!t)return{canEdit:!1,canDelete:!1,canAddTracks:!1,canRemoveTracks:!1,canManageCollaborators:!1,canRead:!1,isOwner:!1};const r=t.id;return{canEdit:St(s,r,a),canDelete:kt(s,r),canAddTracks:Ct(s,r,a),canRemoveTracks:Pt(s,r,a),canManageCollaborators:Dt(s,r),canRead:_t(s,r,a),isOwner:String(s.user_id)===String(r)}},[s,t,a])}function Et({playlist:s,onUpdated:t,canShare:a=!1}){const r=Os(),{success:i,error:l}=Q(),n=Oe(s),[o,m]=f.useState(!1),[u,d]=f.useState(!1),[p,c]=f.useState({title:s.title,description:s.description,is_public:s.is_public,cover_url:s.cover_url}),[h,g]=f.useState(!1),x=Xs(),j=Fe();f.useEffect(()=>{o&&c({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]),f.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")}},y=async()=>{try{await j.mutateAsync(s.id),i("Playlist supprimée avec succès"),d(!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:d,editForm:p,setEditForm:c,showSuccess:h,updateMutation:x,deleteMutation:j,handleUpdate:b,handleDeleteConfirm:y,isBusy:v}}function At({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(L,{size:"sm",inline:!0,className:"sm:mr-2"}),e.jsx("span",{className:"hidden sm:inline",children:"Enregistrement..."})]}):o?e.jsxs(e.Fragment,{children:[e.jsx(ps,{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(xs,{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(qe,{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(ae,{className:"w-4 h-4 sm:mr-2","aria-hidden":!0}),"Supprimer"]})]})}function Mt({open:s,onClose:t,editForm:a,onFormChange:r,onConfirm:i,isPending:l}){return e.jsx(G,{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(B,{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(B,{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(L,{size:"sm",inline:!0}),e.jsx("span",{children:"Enregistrement en cours..."})]})]})})}function Tt({playlist:s,onUpdated:t,onShareClick:a,canShare:r=!1,className:i}){const{permissions:l,showEditDialog:n,setShowEditDialog:o,showDeleteDialog:m,setShowDeleteDialog:u,editForm:d,setEditForm:p,showSuccess:c,updateMutation:h,deleteMutation:g,handleUpdate:x,handleDeleteConfirm:j,isBusy:b}=Et({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(At,{canEdit:l.canEdit,canDelete:l.canDelete,canShare:r,onShareClick:a,onEditClick:()=>o(!0),onDeleteClick:()=>u(!0),isBusy:b,showSuccess:c}),e.jsx(Mt,{open:n,onClose:()=>o(!1),editForm:d,onFormChange:p,onConfirm:x,isPending:h.isPending}),e.jsx(zs,{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 It({playlistId:s,initialFollowing:t=!1,initialFollowerCount:a=0,onFollowChange:r,className:i,size:l="default",variant:n,showCount:o=!1}){const{data:m}=Ee(),{success:u,error:d}=Q(),p=z(),[c,h]=f.useState(t),[g,x]=f.useState(a),[j,b]=f.useState(!1),{data:y}=V({queryKey:["playlist",s],queryFn:()=>Ae(s),enabled:!!s&&!!m,staleTime:3e4}),{data:v}=V({queryKey:["playlistFollowStatus",s],queryFn:()=>rs(s),enabled:!!s&&!!m,staleTime:3e4,retry:!1});f.useEffect(()=>{v?(h(v.is_following),x(v.follower_count)):y&&y.is_following!==void 0?h(y.is_following):t!==void 0&&h(t),y&&y.follower_count!==void 0?x(y.follower_count):a!==void 0&&x(a)},[v,y,t,a]);const N=R({mutationFn:()=>is(s),onMutate:async()=>{h(!0),x(S=>S+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:S=>{h(!1),x($=>Math.max(0,$-1));const q=S.response?.data?.error?.message||S.response?.data?.message||S.message||"Erreur lors de l'abonnement à la playlist";d(q)},onSettled:()=>{b(!1)}}),P=R({mutationFn:()=>ls(s),onMutate:async()=>{h(!1),x(S=>Math.max(0,S-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:S=>{h(!0),x($=>$+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:()=>{b(!1)}}),D=S=>{S.stopPropagation(),!(j||!m)&&(c?P.mutate():N.mutate())};if(!m||m.id===y?.user_id)return null;const C=N.isPending||P.isPending||j,E=n||(c?"outline":"default");return e.jsx(w,{onClick:D,disabled:C,variant:E,size:l,className:_(i,"min-w-24"),children:C?e.jsxs(e.Fragment,{children:[e.jsx(L,{size:"sm",inline:!0,className:"mr-2"}),c?"Désabonnement...":"Abonnement..."]}):c?e.jsxs(e.Fragment,{children:[e.jsx(fs,{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(Re,{className:"h-4 w-4 mr-2"}),"Suivre",o&&g>0&&e.jsxs("span",{className:"ml-2 text-xs",children:["(",g,")"]})]})})}function qt({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-sm transition-all duration-[var(--sumi-duration-normal)] 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 transition-colors duration-[var(--duration-fast)]",children:[e.jsx(ys,{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(It,{playlistId:s.id,initialFollowerCount:i,initialFollowing:l}),e.jsx(Tt,{playlist:s,onUpdated:r,onShareClick:a,canShare:t.canRead})]})]})}function Lt({onRemove:s,className:t,disabled:a}){return e.jsx(Ve,{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(ae,{className:"h-4 w-4 text-muted-foreground hover:text-destructive"})})})}function Rt(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 Ke({playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:l,onTrackRemoved:n,isPlaying:o=!1,className:m,dragHandleProps:u,canRemoveTracks:d=!0}){const[p,c]=f.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-3 sm:p-4 rounded-lg","hover:bg-background dark:hover:bg-muted","active:bg-muted dark:active:bg-muted","transition-colors duration-[var(--duration-fast)] touch-manipulation",i&&"cursor-pointer",m),onClick:h,onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!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 duration-[var(--duration-fast)]","aria-label":"Réorganiser",children:e.jsx(gs,{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-muted dark:hover:bg-muted active:bg-muted dark:active:bg-muted transition-colors duration-[var(--duration-fast)] touch-manipulation min-h-8 min-w-8 sm:min-h-0 sm:min-w-0","aria-label":o?`Mettre en pause ${t.title}`:`Lire ${t.title}`,children:o?e.jsx(js,{className:"h-3 w-3 sm:h-4 sm:w-4 text-foreground dark:text-foreground"}):e.jsx(Qe,{className:"h-3 w-3 sm:h-4 sm:w-4 text-foreground dark:text-foreground"})}):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-muted dark:bg-muted flex items-center justify-center",children:e.jsx(je,{className:"h-5 w-5 sm:h-6 sm:w-6 text-muted-foreground dark:text-muted-foreground"})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("div",{className:"font-medium text-sm sm:text-base text-foreground dark:text-foreground truncate",children:t.title}),e.jsxs("div",{className:"text-xs sm:text-sm text-muted-foreground dark:text-muted-foreground 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-muted-foreground dark:text-muted-foreground flex-shrink-0",children:Rt(t.duration)}),e.jsx("div",{className:"flex items-center gap-2 flex-shrink-0",children:p&&d&&n&&e.jsx(Lt,{onRemove:n,className:"h-8 w-8 text-muted-foreground hover:text-destructive"})})]})}function he(s){return[...s].sort((t,a)=>t.position-a.position)}function Qt(s,t,a,r){const[i,l]=f.useState(()=>he(s));f.useEffect(()=>{l(he(s))},[s]);const n=f.useMemo(()=>new Map(t.map(c=>[c.id,c])),[t]),{toast:o,error:m}=Q(),u=at(),d=ks(Se(_s,{activationConstraint:{distance:8}}),Se(Ds,{coordinateGetter:Ps})),p=f.useCallback(async c=>{const{active:h,over:g}=c;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=Cs(i,x,j);l(b);const y=b.map(v=>v.track_id);try{await u.mutateAsync({playlistId:String(a),trackIds:y}),o({message:"Playlist réorganisée",type:"success"}),r?.()}catch{l(he(s)),m("Impossible de réorganiser la playlist. Veuillez réessayer.")}},[i,s,a,u,o,m,r]);return{sortedPlaylistTracks:i,trackMap:n,sensors:d,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(je,{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 Ft({playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:l,onTrackRemoved:n,isPlaying:o,canRemoveTracks:m}){const{attributes:u,listeners:d,setNodeRef:p,transform:c,transition:h,isDragging:g,isOver:x}=Es({id:s.id}),j={transform:As.Transform.toString(c),transition:h};return e.jsx("div",{ref:p,style:j,className:_("relative rounded-lg",g&&"opacity-50 z-10 shadow-lg ring-2 ring-primary/30 cursor-grabbing",x&&!g&&"border-t-2 border-t-primary"),children:e.jsx(Ke,{playlistTrack:s,track:t,playlistId:a,position:r,onTrackClick:i,onTrackPlay:l,onTrackRemoved:n,isPlaying:o,dragHandleProps:{...u,...d},canRemoveTracks:m})})}function zt({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(k,{variant:"circular",width:24,height:24})}),e.jsx("div",{className:"flex-shrink-0",children:e.jsx(k,{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(k,{variant:"text",height:16,className:"sm:h-4"}),e.jsx(k,{variant:"text",height:12,className:"sm:h-3"})]}),e.jsx("div",{className:"hidden sm:block flex-shrink-0",children:e.jsx(k,{variant:"text",height:14,width:40})})]},r)),e.jsx("span",{className:"sr-only",children:"Chargement des pistes en cours..."})]})}function Ot({playlistTracks:s,tracks:t,playlistId:a,onTrackClick:r,onTrackPlay:i,onTrackRemoved:l,onTracksReordered:n,isPlaying:o,currentPlayingId:m,className:u,emptyMessage:d="Aucun track dans cette playlist",emptyDescription:p="Ajoutez des tracks à cette playlist pour commencer.",enableDragAndDrop:c=!0,canRemoveTracks:h=!0,isLoading:g=!1}){const{sortedPlaylistTracks:x,trackMap:j,sensors:b,handleDragEnd:y}=Qt(s,t,a,n),v=C=>m===C?!0:o?.(C)??!1;if(g)return e.jsx(zt,{className:u});if(x.length===0)return e.jsx($t,{message:d,description:p,className:u});const N=x.map(C=>C.id),P=_("space-y-1",u),D={role:"list","aria-label":"Liste des tracks de la playlist"};return c?e.jsx(Ms,{sensors:b,collisionDetection:Ts,onDragEnd:y,children:e.jsx(Is,{items:N,strategy:qs,children:e.jsx("div",{className:P,...D,children:x.map(C=>{const E=j.get(C.track_id);return E?e.jsx(Ft,{playlistTrack:C,track:E,playlistId:a,position:C.position,onTrackClick:r,onTrackPlay:i,onTrackRemoved:l,isPlaying:v(E.id),canRemoveTracks:h},C.id):null})})})}):e.jsx("div",{className:P,...D,children:x.map((C,E)=>{const S=j.get(C.track_id);return S?e.jsx("div",{className:"animate-stagger-in",style:{animationDelay:`${Math.min(E*50,500)}ms`},children:e.jsx(Ke,{playlistTrack:C,track:S,playlistId:a,position:C.position,onTrackClick:r,onTrackPlay:i,onTrackRemoved:l,isPlaying:v(S.id),canRemoveTracks:h})},C.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 Kt(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 Ut(s={}){try{const a=Kt(s).toString(),r=`/tracks/search${a?`?${a}`:""}`;return(await Be.get(r)).data}catch(t){if(t instanceof Ws){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 Pe=20;function Vt(s,t,a,r){const[i,l]=f.useState(""),n=Gs(i,500),[o,m]=f.useState([]),[u,d]=f.useState(new Set),[p,c]=f.useState(!1),[h,g]=f.useState(null),[x,j]=f.useState(1),[b,y]=f.useState(0),[v,N]=f.useState(!1),{success:P,error:D}=Q(),C=rt(),E=f.useCallback(async()=>{c(!0),g(null);try{const A=await Ut({query:n.trim()||void 0,page:x,limit:Pe});m(A.tracks),y(A.pagination.total)}catch(A){let T="Erreur lors de la recherche";(A instanceof K||A instanceof Error)&&(T=A.message),g(T),m([]),y(0)}finally{c(!1)}},[n,x]);f.useEffect(()=>{n.trim()||s?E():(m([]),y(0))},[n,s,E]),f.useEffect(()=>{s&&(l(""),d(new Set),j(1),g(null))},[s]);const S=f.useCallback(A=>{d(T=>{const I=new Set(T);return I.has(A)?I.delete(A):I.add(A),I})},[]),q=f.useCallback(()=>{d(A=>A.size===o.length?new Set:new Set(o.map(T=>T.id)))},[o]),$=f.useCallback(async()=>{if(u.size===0){D("Aucun track sélectionné");return}N(!0);const A=Array.from(u);let T=0,I=0;try{for(const M of A)try{await C.mutateAsync({playlistId:t,trackId:M}),T++}catch(F){I++,se.error(`Failed to add track ${M}:`,{error:F})}T>0&&(P(`${T} track${T>1?"s":""} ajouté${T>1?"s":""} à la playlist.`),d(new Set),r?.(),a()),I>0&&D(`${I} track${I>1?"s":""} n'a${I>1?"ont":""} pas pu être ajouté${I>1?"s":""}.`)}finally{N(!1)}},[u,t,C,P,D,r,a]),ie=f.useCallback(()=>{l(""),d(new Set),j(1),g(null),a()},[a]),le=Math.ceil(b/Pe),ne=f.useCallback(A=>{j(A)},[]);return{searchQuery:i,setSearchQuery:l,tracks:o,selectedTracks:u,loading:p,error:h,page:x,total:b,totalPages:le,addingTracks:v,handleTrackToggle:S,handleSelectAll:q,handleAddTracks:$,handleClose:ie,setPage:ne}}function Bt({value:s,onChange:t}){return e.jsxs("div",{className:"relative",children:[e.jsx(ge,{className:"absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(B,{type:"text",placeholder:"Rechercher des tracks...",value:s,onChange:a=>t(a.target.value),className:"pl-10"})]})}function Jt({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(ve,{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 Gt({loading:s,error:t,tracks:a,selectedTracks:r,total:i,page:l,totalPages:n,onTrackToggle:o,onSelectAll:m,onPagePrev:u,onPageNext:d}){if(s&&a.length===0)return e.jsxs("div",{className:"flex items-center justify-center p-8 max-h-96",children:[e.jsx(L,{size:"lg",inline:!0,variant:"muted",className:"h-6 w-6"}),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(ve,{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(c=>e.jsx(Jt,{track:c,isSelected:r.has(c.id),onToggle:()=>o(c.id)},c.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:d,disabled:l>=n||s,children:"Suivant"})]})]})]})}function Wt({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(L,{size:"sm",inline:!0,className:"mr-2"}),e.jsx(te,{className:"w-4 h-4 mr-2"}),"Ajouter ",s>0&&`(${s})`]})]})]})}function Ht({open:s,onClose:t,playlistId:a,onTracksAdded:r}){const{searchQuery:i,setSearchQuery:l,tracks:n,selectedTracks:o,loading:m,error:u,page:d,total:p,totalPages:c,addingTracks:h,handleTrackToggle:g,handleSelectAll:x,handleAddTracks:j,handleClose:b,setPage:y}=Vt(s,a,t,r);return e.jsx(G,{open:s,onClose:b,title:"Ajouter des tracks à la playlist",size:"xl",showCancel:!1,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx(Bt,{value:i,onChange:l}),e.jsx(Gt,{loading:m,error:u,tracks:n,selectedTracks:o,total:p,page:d,totalPages:c,onTrackToggle:g,onSelectAll:x,onPagePrev:()=>y(v=>Math.max(1,v-1)),onPageNext:()=>y(v=>v+1)}),e.jsx(Wt,{selectedCount:o.size,addingTracks:h,onCancel:b,onAdd:j})]})})}function Xt({collaborators:s,playlistId:t,canManage:a=!1,className:r}){const{success:i,error:l}=Q(),n=et(),o=st(),m=async(d,p)=>{if(confirm(`Êtes-vous sûr de vouloir retirer ${p} de cette playlist ?`))try{await n.mutateAsync({playlistId:t,userId:d}),i("Collaborateur retiré")}catch(c){l(c instanceof Error?c.message:"Impossible de retirer le collaborateur.")}},u=async(d,p,c)=>{try{await o.mutateAsync({playlistId:t,userId:d,data:{permission:p}}),i(`Permission mise à jour pour ${c}`)}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(d=>{const p=n?.isPending||!1,c=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($e,{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(Y,{options:[{value:"read",label:"Lecture"},{value:"write",label:"Écriture"},{value:"admin",label:"Admin"}],value:d.permission,onChange:h=>u(d.user_id,h,d.user?.username||"User"),disabled:c,className:"w-32"}),e.jsx(w,{variant:"ghost",size:"icon",onClick:()=>m(d.user_id,d.user?.username||"User"),disabled:p,className:"text-destructive hover:text-destructive",children:p?e.jsx(L,{size:"sm",inline:!0}):e.jsx(ae,{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 Zt=({limit:s=20,minScore:t=.1,includeOwn:a=!1,onPlaylistClick:r,className:i})=>{const[l,n]=f.useState([]),[o,m]=f.useState(!0),[u,d]=f.useState(null),{error:p}=Q();return f.useEffect(()=>{(async()=>{m(!0),d(null);try{const g=await ns({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";d(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(vs,{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(bs,{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(ee,{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(ee,{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(c=>e.jsxs("div",{className:"relative",role:"listitem",children:[e.jsx(Me,{playlist:c.playlist,onClick:()=>r?.(c.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: ${(c.score*100).toFixed(0)}%`,children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(ee,{className:"h-3 w-3 text-primary","aria-hidden":"true"}),e.jsxs("span",{className:"font-medium",children:[(c.score*100).toFixed(0),"%"]})]}),c.reason&&e.jsx("p",{className:"text-muted-foreground text-xs mt-1 max-w-32 truncate",title:c.reason,"aria-label":`Raison: ${c.reason}`,children:c.reason})]})]},c.playlist.id))})]})},De=3;function Yt(s,t){const[a,r]=f.useState(null),[i,l]=f.useState(!1),[n,o]=f.useState(null),[m,u]=f.useState(0),d=ze(),p=Q(),c=async()=>{try{o(null);const j=await d.mutateAsync(s),b=`${window.location.origin}/playlists/shared/${j.share_token}`;r(b),u(0)}catch(j){const b=xe(j);o(new Error(b.message))}};f.useEffect(()=>{t&&!a&&!d.isPending&&c()},[t]);const h=async()=>{if(!(m>=De)){u(j=>j+1);try{await c()}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:d.isPending,handleRetry:h,handleCopy:g,handleDismissError:x,maxRetries:De}}function ea({playlistId:s,mutationError:t,isPending:a,shareLink:r,isCopied:i,retryCount:l,maxRetries:n,onRetry:o,onDismissError:m,onCopy:u,onClose:d}){return e.jsxs("div",{className:"space-y-4",children:[t&&e.jsx(fe,{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(L,{size:"lg",inline:!0,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(J,{children:"Share Link"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(B,{value:r,readOnly:!0,className:"flex-1"}),e.jsx(w,{onClick:u,variant:"outline",children:i?e.jsx(Ns,{className:"h-4 w-4"}):e.jsx(we,{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:d,children:"Close"}),e.jsxs(w,{onClick:u,children:[e.jsx(we,{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 sa({open:s,onClose:t,playlistId:a}){const{shareLink:r,isCopied:i,mutationError:l,retryCount:n,isPending:o,handleRetry:m,handleCopy:u,handleDismissError:d,maxRetries:p}=Yt(a,s);return e.jsx(G,{open:s,onClose:t,title:"Share Playlist",variant:"default",size:"md",children:e.jsx(ea,{playlistId:a,mutationError:l,isPending:o,shareLink:r,isCopied:i,retryCount:n,maxRetries:p,onRetry:m,onDismissError:d,onCopy:u,onClose:t})})}const _e=3;function ta(s,t,a){const[r,i]=f.useState(""),[l,n]=f.useState("read"),[o,m]=f.useState(null),[u,d]=f.useState(null),[p,c]=f.useState(0),[h,g]=f.useState(null),x=Ys(),j=Q(),b=async P=>{await x.mutateAsync({playlistId:s,data:{user_id:P.username,permission:P.permission}}),j.success("Collaborator added successfully"),i(""),n("read"),d(null),c(0),g(null),a?.(),t()},y=async P=>{if(P.preventDefault(),m(null),d(null),!r.trim()){m("Username is required");return}const D={username:r.trim(),permission:l};g(D);try{await b(D)}catch(C){const E=xe(C);d(new Error(E.message))}},v=async()=>{if(!(!h||p>=_e)){c(P=>P+1);try{await b(h)}catch(P){const D=xe(P);d(new Error(D.message))}}},N=()=>{d(null),c(0),g(null)};return{username:r,setUsername:i,permission:l,setPermission:n,validationError:o,setValidationError:m,mutationError:u,retryCount:p,isPending:x.isPending,handleSubmit:y,handleRetry:v,handleDismissError:N,maxRetries:_e}}const aa=[{value:"read",label:"Read - Can view playlist"},{value:"write",label:"Write - Can add/remove tracks"},{value:"admin",label:"Admin - Can manage collaborators"}];function ra({open:s,onClose:t,playlistId:a,username:r,onUsernameChange:i,permission:l,onPermissionChange:n,validationError:o,mutationError:m,retryCount:u,maxRetries:d,isPending:p,onSubmit:c,onRetry:h,onDismissError:g}){return e.jsx(G,{open:s,onClose:t,title:"Add Collaborator",variant:"default",size:"md",children:e.jsxs("form",{onSubmit:c,className:"space-y-4",children:[m&&e.jsx(fe,{error:m,variant:"banner",severity:"error",context:{action:"adding collaborator",resource:"playlist",resourceId:a},onRetry:u<d?h:void 0,onDismiss:g}),o&&e.jsx(fe,{error:o,variant:"inline",severity:"error",size:"sm",dismissible:!1}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(J,{htmlFor:"username",children:"Username"}),e.jsx(B,{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(J,{htmlFor:"permission",children:"Permission"}),e.jsx(Y,{value:l,onChange:x=>n(Array.isArray(x)?x[0]:x),options:aa})]}),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(L,{size:"sm",inline:!0,className:"mr-2"}),"Adding..."]}):e.jsxs(e.Fragment,{children:[e.jsx(Re,{className:"mr-2 h-4 w-4"}),"Add Collaborator"]})})]})]})})}function ia({open:s,onClose:t,playlistId:a,onAdded:r}){const{username:i,setUsername:l,permission:n,setPermission:o,validationError:m,setValidationError:u,mutationError:d,retryCount:p,isPending:c,handleSubmit:h,handleRetry:g,handleDismissError:x,maxRetries:j}=ta(a,t,r),b=y=>{l(y),u(null)};return e.jsx(ra,{open:s,onClose:t,playlistId:a,username:i,onUsernameChange:b,permission:n,onPermissionChange:o,validationError:m,mutationError:d,retryCount:p,maxRetries:j,isPending:c,onSubmit:h,onRetry:g,onDismissError:x})}function la({playlist:s,playlistTracks:t,tracks:a,collaborators:r,permissions:i,isAddTrackModalOpen:l,setIsAddTrackModalOpen:n,isShareModalOpen:o,setIsShareModalOpen:m,isAddCollaboratorModalOpen:u,setIsAddCollaboratorModalOpen:d,onTrackRemoved:p,onTracksReordered:c,onTrackAdded:h,onCollaboratorAdded:g}){return e.jsxs(e.Fragment,{children:[e.jsxs(Bs,{defaultValue:"tracks",className:"w-full",children:[e.jsxs(Js,{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(de,{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-heading bg-transparent",children:"Tracks"}),i.canRead&&e.jsx(de,{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-heading bg-transparent",children:"Collaborators"}),e.jsx(de,{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-heading bg-transparent",children:"Recommendations"})]}),e.jsx(ue,{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(ge,{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(te,{className:"w-4 h-4 mr-2"})," Add Tracks"]})]}),e.jsx("div",{className:"p-0",children:e.jsx(Ot,{playlistTracks:t,tracks:a,playlistId:s.id,onTrackRemoved:p,onTracksReordered:c,enableDragAndDrop:i.canEdit,canRemoveTracks:i.canRemoveTracks,className:"divide-y divide-white/5"})})]})}),e.jsx(ue,{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(Le,{className:"w-5 h-5 text-primary"})," Squad Members"]}),i.canManageCollaborators&&e.jsxs(w,{onClick:()=>d(!0),children:[e.jsx(te,{className:"w-4 h-4 mr-2"})," Invite"]})]}),e.jsx(Xt,{collaborators:r,playlistId:s.id,canManage:i.canManageCollaborators})]})}),e.jsx(ue,{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(ee,{className:"w-5 h-5 text-yellow-400 animate-pulse"}),e.jsx("h3",{className:"text-xl font-bold",children:"Suggested for you"})]}),e.jsx(Zt,{limit:8,minScore:.1,includeOwn:!1,onPlaylistClick:x=>{window.location.href=`/playlists/${x.id}`}})]})})]}),e.jsx(Ht,{open:l,onClose:()=>n(!1),playlistId:s.id,onTracksAdded:h}),e.jsx(sa,{open:o,onClose:()=>m(!1),playlistId:s.id}),e.jsx(ia,{open:u,onClose:()=>d(!1),playlistId:s.id,onAdded:g})]})}function na(){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-heading font-bold text-destructive mb-2",children:"Playlist Not Found"}),e.jsx(w,{variant:"outline",className:"mt-8",asChild:!0,children:e.jsx(Ks,{to:"/features/library",children:"Back to Library"})})]})}function oa(){return e.jsxs("div",{className:"min-h-layout-page pb-24",children:[e.jsx(k,{className:"h-80 md:h-96 w-full"}),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(k,{className:"w-full h-full rounded-xl"})}),e.jsxs("div",{className:"flex-1 pb-4 space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(k,{className:"h-6 w-24 rounded-full"}),e.jsx(k,{className:"h-6 w-32 rounded"})]}),e.jsx(k,{className:"h-12 w-3/4 max-w-xl rounded"}),e.jsx(k,{className:"h-5 w-full max-w-2xl rounded"}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx(k,{className:"h-6 w-24 rounded-full"}),e.jsx(k,{className:"h-6 w-16 rounded"}),e.jsx(k,{className:"h-6 w-20 rounded"})]})]})]}),e.jsxs("div",{className:"mt-8 flex flex-wrap gap-4 mb-8",children:[e.jsx(k,{className:"h-14 w-32 rounded-full"}),e.jsx(k,{className:"h-14 w-28 rounded-full"})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx(k,{className:"h-10 w-full max-w-md rounded"}),e.jsx(k,{className:"h-64 w-full rounded-2xl"})]})]})]})}function ca(s){const{id:t}=Us(),a=s??t??"",[r,i]=f.useState(!1),[l,n]=f.useState(!1),[o,m]=f.useState(!1),{data:u,isLoading:d,error:p,refetch:c}=Hs(a),h=Oe(u??void 0),{data:g,refetch:x}=V({queryKey:["playlistCollaborators",a],queryFn:()=>ye.getCollaborators(a),enabled:!!a&&h.canRead}),j=u?.tracks?.map(E=>E.track).filter(E=>!!E)??[],b=u?.tracks??[];return{id:a,playlist:u,isLoading:d,error:p,refetch:c,permissions:h,collaborators:g??[],refetchCollaborators:x,onCollaboratorAdded:()=>{x(),c()},tracks:j,playlistTracks:b,isAddTrackModalOpen:r,setIsAddTrackModalOpen:i,isShareModalOpen:l,setIsShareModalOpen:n,isAddCollaboratorModalOpen:o,setIsAddCollaboratorModalOpen:m,handleTrackAdded:()=>{i(!1),c(),oe.success("Track added")},handleTrackRemoved:()=>{c(),oe.success("Track removed")},handleTracksReordered:()=>{c(),oe.success("Reordered")},openShareModal:()=>n(!0),openAddCollaboratorModal:()=>m(!0)}}function da(s){const t=s?.playlistId,{playlist:a,isLoading:r,error:i,refetch:l,permissions:n,collaborators:o,tracks:m,playlistTracks:u,isAddTrackModalOpen:d,setIsAddTrackModalOpen:p,isShareModalOpen:c,setIsShareModalOpen:h,isAddCollaboratorModalOpen:g,setIsAddCollaboratorModalOpen:x,handleTrackAdded:j,handleTrackRemoved:b,handleTracksReordered:y,openShareModal:v,onCollaboratorAdded:N}=ca(t);return r?e.jsx(oa,{}):i||!a?e.jsx(na,{}):e.jsxs("div",{className:"min-h-layout-page pb-24",children:[e.jsx(Nt,{playlist:a}),e.jsxs("div",{className:"container mx-auto px-4 md:px-8 relative -mt-40 z-10",children:[e.jsx(wt,{playlist:a}),e.jsx(qt,{playlist:a,permissions:n,onShareClick:v,onRefetch:l}),e.jsx(la,{playlist:a,playlistTracks:u,tracks:m,collaborators:o,permissions:n,isAddTrackModalOpen:d,setIsAddTrackModalOpen:p,isShareModalOpen:c,setIsShareModalOpen:h,isAddCollaboratorModalOpen:g,setIsAddCollaboratorModalOpen:x,onTrackRemoved:b,onTracksReordered:y,onTrackAdded:j,onCollaboratorAdded:N})]})]})}function La(){return e.jsxs(Vs,{children:[e.jsx(Z,{path:"/",element:e.jsx(bt,{})}),e.jsx(Z,{path:"/new",element:e.jsx(ce,{to:"/playlists",replace:!0})}),e.jsx(Z,{path:"/:id",element:e.jsx(da,{})}),e.jsx(Z,{path:"/:id/edit",element:e.jsx(ce,{to:"/playlists/:id",replace:!0})}),e.jsx(Z,{path:"*",element:e.jsx(ce,{to:"/playlists",replace:!0})})]})}export{La as PlaylistRoutes};