1 line
19 KiB
JavaScript
1 line
19 KiB
JavaScript
import{a as f,j as e}from"./vendor-react-BHG7lGYR.js";import{G as re}from"./vendor-IYr-MHu4.js";import{s as a,o,b as c,c as q,i as G,e as I,n as k,a as ne,t as le,l as v}from"./vendor-utils-CgOSfOkx.js";import{o as ce,q as me,u as de,r as ue,g as pe,l as xe,C as F,e as R,E as fe,b as A,c as U,B as T,p as he,a as ge,s as be}from"./index-BWcMVITa.js";import{a as ye}from"./vendor-tanstack-BzWBL1hV.js";import{I as g}from"./input-BGBI2Wze.js";import{T as je}from"./textarea-If6sHLPh.js";import{P as ke}from"./progress-BQIngDvS.js";import{u as D}from"./users-BcpK1D4V.js";import{A as we,a as _e}from"./alert-tey2YzVZ.js";import{h as Ne,A as $,av as B,aw as O,ax as V,ay as Y,az as Z}from"./vendor-icons-DaGlTw4_.js";import"./vendor-router-D-s5vIeO.js";const L=a().min(1,"L'email est requis").email("Format d'email invalide").max(255,"L'email est trop long").toLowerCase(),M=a().min(8,"Le mot de passe doit contenir au moins 8 caractères").max(128,"Le mot de passe est trop long").regex(/[A-Z]/,"Le mot de passe doit contenir au moins une majuscule").regex(/[a-z]/,"Le mot de passe doit contenir au moins une minuscule").regex(/[0-9]/,"Le mot de passe doit contenir au moins un chiffre").regex(/[!@#$%^&*(),.?":{}|<>]/,"Le mot de passe doit contenir au moins un caractère spécial").refine(s=>!/(.)\1{3,}/.test(s),"Le mot de passe ne doit pas contenir de répétition de caractères").refine(s=>!/123456|password|qwerty/i.test(s),"Le mot de passe ne doit pas contenir de patterns communs"),Q=a().min(3,"Le nom d'utilisateur doit contenir au moins 3 caractères").max(30,"Le nom d'utilisateur est trop long").regex(/^[a-zA-Z0-9_-]+$/,"Le nom d'utilisateur ne peut contenir que des lettres, chiffres, tirets et underscores").refine(s=>!/^(admin|root|user|test|demo)$/i.test(s),"Ce nom d'utilisateur est réservé"),W=a().min(1,"Le nom d'affichage est requis").max(50,"Le nom d'affichage est trop long").regex(/^[a-zA-ZÀ-ÿ0-9\s\-'.]+$/,"Le nom d'affichage contient des caractères non autorisés");o({email:L,password:a().min(1,"Le mot de passe est requis"),remember_me:c().optional(),captcha:a().optional()});o({email:L,password:M,confirmPassword:a(),username:Q,displayName:W,acceptTerms:c().refine(s=>s===!0,"Vous devez accepter les conditions d'utilisation"),acceptPrivacy:c().refine(s=>s===!0,"Vous devez accepter la politique de confidentialité")}).refine(s=>s.password===s.confirmPassword,{message:"Les mots de passe ne correspondent pas",path:["confirmPassword"]});o({email:L});o({token:a().min(1,"Le token de réinitialisation est requis"),password:M,confirmPassword:a()}).refine(s=>s.password===s.confirmPassword,{message:"Les mots de passe ne correspondent pas",path:["confirmPassword"]});o({currentPassword:a().min(1,"Le mot de passe actuel est requis"),newPassword:M,confirmNewPassword:a()}).refine(s=>s.newPassword===s.confirmNewPassword,{message:"Les nouveaux mots de passe ne correspondent pas",path:["confirmNewPassword"]}).refine(s=>s.currentPassword!==s.newPassword,{message:"Le nouveau mot de passe doit être différent de l'actuel",path:["newPassword"]});o({file:G(File,{message:"Un fichier est requis"}),title:a().min(1,"Le titre est requis").max(255,"Le titre est trop long"),artist:a().min(1,"L'artiste est requis").max(255,"L'artiste est trop long"),description:a().max(1e3,"La description est trop longue").optional(),tags:q(a().max(50)).max(10,"Maximum 10 tags autorisés").optional(),isPublic:c().optional()}).refine(s=>s.file.size<=104857600,{message:"Le fichier est trop volumineux (maximum 100MB)",path:["file"]}).refine(s=>["audio/mpeg","audio/mp3","audio/wav","audio/flac","audio/aac","audio/ogg","audio/m4a"].includes(s.file.type),{message:"Type de fichier non supporté",path:["file"]});o({file:G(File,{message:"Une image est requise"}),alt:a().max(255,"Le texte alternatif est trop long").optional(),caption:a().max(500,"La légende est trop longue").optional()}).refine(s=>s.file.size<=10485760,{message:"L'image est trop volumineuse (maximum 10MB)",path:["file"]}).refine(s=>["image/jpeg","image/png","image/gif","image/webp","image/svg+xml"].includes(s.file.type),{message:"Type d'image non supporté",path:["file"]});o({content:a().min(1,"Le message ne peut pas être vide").max(2e3,"Le message est trop long (maximum 2000 caractères)").refine(s=>!/<script|javascript:|vbscript:|on\w+=/i.test(s),"Le message contient du contenu non autorisé"),conversationId:a().uuid("ID de conversation invalide"),replyToId:a().uuid("ID de réponse invalide").optional(),attachments:q(a().uuid()).max(5,"Maximum 5 pièces jointes").optional()});o({name:a().min(1,"Le nom est requis").max(100,"Le nom est trop long"),description:a().max(500,"La description est trop longue").optional(),isPrivate:c().optional(),participants:q(a().uuid()).min(1,"Au moins un participant est requis").max(50,"Maximum 50 participants")});o({name:a().min(1,"Le nom est requis").max(100,"Le nom est trop long").optional(),description:a().max(500,"La description est trop longue").optional(),isPrivate:c().optional()});o({displayName:W.optional(),bio:a().max(500,"La bio est trop longue").optional(),avatar:a().url("URL d'avatar invalide").optional(),website:a().url("URL de site web invalide").optional(),location:a().max(100,"La localisation est trop longue").optional(),birthDate:a().regex(/^\d{4}-\d{2}-\d{2}$/,"Format de date invalide").optional(),isPublic:c().optional()});o({email:L.optional(),language:I(["en","fr","es","de"],{errorMap:()=>({message:"Langue non supportée"})}).optional(),timezone:a().max(50,"Timezone invalide").optional(),notifications:o({email:c().optional(),push:c().optional(),chat:c().optional(),mentions:c().optional()}).optional(),privacy:o({showOnlineStatus:c().optional(),showLastSeen:c().optional(),allowDirectMessages:c().optional(),showInSearch:c().optional()}).optional()});o({query:a().min(1,"La requête de recherche est requise").max(100,"La requête est trop longue"),type:I(["all","users","tracks","conversations"],{errorMap:()=>({message:"Type de recherche invalide"})}).optional(),limit:k().min(1).max(100).optional(),offset:k().min(0).optional()});o({page:k().min(1,"Le numéro de page doit être supérieur à 0").optional(),limit:k().min(1).max(100,"La limite doit être entre 1 et 100").optional(),cursor:a().optional(),sortBy:a().max(50).optional(),sortOrder:I(["asc","desc"]).optional()});o({genre:a().max(50).optional(),artist:a().max(100).optional(),year:k().min(1900).max(new Date().getFullYear()).optional(),duration:o({min:k().min(0).optional(),max:k().min(0).optional()}).optional(),isPublic:c().optional()});o({code:k(),message:a(),details:ne().optional(),field:a().optional(),timestamp:a()});function ve(s,m,d){const b=s&&typeof s=="object"&&"message"in s?s:null;if(!b||ce(b)!=="validation")return!1;const u=me(b);if(Object.keys(u).length===0)return!1;let w=0;for(const[j,p]of Object.entries(u))m(j,{type:"server",message:p}),w++;return w>0}const Le=3;function Ce(s={}){const{maxRetries:m=Le,onRetry:d}=s,[b,r]=f.useState({retryCount:0,canRetry:!0,lastError:null}),u=f.useRef(null),w=f.useCallback((y,n)=>{u.current={fn:y,variables:n},r(C=>({...C,canRetry:C.retryCount<m}))},[m]),j=f.useCallback(y=>{r(n=>({retryCount:n.retryCount,canRetry:n.retryCount<m,lastError:y}))},[m]),p=f.useCallback(async()=>{if(!u.current)return;const y=b.retryCount;if(!(y>=m)){r(n=>({...n,retryCount:n.retryCount+1,canRetry:n.retryCount+1<m})),d&&d(y+1);try{await u.current.fn(),r({retryCount:0,canRetry:!0,lastError:null}),u.current=null}catch(n){j(n instanceof Error?n:new Error(String(n)))}}},[b.retryCount,m,d,j]),_=f.useCallback(()=>{r({retryCount:0,canRetry:!0,lastError:null}),u.current=null},[]);return{retryState:b,storeMutation:w,handleMutationError:j,retryMutation:p,resetRetry:_}}const Pe=o({username:Q,email:L,first_name:a().optional(),last_name:a().optional(),bio:a().max(500,"Bio must be less than 500 characters").optional(),location:a().max(100).optional(),social_links:o({twitter:a().url("Invalid Twitter URL").optional().or(v("")),instagram:a().url("Invalid Instagram URL").optional().or(v("")),facebook:a().url("Invalid Facebook URL").optional().or(v("")),youtube:a().url("Invalid YouTube URL").optional().or(v("")),website:a().url("Invalid website URL").optional().or(v(""))}).optional()});function Te(){const{data:s}=de(),m=ye(),{t:d}=ue(),b=pe(),[r,u]=f.useState(!1),[w,j]=f.useState(!1),[p,_]=f.useState(null),[y,n]=f.useState(null),{retryState:C,storeMutation:H,handleMutationError:K,retryMutation:X,resetRetry:z}=Ce({maxRetries:3});f.useEffect(()=>{s?.id&&D.calculateProfileCompletion(s.id).then(_).catch(i=>{xe.error("Failed to load profile completion:",i)})},[s?.id]);const J=re({resolver:le(Pe),defaultValues:{username:s?.username||"",email:s?.email||"",first_name:s?.first_name||"",last_name:s?.last_name||"",bio:s?.bio||"",location:s?.location||"",social_links:{twitter:s?.social_links?.twitter||"",instagram:s?.social_links?.instagram||"",facebook:s?.social_links?.facebook||"",youtube:s?.social_links?.youtube||"",website:s?.social_links?.website||""}},mode:"onBlur"}),{register:h,handleSubmit:ee,reset:E,watch:se,setError:ae,formState:{errors:t}}=J,l=se();f.useEffect(()=>{s?.id&&!r&&E({username:s?.username||"",email:s?.email||"",first_name:s?.first_name||"",last_name:s?.last_name||"",bio:s?.bio||"",location:s?.location||"",social_links:{twitter:s?.social_links?.twitter||"",instagram:s?.social_links?.instagram||"",facebook:s?.social_links?.facebook||"",youtube:s?.social_links?.youtube||"",website:s?.social_links?.website||""}})},[s,E,r]);const te=async i=>{if(!s)return;const P=async()=>{const S=s.id,N={username:i.username,first_name:i.first_name||void 0,last_name:i.last_name||void 0,bio:i.bio||void 0,location:i.location||void 0};if(i.social_links){const x={};i.social_links.twitter&&(x.twitter=i.social_links.twitter),i.social_links.instagram&&(x.instagram=i.social_links.instagram),i.social_links.facebook&&(x.facebook=i.social_links.facebook),i.social_links.youtube&&(x.youtube=i.social_links.youtube),i.social_links.website&&(x.website=i.social_links.website),Object.keys(x).length>0&&(N.social_links=x)}if(await ge.put(`/users/${S}`,N),await m.invalidateQueries({queryKey:["user","me"]}),s.id){const x=await D.calculateProfileCompletion(s.id);_(x)}b.success(d("profile.success")||"Profile updated successfully"),u(!1),n(null),z()};H(P,i),j(!0);try{await P()}catch(S){const N=he(S),x=new Error(N.message||d("profile.error")||"Failed to update profile");K(x);const oe=ve(N,ae);n(oe?null:x)}finally{j(!1)}},ie=()=>{E({username:s?.username||"",email:s?.email||"",first_name:s?.first_name||"",last_name:s?.last_name||"",bio:s?.bio||"",location:s?.location||"",social_links:{twitter:s?.social_links?.twitter||"",instagram:s?.social_links?.instagram||"",facebook:s?.social_links?.facebook||"",youtube:s?.social_links?.youtube||"",website:s?.social_links?.website||""}}),u(!1)};return s?e.jsxs("div",{className:"space-y-6",children:[y&&e.jsx(fe,{error:y,variant:"banner",severity:"error",context:{action:"updating profile",resource:"profile"},onRetry:C.canRetry?X:void 0,onDismiss:()=>{n(null),z()}}),p&&e.jsxs(F,{children:[e.jsx(A,{children:e.jsxs(U,{className:"flex items-center gap-2",children:[p.percentage===100?e.jsx(Ne,{className:"h-5 w-5 text-kodo-lime"}):e.jsx($,{className:"h-5 w-5 text-kodo-gold"}),"Profile Completion"]})}),e.jsxs(R,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between text-sm",children:[e.jsxs("span",{className:"text-muted-foreground",children:[p.percentage,"% Complete"]}),e.jsx("span",{className:"font-medium",children:p.percentage===100?"Profile Complete!":`${p.missing.length} field(s) missing`})]}),e.jsx(ke,{value:p.percentage,className:"h-2"})]}),p.missing.length>0&&e.jsxs(we,{children:[e.jsx($,{className:"h-4 w-4"}),e.jsxs(_e,{children:[e.jsx("p",{className:"font-medium mb-1",children:"Complete your profile:"}),e.jsx("ul",{className:"list-disc list-inside text-sm space-y-1",children:p.missing.map((i,P)=>e.jsx("li",{children:i},P))})]})]})]})]}),e.jsxs(F,{children:[e.jsxs(A,{className:"flex flex-row items-center justify-between",children:[e.jsx(U,{children:d("profile.title")||"Profile"}),!r&&e.jsx(T,{onClick:()=>u(!0),variant:"outline",children:d("profile.edit")||"Edit"})]}),e.jsxs(R,{children:[e.jsx("h3",{className:"text-lg font-medium mb-4",children:d("profile.personalInfo")||"Personal Information"}),e.jsxs("form",{onSubmit:ee(te),className:"space-y-4",children:[r&&e.jsx("div",{className:"mb-4",children:e.jsx(T,{type:"button",variant:"ghost",children:d("profile.avatar.changePhoto")||"Change Photo"})}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx("label",{className:"text-sm font-medium",htmlFor:"username",children:"Username"}),e.jsx(g,{id:"username",...h("username"),disabled:!r}),t.username&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.username.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx("label",{className:"text-sm font-medium",htmlFor:"email",children:"Email"}),e.jsx(g,{id:"email",type:"email",...h("email"),disabled:!r}),t.email&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.email.message})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsx("label",{className:"text-sm font-medium",htmlFor:"first_name",children:"First Name"}),e.jsx(g,{id:"first_name",...h("first_name"),disabled:!r}),t.first_name&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.first_name.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx("label",{className:"text-sm font-medium",htmlFor:"last_name",children:"Last Name"}),e.jsx(g,{id:"last_name",...h("last_name"),disabled:!r}),t.last_name&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.last_name.message})]})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx("label",{className:"text-sm font-medium",htmlFor:"location",children:"Location"}),e.jsx(g,{id:"location",...h("location"),disabled:!r,placeholder:"City, Country"}),t.location&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.location.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx("label",{className:"text-sm font-medium",htmlFor:"bio",children:"Bio"}),e.jsx(je,{id:"bio",...h("bio"),disabled:!r,placeholder:"Tell us about yourself...",rows:4,maxLength:500}),e.jsxs("div",{className:"flex justify-between text-xs text-muted-foreground",children:[t.bio&&e.jsx("p",{className:"text-kodo-red",children:t.bio.message}),e.jsxs("span",{className:"ml-auto",children:[l.bio?.length||0,"/500 characters"]})]})]}),r&&e.jsxs("div",{className:"space-y-4 pt-4 border-t",children:[e.jsx("h4",{className:"text-md font-medium",children:"Social Links"}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("label",{className:"text-sm font-medium flex items-center gap-2",htmlFor:"twitter",children:[e.jsx(B,{className:"h-4 w-4"}),"Twitter"]}),e.jsx(g,{id:"twitter",type:"url",placeholder:"https://twitter.com/username",...h("social_links.twitter")}),t.social_links?.twitter&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.social_links.twitter.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("label",{className:"text-sm font-medium flex items-center gap-2",htmlFor:"instagram",children:[e.jsx(O,{className:"h-4 w-4"}),"Instagram"]}),e.jsx(g,{id:"instagram",type:"url",placeholder:"https://instagram.com/username",...h("social_links.instagram")}),t.social_links?.instagram&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.social_links.instagram.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("label",{className:"text-sm font-medium flex items-center gap-2",htmlFor:"facebook",children:[e.jsx(V,{className:"h-4 w-4"}),"Facebook"]}),e.jsx(g,{id:"facebook",type:"url",placeholder:"https://facebook.com/username",...h("social_links.facebook")}),t.social_links?.facebook&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.social_links.facebook.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("label",{className:"text-sm font-medium flex items-center gap-2",htmlFor:"youtube",children:[e.jsx(Y,{className:"h-4 w-4"}),"YouTube"]}),e.jsx(g,{id:"youtube",type:"url",placeholder:"https://youtube.com/@username",...h("social_links.youtube")}),t.social_links?.youtube&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.social_links.youtube.message})]}),e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("label",{className:"text-sm font-medium flex items-center gap-2",htmlFor:"website",children:[e.jsx(Z,{className:"h-4 w-4"}),"Website"]}),e.jsx(g,{id:"website",type:"url",placeholder:"https://example.com",...h("social_links.website")}),t.social_links?.website&&e.jsx("p",{className:"text-sm text-kodo-red",children:t.social_links.website.message})]})]})]}),!r&&l.social_links&&e.jsxs("div",{className:"space-y-4 pt-4 border-t",children:[e.jsx("h4",{className:"text-md font-medium",children:"Social Links"}),e.jsxs("div",{className:"flex flex-wrap gap-4",children:[l.social_links.twitter&&e.jsxs("a",{href:l.social_links.twitter,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-kodo-cyan hover:underline",children:[e.jsx(B,{className:"h-4 w-4"}),"Twitter"]}),l.social_links.instagram&&e.jsxs("a",{href:l.social_links.instagram,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-kodo-magenta hover:underline",children:[e.jsx(O,{className:"h-4 w-4"}),"Instagram"]}),l.social_links.facebook&&e.jsxs("a",{href:l.social_links.facebook,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-kodo-cyan hover:underline",children:[e.jsx(V,{className:"h-4 w-4"}),"Facebook"]}),l.social_links.youtube&&e.jsxs("a",{href:l.social_links.youtube,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-kodo-red hover:underline",children:[e.jsx(Y,{className:"h-4 w-4"}),"YouTube"]}),l.social_links.website&&e.jsxs("a",{href:l.social_links.website,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-2 text-muted-foreground hover:underline",children:[e.jsx(Z,{className:"h-4 w-4"}),"Website"]}),!l.social_links.twitter&&!l.social_links.instagram&&!l.social_links.facebook&&!l.social_links.youtube&&!l.social_links.website&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"No social links added"})]})]}),r&&e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx(T,{type:"button",variant:"secondary",onClick:ie,children:d("profile.cancel")||"Cancel"}),e.jsx(T,{type:"submit",disabled:w,children:w?"Saving...":d("profile.save")||"Save"})]})]})]})]})]}):e.jsx(F,{children:e.jsx(R,{className:"pt-6",children:e.jsx("div",{className:"text-center text-muted-foreground",children:e.jsx("p",{children:"Chargement du profil..."})})})})}function Be(){return e.jsxs("div",{className:"p-4 sm:p-6",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-3xl font-display font-bold text-white mb-2",children:"Mon Profil"}),e.jsx("p",{className:"text-sm text-white opacity-80",children:"Gérez vos informations personnelles"})]}),e.jsx(be,{variant:"default",className:"max-w-4xl",children:e.jsx(Te,{})})]})}export{Be as ProfilePage};
|