7 lines
19 KiB
JavaScript
7 lines
19 KiB
JavaScript
|
|
import{j as e,a as l}from"./vendor-react-YMhRUmcb.js";import{d as U,j as ne,B as A,D as ce,l as de,C as ue,k as me}from"./index-D2uzyr9g.js";import{E as xe,G as Q}from"./vendor-fFnFILYR.js";import{u as pe,a as he}from"./vendor-tanstack-CoFNL2zy.js";import{g as fe,t as ge}from"./tracks-C_h6xkxF.js";import{u as be,D as je,a as ye,b as ve,c as B}from"./useIsRateLimited-C43yhDlJ.js";import{ai as F,X as Ne,A as we,R as ke,f as q,aj as Ce,ak as Se,Y as $,e as Ae,a9 as De,al as Me,T as Pe,S as Ue,am as Le,L as Te,aa as Ee}from"./vendor-icons-DINCNwpk.js";import{P as _e}from"./progress-CWjxseYI.js";import{A as Fe}from"./alert-COAUu9KR.js";import{L as _,I as P}from"./input-DL1WY4HG.js";import{p as Re,i as ze,f as Ie}from"./vendor-utils-4BWoYre8.js";import{c as Ve}from"./vendor-router-DX94Iu-2.js";import"./dropdown-DLDDI8f2.js";function Ge({children:s,variant:r="default",className:t}){return e.jsx("div",{className:U("p-8",r==="alert"&&"text-destructive",t),children:s})}function Oe({children:s,className:r}){return e.jsx("div",{className:U("flex items-center justify-end gap-2 p-8 border-t border-border",r),children:s})}const G={all:["library"],tracks:s=>[...G.all,"tracks",{userId:s}]};function Qe(s=1,r=50){const{user:t}=ne();return pe({queryKey:[...G.tracks(t?.id),{page:s,limit:r}],queryFn:()=>fe({userId:t?.id,page:s,limit:r}),enabled:!!t?.id,placeholderData:c=>c})}const Be=100*1024*1024,qe={"audio/mpeg":[".mp3"],"audio/wav":[".wav"],"audio/ogg":[".ogg"],"audio/flac":[".flac"],"audio/mp4":[".m4a"],"audio/aac":[".aac"]},V=3;function $e({onClose:s}){const[r,t]=l.useState(null),[c,a]=l.useState(0),[d,f]=l.useState(!1),[y,i]=l.useState(null),[h,g]=l.useState(null),[v,x]=l.useState(!1),[N,w]=l.useState(0),[D,b]=l.useState(!1),[m,S]=l.useState({file:null,title:"",artist:"",album:"",genre:""}),[u,k]=l.useState({}),j=be(),R=he(),O=l.useCallback(()=>{S({file:null,title:"",artist:"",album:"",genre:""}),k({})},[]),z=l.useCallback(()=>{d||(t(null),a(0),i(null),g(null),x(!1),w(0),b(!1),O(),s())},[d,O,s]),M=l.useCallback((o,n)=>{S(p=>({...p,[o]:n}))},[]),I=l.useCallback(()=>m,[m]),L=l.useCallback(async(o,n=1)=>{if(!o.file){i("Veuillez sélectionner un fichier"),g(null),x(!1);return}f(!0),i(null),g(null),x(!1),b(!1),a(0);try{const p={title:o.title||o.file.name.replace(/\.[^/.]+$/,""),artist:o.artist,album:o.album,genre:o.genre,is_public:!1};await ge.create(o.file,p,C=>{a(C)}),b(!0),a(100),w(0),R.invalidateQueries({queryKey:G.all}),R.invalidateQueries({queryKey:["tracks"]}),setTimeout(()=>z(),1500)}catch(p){let C="Erreur lors de l'upload",T=null,E=!1;if(p instanceof Error){C=p.message;const le=/network|réseau|timeout|econnaborted|etimedout|se connecter/i.test(C),oe=/serveur|server|500|503|502/i.test(C),ie=/format|taille|invalide|trop volumineux|non supporté|400|413|415/i.test(C);le?(T="NETWORK",E=n<V):oe?(T="SERVER",E=n<V):ie&&(T="VALIDATION",E=!1)}i(C),g(T),x(E),a(0),w(n)}finally{f(!1)}},[R,z]),X=l.useCallback(o=>{const n=o[0];if(n){t(n),i(null),b(!1),M("file",n);const p=n.name.replace(/\.[^/.]+$/,"");m.title||M("title",p)}},[M,m.title]),{getRootProps:Z,getInputProps:H,isDragActive:J}=xe({onDrop:X,accept:qe,maxSize:Be,multiple:!1,onError:o=>i(`Erreur lors de la sélection du fichier: ${o.message}`),onDropRejected:o=>{const n=o[0];n?.errors[0]?.code==="file-too-large"?i("Le fichier est trop volumineux (max 100 MB)"):n?.errors[0]?.code==="file-invalid-type"?i("Format de fichier non supporté. Formats acceptés: MP3, WAV, OGG, FLAC, M4A, AAC"):i(n?.errors[0]?.message||"Erreur lors de la sélection du fichier")}}),ee=o=>({value:m[o]instanceof File?"":m[o]||"",onChange:n=>{S(p=>({...p,[o]:n.target.value}))}}),se=l.useCallback((o,n)=>p=>{if(p.preventDefault(),!m.file){k({file:"Veuillez sélectionner un fichier"}),n?.({file:{message:"Veuillez sélectionner un fichier"}});return}k({}),o(m)},[m]),re=l.useCallback(async o=>{await L(o,1)},[L]),te=l.useCallback(()=>{L(I(),N+1)},[N,I,L]),ae=l.useCallback(()=>{t(null),i(null),b(!1),a(0),M("file",null)},[M]);return{file:r,uploadProgress:c,isUploading:d,error:y,errorCode:h,isRetryable:v,retryCount:N,success:D,
|
||
|
|
border-2 border-dashed rounded-lg p-12 text-center cursor-pointer
|
||
|
|
transition-colors
|
||
|
|
${t?"border-primary bg-primary/5":"border-muted-foreground/25"}
|
||
|
|
hover:border-primary hover:bg-primary/5
|
||
|
|
`,children:[e.jsx("input",{...r()}),e.jsx(F,{className:"mx-auto h-12 w-12 text-muted-foreground mb-4"}),e.jsx("p",{className:"text-lg font-medium mb-2",children:t?"Déposez le fichier ici":"Glissez-déposez un fichier audio"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:"ou cliquez pour sélectionner"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Formats acceptés: MP3, WAV, OGG, FLAC, M4A, AAC (max 100 MB)"})]})}function Ye({file:s,isUploading:r,onRemove:t}){return e.jsx("div",{className:"border rounded-lg p-4","data-testid":"upload-file-display",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx(F,{className:"h-8 w-8 text-primary"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium","data-testid":"upload-file-name",children:s.name}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[(s.size/1024/1024).toFixed(2)," MB"]})]})]}),!r&&e.jsx(A,{type:"button",variant:"ghost",size:"icon",onClick:t,className:"h-8 w-8",children:e.jsx(Ne,{className:"h-4 w-4"})})]})})}function We({progress:s}){return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsx("span",{children:"Upload en cours..."}),e.jsxs("span",{children:[s,"%"]})]}),e.jsx(_e,{value:s})]})}function Xe({error:s,errorCode:r,retryCount:t,isRetryable:c,isUploading:a,onRetry:d}){return e.jsx(Fe,{variant:"destructive","data-testid":"upload-error",children:e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx(we,{className:"h-4 w-4 mt-0.5 shrink-0"}),e.jsxs("div",{className:"flex-1 space-y-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:s}),r&&e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Code d'erreur: ",r]}),t>0&&e.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Tentative ",t,"/",V]})]}),c&&e.jsxs(A,{type:"button",variant:"outline",size:"sm",onClick:d,disabled:a,className:"mt-2",children:[e.jsx(ke,{className:"h-4 w-4 mr-2"}),"Réessayer"]})]})]})})}function Ze({register:s,errors:r}){return e.jsxs("div",{className:"space-y-4 border-t pt-4",children:[e.jsx("h3",{className:"font-medium",children:"Métadonnées (optionnel)"}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(_,{htmlFor:"title",children:"Titre *"}),e.jsx(P,{id:"title",...s("title"),placeholder:"Titre du morceau"}),r.title&&e.jsx("p",{className:"text-sm text-destructive",children:r.title})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(_,{htmlFor:"artist",children:"Artiste"}),e.jsx(P,{id:"artist",...s("artist"),placeholder:"Nom de l'artiste"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(_,{htmlFor:"album",children:"Album"}),e.jsx(P,{id:"album",...s("album"),placeholder:"Nom de l'album"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(_,{htmlFor:"genre",children:"Genre"}),e.jsx(P,{id:"genre",...s("genre"),placeholder:"Genre musical"})]})]})]})}function He({open:s,onClose:r}){const{file:t,uploadProgress:c,isUploading:a,error:d,errorCode:f,isRetryable:y,retryCount:i,success:h,formErrors:g,register:v,handleSubmit:x,onSubmit:N,getRootProps:w,getInputProps:D,isDragActive:b,handleClose:m,handleRetry:S,handleRemoveFile:u,isRateLimited:k}=$e({onClose:r});return e.jsx(ce,{open:s,onClose:m,title:"Uploader un fichier audio",size:"lg",children:e.jsxs("form",{id:"upload-track-form",onSubmit:x(N,j=>{de.warn("Form validation errors:",{errors:j})}),children:[e.jsx(Ge,{children:e.jsxs("div",{className:"space-y-6",children:[t?e.jsx(Ye,{file:t,isUploading:a,onRemove:u}):e.jsx(Ke,{getRootProps:w,getInputProps:D,isDragActive:b}),a&&e.jsx(We,{progress:c}),d&&e.jsx(Xe,{error:d,errorCode:f,retryCount:i,isRetryable:y,isUploading:a,onRetry:S}),h&&e.jsxs("div",{className:"rounded-lg border bg-success/10 border-success p-4 flex items-center gap-2 text-success",children:[e.jsx(q,{className:"h-4 w-4 shrink-0"}),e.jsx("span",{children:
|