1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7639,9838],{5279:(e,t,a)=>{a.d(t,{As:()=>c,Jd:()=>l,Nu:()=>u});var n=a(7620),r=a(79748),s=a(48842),i=a(54183),o=a(83811),d=a(7639);function l(){let e=(0,o.nc)(o.mB);return{user:e,isAuthenticated:(0,o.nc)(o.Kc),loading:(0,o.nc)(o.Di)}}function c(){let e=(0,s.rd)(),{setLoading:t,setError:a,setInternalToken:r,setUserInfo:l,reset:c}=(0,o.nc)(),u=(0,o.nc)(o.nT),m=(0,o.nc)(o.Di),f=(0,n.useCallback)(async()=>{t(!0),a(null);try{await (0,i.G6)()}catch(e){a(e instanceof Error?e.message:"Failed to sign in with Google"),t(!1)}},[t,a]),h=(0,n.useCallback)(async(e,n)=>{t(!0),a(null);try{await (0,i.Ru)(e,n)}catch(e){a(e instanceof Error?e.message:"Failed to sign in"),t(!1)}},[t,a]),g=(0,n.useCallback)(async(e,n)=>{t(!0),a(null);try{await (0,i.bk)(e,n)}catch(e){a(e instanceof Error?e.message:"Failed to create account"),t(!1)}},[t,a]),v=(0,n.useCallback)(async e=>{let{messageId:t}=await (0,d.wG)(e);return t},[]),p=(0,n.useCallback)(async(e,a,n)=>{let s=await (0,d.ZY)(e,a,n);r(s.token,s.expiresIn);let i=await (0,d.me)(s.token);if(!i)throw r(null),t(!1),new d.vQ("Failed to load user profile after sign-in",void 0,"user_info_failed");l(i)},[t,r,l]);return{signInGoogle:f,signInEmail:h,signUpEmail:g,sendEmailOtpCode:v,verifyEmailOtpCode:p,signOut:(0,n.useCallback)(async()=>{t(!0);try{await (0,d.JQ)(),await (0,i.CI)(),c(),e.push("/login")}catch(e){a(e instanceof Error?e.message:"Failed to sign out")}},[e,c,t,a]),sendPasswordResetEmail:(0,n.useCallback)(async e=>{t(!0),a(null);try{return await (0,i.J1)(e),t(!1),!0}catch(e){return a(e instanceof Error?e.message:"Failed to send reset email"),t(!1),!1}},[t,a]),error:u,loading:m}}function u(){let e=(0,s.rd)(),t=(0,s.a8)(),a=(0,r.useSearchParams)(),{user:i,loading:o,isAuthenticated:d}=l();return(0,n.useEffect)(()=>{if(!o&&!d){let n=a.toString(),r=`${t}${n?`?${n}`:""}`;e.replace(`/login?redirect=${encodeURIComponent(r)}`)}},[o,d,e,t,a]),{user:i,loading:o}}},7639:(e,t,a)=>{a.d(t,{JQ:()=>l,ZY:()=>o,exchangeFirebaseToken:()=>s,me:()=>d,vQ:()=>r,wG:()=>i});let n={"Invalid verification code":"invalid_code","Failed to send verification code":"send_failed","Verification service error":"verify_service_error"};class r extends Error{constructor(e,t,a){super(e),this.statusCode=t,this.name="TokenExchangeError",this.code=a??n[e]}}async function s(e){try{let t=await fetch("/api/auth/exchange",{method:"POST",headers:{"Content-Type":"application/json","fb-token":`Bearer ${e}`}});if(!t.ok){let e=await t.text().catch(()=>"Unknown error");throw new r(`Token exchange failed: ${e}`,t.status)}let a=await t.json(),n=a.access_token||a.token;if(!n)throw new r("Invalid response: missing token");return{token:n,expiresIn:a.expires_in,isNewUser:a.is_new_user}}catch(e){if(e instanceof r)throw e;throw new r(`Token exchange failed: ${e instanceof Error?e.message:"Unknown error"}`)}}async function i(e){let t;try{t=await fetch("/api/auth/email-otp/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:e})})}catch(e){throw new r(`Failed to send code: ${e instanceof Error?e.message:"Unknown error"}`)}let a=await t.json().catch(()=>({}));if(!t.ok)throw new r(("string"==typeof a?.detail?a.detail:"string"==typeof a?.error?a.error:null)||"Failed to send code",t.status);let n=a?.message_id;if(!n||"string"!=typeof n)throw new r("Invalid response: missing message_id");return{messageId:n}}async function o(e,t,a){let n;try{n=await fetch("/api/auth/email-otp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message_id:e,verify_code:t,email:a})})}catch(e){throw new r(`Failed to verify code: ${e instanceof Error?e.message:"Unknown error"}`)}let s=await n.json().catch(()=>({}));if(!n.ok)throw new r(("string"==typeof s?.detail?s.detail:"string"==typeof s?.error?s.error:null)||"Verification failed",n.status);let i=s.access_token||s.token;if(!i)throw new r("Invalid response: missing token");return{token:i,expiresIn:s.expires_in,isNewUser:s.is_new_user}}async function d(e,t){try{let a={Authorization:`Bearer ${e}`};t&&t>Date.now()&&(a["x-token-expires-at-ms"]=String(t));let n=await fetch("/api/user/me",{method:"GET",headers:a});if(!n.ok)return console.error("Failed to fetch user info:",n.status),null;let r=await n.json();return{uid:r.uid,email:r.email||null,name:r.name||null,avatar:r.avatar||null,phoneNumber:r.phone_number||null}}catch(e){return console.error("Failed to fetch user info:",e),null}}async function l(){await fetch("/api/auth/logout",{method:"POST"})}},39174:(e,t,a)=>{a.d(t,{Q:()=>u});var n=a(54568),r=a(7620),s=a(47213),i=a(97380),o=a(97788),d=a(88353),l=a(48842);let c=[{value:"zh",label:"䏿"},{value:"en",label:"English"}];function u(){let e=(0,s.Ym)(),t=(0,l.rd)(),a=(0,l.a8)(),[u,m]=(0,r.useTransition)(),f=c.find(t=>t.value===e);return(0,n.jsxs)(d.rI,{children:[(0,n.jsx)(d.ty,{asChild:!0,children:(0,n.jsxs)(o.$,{variant:"ghost",size:"sm",disabled:u,children:[(0,n.jsx)(i.A,{className:"h-4 w-4 mr-1"}),f?.label]})}),(0,n.jsx)(d.SQ,{align:"end",children:c.map(r=>(0,n.jsx)(d._2,{onClick:()=>{var e;return e=r.value,void m(()=>{t.replace(a,{locale:e})})},className:e===r.value?"bg-accent":"",children:r.label},r.value))})]})}},48842:(e,t,a)=>{a.d(t,{N_:()=>s,Hm:()=>l,a8:()=>o,rd:()=>d});var n=a(25773);let r=(0,a(15289).A)({locales:["en","zh"],defaultLocale:"en",localePrefix:"always"}),{Link:s,redirect:i,usePathname:o,useRouter:d,getPathname:l}=(0,n.A)(r)},52991:(e,t,a)=>{a.d(t,{B:()=>f});var n=a(54568),r=a(7620),s=a(48842),i=a(33971),o=a(70452),d=a(46175),l=a(76710),c=a(97788),u=a(88353),m=a(5279);function f({user:e}){let{signOut:t}=(0,m.As)(),a=(0,i.c)("account.tabs"),h=(0,i.c)("console.header"),[g,v]=(0,r.useState)(!1),[p,x]=(0,r.useState)(!1),w=e.photoURL?.trim()||void 0,b=!!w,y=b&&g&&!p;return(0,n.jsxs)(u.rI,{children:[(0,n.jsx)(u.ty,{asChild:!0,children:(0,n.jsxs)(c.$,{variant:"ghost",className:"relative h-8 rounded-full px-2",children:[y?(0,n.jsx)("img",{src:w,alt:e.displayName??"User avatar",className:"h-8 w-8 rounded-full object-cover",onLoad:()=>v(!0),onError:()=>x(!0)}):(0,n.jsx)("span",{className:"text-sm font-medium",children:e.displayName??e.email??"User"}),b&&!g&&!p&&(0,n.jsx)("img",{src:w,alt:"",className:"hidden",onLoad:()=>v(!0),onError:()=>x(!0)})]})}),(0,n.jsxs)(u.SQ,{className:"w-56",align:"end",forceMount:!0,children:[(0,n.jsx)(u.lp,{className:"font-normal",children:(0,n.jsxs)("div",{className:"flex flex-col space-y-1",children:[(0,n.jsx)("p",{className:"text-sm font-medium leading-none",children:e.displayName??"User"}),(0,n.jsx)("p",{className:"text-xs leading-none text-muted-foreground",children:e.email})]})}),(0,n.jsx)(u.mB,{}),(0,n.jsx)(u._2,{asChild:!0,children:(0,n.jsxs)(s.N_,{href:"/account",className:"cursor-pointer",children:[(0,n.jsx)(o.A,{className:"mr-2 h-4 w-4"}),a("profile")]})}),(0,n.jsx)(u._2,{asChild:!0,children:(0,n.jsxs)(s.N_,{href:"/billing",className:"cursor-pointer",children:[(0,n.jsx)(d.A,{className:"mr-2 h-4 w-4"}),a("billing")]})}),(0,n.jsx)(u.mB,{}),(0,n.jsxs)(u._2,{className:"cursor-pointer text-destructive focus:text-destructive",onClick:t,children:[(0,n.jsx)(l.A,{className:"mr-2 h-4 w-4"}),h("signOut")]})]})]})}},88353:(e,t,a)=>{a.d(t,{SQ:()=>d,_2:()=>l,lp:()=>c,mB:()=>u,rI:()=>i,ty:()=>o});var n=a(54568);a(7620);var r=a(64356),s=a(17483);function i({...e}){return(0,n.jsx)(r.Root,{"data-slot":"dropdown-menu",...e})}function o({...e}){return(0,n.jsx)(r.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function d({className:e,sideOffset:t=4,...a}){return(0,n.jsx)(r.Portal,{children:(0,n.jsx)(r.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:(0,s.cn)("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
1de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...a})})}function l({className:e,inset:t,variant:a="default",...i}){return(0,n.jsx)(r.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":a,className:(0,s.cn)("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...i})}function c({className:e,inset:t,...a}){return(0,n.jsx)(r.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:(0,s.cn)("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...a})}function u({className:e,...t}){return(0,n.jsx)(r.Separator,{"data-slot":"dropdown-menu-separator",className:(0,s.cn)("bg-border -mx-1 my-1 h-px",e),...t})}},97788:(e,t,a)=>{a.d(t,{$:()=>d});var n=a(54568);a(7620);var r=a(91397),s=a(78347),i=a(17483);let o=(0,r.F)("inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-xs":"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function d({className:e,variant:t="default",size:a="default",asChild:r=!1,...l}){let c=r?s.bL:"button";return(0,n.jsx)(c,{"data-slot":"button","data-variant":t,"data-size":a,className:(0,i.cn)(o({variant:t,size:a,className:e})),...l})}}}]);
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.