1import{j as t}from"./vendor-motion-BbExknJL.js";import{r as o,u as C}from"./vendor-react-JrmCn3bB.js";import{w as h,n as I,X as z,v as P,L as _,a1 as j}from"./index-ChZ-G7s9.js";import{I as E}from"./input-ChQ2RzkV.js";import"./vendor-ui-DnUDR9QE.js";import"./vendor-charts-Bmd7Bphi.js";import"./vendor-query-BOAoD1gU.js";import"./vendor-supabase-BX9gqKp5.js";function S(e){switch(e){case"ambassador":return"ambassador";case"admin":return"admin";case"owner":return"owner";case"guest":default:return"guest"}}function T(e){switch(S(e)){case"ambassador":return"/auth";case"admin":return"/dashboard";case"owner":return"/dashboard";case"guest":default:return"/"}}function A(e){switch(S(e)){case"ambassador":return"Volver al login";case"admin":return"Volver al panel de administración";case"owner":return"Volver al dashboard";case"guest":default:return"Volver al inicio"}}async function V(e){try{const{data:s}=await h.from("admin_user_roles").select("id").eq("user_id",e).limit(1).maybeSingle();return s?"admin":"guest"}catch{return"guest"}}function D(){const e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,s=new URLSearchParams(window.location.search),r=new URLSearchParams(e),l=s.get("type")??r.get("type"),f=s.get("token_hash")??r.get("token_hash"),u=s.get("access_token")??r.get("access_token"),g=s.get("refresh_token")??r.get("refresh_token"),d=S(s.get("portal")??r.get("portal"));return{accessToken:u,refreshToken:g,isRecovery:l==="recovery"||!!f||!!u,portalHint:d,tokenHash:f}}function O(e){const s=new URL(window.location.href);s.searchParams.delete("token_hash"),s.searchParams.delete("type"),s.searchParams.delete("access_token"),s.searchParams.delete("refresh_token"),s.searchParams.set("portal",e),s.hash="",window.history.replaceState({},document.title,`${s.pathname}${s.search}`)}function q(){const e=o.useMemo(()=>D(),[]),[s,r]=o.useState(e.isRecovery),[l,f]=o.useState(!1),[u,g]=o.useState(null),d=o.useRef(!1);return o.useEffect(()=>{if(!e.isRecovery){r(!1),f(!0);return}let v=!0;const p=n=>{!v||d.current||(d.current=!0,O(e.portalHint),g(n),f(!1),r(!1))},k=()=>{!v||d.current||(d.current=!0,g(null),f(!0),r(!1))},{data:{subscription:N}}=h.auth.onAuthStateChange((n,i)=>{if(n==="PASSWORD_RECOVERY"&&i?.user?.id){p(i.user.id);return}(n==="SIGNED_IN"||n==="TOKEN_REFRESHED")&&i?.user?.id&&e.isRecovery&&p(i.user.id)}),y=async()=>{try{if(e.accessToken&&e.refreshToken){const{data:m,error:a}=await h.auth.setSession({access_token:e.accessToken,refresh_token:e.refreshToken});if(!a){const c=m.session?.user?.id??m.user?.id;if(c){p(c);return}}}if(e.tokenHash){const{data:m,error:a}=await h.auth.verifyOtp({token_hash:e.tokenHash,type:"recovery"});if(!a){const c=m.session?.user?.id??m.user?.id;if(c){p(c);return}}}if(await new Promise(m=>setTimeout(m,1500)),d.current)return;const{data:{session:n}}=await h.auth.getSession();if(n?.user?.id){p(n.user.id);return}const{data:{user:i}}=await h.auth.getUser();i?.id&&p(i.id)}catch(n){console.warn("Password recovery session initialization failed",n)}},R=window.setTimeout(k,8e3);return y(),()=>{v=!1,window.clearTimeout(R),N.unsubscribe()}},[e.accessToken,e.isRecovery,e.portalHint,e.refreshToken,e.tokenHash]),{invalid:l,portalHint:e.portalHint,ready:!!u&&!s,recoveryUserId:u,verifying:s}}const L=[{label:"Al menos 6 caracteres",test:e=>e.length>=6},{label:"Contiene una letra",test:e=>/[a-zA-Z]/.test(e)},{label:"Contiene un número",test:e=>/\d/.test(e)}];function M({password:e}){return e?t.jsx("ul",{className:"mt-2 space-y-1",children:L.map(s=>{const r=s.test(e);return t.jsxs("li",{className:"flex items-center gap-1.5 text-xs",children:[r?t.jsx(I,{size:12,className:"text-primary"}):t.jsx(z,{size:12,className:"text-destructive"}),t.jsx("span",{className:r?"text-muted-foreground":"text-destructive",children:s.label})]},s.label)})}):null}function B(){const e=C(),[s,r]=o.useState(""),[l,f]=o.useState(""),[u,g]=o.useState(!1),[d,v]=o.useState(null),{invalid:p,portalHint:k,ready:N,recoveryUserId:y,verifying:R}=q(),n=o.useMemo(()=>L.every(a=>a.test(s)),[s]);o.useEffect(()=>{if(!y)return;let a=!1;return(async()=>{const x=await V(y);a||v(x)})(),()=>{a=!0}},[y]);const i=d??k,m=async a=>{if(a.preventDefault(),!n){j.error("La contraseña no cumple los requisitos");return}if(s!==l){j.error("Las contraseñas no coinciden");return}g(!0);try{await new Promise(w=>setTimeout(w,300));const{data:{user:c}}=await h.auth.getUser();if(!c)throw new Error("Tu sesión de recuperación ha expirado. Solicita un nuevo enlace.");let x=null;for(let w=0;w<3;w++){const{error:b}=await h.auth.updateUser({password:s});if(!b){j.success("Contraseña actualizada correctamente"),e(T(i));return}if(x=b,!b.message.includes("aborted")&&!b.message.includes("network"))break;await new Promise(H=>setTimeout(H,800*(w+1)));const{data:{user:U}}=await h.auth.getUser();if(!U)throw new Error("Tu sesión de recuperación ha expirado. Solicita un nuevo enlace.")}throw x||new Error("Error al actualizar la contraseña")}catch(c){const x=c?.message||"",w=x.includes("aborted")||x.includes("network")?"Tu sesión de recuperación fue interrumpida. Abre el enlace del email de nuevo.":x;j.error(w)}finally{g(!1)}};return R?t.jsx("main",{className:"min-h-screen bg-background flex items-center justify-center pt-20 pb-16",children:t.jsxs("div",{className:"text-center space-y-3",children:[t.jsx(P,{className:"h-8 w-8 animate-spin text-primary mx-auto"}),t.jsx("p",{className:"text-muted-foreground text-sm",children:"Verificando tu enlace de recuperaciónâ¦"})]})}):t.jsx("main",{className:"min-h-screen bg-background flex items-center justify-center pt-20 pb-16",children:t.jsxs("div",{className:"w-full max-w-md px-6",children:[t.jsxs("div",{className:"text-center mb-10",children:[t.jsx("p",{className:"text-xs font-medium text-primary uppercase tracking-widest mb-3",children:"Seguridad"}),t.jsx("h1",{className:"text-foreground text-3xl font-light",children:"Nueva contraseña"})]}),N&&!p?t.jsxs("form",{onSubmit:m,className:"bg-card border border-border rounded-xl p-8 space-y-5",children:[t.jsxs("div",{children:[t.jsx("label",{className:"text-muted-foreground text-xs block mb-1",children:"Nueva contraseña"}),t.jsxs("div",{className:"relative",children:[t.jsx(_,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"}),t.jsx(E,{type:"password",value:s,onChange:a=>r(a.target.value),placeholder:"MÃn. 6 caracteres",required:!0,minLength:6,className:"pl-9"})]}),t.jsx(M,{password:s})]}),t.jsxs("div",{children:[t.jsx("label",{className:"text-muted-foreground text-xs block mb-1",children:"Confirmar contraseña"}),t.jsxs("div",{className:"relative",children:[t.jsx(_,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"}
1),t.jsx(E,{type:"password",value:l,onChange:a=>f(a.target.value),placeholder:"Repite la contraseña",required:!0,minLength:6,className:"pl-9"})]}),l&&l!==s&&t.jsxs("p",{className:"text-xs text-destructive mt-1 flex items-center gap-1",children:[t.jsx(z,{size:12})," Las contraseñas no coinciden"]})]}),t.jsxs("button",{type:"submit",disabled:u||!n||s!==l,className:"w-full py-2.5 bg-primary text-primary-foreground rounded-xl font-medium text-sm hover:bg-primary/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2",children:[u&&t.jsx(P,{size:16,className:"animate-spin"}),u?"Actualizando...":"Actualizar contraseña"]})]}):t.jsxs("div",{className:"bg-card border border-border rounded-xl p-8 text-center space-y-4",children:[t.jsx("p",{className:"text-muted-foreground",children:"Enlace inválido o expirado. Solicita uno nuevo."}),t.jsx("a",{href:T(i),className:"text-primary text-sm inline-block hover:underline",children:A(i)})]})]})})}export{B as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.