1import{e as Y,bm as re,b as ie,n as H,j as s,M as le,bn as ce,bo as de}from"./index.CHvzgvcl.js";import{r as c,f as me,j as ue,d as fe,L as V}from"./reactRouter.DIJDf_PU.js";import{D as ge}from"./DiscordIcon.BPe0K4t5.js";import{G as pe}from"./GoogleIcon.Dvw9apY0.js";import{u as J}from"./i18n.CnDgzqyN.js";import"./recharts.CxMvZdXo.js";(function(){try{var u=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};u.SENTRY_RELEASE={id:"9285efe8a8dce1f690960d89b06301901087e606"},u._sentryModuleMetadata=u._sentryModuleMetadata||{},u._sentryModuleMetadata[new u.Error().stack]=function(v){for(var x=1;x<arguments.length;x++){var k=arguments[x];if(k!=null)for(var w in k)k.hasOwnProperty(w)&&(v[w]=k[w])}return v}({},u._sentryModuleMetadata[new u.Error().stack],{"_sentryBundlerPluginAppKey:tuf-website":!0});var y=new u.Error().stack;y&&(u._sentryDebugIds=u._sentryDebugIds||{},u._sentryDebugIds[y]="f8ce224c-ccae-4907-8cd1-3a06a6e2810f",u._sentryDebugIdIdentifier="sentry-dbid-f8ce224c-ccae-4907-8cd1-3a06a6e2810f")}catch{}})();function be(){return typeof window<"u"&&typeof window.PublicKeyCredential<"u"}function he(){const[u,y]=c.useState("credentials"),[v,x]=c.useState(""),[k,w]=c.useState(""),[i,d]=c.useState(""),[e,h]=c.useState(!1),[E,M]=c.useState(!1),[j,A]=c.useState(null),[N,P]=c.useState(null),r=c.useRef(null),b=c.useRef(null),[S,I]=c.useState(""),[X,T]=c.useState(""),[L,O]=c.useState([]),[_,G]=c.useState(!0),[q,D]=c.useState(null),[Z,U]=c.useState(0),[$,R]=c.useState(!1),[ee]=c.useState(()=>be()),{login:se,loginWithProvider:Q,requestLoginMfaEmail:W,verifyLoginMfa:te,loginWithPasskey:ae,verifyLoginMfaPasskey:ne}=Y(),{t:g}=J("pages");c.useEffect(()=>{if(b.current&&(clearInterval(b.current),b.current=null),j){const f=Date.now()+j;b.current=setInterval(()=>{const m=Math.max(0,f-Date.now());m<=0?(b.current&&(clearInterval(b.current),b.current=null),d(""),A(null)):A(m)},1e3)}return()=>{b.current&&(clearInterval(b.current),b.current=null)}},[j]),c.useEffect(()=>{if(!q){U(0);return}const f=()=>{const o=new Date(q).getTime()-Date.now();U(Math.max(0,Math.ceil(o/1e3)))};f();const m=setInterval(f,500);return()=>clearInterval(m)},[q]);const oe=f=>{if(!f)return"0s";const m=Math.floor(f/1e3),o=Math.floor(m/60)%60,n=Math.floor(m/3600)%24,t=Math.floor(m/86400);let a="";return t>0&&(a+=`${t}d `),(n>0||t>0)&&(a+=`${n}h `),(o>0||n>0||t>0)&&(a+=`${o}m `),a+=`${m%60}s`,a},F=c.useCallback(async()=>{var f,m,o,n,t,a,p,C;h(!0),d("");try{const l=await W();T((l==null?void 0:l.maskedEmail)||""),D((l==null?void 0:l.emailResendAvailableAt)||null),R(!0)}catch(l){R(!0);const z=((m=(f=l==null?void 0:l.response)==null?void 0:f.data)==null?void 0:m.code)||(l==null?void 0:l.code),B=((n=(o=l==null?void 0:l.response)==null?void 0:o.data)==null?void 0:n.message)||(l==null?void 0:l.message);if(z==="MFA_PENDING_REQUIRED"){y("credentials"),d(B||g("login.mfa.expired"));return}if(z==="RESEND_COOLDOWN"){const K=(a=(t=l==null?void 0:l.response)==null?void 0:t.data)==null?void 0:a.retryAfter;typeof K=="number"&&D(new Date(Date.now()+K).toISOString()),(C=(p=l==null?void 0:l.response)==null?void 0:p.data)!=null&&C.maskedEmail&&T(l.response.data.maskedEmail);return}d(B||g("login.mfa.sendFailed"))}finally{h(!1)}},[W,g]);return c.useEffect(()=>{u==="mfa"&&!$&&L.includes("email")&&F()},[u,$,L,F]),{step:u,email:v,setEmail:x,password:k,setPassword:w,error:i,loading:e,requireCaptcha:E,retryAfter:j,captchaToken:N,setCaptchaToken:P,captchaRef:r,formatTime:oe,submitCredentials:async f=>{var m,o;f.preventDefault(),d(""),A(null),h(!0);try{if(E&&!N)return d(g("login.errors.captcha.incomplete")),h(!1),{completed:!1};const n=await se(v,k,N);if((n==null?void 0:n.status)==="mfa_required"){const t=Array.isArray(n.methods)?n.methods:[];O(t),T(n.maskedEmail||""),I(""),G(!0);const p=(n.emailResendAvailableAt?new Date(n.emailResendAvailableAt).getTime():0)>Date.now();return D(p?n.emailResendAvailableAt:null),R(p||!t.includes("email")),y("mfa"),{completed:!1}}return n!=null&&n.user?(y("credentials"),{completed:!0}):{completed:!1}}catch(n){console.error("Login error:",n);const t=(m=n==null?void 0:n.response)==null?void 0:m.status;let a={generic:g("login.errors.generic"),network:g("login.errors.network")};t===401?a={...a,generic:g("login.errors.invalidCredentials")}
1:t===403?a={...a,generic:g("login.errors.emailNotVerified")}:t===429&&(a={...a,generic:g("login.errors.rateLimit")});const p=re(n,a);return p.retryAfter!=null&&(p.message=p.message||g("login.errors.rateLimit")),d(p.message),p.retryAfter&&A(p.retryAfter),p.requireCaptcha&&M(!0),(o=r.current)==null||o.reset(),{completed:!1}}finally{h(!1)}},submitDiscord:async()=>{try{d(""),await Q("discord")}catch{d(g("login.errors.discordFailed"))}},submitGoogle:async()=>{try{d(""),await Q("google")}catch{d(g("login.errors.googleFailed"))}},submitPasskey:async()=>{var f,m;d(""),h(!0);try{const o=await ae();return o!=null&&o.cancelled?{completed:!1}:o!=null&&o.user?{completed:!0}:{completed:!1}}catch(o){const n=((m=(f=o==null?void 0:o.response)==null?void 0:f.data)==null?void 0:m.message)||(o==null?void 0:o.message);return d(n||g("login.passkey.failed")),{completed:!1}}finally{h(!1)}},passkeysSupported:ee,mfaCode:S,setMfaCode:I,maskedEmail:X,mfaMethods:L,rememberDevice:_,setRememberDevice:G,resendSeconds:Z,requestMfaCode:F,submitMfa:async f=>{var m,o,n,t;if(f.preventDefault(),d(""),!S||S.length<8)return d(g("login.mfa.codeRequired")),{completed:!1};h(!0);try{const a=await te({code:S,rememberDevice:_});return a!=null&&a.user?{completed:!0}:{completed:!1}}catch(a){const p=((o=(m=a==null?void 0:a.response)==null?void 0:m.data)==null?void 0:o.code)||(a==null?void 0:a.code),C=((t=(n=a==null?void 0:a.response)==null?void 0:n.data)==null?void 0:t.message)||(a==null?void 0:a.message);return p==="MFA_PENDING_REQUIRED"?(y("credentials"),d(C||g("login.mfa.expired")),{completed:!1}):(d(C||g("login.mfa.invalidCode")),{completed:!1})}finally{h(!1)}},submitMfaPasskey:async()=>{var f,m,o,n;d(""),h(!0);try{const t=await ne({rememberDevice:_});return t!=null&&t.cancelled?{completed:!1}:t!=null&&t.user?{completed:!0}:{completed:!1}}catch(t){const a=((m=(f=t==null?void 0:t.response)==null?void 0:f.data)==null?void 0:m.code)||(t==null?void 0:t.code),p=((n=(o=t==null?void 0:t.response)==null?void 0:o.data)==null?void 0:n.message)||(t==null?void 0:t.message);return a==="MFA_PENDING_REQUIRED"?(y("credentials"),d(p||g("login.mfa.expired")),{completed:!1}):(d(p||g("login.mfa.passkeyFailed")),{completed:!1})}finally{h(!1)}},backToCredentials:()=>{y("credentials"),I(""),O([]),R(!1),D(null),d("")}}}const Re=()=>{const u=me(),[y]=ue(),{user:v,getOriginUrl:x,clearOriginUrl:k,setOriginUrl:w}=Y(),{t:i}=J("pages"),d=fe(),e=he(),h=c.useMemo(()=>ie({title:i("login.meta.title"),description:i("login.meta.description"),pathname:d.pathname,type:"article",noindex:!0}),[i,d.pathname]);c.useEffect(()=>{const r=y.get("returnTo");r&&/^https?:\/\//i.test(r)&&w(r)},[y,w]);const E=c.useRef(!!v);c.useEffect(()=>{if(v&&E.current){const r=x();if(r&&/^https?:\/\//i.test(r)){k(),H(r);return}u("/profile",{replace:!0})}},[v,u,x,k]);const M=()=>{const r=x()||"/profile";if(k(),/^https?:\/\//i.test(r)){H(r);return}u(r,{replace:!0})},j=async r=>{const{completed:b}=await e.submitCredentials(r);b&&M()},A=async()=>{const{completed:r}=await e.submitPasskey();r&&M()},N=async r=>{const{completed:b}=await e.submitMfa(r);b&&M()},P=async()=>{const{completed:r}=await e.submitMfaPasskey();r&&M()};return s.jsxs("div",{className:"login-page-wrapper",children:[s.jsx(le,{...h}),s.jsx("div",{className:"login-page",children:s.jsxs("div",{className:"login-container",children:[s.jsx("h1",{children:e.step==="mfa"?i("login.mfa.title"):i("login.header.title")}),e.error&&s.jsxs("div",{className:"error-message",children:[e.error,e.retryAfter&&s.jsxs("div",{className:"retry-countdown",children:["Time remaining: ",e.formatTime(e.retryAfter)]})]}),e.step==="credentials"&&s.jsxs(s.Fragment,{children:[s.jsxs("form",{onSubmit:j,className:"login-form",children:[s.jsxs("div",{className:"form-group",children:[s.jsx("label",{htmlFor:"email",children:i("login.form.labels.emailOrUsername")}),s.jsx("input",{type:"text",id:"email",value:e.email,onChange:r=>e.setEmail(r.target.value),required:!0,disabled:e.loading||e.retryAfter,className:`login-input ${e.retryAfter?"rate-limit":""}`})]}),s.jsxs("div",{className:"form-group",children:[s.jsx("label",{htmlFor:"password",children:i("login.form.labels.password")}),s.jsx("input",{type:"password",autoComplete:"login-password",id:"password",value:e.password,onChange:r=>e.setPassword(r.target.value),required:!0,disabled:e.loading||e.retryAfter,className:`login-input ${e.retryAfter?"rate-limit":""}`}),s.jsx("div",{className:"forgot-password-link",children:s.jsx(V,{to:"/forgot-password",className:"forgot-password-text",children:"Forgot your password?"})})]}),e.requireCaptcha&&s.jsx("div",{className:"captcha-container",children:s.jsx(ce,{ref:e.captchaRef,onChange:e.setCaptchaToken})}),s.jsx("button",{type:"submit",className:"login-button btn-fill-primary btn-block",disabled:e.loading||e.retryAfter||e.requireCaptcha&&!e.captchaToken,children:e.loading?i("login.form.buttons.loggingIn"):i("login.form.buttons.login")})]}),s.jsx("div",{className:"divider",children:s.jsx("span",{children:i("login.form.divider")})}),s.jsxs("div",{className:"oauth-provider-buttons",children:[s.jsxs("button",{type:"button",className:"discord-button btn-fill-discord btn-block",onClick:e.submitDiscord,disabled:e.loading||e.retryAfter,children:[s.jsx(ge,{size:18}),i("login.form.buttons.discordLogin")]}),s.jsxs("button",{type:"button",className:"google-button btn-fill-glass btn-block",onClick:e.submitGoogle,disabled:e.loading||e.retryAfter,children:[s.jsx(pe,{size:18}),i("login.form.buttons.googleLogin")]})]}),e.passkeysSupported&&s.jsx("button",{type:"button",className:"passkey-button btn-fill-glass btn-block",onClick:A,disabled:e.loading||e.retryAfter,children:i("login.passkey.button")}),s.jsx("div",{className:"links",children:s.jsx(V,{to:"/register",className:"register-link",children:i("login.form.links.register")})})]}),e.step==="mfa"&&s.jsxs("form",{onSubmit:N,className:"login-form login-mfa-form",children:[e.mfaMethods.includes("passkey")&&e.passkeysSupported&&s.jsx("button",{type:"button",className:"login-mfa-passkey btn-fill-glass btn-block",onClick:P,disabled:e.loading,children:i("login.mfa.usePasskey")}),e.mfaMethods.includes("email")&&s.jsxs(s.Fragment,{children:[s.jsx("p",{className:"login-mfa-prompt",children:i("login.mfa.codePrompt",{email:e.maskedEmail||i("login.mfa.yourEmail")})}),s.jsx(de,{id:"login-mfa-code",label:i("login.mfa.codeLabel"),value:e.mfaCode,onChange:e.setMfaCode,disabled:e.loading})]}),s.jsxs("label",{className:"login-mfa-remember",children:[s.jsx("input",{type:"checkbox",checked:e.rememberDevice,onChange:r=>e.setRememberDevice(r.target.checked),disabled:e.loading}),s.jsx("span",{children:i("login.mfa.rememberDevice")})]}),e.mfaMethods.includes("email")&&s.jsx("button",{type:"submit",className:"login-button btn-fill-primary btn-block",disabled:e.loading||e.mfaCode.length<8,children:e.loading?i("login.mfa.verifying"):i("login.mfa.confirm")}),s.jsxs("div",{className:"login-mfa-actions",children:[e.mfaMethods.includes("email")&&s.jsx("button",{type:"button",className:"login-mfa-resend",onClick:()=>e.requestMfaCode(),disabled:e.loading||e.resendSeconds>0,children:e.resendSeconds>0?i("login.mfa.resendIn",{seconds:e.resendSeconds}):i("login.mfa.resend")}),s.jsx("button",{type:"button",className:"login-mfa-back",onClick:e.backToCredentials,disabled:e.loading,children:i("login.mfa.back")})]})]})]})})]})};export{Re 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.