1"use strict";(self.rspackChunknewapi_web=self.rspackChunknewapi_web||[]).push([[4066],{38525(e,s,a){a.d(s,{d:()=>l});var t=a(72361),r=a(6702),n=a(3088);function l(e){var s;let{t:a}=(0,r.Bd)(),{group:l,label:i,ratio:o,copyable:d=!1,showDot:c,...u}=e,m=l?.trim(),h="auto"===m,x=!m,p=h||x,j=(s={labelOverride:i,groupName:m,isAutoGroup:h,isEmptyGroup:x,t:a}).labelOverride?s.labelOverride:s.isEmptyGroup?s.t("User Group"):s.isAutoGroup?s.t("Auto"):s.groupName??"";return(0,t.jsx)(n.Wh,{...u,copyable:d,label:j,showDot:c??(!p&&void 0),variant:p?"neutral":void 0,autoColor:p?void 0:m})}},21258(e,s,a){a.d(s,{C:()=>n});var t=a(72361),r=a(81204);function n(e){return(0,t.jsx)("span",{className:(0,r.cn)("text-muted-foreground inline-block font-mono tabular-nums",e.className),children:e.value})}},48144(e,s,a){a.d(s,{DG:()=>m,OX:()=>r,eW:()=>u,f:()=>x,gY:()=>c,l7:()=>d,oV:()=>i,qL:()=>o,qT:()=>n,td:()=>l,zE:()=>h});var t=a(64577);async function r(){return(await t.FH.get("/api/subscription/admin/plans")).data}async function n(e){return(await t.FH.post("/api/subscription/admin/plans",e)).data}async function l(e,s){return(await t.FH.put(`/api/subscription/admin/plans/${e}`,s)).data}async function i(e,s){return(await t.FH.patch(`/api/subscription/admin/plans/${e}`,{enabled:s})).data}async function o(e){return(await t.FH.get(`/api/subscription/admin/users/${e}/subscriptions`)).data}async function d(e,s){return(await t.FH.post(`/api/subscription/admin/users/${e}/subscriptions`,s)).data}async function c(e){return(await t.FH.post(`/api/subscription/admin/user_subscriptions/${e}/invalidate`)).data}async function u(e){return(await t.FH.delete(`/api/subscription/admin/user_subscriptions/${e}`)).data}async function m(e){return(await t.FH.post("/api/option/waffo-pancake/subscription-product",e)).data}async function h(){return(await t.FH.post("/api/option/waffo-pancake/subscription-product-options")).data}async function x(){return(await t.FH.get("/api/group")).data}},78930(e,s,a){a.d(s,{sX:()=>u,Hc:()=>h,a3:()=>r,ak:()=>n,Ey:()=>l,vD:()=>c,jy:()=>m});var t=a(37936);function r(e,s){let a=e?.duration_unit||"month",t=e?.duration_value||1,r={year:s("years"),month:s("months"),day:s("days"),hour:s("hours"),custom:s("Custom (seconds)")};if("custom"===a){let a=e?.custom_seconds||0;return a>=86400?`${Math.floor(a/86400)} ${s("days")}`:a>=3600?`${Math.floor(a/3600)} ${s("hours")}`:`${a} ${s("seconds")}`}return`${t} ${r[a]||a}`}function n(e,s){let a=e?.quota_reset_period||"never";if("daily"===a)return s("Daily");if("weekly"===a)return s("Weekly");if("monthly"===a)return s("Monthly");if("custom"===a){let a=Number(e?.quota_reset_custom_seconds||0);return a>=86400?`${Math.floor(a/86400)} ${s("days")}`:a>=3600?`${Math.floor(a/3600)} ${s("hours")}`:a>=60?`${Math.floor(a/60)} ${s("minutes")}`:`${a} ${s("seconds")}`}return s("No Reset")}function l(e){return e?(0,t.A)(1e3*e).format("YYYY-MM-DD HH:mm:ss"):"-"}var i=a(25732),o=a(63859),d=a(3642);function c(e){return i.Ik({title:i.Yj().min(1,e("Please enter plan title")),subtitle:i.Yj().optional(),price_amount:o.ai().min(0,e("Please enter amount")),duration_unit:i.k5(["year","month","day","hour","custom"]),duration_value:o.ai().min(1),custom_seconds:o.ai().min(0).optional(),quota_reset_period:i.k5(["never","daily","weekly","monthly","custom"]),quota_reset_custom_seconds:o.ai().min(0).optional(),enabled:i.zM(),sort_order:o.ai(),max_purchase_per_user:o.ai().min(0),total_amount:o.ai().min(0),upgrade_group:i.Yj().optional(),stripe_price_id:i.Yj().optional(),creem_product_id:i.Yj().optional(),waffo_pancake_product_id:i.Yj().optional()})}let u={title:"",subtitle:"",price_amount:0,duration_unit:"month",duration_value:1,custom_seconds:0,quota_reset_period:"never",quota_reset_custom_seconds:0,enabled:!0,sort_order:0,max_purchase_per_user:0,total_amount:0,upgrade_group:"",stripe_price_id:"",creem_product_id:"",waffo_pancake_product_id:""};function m(e){return{title:e.title||"",subtitle:e.subtitle||"",price_amount:Number(e.price_amount||0),duration_unit:e.duration_unit||"month",duration_value:Number(e.duration_value||1),custom_seconds:Number(e.custom_seconds||0),quota_reset_period:e.quota_reset_period||"never",quota_reset_custom_seconds:Number(e.quota_reset_custom_seconds||0),enabled:!1!==e.enabled,sort_order:Number(e.sort_order||0),max_purchase_per_user:Number(e.max_purchase_per_user||0),total_amount:(0,d.Sh)(Number(e.total_amount||0)),upgrade_group:e.upgrade_group||"",stripe_price_id:e.stripe_price_id||"",creem_product_id:e.creem_product_id||"",waffo_pancake_product_id:e.waffo_pancake_product_id||""}}function h(e){return{plan:{...e,price_amount:Number(e.price_amount||0),currency:"USD",duration_value:Number(e.duration_value||0),custom_seconds:Number(e.custom_seconds||0),quota_reset_period:e.quota_reset_period||"never",quota_reset_custom_seconds:"custom"===e.quota_reset_period?Number(e.quota_reset_custom_seconds||0):0,sort_order:Number(e.sort_order||0),max_purchase_per_user:Number(e.max_purchase_per_user||0),total_amount:(0,d.dD)(Number(e.total_amount||0)),upgrade_group:e.upgrade_group||""}}}},32094(e,s,a){a.d(s,{OP:()=>y,S$:()=>x,SO:()=>f,TK:()=>o,UL:()=>m,XD:()=>j,Xw:()=>u,ZC:()=>c,f:()=>p,hG:()=>d,kg:()=>i,lo:()=>r,tg:()=>h,wz:()=>l,x5:()=>n,zm:()=>g});var t=a(64577);async function r(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{p:s=1,page_size:a=10}=e;return(await t.FH.get(`/api/user/?p=${s}&page_size=${a}`)).data}async function n(e){let{keyword:s="",group:a="",role:r="",status:n="",p:l=1,page_size:i=10}=e,o=new URLSearchParams;return o.set("keyword",s),o.set("group",a),r&&o.set("role",r),n&&o.set("status",n),o.set("p",String(l)),o.set("page_size",String(i)),(await t.FH.get(`/api/user/search?${o.toString()}`)).data}async function l(e){return(await t.FH.get(`/api/user/${e}`)).data}async function i(e){return(await t.FH.post("/api/user/",e)).data}async function o(e){return(await t.FH.put("/api/user/",e)).data}async function d(e){return(await t.FH.delete(`/api/user/${e}/`)).data}async function c(e,s){return(await t.FH.post("/api/user/manage",{id:e,action:s})).data}async function u(e){return(await t.FH.post("/api/user/manage",e)).data}async function m(e,s){return(await t.FH.post("/api/user/tier",{user_id:e,tier:s})).data}async function h(e){return(await t.FH.delete(`/api/user/${e}/reset_passkey`)).data}async function x(e){return(await t.FH.delete(`/api/user/${e}/2fa`)).data}async function p(){return(await t.FH.get("/api/group/")).data}async function j(e){return(await t.FH.get(`/api/user/${e}
1/oauth/bindings`)).data}async function g(e,s){return(await t.FH.delete(`/api/user/${e}/bindings/${s}`)).data}async function y(e,s){return(await t.FH.delete(`/api/user/${e}/oauth/bindings/${s}`)).data}async function f(){return(await t.FH.get("/api/user/topup/overview")).data.data}},74028(e,s,a){a.d(s,{c:()=>r});var t=a(68413);function r(e){let{search:s,navigate:a,pagination:r,globalFilter:n,columnFilters:l=[]}=e,i=r?.pageKey??"page",o=r?.pageSizeKey??"pageSize",d=r?.defaultPage??1,c=r?.defaultPageSize??20,u=n?.key??"filter",m=n?.enabled??!0,h=n?.trim??!0,x=(0,t.useMemo)(()=>{let e=[];for(let a of l){let t=s[a.searchKey],r=a.deserialize??(e=>e);if("string"===a.type){let s=r(t)??"";"string"==typeof s&&""!==s.trim()&&e.push({id:a.columnId,value:s})}else{let s=r(t)??[];Array.isArray(s)&&s.length>0&&e.push({id:a.columnId,value:s})}}return e},[l,s]),[p,j]=(0,t.useState)(x);(0,t.useEffect)(()=>{j(x)},[s]);let g=(0,t.useMemo)(()=>{let e=s[i],a=s[o];return{pageIndex:Math.max(0,("number"==typeof e?e:d)-1),pageSize:"number"==typeof a?a:c}},[s,i,o,d,c]),[y,f]=(0,t.useState)(()=>{if(!m)return;let e=s[u];return"string"==typeof e?e:""}),b=m?e=>{let s="function"==typeof e?e(y??""):e,t=h?s.trim():s;f(t),a({search:e=>({...e,[i]:void 0,[u]:t||void 0})})}:void 0;return{globalFilter:m?y??"":void 0,onGlobalFilterChange:b,columnFilters:p,onColumnFiltersChange:e=>{let s="function"==typeof e?e(p):e;j(s);let t={};for(let e of l){let a=s.find(s=>s.id===e.columnId),r=e.serialize??(e=>e);if("string"===e.type){let s="string"==typeof a?.value?a.value:"";t[e.searchKey]=""!==s.trim()?r(s):void 0}else{let s=Array.isArray(a?.value)?a.value:[];t[e.searchKey]=s.length>0?r(s):void 0}}a({search:e=>({...e,[i]:void 0,...t})})},pagination:g,onPaginationChange:e=>{let s="function"==typeof e?e(g):e,t=s.pageIndex+1,r=s.pageSize;a({search:e=>({...e,[i]:t<=d?void 0:t,[o]:r})})},ensurePageInRange:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{resetTo:"first"},r=s[i],n="number"==typeof r?r:d;e>0&&n>e&&a({replace:!0,search:s=>({...s,[i]:"last"===t.resetTo?e:void 0})})}}}},42969(e,s,a){a.r(s),a.d(s,{component:()=>eC});var t=a(72361),r=a(6702),n=a(67267),l=a(68413),i=a(20598),o=a(18692),d=a(32094),c=a(61631);let u={1:{labelKey:"Enabled",variant:"success",value:1},2:{labelKey:"Disabled",variant:"neutral",value:2},DELETED:{labelKey:"Deleted",variant:"danger",value:-1}},m={1:{labelKey:"User",value:1,icon:c.KJW},10:{labelKey:"Admin",value:10,icon:c.zWC},100:{labelKey:"Root",value:100,icon:c.ekZ}},h="default",x=[{key:"github_id",label:"GitHub ID"},{key:"discord_id",label:"Discord ID"},{key:"oidc_id",label:"OIDC ID"},{key:"wechat_id",label:"WeChat ID"},{key:"email",label:"Email"},{key:"telegram_id",label:"Telegram ID"}],p="An unexpected error occurred",j={enable:"User enabled successfully",disable:"User disabled successfully",promote:"User promoted to admin successfully",demote:"User demoted to regular user successfully",delete:"User deleted successfully",add_quota:"Quota adjusted successfully"};var g=a(25732),y=a(3642);let f=g.Ik({username:g.Yj().min(1,"Username is required"),display_name:g.Yj().optional(),password:g.Yj().optional(),role:g.ai().optional(),quota_dollars:g.ai().min(0).optional(),group:g.Yj().optional(),remark:g.Yj().optional(),vendor_discounts:g.g1(g.Yj(),g.ai().min(0).max(1)).optional(),setting_raw:g.Yj().optional()}),b={username:"",display_name:"",password:"",role:1,quota_dollars:0,group:h,remark:"",vendor_discounts:{},setting_raw:""};function v(e){let s={};if(e.setting)try{s=JSON.parse(e.setting).vendor_discounts||{}}catch{s={}}return{username:e.username,display_name:e.display_name,password:"",role:e.role,quota_dollars:(0,y.Sh)(e.quota),group:e.group||h,remark:e.remark||"",vendor_discounts:s,setting_raw:e.setting||""}}var _=a(23554);let w=l.createContext(null);function N(e){let{children:s}=e,[a,r]=(0,_.Ay)(null),[n,i]=(0,l.useState)(null),[o,d]=(0,l.useState)(0);return(0,t.jsx)(w,{value:{open:a,setOpen:r,currentRow:n,setCurrentRow:i,refreshTrigger:o,triggerRefresh:()=>d(e=>e+1)},children:s})}let S=()=>{let e=l.useContext(w);if(!e)throw Error("useUsers has to be used within <UsersContext>");return e};function k(){let{t:e}=(0,r.Bd)(),{open:s,setOpen:a,currentRow:n,triggerRefresh:c}=S(),[u,m]=(0,l.useState)(!1),h=async()=>
1{if(n){m(!0);try{let s=await (0,d.hG)(n.id);s.success?(i.oR.success(e(j.delete)),a(null),c()):i.oR.error(s.message||e("Failed to delete user"))}catch(s){i.oR.error(e(p))}finally{m(!1)}}};return(0,t.jsx)(o.Lt,{open:"delete"===s,onOpenChange:e=>!e&&a(null),children:(0,t.jsxs)(o.EO,{children:[(0,t.jsxs)(o.wd,{children:[(0,t.jsx)(o.r7,{children:e("Are you sure?")}),(0,t.jsxs)(o.$v,{children:[e("This will permanently delete user")," ",(0,t.jsx)("span",{className:"font-semibold",children:n?.username}),e(". This action cannot be undone.")]})]}),(0,t.jsxs)(o.ck,{children:[(0,t.jsx)(o.Zr,{disabled:u,children:e("Cancel")}),(0,t.jsx)(o.Rx,{onClick:h,disabled:u,className:"bg-destructive text-destructive-foreground hover:bg-destructive/90",children:u?"Deleting...":"Delete"})]})]})})}var C=a(86832),I=a(48367),$=a(53540),F=a(52946),R=a(46775),D=a(97077),A=a(54023),q=a(61309),z=a(82243),H=a(10998),U=a(28769),T=a(5304),E=a(81204),M=a(1755);function O(e){let{t:s}=(0,r.Bd)(),[a,n]=(0,l.useState)("add"),[o,c]=(0,l.useState)(""),[u,m]=(0,l.useState)(""),[h,x]=(0,l.useState)(!1),{meta:p}=(0,F.cw)(),j=(0,F.yz)(),g="tokens"===p.kind,f=parseFloat(o)||0,b=(0,y.dD)(Math.abs(f)),v=async()=>{if((o||"override"===a)&&(!(b<=0)||"override"===a)){x(!0);try{let t="override"===a?(0,y.dD)(f):b,r=await (0,d.Xw)({id:e.userId,action:"add_quota",mode:a,value:"override"===a?t:Math.abs(t),remark:u.trim()||void 0});r.success?(i.oR.success(s("Quota adjusted successfully")),c(""),m(""),n("add"),e.onOpenChange(!1),e.onSuccess()):i.oR.error(r.message||s("Failed to adjust quota"))}catch(e){i.oR.error(e instanceof Error?e.message:s("Failed to adjust quota"))}finally{x(!1)}}},_=g?s("Enter amount in tokens"):s("Enter amount in {{currency}}",{currency:j});return(0,t.jsx)(M.lG,{open:e.open,onOpenChange:e.onOpenChange,children:(0,t.jsxs)(M.Cf,{children:[(0,t.jsxs)(M.c7,{children:[(0,t.jsx)(M.L3,{children:s("Adjust Quota")}),(0,t.jsx)(M.rr,{children:s("Select an operation mode and enter the amount")})]}),(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"text-muted-foreground text-sm",children:(()=>{let t=e.currentQuota;switch(a){case"add":return`${s("Current quota")}: ${(0,y.eN)(t)} +${(0,y.eN)(b)} = ${(0,y.eN)(t+b)}`;case"subtract":return`${s("Current quota")}: ${(0,y.eN)(t)} -${(0,y.eN)(b)} = ${(0,y.eN)(t-b)}`;case"override":{let e=(0,y.dD)(f);return`${s("Current quota")}: ${(0,y.eN)(t)} â ${(0,y.eN)(e)}`}default:return""}})()}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)(q.J,{children:s("Mode")}),(0,t.jsx)("div",{className:"flex gap-1",children:["add","subtract","override"].map(e=>(0,t.jsx)(R.$,{type:"button",variant:"outline",size:"sm",className:(0,E.cn)(a===e&&"bg-primary text-primary-foreground hover:bg-primary/90 hover:text-primary-foreground"),onClick:()=>{n(e),c("")},children:"add"===e?s("Add"):"subtract"===e?s("Subtract"):s("Override")},e))})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(q.J,{children:[s("Amount")," (",j,")"]}),(0,t.jsx)(A.p,{type:"number",step:g?1:1e-6,min:"override"===a?void 0:0,placeholder:_,value:o,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"===e.key&&v()}})]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsxs)(q.J,{children:[s("Remark"),(0,t.jsx)("span",{className:"text-muted-foreground ml-1 text-xs font-normal",children:s("(optional, visible to the user)")})]}),(0,t.jsx)(A.p,{maxLength:200,placeholder:s("e.g. compensation, refund, correction..."),value:u,onChange:e=>m(e.target.value),onKeyDown:e=>{"Enter"===e.key&&v()}})]})]}),(0,t.jsxs)(M.Es,{children:[(0,t.jsx)(R.$,{variant:"outline",onClick:()=>{c(""),m(""),n("add"),e.onOpenChange(!1)},children:s("Cancel")}),(0,t.jsx)(R.$,{onClick:v,disabled:h,children:h?s("Processing..."):s("Confirm")})]})]})})}let B=[{key:"openai",label:"OpenAI / GPT"},{key:"anthropic",label:"Anthropic / Claude"},{key:"gemini",label:"Google / Gemini"},{key:"deepseek",label:"DeepSeek"},{key:"glm",label:"æºè°± / GLM"},{key:"qwen",label:"éä¹åé® / Qwen"},{key:"kimi",label:"Kimi / Moonshot"},{key:"grok",label:"xAI / Grok"},{key:"minimax",label:"MiniMax"},{key:"doubao",label:"è±å
/ 峿¢¦"},{key:"multimodal",label:"夿¨¡æ"}];function K(e){let{open:s,onOpenChange:a,currentRow:n}=e,{t:o}=(0,r.Bd)(),u=!!n,{triggerRefresh:m}=S(),[h,j]=(0,l.useState)(!1),[g,_]=(0,l.useState)(!1),{data:w}=(0,$.I)({queryKey:["groups"],queryFn:d.f,staleTime:3e5}),N=w?.data||[],k=(0,C.mN)({resolver:(0,I.u)(f),defaultValues:b});(0,l.useEffect)(()=>{s&&u&&n?(0,d.wz)(n.id).then(e=>{e.success&&e.data&&k.reset(v(e.data))}):s&&!u&&k.reset(b)},[s,u,n,k]);let{meta:E}=(0,F.cw)(),M=(0,F.yz)(),K="tokens"===E.kind,P=k.watch("quota_dollars")||0,V=async e=>{if(!u){let s=e.password?.length||0;if(s<8||s>20)return void k.setError("password",{type:"manual",message:o("Password must be between 8 and 20 characters")})}j(!0);try{var s;let t,r=(s=n?.id,t={username:e.username,display_name:e.display_name||e.username,password:e.password||void 0},void 0===s?t.role=e.role||1:(t.group=e.group,t.remark=e.remark||void 0,t.id=s,t.setting=function(e,s){let a={};if(e)try{a=JSON.parse(e)}catch{a={}}let t={};for(let[e,a]of Object.entries(s||{}))"number"==typeof a&&a>=0&&a<=1&&(t[e]=a);return Object.keys(t).length>0?a.vendor_discounts=t:delete a.vendor_discounts,JSON.stringify(a)}(e.setting_raw,e.vendor_discounts)),t),l=u?await (0,d.TK)(r):await (0,d.kg)(r);l.success?(i.oR.success(u?o("User updated successfully"):o("User created successfully")),a(!1),m()):i.oR.error(l.message||(u?o("Failed to update user"):o("Failed to create user")))}catch(e){i.oR.error(o(p))}finally{j(!1)}},W=async()=>
1{if(!n)return;let e=await (0,d.wz)(n.id);e.success&&e.data&&k.reset(v(e.data)),m()};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(H.cj,{open:s,onOpenChange:e=>{a(e),e||k.reset()},children:(0,t.jsxs)(H.h,{className:(0,T.jW)("sm:max-w-[600px]"),children:[(0,t.jsxs)(H.Fm,{className:(0,T.Dt)(),children:[(0,t.jsxs)(H.qp,{children:[u?o("Update"):o("Create")," ",o("User")]}),(0,t.jsx)(H.Qs,{children:u?o("Update the user by providing necessary info."):o("Add a new user by providing necessary info.")})]}),(0,t.jsx)(D.lV,{...k,children:(0,t.jsxs)("form",{id:"user-form",onSubmit:k.handleSubmit(V),className:(0,T.e)(),children:[(0,t.jsxs)(T.y5,{children:[(0,t.jsx)("h3",{className:"text-sm font-medium",children:o("Basic Information")}),(0,t.jsx)(D.zB,{control:k.control,name:"username",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Username")}),(0,t.jsx)(D.MJ,{children:(0,t.jsx)(A.p,{...s,placeholder:o("Enter username"),disabled:u})}),(0,t.jsx)(D.C5,{})]})}}),!u&&(0,t.jsx)(D.zB,{control:k.control,name:"role",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Role")}),(0,t.jsxs)(z.l6,{items:[{value:"1",label:o("Common User")},{value:"10",label:o("Admin")}],onValueChange:e=>null!==e&&s.onChange(parseInt(e)),value:String(s.value),children:[(0,t.jsx)(D.MJ,{children:(0,t.jsx)(z.bq,{children:(0,t.jsx)(z.yv,{placeholder:o("Select a role")})})}),(0,t.jsx)(z.gC,{alignItemWithTrigger:!1,children:(0,t.jsxs)(z.s3,{children:[(0,t.jsx)(z.eb,{value:"1",children:o("Common User")}),(0,t.jsx)(z.eb,{value:"10",children:o("Admin")})]})})]}),(0,t.jsx)(D.Rr,{children:o("Set the user's role (cannot be Root)")}),(0,t.jsx)(D.C5,{})]})}}),(0,t.jsx)(D.zB,{control:k.control,name:"display_name",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Display Name")}),(0,t.jsx)(D.MJ,{children:(0,t.jsx)(A.p,{...s,placeholder:o("Enter display name")})}),(0,t.jsx)(D.Rr,{children:o("Leave empty to use username")}),(0,t.jsx)(D.C5,{})]})}}),(0,t.jsx)(D.zB,{control:k.control,name:"password",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Password")}),(0,t.jsx)(D.MJ,{children:(0,t.jsx)(A.p,{...s,type:"password",placeholder:u?o("Leave empty to keep unchanged"):o("Enter password (min 8 characters)")})}),(0,t.jsx)(D.C5,{})]})}})]}),u&&(0,t.jsxs)(T.y5,{children:[(0,t.jsx)("h3",{className:"text-sm font-medium",children:o("Group & Quota")}),(0,t.jsx)(D.zB,{control:k.control,name:"group",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Group")}),(0,t.jsxs)(z.l6,{items:[...N.map(e=>({value:e,label:e}))],onValueChange:s.onChange,value:s.value,children:[(0,t.jsx)(D.MJ,{children:(0,t.jsx)(z.bq,{children:(0,t.jsx)(z.yv,{placeholder:o("Select a group")})})}),(0,t.jsx)(z.gC,{alignItemWithTrigger:!1,children:(0,t.jsx)(z.s3,{children:N.map(e=>(0,t.jsx)(z.eb,{value:e,children:e},e))})})]}),(0,t.jsx)(D.C5,{})]})}}),(0,t.jsx)(D.zB,{control:k.control,name:"quota_dollars",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Remaining Quota ({{currency}})",{currency:M})}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(D.MJ,{children:(0,t.jsx)(A.p,{value:K?String(s.value||0):(s.value||0).toFixed(6),readOnly:!0,className:"flex-1"})}),(0,t.jsxs)(R.$,{type:"button",variant:"outline",onClick:()=>_(!0),children:[(0,t.jsx)(c.gHP,{className:"mr-1 h-4 w-4"}),o("Adjust Quota")]})]}),(0,t.jsx)(D.Rr,{children:(0,y.eN)((0,y.dD)(s.value||0))}),(0,t.jsx)(D.C5,{})]})}}),(0,t.jsx)(D.zB,{control:k.control,name:"vendor_discounts",render:e=>{let{field:s}=e,a=s.value||{};return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Vendor Discounts")}),(0,t.jsx)("div",{className:"flex flex-col gap-2",children:B.map(e=>(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(q.J,{className:"w-40 shrink-0 text-xs",children:e.label}),(0,t.jsx)(A.p,{type:"number",step:"0.01",min:0,max:1,className:"flex-1",placeholder:o("No discount (Ã1)"),value:void 0===a[e.key]?"":String(a[e.key]),onChange:t=>{let r=t.target.value,n={...a};if(""===r)delete n[e.key];else{let s=Number(r);Number.isNaN(s)||(n[e.key]=s)}s.onChange(n)}})]},e.key))}),(0,t.jsx)(D.Rr,{children:o("Per-vendor discount 0-1 (0.8 = 20% off). Empty = no discount (Ã1). Replaces group ratio.")}),(0,t.jsx)(D.C5,{})]})}}),(0,t.jsx)(D.zB,{control:k.control,name:"remark",render:e=>{let{field:s}=e;return(0,t.jsxs)(D.eI,{children:[(0,t.jsx)(D.lR,{children:o("Remark")}),(0,t.jsx)(D.MJ,{children:(0,t.jsx)(U.T,{...s,placeholder:o("Admin notes (only visible to admins)"),rows:3})}),(0,t.jsx)(D.C5,{})]})}})]}),u&&(0,t.jsxs)(T.y5,{children:[(0,t.jsx)("h3",{className:"text-sm font-medium",children:o("Binding Information")}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:o("Third-party account bindings (read-only, managed by user in profile settings)")}),(0,t.jsx)("div",{className:"flex flex-col gap-3",children:x.map(e=>{let{key:s,label:a}=e;return(0,t.jsxs)("div",{children:[(0,t.jsx)(q.J,{className:"text-muted-foreground text-xs",children:o(a)}),(0,t.jsx)(A.p,{value:n?.[s]||"-",disabled:!0,className:"mt-1"})]},s)})})]})]})}),(0,t.jsxs)(H.XW,{className:(0,T.Jx)(),children:[(0,t.jsx)(H.kN,{render:(0,t.jsx)(R.$,{variant:"outline"}),children:o("Close")}),(0,t.jsx)(R.$,{form:"user-form",type:"submit",disabled:h,children:h?o("Saving..."):o("Save changes")}
1)]})]})}),n&&(0,t.jsx)(O,{open:g,onOpenChange:_,userId:n.id,currentQuota:(0,y.dD)(P||0),onSuccess:W})]})}function P(){let{t:e}=(0,r.Bd)(),{setOpen:s,setCurrentRow:a}=S();return(0,t.jsx)("div",{className:"flex gap-2",children:(0,t.jsxs)(R.$,{size:"sm",onClick:()=>{a(null),s("create")},children:[(0,t.jsx)(c.FWt,{className:"h-4 w-4"}),e("Add User")]})})}var V=a(2718),W=a(55581),L=a(3521),Z=a(11564),G=a(74028),J=a(58254);function Y(e){let{table:s}=e;return(0,t.jsx)(J.Of,{table:s,entityName:"user",children:(0,t.jsx)(t.Fragment,{})})}var Q=a(33120),X=a(59958),ee=a(34126),es=a(38525),ea=a(48196);function et(e){let{children:s,className:a="",contentClassName:r=""}=e,n=(0,l.useRef)(null),[i,o]=(0,l.useState)(!1);return((0,l.useEffect)(()=>{er(n.current)?o(!0):o(!1)},[]),i)?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"hidden sm:block",children:(0,t.jsx)(ee.Bc,{delay:0,children:(0,t.jsxs)(ee.m_,{children:[(0,t.jsx)(ee.k$,{render:(0,t.jsx)("div",{ref:n,className:(0,E.cn)("truncate",a)}),children:s}),(0,t.jsx)(ee.ZI,{children:(0,t.jsx)("p",{className:r,children:s})})]})})}),(0,t.jsx)("div",{className:"sm:hidden",children:(0,t.jsxs)(ea.AM,{children:[(0,t.jsx)(ea.Wv,{render:(0,t.jsx)("div",{ref:n,className:(0,E.cn)("truncate",a)}),children:s}),(0,t.jsx)(ea.hl,{className:(0,E.cn)("w-fit",r),children:(0,t.jsx)("p",{children:s})})]})})]}):(0,t.jsx)("div",{ref:n,className:(0,E.cn)("truncate",a),children:s})}let er=e=>!!e&&(e.offsetHeight<e.scrollHeight||e.offsetWidth<e.scrollWidth);var en=a(3088),el=a(21258),ei=a(43631),eo=a(24993),ed=a(32999),ec=a(48144),eu=a(78930);function em(e){let s=Date.now()/1e3,a=(e.sub.end_time||0)>0&&e.sub.end_time<s;return"active"!==e.sub.status||a?"cancelled"===e.sub.status?(0,t.jsx)(en.Wh,{label:e.t("Invalidated"),variant:"neutral",copyable:!1}):(0,t.jsx)(en.Wh,{label:e.t("Expired"),variant:"neutral",copyable:!1}):(0,t.jsx)(en.Wh,{label:e.t("Active"),variant:"success",copyable:!1})}function eh(e){let{t:s}=(0,r.Bd)(),[a,n]=(0,l.useState)(!1),[o,d]=(0,l.useState)(!1),[u,m]=(0,l.useState)([]),[h,x]=(0,l.useState)([]),[p,j]=(0,l.useState)(""),[g,y]=(0,l.useState)(null),f=(0,l.useMemo)(()=>{let e=new Map;return u.forEach(s=>{s.plan.id&&e.set(s.plan.id,s.plan.title||`#${s.plan.id}`)}),e},[u]),b=(0,l.useCallback)(async()=>{if(e.user?.id){n(!0);try{let[s,a]=await Promise.all([(0,ec.OX)(),(0,ec.qL)(e.user.id)]);s.success&&m(s.data||[]),a.success&&x(a.data||[])}catch{i.oR.error(s("Loading failed"))}finally{n(!1)}}},[e.user?.id,s]);(0,l.useEffect)(()=>{e.open&&e.user?.id&&(j(""),b())},[e.open,e.user?.id,b]);let v=async()=>{if(!e.user?.id||!p)return void i.oR.error(s("Please select a subscription plan"));d(!0);try{let a=await (0,ec.l7)(e.user.id,{plan_id:Number(p)});a.success&&(i.oR.success(a.data?.message||s("Added successfully")),j(""),await b(),e.onSuccess?.())}catch{i.oR.error(s("Request failed"))}finally{d(!1)}},_=async()=>{if(g)try{if("invalidate"===g.type){let a=await (0,ec.gY)(g.subId);a.success&&(i.oR.success(a.data?.message||s("Has been invalidated")),await b(),e.onSuccess?.())}else(await (0,ec.eW)(g.subId)).success&&(i.oR.success(s("Deleted")),await b(),e.onSuccess?.())}catch{i.oR.error(s("Operation failed"))}finally{y(null)}};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(H.cj,{open:e.open,onOpenChange:e.onOpenChange,children:(0,t.jsxs)(H.h,{className:(0,T.jW)("sm:max-w-2xl"),children:[(0,t.jsxs)(H.Fm,{className:(0,T.Dt)(),children:[(0,t.jsx)(H.qp,{children:s("User Subscription Management")}),(0,t.jsxs)(H.Qs,{children:[e.user?.username||"-"," (ID: ",e.user?.id||"-",")"]})]}),(0,t.jsxs)("div",{className:(0,T.e)(),children:[(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsxs)(z.l6,{items:[...u.map(e=>({value:String(e.plan.id),label:(0,t.jsxs)(t.Fragment,{children:[e.plan.title,"($",Number(e.plan.price_amount||0).toFixed(2),")"]})}))],value:p,onValueChange:e=>null!==e&&j(e),children:[(0,t.jsx)(z.bq,{className:"flex-1",children:(0,t.jsx)(z.yv,{placeholder:s("Select subscription plan")})}),(0,t.jsx)(z.gC,{alignItemWithTrigger:!1,children:(0,t.jsx)(z.s3,{children:u.map(e=>
1(0,t.jsxs)(z.eb,{value:String(e.plan.id),children:[e.plan.title," ($",Number(e.plan.price_amount||0).toFixed(2),")"]},e.plan.id))})})]}),(0,t.jsxs)(R.$,{onClick:v,disabled:o||!p,children:[(0,t.jsx)(c.FWt,{className:"mr-1 h-4 w-4"}),s("Add subscription")]})]}),(0,t.jsx)("div",{className:"rounded-md border",children:(0,t.jsxs)(ed.XI,{children:[(0,t.jsx)(ed.A0,{children:(0,t.jsxs)(ed.Hj,{children:[(0,t.jsx)(ed.nd,{children:"ID"}),(0,t.jsx)(ed.nd,{children:s("Plan")}),(0,t.jsx)(ed.nd,{children:s("Status")}),(0,t.jsx)(ed.nd,{children:s("Validity")}),(0,t.jsx)(ed.nd,{children:s("Total Quota")}),(0,t.jsx)(ed.nd,{className:"text-right",children:s("Actions")})]})}),(0,t.jsx)(ed.BF,{children:a?(0,t.jsx)(ed.Hj,{children:(0,t.jsx)(ed.nA,{colSpan:6,className:"py-8 text-center",children:s("Loading...")})}):0===h.length?(0,t.jsx)(ed.Hj,{children:(0,t.jsx)(ed.nA,{colSpan:6,className:"text-muted-foreground py-8 text-center",children:s("No subscription records")})}):h.map(e=>{let a=e.subscription,r=Date.now()/1e3,n=(a.end_time||0)>0&&a.end_time<r,l="active"===a.status&&!n,i=Number(a.amount_total||0),o=Number(a.amount_used||0);return(0,t.jsxs)(ed.Hj,{children:[(0,t.jsx)(ed.nA,{children:(0,t.jsx)(el.C,{value:a.id})}),(0,t.jsx)(ed.nA,{children:(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-medium",children:f.get(a.plan_id)||`#${a.plan_id}`}),(0,t.jsxs)("div",{className:"text-muted-foreground text-sm",children:[s("Source"),": ",a.source||"-"]})]})}),(0,t.jsx)(ed.nA,{children:(0,t.jsx)(em,{sub:a,t:s})}),(0,t.jsx)(ed.nA,{children:(0,t.jsxs)("div",{className:"text-sm",children:[(0,t.jsxs)("div",{children:[s("Start"),": ",(0,eu.Ey)(a.start_time)]}),(0,t.jsxs)("div",{children:[s("End"),": ",(0,eu.Ey)(a.end_time)]})]})}),(0,t.jsx)(ed.nA,{children:i>0?`${o}/${i}`:s("Unlimited")}),(0,t.jsx)(ed.nA,{className:"text-right",children:(0,t.jsxs)("div",{className:"flex justify-end gap-1",children:[(0,t.jsx)(R.$,{size:"sm",variant:"outline",disabled:!l,onClick:()=>y({type:"invalidate",subId:a.id}),children:s("Invalidate")}),(0,t.jsx)(R.$,{size:"sm",variant:"destructive",onClick:()=>y({type:"delete",subId:a.id}),children:s("Delete")})]})})]},a.id)})})]})})]})]})}),g&&(0,t.jsx)(eo.T,{open:!0,onOpenChange:e=>!e&&y(null),title:"invalidate"===g.type?s("Confirm invalidate"):s("Confirm delete"),desc:"invalidate"===g.type?s("After invalidating, this subscription will be immediately deactivated. Historical records are not affected. Continue?"):s("Deleting will permanently remove this subscription record (including benefit details). Continue?"),handleConfirm:_,destructive:"delete"===g.type})]})}var ex=a(6433),ep=a(64577),ej=a(3676),eg=a(72690);let ey=[{key:"email",field:"email",label:"Email",icon:(0,t.jsx)(c.gE4,{className:"h-4 w-4"}),statusKey:null},{key:"github_id",field:"github_id",label:"GitHub",icon:(0,t.jsx)(ex.SrF,{className:"h-4 w-4"}),statusKey:"github_oauth"},{key:"discord_id",field:"discord_id",label:"Discord",icon:(0,t.jsx)(ex.Nxe,{className:"h-4 w-4"}),statusKey:"discord_oauth"},{key:"wechat_id",field:"wechat_id",label:"WeChat",icon:(0,t.jsx)(c.oFn,{className:"h-4 w-4"}),statusKey:"wechat_login"},{key:"oidc_id",field:"oidc_id",label:"OIDC",icon:(0,t.jsx)(c.qzq,{className:"h-4 w-4"}),statusKey:"oidc_enabled"},{key:"telegram_id",field:"telegram_id",label:"Telegram",icon:(0,t.jsx)(c.Vnp,{className:"h-4 w-4"}),statusKey:"telegram_oauth"},{key:"linux_do_id",field:"linux_do_id",label:"LinuxDO",icon:(0,t.jsx)(c.qzq,{className:"h-4 w-4"}),statusKey:"linuxdo_oauth"}];function ef(e){return e.iconUrl?(0,t.jsx)("img",{src:e.iconUrl,alt:"",className:"h-4 w-4 rounded-sm object-contain",onError:e=>{e.currentTarget.style.display="none"}}):(0,t.jsx)(c.vvC,{className:"h-4 w-4"})}function eb(e){let{t:s}=(0,r.Bd)(),[a,n]=(0,l.useState)(null),[o,u]=(0,l.useState)([]),[m,h]=(0,l.useState)({}),[x,p]=(0,l.useState)(!1),[j,g]=(0,l.useState)(!0),[y,f]=(0,l.useState)(null),[b,v]=(0,l.useState)(!1),_=(0,l.useCallback)(async()=>{if(e.userId){p(!0);try{let[s,a,t]=await Promise.all([(0,d.wz)(e.userId),(0,d.XD)(e.userId).catch(()=>({success:!1,data:[]})),ep.FH.get("/api/status").then(e=>e.data).catch(()=>({success:!1,data:{}}))]);s.success&&s.data&&n(s.data),a.success&&a.data&&u(a.data),t.success&&t.data&&h(t.data)}catch{i.oR.error(s("Failed to load"))}finally{p(!1)}}},[e.userId,s]);(0,l.useEffect)(()=>{e.open&&e.userId?(g(!0),_()):(n(null),u([]),h({}))},[e.open,e.userId,_]);let w=(0,l.useMemo)(()=>{let e=[];for(let s of ey){let t=a?String(a[s.field]||""):"",r=!!t,n=null==s.statusKey||!!m[s.statusKey];e.push({key:s.key,label:s.label,icon:s.icon,value:r?t:"",type:"builtin",isBound:r,isEnabled:n})}let s=new Map(o.map(e=>[String(e.provider_id),e])),r=m.custom_oauth_providers||[],n=new Set;for(let a of r){n.add(String(a.id));let r=s.get(String(a.id));e.push({key:`oauth_${a.id}`,label:a.name||a.id,icon:(0,t.jsx)(ef,{iconUrl:a.icon}),value:r?.external_id||"",type:"custom",providerId:String(a.id),isBound:!!r,isEnabled:!0})}for(let s of o)n.has(String(s.provider_id))||e.push({key:`oauth_${s.provider_id}`,label:s.provider_name||s.provider_id,icon:(0,t.jsx)(c.vvC,{className:"h-4 w-4"}),value:s.external_id||"-",type:"custom",providerId:String(s.provider_id),isBound:!0,isEnabled:!1});return e},[a,o,m]),N=j?w.filter(e=>e.isBound):w,S=w.filter(e=>e.isBound).length,k=async()=>
1{if(y&&e.userId){v(!0);try{let a;"builtin"===y.type?a=await (0,d.zm)(e.userId,y.key):y.providerId&&(a=await (0,d.OP)(e.userId,y.providerId)),a?.success?(i.oR.success(s("Unbound {{provider}}",{provider:y.label})),await _(),e.onUnbindSuccess?.()):i.oR.error(a?.message||s("Unbind failed"))}catch{i.oR.error(s("Unbind failed"))}finally{v(!1),f(null)}}};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(M.lG,{open:e.open,onOpenChange:e.onOpenChange,children:(0,t.jsxs)(M.Cf,{className:"sm:max-w-lg",children:[(0,t.jsxs)(M.c7,{children:[(0,t.jsxs)(M.L3,{className:"flex items-center gap-2",children:[(0,t.jsx)(c.vvC,{className:"h-5 w-5"}),s("Account Binding Management")]}),(0,t.jsx)(M.rr,{className:"sr-only",children:s("Manage account bindings for this user")})]}),x?(0,t.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,t.jsx)(c.krw,{className:"text-muted-foreground h-6 w-6 animate-spin"})}):(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[a&&(0,t.jsxs)("p",{className:"text-muted-foreground text-sm",children:[a.username," (ID: ",a.id,")"]}),(0,t.jsx)(ee.Bc,{children:(0,t.jsxs)(ee.m_,{children:[(0,t.jsxs)(ee.k$,{render:(0,t.jsx)(R.$,{variant:"ghost",size:"sm",className:"h-7 gap-1.5 px-2 text-xs",onClick:()=>g(e=>!e)}),children:[j?(0,t.jsx)(c.kU3,{className:"h-3.5 w-3.5"}):(0,t.jsx)(c.X_F,{className:"h-3.5 w-3.5"}),j?s("Show All"):s("Bound Only")]}),(0,t.jsx)(ee.ZI,{children:j?s("Show all providers including unbound"):s("Show only bound providers")})]})})]}),(0,t.jsx)(eg.w,{}),(0,t.jsx)(ej.F,{className:"max-h-[50vh]",children:0===N.length?(0,t.jsx)("p",{className:"text-muted-foreground py-4 text-center text-sm",children:j?s("This user has no bindings"):s("No providers available")}):(0,t.jsx)("div",{className:"grid grid-cols-1 gap-2 pr-3 lg:grid-cols-2",children:N.map(e=>(0,t.jsxs)("div",{className:`flex items-center justify-between rounded-md border px-3 py-2.5 ${!e.isBound?"opacity-50":""}`,children:[(0,t.jsxs)("div",{className:"flex min-w-0 items-center gap-2.5",children:[(0,t.jsx)("div",{className:"text-muted-foreground shrink-0",children:e.icon}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("span",{className:"text-sm font-medium",children:e.label}),!e.isEnabled&&(0,t.jsx)(en.Wh,{variant:"neutral",label:s("Disabled"),copyable:!1,size:"sm"})]}),(0,t.jsx)("p",{className:"text-muted-foreground max-w-[140px] truncate text-xs",children:e.isBound?e.value:s("Not bound")})]})]}),e.isBound&&(0,t.jsx)(R.$,{variant:"ghost",size:"sm",className:"text-destructive hover:text-destructive h-7 w-7 shrink-0 p-0",onClick:()=>f(e),children:(0,t.jsx)(c.c2n,{className:"h-3.5 w-3.5"})})]},e.key))})}),(0,t.jsxs)("p",{className:"text-muted-foreground text-xs",children:[s("Bound"),": ",S," / ",w.length]})]})]})}),(0,t.jsx)(eo.T,{open:!!y,onOpenChange:e=>!e&&f(null),title:s("Confirm Unbind"),desc:s("Are you sure you want to unbind {{provider}} for this user? The user will no longer be able to log in via this method.",{provider:y?.label||""}),confirmText:s("Confirm Unbind"),destructive:!0,handleConfirm:k,isLoading:b})]})}var ev=a(35770);function e_(e){let{t:s}=(0,r.Bd)(),a=(0,ev.BV)(e.user.setting),[n,o]=(0,l.useState)(a),[u,m]=(0,l.useState)(!1);(0,l.useEffect)(()=>{e.open&&o((0,ev.BV)(e.user.setting))},[e.open,e.user.setting]);let h=ev.qU.map(e=>({value:e,label:(0,ev.PN)(e,s)})),x=async()=>{m(!0);try{let a=await (0,d.UL)(e.user.id,n);a.success?(i.oR.success(s("Tier updated successfully")),e.onSuccess?.(),e.onOpenChange(!1)):i.oR.error(a.message||s("Update failed"))}catch{i.oR.error(s("Update failed"))}finally{m(!1)}};return(0,t.jsx)(M.lG,{open:e.open,onOpenChange:e.onOpenChange,children:(0,t.jsxs)(M.Cf,{className:"sm:max-w-sm",children:[(0,t.jsxs)(M.c7,{children:[(0,t.jsxs)(M.L3,{className:"flex items-center gap-2",children:[(0,t.jsx)(c.QFT,{className:"h-5 w-5"}),s("User Tier")]}),(0,t.jsx)(M.rr,{children:s("Set the tier for {{username}}",{username:e.user.username})})]}),(0,t.jsxs)(z.l6,{items:h,value:n,onValueChange:e=>null!==e&&o(e),children:[(0,t.jsx)(z.bq,{children:(0,t.jsx)(z.yv,{placeholder:s("Set user tier")})}),(0,t.jsx)(z.gC,{alignItemWithTrigger:!1,children:(0,t.jsx)(z.s3,{children:h.map(e=>(0,t.jsx)(z.eb,{value:e.value,children:e.label},e.value))})})]}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:s("Tier discounts are configured in Tier Management")}),(0,t.jsxs)(M.Es,{children:[(0,t.jsx)(R.$,{variant:"outline",onClick:()=>e.onOpenChange(!1),disabled:u,children:s("Cancel")}),(0,t.jsxs)(R.$,{onClick:x,disabled:u,children:[u&&(0,t.jsx)(c.krw,{className:"mr-2 h-4 w-4 animate-spin"}),s("Save")]})]})]})})}function ew(e){let{row:s}=e,{t:a}=(0,r.Bd)(),n=s.original,{setOpen:o,setCurrentRow:u,triggerRefresh:m}=S(),[h,x]=(0,l.useState)(!1),[g,y]=(0,l.useState)(!1),[f,b]=(0,l.useState)(!1),[v,_]=(0,l.useState)(!1),[w,N]=(0,l.useState)(!1),k=async e=>{try{let s=await (0,d.ZC)(n.id,e);s.success?(i.oR.success(a(j[e])),m()):i.oR.error(s.message||a("Failed to {{action}} user",{action:e}))}catch(e){i.oR.error(a(p))}},C=async()=>{try{let e=await (0,d.tg)(n.id);e.success?(i.oR.success(a("Passkey reset successfully")),m()):i.oR.error(e.message||a("Failed to reset Passkey"))}catch(e){i.oR.error(a(p))}finally{x(!1)}},I=async()=>{try{let e=await (0,d.S$)(n.id);e.success?(i.oR.success(a("Two-factor authentication reset")),m()):i.oR.error(e.message||a("Failed to reset 2FA"))}catch(e){i.oR.error(a(p))}finally{y(!1)}},$=2===n.status,F=n.role>=10,D=100===n.role;return null!=n.DeletedAt?null:(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(ei.rI,{children:[(0,t.jsxs)(ei.ty,{render:(0,t.jsx)(R.$,{variant:"ghost",className:"data-popup-open:bg-muted flex h-8 w-8 p-0"}),children:[(0,t.jsx)(c.a4,{className:"h-4 w-4"}),(0,t.jsx)("span",{className:"sr-only",children:a("Open menu")})]}),(0,t.jsxs)(ei.SQ,{align:"end",className:"w-[180px]",children:[(0,t.jsxs)(ei._2,{onClick:()=>{u(n),o("update")},children:[a("Edit"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.gHP,{size:16})})]}),(0,t.jsx)(ei.mB,{}),$?(0,t.jsxs)(ei._2,{onClick:()=>
1k("enable"),children:[a("Enable"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.aJd,{size:16})})]}):(0,t.jsxs)(ei._2,{onClick:()=>k("disable"),disabled:D,children:[a("Disable"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.$o3,{size:16})})]}),F&&!D&&(0,t.jsxs)(ei._2,{onClick:()=>k("demote"),children:[a("Demote"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.yd$,{size:16})})]}),!F&&(0,t.jsxs)(ei._2,{onClick:()=>k("promote"),children:[a("Promote"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.DoI,{size:16})})]}),(0,t.jsxs)(ei._2,{onSelect:e=>{e.preventDefault(),b(!0)},children:[a("Manage Bindings"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.vvC,{size:16})})]}),(0,t.jsxs)(ei._2,{onSelect:e=>{e.preventDefault(),_(!0)},children:[a("Manage Subscriptions"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.y5g,{size:16})})]}),(0,t.jsxs)(ei._2,{onSelect:e=>{e.preventDefault(),N(!0)},children:[a("User Tier"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.QFT,{size:16})})]}),(0,t.jsx)(ei.mB,{}),(0,t.jsxs)(ei._2,{onSelect:e=>{e.preventDefault(),x(!0)},disabled:D,children:[a("Reset Passkey"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.kVM,{size:16})})]}),(0,t.jsxs)(ei._2,{onSelect:e=>{e.preventDefault(),y(!0)},disabled:D,children:[a("Reset 2FA"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.yZn,{size:16})})]}),(0,t.jsx)(ei.mB,{}),(0,t.jsxs)(ei._2,{onClick:()=>{u(n),o("delete")},className:"text-destructive focus:text-destructive",disabled:D,children:[a("Delete"),(0,t.jsx)(ei.V0,{children:(0,t.jsx)(c.TBR,{size:16})})]})]})]}),(0,t.jsx)(eo.T,{open:h,onOpenChange:x,title:a("Reset Passkey"),desc:`Reset Passkey for ${n.username}? The user will need to register a new Passkey before using passwordless login.`,confirmText:"Reset Passkey",handleConfirm:C}),(0,t.jsx)(eo.T,{open:g,onOpenChange:y,title:a("Reset Two-Factor Authentication"),desc:`Reset 2FA for ${n.username}? The user must set up 2FA again to continue using it.`,confirmText:"Reset 2FA",handleConfirm:I}),(0,t.jsx)(eb,{open:f,onOpenChange:b,userId:n.id,onUnbindSuccess:m}),(0,t.jsx)(eh,{open:v,onOpenChange:_,user:{id:n.id,username:n.username},onSuccess:m}),(0,t.jsx)(e_,{open:w,onOpenChange:N,user:{id:n.id,username:n.username,setting:n.setting},onSuccess:m})]})}let eN=(0,V.GY)("/_authenticated/users/");function eS(){let{t:e}=(0,r.Bd)(),s=function(){let{t:e}=(0,r.Bd)();return[{id:"select",header:e=>{let{table:s}=e;return(0,t.jsx)(Q.S,{checked:s.getIsAllPageRowsSelected(),indeterminate:s.getIsSomePageRowsSelected(),onCheckedChange:e=>s.toggleAllPageRowsSelected(!!e),"aria-label":"Select all",className:"translate-y-[2px]"})},cell:e=>{let{row:s}=e;return(0,t.jsx)(Q.S,{checked:s.getIsSelected(),onCheckedChange:e=>s.toggleSelected(!!e),"aria-label":"Select row",className:"translate-y-[2px]"})},enableSorting:!1,enableHiding:!1,meta:{label:e("Select")}},{accessorKey:"id",header:e=>{let{column:s}=e;return(0,t.jsx)(J.wZ,{column:s,title:"ID"})},cell:e=>{let{row:s}=e;return(0,t.jsx)(el.C,{value:s.getValue("id"),className:"w-[60px]"})},meta:{label:e("ID"),mobileHidden:!0}},{accessorKey:"username",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Username")})},cell:e=>{let{row:s}=e,a=s.getValue("username"),r=s.original.display_name,n=s.original.remark;return(0,t.jsxs)("div",{className:"flex min-w-[160px] flex-col gap-1",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(et,{className:"max-w-[140px] font-medium",children:a}),n&&(0,t.jsxs)(ee.m_,{children:[(0,t.jsx)(ee.k$,{render:(0,t.jsx)(en.Wh,{variant:"success",copyable:!1}),children:(0,t.jsx)(et,{className:"max-w-[80px]",children:n})}),(0,t.jsx)(ee.ZI,{children:(0,t.jsx)("p",{className:"text-xs",children:n})})]})]}),r&&r!==a&&(0,t.jsx)(et,{className:"text-muted-foreground max-w-[180px] text-xs",children:r})]})},enableHiding:!1,meta:{label:e("Username"),mobileTitle:!0}},{accessorKey:"status",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Status")})},cell:s=>{let{row:a}=s,r=a.original,n=r.request_count,l=null!=r.DeletedAt?u.DELETED:u[r.status];return l?(0,t.jsxs)(ee.m_,{children:[(0,t.jsx)(ee.k$,{render:(0,t.jsx)("div",{className:"cursor-help"}),children:(0,t.jsx)(en.Wh,{label:e(l.labelKey),variant:l.variant,copyable:!1})}),(0,t.jsx)(ee.ZI,{children:(0,t.jsxs)("p",{className:"text-xs",children:[e("Requests:")," ",n.toLocaleStr
1ing()]})})]}):null},filterFn:(e,s,a)=>a.includes(String(e.getValue(s))),enableSorting:!1,meta:{label:e("Status"),mobileBadge:!0}},{id:"quota",accessorKey:"quota",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Quota")})},cell:s=>{let{row:a}=s,r=a.original,n=r.used_quota,l=r.quota,i=n+l,o=i>0?l/i*100:0;return 0===i?(0,t.jsx)(en.Wh,{label:e("No Quota"),variant:"neutral",copyable:!1}):(0,t.jsxs)(ee.m_,{children:[(0,t.jsxs)(ee.k$,{render:(0,t.jsx)("div",{className:"w-[150px] cursor-help space-y-1"}),children:[(0,t.jsxs)("div",{className:"flex justify-between text-xs",children:[(0,t.jsx)("span",{className:"font-medium tabular-nums",children:(0,y.eN)(l)}),(0,t.jsx)("span",{className:"text-muted-foreground tabular-nums",children:(0,y.eN)(i)})]}),(0,t.jsx)(X.ke,{value:o,className:(0,E.cn)("h-1.5",o<=10?"[&_[data-slot=progress-indicator]]:bg-red-500":o<=30?"[&_[data-slot=progress-indicator]]:bg-amber-500":"[&_[data-slot=progress-indicator]]:bg-emerald-500")})]}),(0,t.jsx)(ee.ZI,{children:(0,t.jsxs)("div",{className:"space-y-1 text-xs",children:[(0,t.jsxs)("div",{children:[e("Used:")," ",(0,y.eN)(n)]}),(0,t.jsxs)("div",{children:[e("Remaining:")," ",(0,y.eN)(l)]}),(0,t.jsxs)("div",{children:[e("Total:")," ",(0,y.eN)(i)]}),(0,t.jsxs)("div",{children:[e("Percentage:")," ",o.toFixed(1),"%"]})]})})]})},meta:{label:e("Quota")}},{accessorKey:"group",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Group")})},cell:e=>{let{row:s}=e,a=s.getValue("group");return(0,t.jsx)(es.d,{group:a})},filterFn:(s,a,t)=>{let r=String(s.getValue(a)||e("User Group")).toLowerCase(),n=String(t).toLowerCase();return r.includes(n)},meta:{label:e("Group")}},{accessorKey:"role",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Role")})},cell:s=>{let{row:a}=s,r=m[a.getValue("role")];return r?(0,t.jsxs)("div",{className:"flex items-center gap-x-2",children:[r.icon&&(0,t.jsx)(r.icon,{size:16,className:"text-muted-foreground"}),(0,t.jsx)("span",{className:"text-sm",children:e(r.labelKey)})]}):null},filterFn:(e,s,a)=>a.includes(String(e.getValue(s))),enableSorting:!1,meta:{label:e("Role")}},{id:"invite_info",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Invite Info")})},cell:s=>{let{row:a}=s,r=a.original,n=r.aff_count||0,l=r.aff_history_quota||0,i=r.inviter_id||0;return(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsxs)(ee.m_,{children:[(0,t.jsx)(ee.k$,{render:(0,t.jsx)(en.Wh,{label:`${e("Invited")}: ${n}`,variant:"neutral",copyable:!1,className:"cursor-help"})}),(0,t.jsx)(ee.ZI,{children:(0,t.jsx)("p",{className:"text-xs",children:e("Number of users invited")})})]}),(0,t.jsxs)(ee.m_,{children:[(0,t.jsx)(ee.k$,{render:(0,t.jsx)(en.Wh,{label:`${e("Revenue")}: ${(0,y.eN)(l)}`,variant:"neutral",copyable:!1,className:"cursor-help"})}),(0,t.jsx)(ee.ZI,{children:(0,t.jsx)("p",{className:"text-xs",children:e("Total invitation revenue")})})]}),i>0&&(0,t.jsxs)(ee.m_,{children:[(0,t.jsx)(ee.k$,{render:(0,t.jsx)(en.Wh,{label:`${e("Inviter")}: ${i}`,variant:"neutral",copyable:!1,className:"cursor-help"})}),(0,t.jsx)(ee.ZI,{children:(0,t.jsxs)("p",{className:"text-xs",children:[e("Invited by user ID")," ",i]})})]}),0===i&&(0,t.jsx)(en.Wh,{label:e("No Inviter"),variant:"neutral",copyable:!1})]})},enableSorting:!1,meta:{label:e("Invite Info"),mobileHidden:!0}},{accessorKey:"created_at",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Created At")})},cell:e=>{let{row:s}=e,a=s.getValue("created_at");return(0,t.jsx)("span",{className:"text-muted-foreground text-sm",children:a?(0,y.Ey)(a):"-"})},meta:{label:e("Created At"),mobileHidden:!0}},{accessorKey:"last_login_at",header:s=>{let{column:a}=s;return(0,t.jsx)(J.wZ,{column:a,title:e("Last Login")})},cell:e=>{let{row:s}=e,a=s.getValue("last_login_at");return(0,t.jsx)("span",{className:"text-muted-foreground text-sm",children:a?(0,y.Ey)(a):"-"})},meta:{label:e("Last Login"),mobileHidden:!0}},{id:"actions",cell:e=>{let{row:s}=e;return(0,t.jsx)(ew,{row:s})},meta:{label:e("Actions")}}]}(),{refreshTrigger:a}=S(),n=(0,Z.Ub)("(max-width: 640px)"),[o,h]=(0,l.useState)({}),[x,p]=(0,l.useState)([]),[j,g]=(0,l.useState)({}),{globalFilter:f,onGlobalFilterChange:b,columnFilters:v,onColumnFiltersChange:_,pagination:w,onPaginationChange:N,ensurePageInRange:k}=(0,G.c)({search:eN.useSearch(),navigate:eN.useNavigate(),pagination:{defaultPage:1,defaultPageSize:n?10:20},globalFilter:{enabled:!0,key:"filter"}
1,columnFilters:[{columnId:"status",searchKey:"status",type:"array"},{columnId:"role",searchKey:"role",type:"array"},{columnId:"group",searchKey:"group",type:"string"}]}),C=v.find(e=>"status"===e.id)?.value??[],I=v.find(e=>"role"===e.id)?.value??[],F=v.find(e=>"group"===e.id)?.value??"",{data:R,isLoading:D,isFetching:A}=(0,$.I)({queryKey:["users",w.pageIndex+1,w.pageSize,f,C,I,F,a],queryFn:async()=>{let e=f?.trim(),s=C.length>0||I.length>0||!!F,a={p:w.pageIndex+1,page_size:w.pageSize},t=e||s?await (0,d.x5)({...a,keyword:f,status:C[0]??"",role:I[0]??"",group:F}):await (0,d.lo)(a);return t.success?{items:t.data?.items||[],total:t.data?.total||0}:(i.oR.error(t.message||`Failed to ${e?"search":"load"} users`),{items:[],total:0})},placeholderData:e=>e}),q=R?.items||[],z=(0,W.N4)({data:q,columns:s,state:{sorting:x,columnVisibility:j,rowSelection:o,columnFilters:v,globalFilter:f,pagination:w},enableRowSelection:!0,onRowSelectionChange:h,onSortingChange:p,onColumnVisibilityChange:g,globalFilterFn:(e,s,a)=>{let t=String(a).toLowerCase();return[e.getValue("username"),e.original.display_name,e.original.email].some(e=>String(e||"").toLowerCase().includes(t))},getCoreRowModel:(0,L.HT)(),getFilteredRowModel:(0,L.hM)(),getPaginationRowModel:(0,L.kW)(),getSortedRowModel:(0,L.h5)(),getFacetedRowModel:(0,L.kQ)(),getFacetedUniqueValues:(0,L.oS)(),onPaginationChange:N,onGlobalFilterChange:b,onColumnFiltersChange:_,manualPagination:!0,pageCount:Math.ceil((R?.total||0)/w.pageSize)}),H=z.getPageCount();return(0,l.useEffect)(()=>{k(H)},[H,k]),(0,t.jsx)(J.cx,{table:z,columns:s,isLoading:D,isFetching:A,emptyTitle:e("No Users Found"),emptyDescription:e("No users available. Try adjusting your search or filters."),skeletonKeyPrefix:"users-skeleton",toolbarProps:{searchPlaceholder:e("Filter by username, name or email..."),filters:[{columnId:"status",title:e("Status"),options:[{label:e("Enabled"),value:String(1)},{label:e("Disabled"),value:String(2)}],singleSelect:!0},{columnId:"role",title:e("Role"),options:[{label:e("User"),value:String(1),icon:c.KJW},{label:e("Admin"),value:String(10),icon:c.zWC},{label:e("Root"),value:String(100),icon:c.ekZ}],singleSelect:!0}]},getRowClassName:(e,s)=>{var a;let{isMobile:t}=s;return null==(a=e.original).DeletedAt&&2!==a.status?void 0:t?J.Z0:J.JM},bulkActions:(0,t.jsx)(Y,{table:z})})}function ek(){let{t:e}=(0,r.Bd)(),{open:s,setOpen:a,currentRow:l}=S();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.Ni,{children:[(0,t.jsx)(n.Ni.Title,{children:e("Users")}),(0,t.jsx)(n.Ni.Actions,{children:(0,t.jsx)(P,{})}),(0,t.jsx)(n.Ni.Content,{children:(0,t.jsx)(eS,{})})]}),(0,t.jsx)(K,{open:"create"===s||"update"===s,onOpenChange:e=>!e&&a(null),currentRow:"update"===s&&l||void 0}),(0,t.jsx)(k,{})]})}let eC=function(){return(0,t.jsx)(N,{children:(0,t.jsx)(ek,{})})}}}]);
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.