- Deleted apps/web/src/utils/optimisticStoreUpdates.ts (unused file) - File was unused - no imports found in codebase - Mutations already use React Query's onMutate pattern - No TypeScript errors after deletion - Actions 4.4.1.2 and 4.4.1.3 complete
2 lines
28 KiB
JavaScript
2 lines
28 KiB
JavaScript
import{o as V,n as re,a3 as G,t as te,r as c,a4 as ae,a5 as U,j as e,c as A,aW as xe,aX as pe,B as T,b0 as fe,aZ as ge,a$ as J,bq as Ne,aR as ne,G as F,L as _,br as X,X as Z,bs as je,bt as H,b5 as we,aL as ve,aN as ye,aO as be,aM as Ee,E as B,aA as Q,aD as Ce,D as Te,z as ke,h as Se,bu as Y,bv as W,bw as De,bx as Oe,by as Ae,bz as Re,bA as Ie,bB as ie,bo as Me,aK as oe,au as Ve,a0 as Le,a9 as ze,bk as Pe,M as qe,P as Ke,a as $e,bC as Ue,bD as _e,bp as We}from"./chunk-Cad8leGS.js";import{d as Fe,A as le,c as ce,T as I,e as Be}from"./chunk-B7sOPOlf.js";import{u as He}from"./chunk-BlDLB1ZZ.js";import{e as Qe,u as Xe,B as K,C as $}from"./index-D792PhRw.js";import{T as Ge,a as Je,b as ee,c as se}from"./chunk-DWbKrX8g.js";import{A as L}from"./chunk-BoPufJSi.js";import{A as Ze}from"./chunk-BipwgKQz.js";import{f as Ye,a as es}from"./chunk-B4NZlYwU.js";import"./chunk-wkfC2Tom.js";import"./chunk-VMUEamc6.js";import"./chunk-Df4po8fP.js";class l extends Error{constructor(t,s,r=!1,n){super(t),this.code=s,this.retryable=r,this.originalError=n,this.name="CommentError"}}async function ue(a,t,s){try{return(await V.post(`/tracks/${a}/comments`,{content:t,parent_id:s})).data.comment}catch(r){if(r instanceof L){if(r.response?.status===401)throw new l("Non autorisé: Veuillez vous connecter pour commenter","VALIDATION",!1,r);if(r.response?.status===404)throw new l("Track ou commentaire parent introuvable","VALIDATION",!1,r);if(r.response?.status===400){const j=r.response?.data?.error||"Données invalides";throw new l(j,"VALIDATION",!1,r)}if(r.response?.status===500)throw new l("Erreur serveur: Impossible de créer le commentaire. Veuillez réessayer plus tard.","SERVER",!0,r);if(r.code==="ECONNABORTED"||r.code==="ETIMEDOUT"||!r.response)throw new l("Erreur réseau: Impossible de se connecter au serveur.","NETWORK",!0,r);const n=r.response?.data?.error||r.message||"Échec de la création du commentaire";throw new l(n,"UNKNOWN",!1,r)}throw r instanceof l?r:new l("Erreur inconnue lors de la création du commentaire","UNKNOWN",!1,r)}}async function ss(a,t=1,s=20){try{return(await V.get(`/tracks/${a}/comments?page=${t}&limit=${s}`)).data}catch(r){if(r instanceof L){if(r.response?.status===404)throw new l("Track introuvable","VALIDATION",!1,r);if(r.response?.status===500)throw new l("Erreur serveur: Impossible de récupérer les commentaires. Veuillez réessayer plus tard.","SERVER",!0,r);if(r.code==="ECONNABORTED"||r.code==="ETIMEDOUT"||!r.response)throw new l("Erreur réseau: Impossible de se connecter au serveur.","NETWORK",!0,r);const n=r.response?.data?.error||r.message||"Échec de la récupération des commentaires";throw new l(n,"UNKNOWN",!1,r)}throw r instanceof l?r:new l("Erreur inconnue lors de la récupération des commentaires","UNKNOWN",!1,r)}}async function rs(a,t){try{return(await V.put(`/comments/${a}`,{content:t})).data.comment}catch(s){if(s instanceof L){if(s.response?.status===401)throw new l("Non autorisé: Veuillez vous connecter pour modifier ce commentaire","VALIDATION",!1,s);if(s.response?.status===403)throw new l("Non autorisé: Vous ne pouvez modifier que vos propres commentaires","VALIDATION",!1,s);if(s.response?.status===404)throw new l("Commentaire introuvable","VALIDATION",!1,s);if(s.response?.status===400){const n=s.response?.data?.error||"Données invalides";throw new l(n,"VALIDATION",!1,s)}if(s.response?.status===500)throw new l("Erreur serveur: Impossible de mettre à jour le commentaire. Veuillez réessayer plus tard.","SERVER",!0,s);if(s.code==="ECONNABORTED"||s.code==="ETIMEDOUT"||!s.response)throw new l("Erreur réseau: Impossible de se connecter au serveur.","NETWORK",!0,s);const r=s.response?.data?.error||s.message||"Échec de la mise à jour du commentaire";throw new l(r,"UNKNOWN",!1,s)}throw s instanceof l?s:new l("Erreur inconnue lors de la mise à jour du commentaire","UNKNOWN",!1,s)}}async function ts(a){try{await V.delete(`/comments/${a}`)}catch(t){if(t instanceof L){if(t.response?.status===401)throw new l("Non autorisé: Veuillez vous connecter pour supprimer ce commentaire","VALIDATION",!1,t);if(t.response?.status===403)throw new l("Non autorisé: Vous ne pouvez supprimer que vos propres commentaires","VALIDATION",!1,t);if(t.response?.status===404)throw new l("Commentaire introuvable","VALIDATION",!1,t);if(t.response?.status===500)throw new l("Erreur serveur: Impossible de supprimer le commentaire. Veuillez réessayer plus tard.","SERVER",!0,t);if(t.code==="ECONNABORTED"||t.code==="ETIMEDOUT"||!t.response)throw new l("Erreur réseau: Impossible de se connecter au serveur.","NETWORK",!0,t);const s=t.response?.data?.error||t.message||"Échec de la suppression du commentaire";throw new l(s,"UNKNOWN",!1,t)}throw t instanceof l?t:new l("Erreur inconnue lors de la suppression du commentaire","UNKNOWN",!1,t)}}async function as(a,t=1,s=20){try{return(await V.get(`/comments/${a}/replies?page=${t}&limit=${s}`)).data}catch(r){if(r instanceof L){if(r.response?.status===404)throw new l("Commentaire parent introuvable","VALIDATION",!1,r);if(r.response?.status===500)throw new l("Erreur serveur: Impossible de récupérer les réponses. Veuillez réessayer plus tard.","SERVER",!0,r);if(r.code==="ECONNABORTED"||r.code==="ETIMEDOUT"||!r.response)throw new l("Erreur réseau: Impossible de se connecter au serveur.","NETWORK",!0,r);const n=r.response?.data?.error||r.message||"Échec de la récupération des réponses";throw new l(n,"UNKNOWN",!1,r)}throw r instanceof l?r:new l("Erreur inconnue lors de la récupération des réponses","UNKNOWN",!1,r)}}const ns=3;function de({comment:a,trackId:t,depth:s=0,className:r}){const{data:n}=re(),{success:j,error:w}=G(),f=te(),[g,x]=c.useState(!1),[v,h]=c.useState(!1),[y,i]=c.useState(""),[d,p]=c.useState(a.content),[E,k]=c.useState(s===0),[S,b]=c.useState(!1),{data:C,isLoading:D}=ae({queryKey:["commentReplies",a.id],queryFn:()=>as(a.id,1,20),enabled:E&&!a.replies}),O=a.replies||C?.replies||[],u=s<ns,m=n?.id===a.user_id,o=n?.id===a.user_id||n?.role==="admin",M=U({mutationFn:N=>ue(t,N,a.id),onSuccess:()=>{f.invalidateQueries({queryKey:["trackComments",t]}),f.invalidateQueries({queryKey:["commentReplies",a.id]}),i(""),x(!1),k(!0),j("Réponse publiée")},onError:N=>{w(N.message||"Erreur lors de la publication de la réponse")}}),z=U({mutationFn:N=>rs(a.id,N),onSuccess:()=>{f.invalidateQueries({queryKey:["trackComments",t]}),h(!1),j("Commentaire modifié")},onError:N=>{w(N.message||"Erreur lors de la modification")}}),P=U({mutationFn:()=>ts(a.id),onSuccess:()=>{f.invalidateQueries({queryKey:["trackComments",t]}),b(!1),j("Commentaire supprimé")},onError:N=>{w(N.message||"Erreur lors de la suppression")}}),q=N=>{N.preventDefault(),!(!y.trim()||!n)&&M.mutate(y.trim())},me=N=>{N.preventDefault(),d.trim()&&z.mutate(d.trim())},he=()=>{P.mutate()};return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:A("space-y-3",r),children:e.jsxs("div",{className:"flex gap-3",children:[e.jsx(Ze,{src:a.user?.avatar,fallback:a.user?.username?.charAt(0).toUpperCase()||"U",size:"sm",className:"h-8 w-8 shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0 space-y-2",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("span",{className:"font-medium text-sm",children:a.user?.username||"Utilisateur"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:Ye(new Date(a.created_at),{addSuffix:!0,locale:es})}),a.is_edited&&e.jsx("span",{className:"text-xs text-muted-foreground italic",children:"(modifié)"})]})}),(m||o)&&e.jsxs(xe,{children:[e.jsx(pe,{asChild:!0,children:e.jsx(T,{variant:"ghost",size:"icon",className:"h-6 w-6",children:e.jsx(fe,{className:"h-4 w-4"})})}),e.jsxs(ge,{align:"end",children:[m&&e.jsxs(J,{onClick:()=>h(!0),children:[e.jsx(Ne,{className:"mr-2 h-4 w-4"}),"Modifier"]}),o&&e.jsxs(J,{onClick:()=>b(!0),className:"text-destructive",children:[e.jsx(ne,{className:"mr-2 h-4 w-4"}),"Supprimer"]})]})]})]}),v?e.jsxs("form",{onSubmit:me,className:"space-y-2",children:[e.jsx(F,{value:d,onChange:N=>p(N.target.value),maxLength:500,autoFocus:!0}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(T,{type:"submit",size:"sm",disabled:!d.trim()||z.isPending,children:[z.isPending?e.jsx(_,{className:"h-4 w-4 mr-2 animate-spin"}):e.jsx(X,{className:"h-4 w-4 mr-2"}),"Enregistrer"]}),e.jsxs(T,{type:"button",variant:"outline",size:"sm",onClick:()=>{h(!1),p(a.content)},children:[e.jsx(Z,{className:"h-4 w-4 mr-2"}),"Annuler"]})]})]}):e.jsx("p",{className:"text-sm whitespace-pre-wrap break-words",children:a.content}),!v&&e.jsxs("div",{className:"flex items-center gap-4",children:[u&&n&&e.jsxs(T,{variant:"ghost",size:"sm",onClick:()=>x(!g),className:"h-7 text-xs",children:[e.jsx(je,{className:"h-3 w-3 mr-1"}),"Répondre"]}),O.length>0&&e.jsxs(T,{variant:"ghost",size:"sm",onClick:()=>k(!E),className:"h-7 text-xs",children:[e.jsx(H,{className:"h-3 w-3 mr-1"}),E?"Masquer":"Afficher"," ",O.length," ",O.length===1?"réponse":"réponses"]})]}),g&&n&&e.jsxs("form",{onSubmit:q,className:"space-y-2 pt-2",children:[e.jsx(F,{value:y,onChange:N=>i(N.target.value),placeholder:`Répondre à ${a.user?.username}...`,maxLength:500,autoFocus:!0}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(T,{type:"submit",size:"sm",disabled:!y.trim()||M.isPending,children:[M.isPending?e.jsx(_,{className:"h-4 w-4 mr-2 animate-spin"}):e.jsx(X,{className:"h-4 w-4 mr-2"}),"Publier"]}),e.jsxs(T,{type:"button",variant:"outline",size:"sm",onClick:()=>{x(!1),i("")},children:[e.jsx(Z,{className:"h-4 w-4 mr-2"}),"Annuler"]})]})]}),E&&e.jsx("div",{className:"space-y-3 pt-2 pl-4 border-l-2 border-muted",children:D?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(_,{className:"h-4 w-4 animate-spin text-muted-foreground"})}):O.length>0?O.map(N=>e.jsx(de,{comment:N,trackId:t,depth:s+1},N.id)):null})]})]})}),e.jsx(we,{open:S,onClose:()=>b(!1),onConfirm:he,title:"Supprimer le commentaire",description:"Êtes-vous sûr de vouloir supprimer ce commentaire ? Cette action est irréversible.",confirmLabel:"Supprimer",cancelLabel:"Annuler",variant:"destructive"})]})}function is({trackId:a}){const{data:t}=re(),s=G(),r=te(),[n,j]=c.useState(""),[w,f]=c.useState(null),[g,x]=c.useState(1),v=20,{data:h,isLoading:y,error:i}=ae({queryKey:["trackComments",a,g],queryFn:()=>ss(a,g,v),enabled:!!a}),[d,p]=c.useState(""),[E,k]=c.useState(0),S=U({mutationFn:m=>ue(a,m),onSuccess:()=>{r.invalidateQueries({queryKey:["trackComments",a]}),j(""),f(null),k(0),p(""),s.success("Commentaire publié")},onError:m=>{f(new Error(m.message||"Erreur lors de la publication")),p(n.trim())}}),b=m=>{m.preventDefault(),!(!n.trim()||!t)&&(p(n.trim()),S.mutate(n.trim()))},C=async()=>{if(!(!d||E>=3)){k(m=>m+1);try{await S.mutateAsync(d)}catch{}}},D=h?.comments?.filter(m=>!m.parent_id)||[],O=h?.total||0,u=Math.ceil(O/v);return e.jsxs(ve,{children:[e.jsx(ye,{children:e.jsxs(be,{className:"flex items-center gap-2",children:[e.jsx(H,{className:"h-5 w-5"}),"Commentaires (",h?.total||0,")"]})}),e.jsxs(Ee,{className:"space-y-4",children:[w&&e.jsx(B,{error:w,variant:"banner",severity:"error",context:{action:"publishing comment",resource:"comment"},onRetry:E<3?C:void 0,onDismiss:()=>{f(null),k(0),p("")}}),t?e.jsxs("form",{onSubmit:b,className:"flex gap-2",children:[e.jsx(F,{value:n,onChange:m=>j(m.target.value),placeholder:"Écrire un commentaire...",maxLength:500}),e.jsx(T,{type:"submit",disabled:!n.trim()||S.isPending,children:S.isPending?e.jsx(_,{className:"h-4 w-4 animate-spin"}):e.jsx(X,{className:"h-4 w-4"})})]}):e.jsx("p",{className:"text-sm text-muted-foreground",children:"Connectez-vous pour commenter"}),y?e.jsx("div",{className:"flex justify-center py-8",children:e.jsx(Q,{})}):i?e.jsx(B,{error:i instanceof Error?i:new Error("Failed to load comments"),variant:"card",severity:"error",context:{action:"fetching comments",resource:"comments",resourceId:a},onRetry:()=>r.invalidateQueries({queryKey:["trackComments",a]})}):D.length===0?e.jsx("div",{className:"text-center text-muted-foreground py-8",children:"Aucun commentaire pour le moment. Soyez le premier à commenter !"}):e.jsxs("div",{className:"space-y-4",children:[D.map(m=>e.jsx(de,{comment:m,trackId:a},m.id)),u>1&&e.jsxs("div",{className:"flex items-center justify-center gap-2 pt-4",children:[e.jsx(T,{variant:"outline",size:"sm",onClick:()=>x(m=>Math.max(1,m-1)),disabled:g===1,children:"Précédent"}),e.jsxs("span",{className:"text-sm text-muted-foreground",children:["Page ",g," sur ",u]}),e.jsx(T,{variant:"outline",size:"sm",onClick:()=>x(m=>Math.min(u,m+1)),disabled:g===u,children:"Suivant"})]})]})]})]})}function os({open:a,onClose:t,trackId:s}){const[r,n]=c.useState(null),[j,w]=c.useState(!1),[f,g]=c.useState(!1),[x,v]=c.useState(null),[h,y]=c.useState(0),i=c.useRef(null),d=G();c.useEffect(()=>{a&&!r&&p()},[a]);const p=async()=>{const b=async()=>{const C=new Date;C.setDate(C.getDate()+7);const D=await Fe(s,{permissions:"read",expires_at:C.toISOString()});n(D),v(null),y(0),i.current=null};i.current=b,w(!0),v(null);try{await b()}catch(C){const D=Ce(C);v(new Error(D.message))}finally{w(!1)}},E=async()=>{if(!(!i.current||h>=3)){y(b=>b+1),w(!0);try{await i.current()}catch{}finally{w(!1)}}},k=async()=>{if(!r)return;const b=`${window.location.origin}/tracks/shared/${r.token}`;try{await navigator.clipboard.writeText(b),g(!0),d.success("Link copied to clipboard"),setTimeout(()=>g(!1),2e3)}catch{d.error("Failed to copy link")}},S=r?`${window.location.origin}/tracks/shared/${r.token}`:"";return e.jsx(Te,{open:a,onClose:t,title:"Share Track",variant:"default",size:"md",children:e.jsxs("div",{className:"space-y-4",children:[x&&e.jsx(B,{error:x,variant:"banner",severity:"error",context:{action:"creating share link",resource:"track",resourceId:s},onRetry:h<3?E:void 0,onDismiss:()=>{v(null),y(0),i.current=null}}),j?e.jsx("div",{className:"text-center py-4",children:"Creating share link..."}):r?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(ke,{children:"Share Link"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(F,{value:S,readOnly:!0,className:"flex-1"}),e.jsx(T,{onClick:k,variant:"outline",children:f?e.jsx(Se,{className:"h-4 w-4"}):e.jsx(Y,{className:"h-4 w-4"})})]})]}),e.jsx("div",{className:"text-xs text-muted-foreground",children:"This link will expire in 7 day(s)"}),e.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[e.jsx(T,{variant:"outline",onClick:t,children:"Close"}),e.jsxs(T,{onClick:k,children:[e.jsx(Y,{className:"mr-2 h-4 w-4"}),"Copy Link"]})]})]}):e.jsx("div",{className:"text-center text-destructive",children:"Failed to create share link"})]})})}class R extends Error{constructor(t,s,r=!1,n){super(t),this.code=s,this.retryable=r,this.originalError=n,this.name="TrackHistoryError"}}async function ls(a,t){try{const s=new URLSearchParams;t?.limit!==void 0&&s.append("limit",t.limit.toString()),t?.offset!==void 0&&s.append("offset",t.offset.toString());const r=s.toString(),n=`/tracks/${a}/history${r?`?${r}`:""}`;return(await V.get(n)).data}catch(s){if(s instanceof L){if(s.response?.status===400)throw new R("Requête invalide: ID de track invalide","VALIDATION",!1,s);if(s.response?.status===404)throw new R("Track introuvable","NOT_FOUND",!1,s);if(s.response?.status===500)throw new R("Erreur serveur: Impossible de récupérer l'historique. Veuillez réessayer plus tard.","SERVER",!0,s);if(s.code==="ECONNABORTED"||s.code==="ETIMEDOUT"||!s.response)throw new R("Erreur réseau: Impossible de se connecter au serveur. Veuillez vérifier votre connexion.","NETWORK",!0,s);const r=s.response?.data?.error||s.message||"Échec de la récupération de l'historique";throw new R(r,"UNKNOWN",!1,s)}throw s instanceof R?s:new R("Erreur inconnue lors de la récupération de l'historique","UNKNOWN",!1,s)}}function cs({trackId:a,className:t,limit:s=50}){const[r,n]=c.useState([]),[j,w]=c.useState(!0),[f,g]=c.useState(null),[x,v]=c.useState(0),[h,y]=c.useState(0),[i]=c.useState(s);c.useEffect(()=>{d()},[a,h]);const d=async()=>{w(!0),g(null);try{const o=await ls(a,{limit:i,offset:h});n(o.history),v(o.total)}catch(o){o instanceof R?g(o.message):g("Impossible de charger l'historique")}finally{w(!1)}},p=o=>{const M=new Date(o);return new Intl.DateTimeFormat("fr-FR",{year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(M)},E=o=>{switch(o){case"created":return oe;case"updated":return Me;case"deleted":return ne;case"published":return ie;case"unpublished":return Ie;case"restored":return Re;default:return W}},k=o=>{switch(o){case"created":return"Créé";case"updated":return"Modifié";case"deleted":return"Supprimé";case"published":return"Publié";case"unpublished":return"Dépublié";case"restored":return"Restauré";default:return o}},S=o=>{switch(o){case"created":return"text-green-600 bg-green-50";case"updated":return"text-blue-600 bg-blue-50";case"deleted":return"text-red-600 bg-red-50";case"published":return"text-purple-600 bg-purple-50";case"unpublished":return"text-orange-600 bg-orange-50";case"restored":return"text-cyan-600 bg-cyan-50";default:return"text-gray-600 bg-gray-50"}},b=o=>{if(!o)return null;try{return JSON.parse(o)}catch{return o}},C=o=>o==null?"":typeof o=="string"?o:typeof o=="object"?JSON.stringify(o,null,2):String(o),D=()=>{h>0&&y(Math.max(0,h-i))},O=()=>{h+i<x&&y(h+i)};if(j)return e.jsx("div",{className:A("flex items-center justify-center p-4",t),children:e.jsx(Q,{size:"sm"})});if(f)return e.jsx("div",{className:A("p-4",t),children:e.jsx(le,{variant:"destructive",children:e.jsx(ce,{children:f})})});const u=h>0,m=h+i<x;return e.jsxs("div",{className:A("space-y-4",t),children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(W,{className:"h-5 w-5"}),e.jsx("h3",{className:"text-lg font-semibold",children:"Historique des modifications"}),x>0&&e.jsxs("span",{className:"text-sm text-muted-foreground",children:["(",x,")"]})]})}),r.length===0?e.jsxs("div",{className:"text-center py-8 text-muted-foreground",children:[e.jsx(W,{className:"h-12 w-12 mx-auto mb-4 opacity-50"}),e.jsx("p",{children:"Aucune modification enregistrée"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute left-6 top-0 bottom-0 w-0.5 bg-border"}),e.jsx("div",{className:"space-y-6",children:r.map(o=>{const M=E(o.action),z=S(o.action),P=b(o.old_value),q=b(o.new_value);return e.jsxs("div",{className:"relative flex gap-4",children:[e.jsx("div",{className:A("relative z-10 flex h-12 w-12 items-center justify-center rounded-full border-2 border-background",z),children:e.jsx(M,{className:"h-5 w-5"})}),e.jsxs("div",{className:"flex-1 space-y-2 pb-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:A("text-sm font-semibold",z.split(" ")[0]),children:k(o.action)}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:["#",o.id]})]}),e.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[e.jsx(De,{className:"h-3 w-3"}),e.jsx("span",{children:p(o.created_at)})]})]}),(P!==null||q!==null)&&e.jsxs("div",{className:"space-y-2 rounded-lg border bg-muted/50 p-3 text-sm",children:[P!==null&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"Ancienne valeur:"}),e.jsx("pre",{className:"text-xs bg-background rounded p-2 overflow-x-auto",children:C(P)})]}),q!==null&&e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-muted-foreground mb-1",children:"Nouvelle valeur:"}),e.jsx("pre",{className:"text-xs bg-background rounded p-2 overflow-x-auto",children:C(q)})]})]})]})]},o.id)})})]}),x>i&&e.jsxs("div",{className:"flex items-center justify-between border-t pt-4",children:[e.jsxs("div",{className:"text-sm text-muted-foreground",children:["Affichage ",h+1," -"," ",Math.min(h+i,x)," sur ",x]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(T,{variant:"outline",size:"sm",onClick:D,disabled:!u,children:[e.jsx(Oe,{className:"h-4 w-4 mr-1"}),"Précédent"]}),e.jsxs(T,{variant:"outline",size:"sm",onClick:O,disabled:!m,children:["Suivant",e.jsx(Ae,{className:"h-4 w-4 ml-1"})]})]})]})]})]})}async function us(a){try{return(await V.get(`/tracks/${a}/stats`)).data.stats}catch(t){if(t instanceof L){if(t.response?.status===404)throw new I("Track introuvable","VALIDATION",!1,t);if(t.response?.status===500)throw new I("Erreur serveur: Impossible de récupérer les statistiques. Veuillez réessayer plus tard.","SERVER",!0,t);if(t.code==="ECONNABORTED"||t.code==="ETIMEDOUT"||!t.response)throw new I("Erreur réseau: Impossible de se connecter au serveur.","NETWORK",!0,t);const s=t.response?.data?.error||t.message||"Échec de la récupération des statistiques";throw new I(s,"UNKNOWN",!1,t)}throw t instanceof I?t:new I("Erreur inconnue lors de la récupération des statistiques","UNKNOWN",!1,t)}}function ds({trackId:a,className:t,variant:s="horizontal",showLabels:r=!1}){const[n,j]=c.useState(null),[w,f]=c.useState(!0),[g,x]=c.useState(null);c.useEffect(()=>{(async()=>{f(!0),x(null);try{const d=await us(a);j(d)}catch(d){d instanceof I?x(d.message):x("Impossible de charger les statistiques")}finally{f(!1)}})()},[a]);const v=i=>i>=1e6?`${(i/1e6).toFixed(1)}M`:i>=1e3?`${(i/1e3).toFixed(1)}K`:i.toString(),h=i=>{const d=Math.floor(i/3600),p=Math.floor(i%3600/60),E=i%60;return d>0?`${d}h ${p}m`:p>0?`${p}m ${E}s`:`${E}s`};if(w)return e.jsx("div",{className:A("flex items-center justify-center p-4",t),children:e.jsx(Q,{size:"sm"})});if(g)return e.jsx(le,{variant:"destructive",className:t,children:e.jsx(ce,{className:"text-sm",children:g})});if(!n)return null;const y=[{icon:ie,value:v(n.views),label:"Vues",rawValue:n.views},{icon:Ve,value:v(n.likes),label:"Likes",rawValue:n.likes},{icon:H,value:v(n.comments),label:"Commentaires",rawValue:n.comments},{icon:Le,value:v(n.downloads),label:"Téléchargements",rawValue:n.downloads},{icon:ze,value:h(n.total_play_time),label:"Temps d'écoute",rawValue:n.total_play_time}];return s==="vertical"?e.jsx("div",{className:A("space-y-3",t),children:y.map((i,d)=>{const p=i.icon;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{className:"h-4 w-4 text-muted-foreground"}),e.jsxs("div",{className:"flex-1",children:[r&&e.jsx("div",{className:"text-xs text-muted-foreground",children:i.label}),e.jsx("div",{className:"text-sm font-medium",children:i.value})]})]},d)})}):e.jsx("div",{className:A("flex flex-wrap gap-4",t),children:y.map((i,d)=>{const p=i.icon;return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(p,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-sm font-medium",children:i.value}),r&&e.jsx("span",{className:"text-xs text-muted-foreground ml-1",children:i.label})]},d)})})}function ms(a){const t=Math.floor(a/60),s=Math.floor(a%60);return`${t}:${s.toString().padStart(2,"0")}`}function Es(){const{id:a}=Qe(),t=Xe(),[s,r]=c.useState(null),[n,j]=c.useState(!0),[w,f]=c.useState(null),[g,x]=c.useState(!1),{play:v,pause:h,currentTrack:y,isPlaying:i,addToQueue:d}=He(),p=async()=>{if(!a){f(new Error("Track ID is required")),j(!1);return}try{j(!0),f(null);const u=await Be(a);r(u)}catch(u){const m=u instanceof I||u instanceof Error?u.message:"Failed to load track";f(new Error(m))}finally{j(!1)}};c.useEffect(()=>{p()},[a]);const E=u=>({id:u.id,title:u.title,artist:u.artist,album:u.album,duration:u.duration,url:u.stream_manifest_url||u.file_path,cover:u.cover_art_path,genre:u.genre}),k=()=>{if(!s)return;const u=E(s);v(u)},S=()=>{h()},b=()=>{if(!s)return;const u=E(s);d([u]),We.success("Track ajouté à la file d'attente")},C=()=>{x(!0)},O=y?.id===s?.id&&i;return n?e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsxs("div",{className:"flex items-center justify-center min-h-[400px]",children:[e.jsx(Q,{}),e.jsx("span",{className:"ml-2 text-kodo-secondary",children:"Chargement du track..."})]})}):w||!s?e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx(B,{error:w||new Error("Track introuvable"),variant:"card",severity:"error",context:{action:"fetching track",resource:"track",resourceId:a},onRetry:p,actions:[{label:"Retour",onClick:()=>t(-1),variant:"outline"}]})}):e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[e.jsxs(K,{onClick:()=>t(-1),variant:"ghost",className:"mb-4",children:[e.jsx(Pe,{className:"h-4 w-4 mr-2"}),"Retour"]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:[e.jsx("div",{className:"md:col-span-1",children:e.jsx($,{variant:"gaming",children:s.cover_art_path?e.jsx("img",{src:s.cover_art_path,alt:s.title,className:"w-full aspect-square object-cover rounded-lg"}):e.jsx("div",{className:"w-full aspect-square bg-kodo-slate rounded-lg flex items-center justify-center",children:e.jsx(qe,{className:"h-24 w-24 text-kodo-cyan"})})})}),e.jsxs("div",{className:"md:col-span-2 space-y-6",children:[e.jsxs($,{variant:"default",children:[e.jsx("h1",{className:"text-3xl font-display font-bold text-white mb-2",children:s.title}),e.jsx("p",{className:"text-xl text-kodo-secondary mb-4",children:s.artist}),s.album&&e.jsxs("p",{className:"text-lg text-kodo-secondary mb-4",children:["Album: ",s.album]}),e.jsxs("div",{className:"flex gap-2 mb-6",children:[O?e.jsxs(K,{onClick:S,variant:"primary",size:"lg",children:[e.jsx(Ke,{className:"h-5 w-5 mr-2"}),"Pause"]}):e.jsxs(K,{onClick:k,variant:"gaming",size:"lg",children:[e.jsx($e,{className:"h-5 w-5 mr-2"}),"Play"]}),e.jsxs(K,{onClick:b,variant:"secondary",size:"lg",title:"Ajouter à la file d'attente",children:[e.jsx(oe,{className:"h-5 w-5 mr-2"}),"Queue"]}),e.jsxs(K,{onClick:C,variant:"ghost",size:"lg",title:"Partager",children:[e.jsx(Ue,{className:"h-5 w-5 mr-2"}),"Partager"]})]}),e.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-kodo-secondary",children:"Durée"}),e.jsx("p",{className:"font-semibold text-white",children:ms(s.duration)})]}),s.genre&&e.jsxs("div",{children:[e.jsx("p",{className:"text-kodo-secondary",children:"Genre"}),e.jsx("p",{className:"font-semibold text-white",children:s.genre})]}),s.year&&e.jsxs("div",{children:[e.jsx("p",{className:"text-kodo-secondary",children:"Année"}),e.jsx("p",{className:"font-semibold text-white",children:s.year})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-kodo-secondary",children:"Lectures"}),e.jsx("p",{className:"font-semibold text-kodo-cyan",children:s.play_count})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-kodo-secondary",children:"Likes"}),e.jsx("p",{className:"font-semibold text-kodo-magenta",children:s.like_count})]})]})]}),e.jsxs($,{variant:"gaming",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsx(_e,{className:"h-5 w-5 text-kodo-gold"}),e.jsx("h2",{className:"text-xl font-heading font-bold text-white",children:"Analytics"})]}),e.jsx(ds,{trackId:parseInt(s.id,10)||0,variant:"horizontal",showLabels:!0})]}),e.jsxs(Ge,{defaultValue:"comments",className:"w-full",children:[e.jsxs(Je,{children:[e.jsxs(ee,{value:"comments",children:[e.jsx(H,{className:"mr-2 h-4 w-4"}),"Comments"]}),e.jsxs(ee,{value:"history",children:[e.jsx(W,{className:"mr-2 h-4 w-4"}),"History"]})]}),e.jsx(se,{value:"comments",className:"mt-4",children:e.jsx(is,{trackId:s.id})}),e.jsx(se,{value:"history",className:"mt-4",children:e.jsxs($,{variant:"default",children:[e.jsx("h3",{className:"text-lg font-heading font-bold text-white mb-4",children:"Version History"}),e.jsx(cs,{trackId:s.id,limit:20})]})})]}),s.waveform_path&&e.jsxs($,{variant:"glass",children:[e.jsx("h2",{className:"text-xl font-heading font-bold text-white mb-4",children:"Waveform"}),e.jsx("img",{src:s.waveform_path,alt:"Waveform",className:"w-full h-32 object-contain"})]})]})]}),s&&e.jsx(os,{open:g,onClose:()=>x(!1),trackId:s.id,trackTitle:s.title})]})}export{Es as TrackDetailPage};
|
|
//# sourceMappingURL=TrackDetailPage-Dsmoyevp.js.map
|