PageSourceSearch

https://xquare.net/_nuxt/D4-B9Ckk.js

js xquare.net collected 2026-09-24 14:29:14 UTC 8,766 bytes, 1 lines download raw bytes

1import{d as j,u as D,B as F,C as Z,a as G,c as w,b as t,g as o,t as d,m as S,l as c,v as m,p,i as U,h as _,n as J,e as K,f as Q,q as a,_ as X,o as h,s as $}from"./uv7Rk5x0.js";import{u as Y}from"./BDk9WT6c.js";import{s as ee}from"./DnecuJxo.js";const te={class:"min-h-[calc(100dvh-9rem)] flex items-center justify-center bg-background"},se={class:"w-full max-w-sm bg-surface-container-lowest rounded-2xl border border-outline-variant/30 p-6 shadow-sm"},oe={class:"flex flex-col items-center mb-5"},ne=["src"],re={class:"text-sm text-on-surface-variant"},ae={class:"grid grid-cols-2 gap-3"},ie={class:"grid grid-cols-2 gap-3"},le={key:0,class:"text-sm text-error"},ue=["disabled"],de={class:"text-sm text-on-surface-variant"},ce={class:"text-on-surface"},me={key:0,class:"text-sm text-error"},pe=["disabled"],fe={class:"flex items-center justify-between text-sm"},be={class:"text-center text-sm text-on-surface-variant mt-5"},we=j({__name:"sign-up",setup(ge){D({title:"Sign up · xquare hub"});const L=F(),N=Z(),V=G(),P=Y(),x=a(""),y=a(""),f=a(""),k=a(""),l=a(""),b=a(""),C=a(1),g=a(""),u=a(0);let v=null;const r=a(""),i=a(!1),R=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,T=/^[a-z0-9](-?[a-z0-9])*$/,B=/^\+?[0-9]{8,15}$/,q=$(()=>k.value.trim().replace(/[\s().-]/g,"")),E=$(()=>{const s=f.value.trim().toLowerCase();return!!(x.value.trim()&&y.value.trim()&&s.length>=3&&s.length<=32&&T.test(s)&&!/^[0-9]+$/.test(s)&&B.test(q.value)&&R.test(l.value.trim())&&b.value.length>=8)});function z(s){return typeof s!="string"||!s.startsWith("/")||s.startsWith("//")?"/m/":s}function M(){u.value=60,v&&clearInterval(v),v=ee(()=>{u.value-=1,u.value<=0&&v&&(clearInterval(v),v=null)},1e3)}async function O(){if(!(!E.value||i.value)){r.value="",i.value=!0;try{(await $fetch("/api/auth/signup",{method:"POST",body:{first_name:x.value.trim(),last_name:y.value.trim(),username:f.value.trim().toLowerCase(),phone_number:q.value,email:l.value.trim().toLowerCase(),password:b.value}}))?.verification_required&&(M(),C.value=2)}catch(s){r.value=s?.data?.statusMessage||s?.statusMessage||s?.message||"Sign-up failed"}finally{i.value=!1}}}async function A(){if(!i.value){if(!/^[0-9]{6}$/.test(g.value)){r.value="Enter the 6-digit code from the email we sent.";return}r.value="",i.value=!0;try{await $fetch("/api/auth/verify-signup",{method:"POST",body:{email:l.value.trim().toLowerCase(),code:g.value}});const s=await $fetch("/api/auth/sign-in",{method:"POST",body:{email:l.value.trim().toLowerCase(),password:b.value}});if(!s?.session)throw new Error("No session returned");await L.auth.setSession({access_token:s.session.access_token,refresh_token:s.session.refresh_token});try{await $fetch("/api/auth/sync-zulip",{method:"POST",headers:{Authorization:`Bearer ${s.session.access_token}`}})}catch(e){console.warn("Zulip sync failed (non-blocking):",e)}try{await $fetch("/api/auth/username",{method:"POST",headers:{Authorization:`Bearer ${s.session.access_token}`},body:{username:f.value.trim().toLowerCase()}})}catch(e){console.warn("username set failed (picker will surface):",e)}await N.push(z(V.query.redirect))}catch(s){r.value=s?.data?.statusMessage||s?.statusMessage||s?.message||"Verification failed"}finally{i.value=!1}}}async function I(){if(!(u.value>0)){r.value="";try{await $fetch("/api/auth/resend-signup-code",{method:"POST",body:{email:l.value.trim().toLowerCase()}}),M()}catch(s){r.value=s?.data?.statusMessage||s?.statusMessage||"Could not resend the code."}}}const H=$(()=>{const s=V.query.redirect;return typeof s=="string"&&s?`/m/sign-in?redirect=${encodeURIComponent(s)}`:"/m/sign-in"});return(s,e)=>{const W=X;return h(),w("div",te,[t("div",se,[t("div",oe,[t("img",{src:`/brands/${o(P)}/logo.svg?v=2`,alt:"hub",class:"h-10 w-auto mb-2"},null,8,ne),t("p",re,d(o(C)===1?"Create your account":"Verify your email"),1)]),o(C)===1?(h(),w("form",{key:0,onSubmit:S(O,["prevent"]),class:"space-y-3"},[t("div",ae,[t("div",null,[e[8]||(e[8]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"First name",-1)),c(t("input",{"onUpdate:modelValue":e[0]||(e[0]=n=>p(x)?x.value=n:null),type:"text",autocomplete:"given-name",required:"",class:"w-full px-4 py-2.5 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-sm"},null,512),[[m,o(x)]])]),t("div",null,[e[9]||(e[9]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"Last name",-1)),c(t("input",{"onUpdate:modelValue":e[1]||(e[1]=n=>p(y)?y.value=n:null),type:"text",autocomplete:"family-name",required:"",class:"w-full px-4 py-2.5 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-sm"},null,512),[[m,o(y)]])])]),t("div",ie,[t("div",null,[e[10]||(e[10]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"Username",-1)),c(t("input",{"onUpdate:modelValue":e[2]||(e[2]=n=>p(f)?f.value=n:null),type:"text",autocomplete:"username",required:"",minlength:"3",maxlength:"32",placeholder:"e.g. budi-s",class:"w-full px-4 py-2.5 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-sm"},null,512),[[m,o(f)]])]),t("div",null,[e[11]||(e[11]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"Phone number",-1)),c(t("input",{"onUpdate:modelValue":e[3]||(e[3]=n=>p(k)?k.value=n:null),type:"tel",autocomplete:"tel",inputmode:"tel",required:"",placeholder:"08xxxxxxxxxx",class:"w-full px-4 py-2.5 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-sm"},null,512),[[m,o(k)]])])]),t("div",null,[e[12]||(e[12]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"Email",-1)),c(t("input",{"onUpdate:modelValue":e[4]||(e[4]=n=>p(l)?l.value=n:null),type:"email",autocomplete:"email",required:"",class:"w-full px-4 py-2.5 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-sm"},null,512),[[m,o(l)]])]),t("div",null,[e[13]||(e[13]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"Password",-1)),c(t("input",{"onUpdate:modelValue":e[5]||(e[5]=n=>p(b)?b.value=n:null),type:"password",autocomplete:"new-password",required:"",minlength:"8",placeholder:"Min. 8 characters",class:"w-full px-4 py-2.5 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-sm"},null,512),[[m,o(b)]])]),o(r)?(h(),w("p",le,d(o(r)),1)):U("",!0),t("button",{type:"submit",disabled:o(i)||!o(E),class:"w-full bg-primary text-on-primary font-bold py-2.5 rounded-lg hover:brightness-110 active:scale-[0.98] transition-[transform,filter] duration-150 disabled:opacity-50"},d(o(i)?"Sending code…":"Sign up"),9,ue)],32)):(h(),w("form",{key:1,onSubmit:S(A,["prevent"]),class:"space-y-4"},[t("p",de,[e[14]||(e[14]=_(" We sent a 6-digit code to ",-1)),t("strong",ce,d(o(l)),1),e[15]||(e[15]=_(". Enter it below to finish creating your account. ",-1))]),t("div",null,[e[16]||(e[16]=t("label",{class:"block text-xs font-bold uppercase tracking-widest text-outline mb-1"},"Verification code",-1)),c(t("input",{"onUpdate:modelValue":e[6]||(e[6]=n=>p(g)?g.value=n:null),type:"text",inputmode:"numeric",autocomplete:"one-time-code",pattern:"[0-9]{6}",maxlength:"6",required:"",placeholder:"······",class:"w-full px-4 py-3 bg-surface-container rounded-lg border border-outline-variant/40 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary text-center text-lg font-bold tracking-[0.35em]"},null,512),[[m,o(g)]])]),o(r)?(h(),w("p",me,d(o(r)),1)):U("",!0),t("button",{type:"submit",disabled:o(i),class:"w-full bg-primary text-on-primary font-bold py-2.5 rounded-lg hover:brightness-110 active:scale-[0.98] transition-[transform,filter] duration-150 disabled:opacity-50"},d(o(i)?"Verifying…":"Verify & sign in"),9,pe),t("div",fe,[t("button",{type:"button",onClick:e[7]||(e[7]=n=>{C.value=1,g.value=""}),class:"text-on-surface-variant hover:text-primary"},"← Change email"),t("a",{href:"#",class:J(["text-primary font-semibold hover:underline",o(u)>0?"pointer-events-none opacity-50":""]),onClick:S(I,["prevent"])},d(o(u)>0?`resend in ${o(u)}s`:"resend code"),3)])],32)),t("p",be,[e[18]||(e[18]=_(" Already have an account? ",-1)),K(W,{to:o(H),class:"text-primary font-semibold hover:underline"},{default:Q(()=>[...e[17]||(e[17]=[_("Sign in",-1)])]),_:1},8,["to"])])])])}}});
1export{we 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.