1import{j as z,L as ke,r as Y,bm as dt,b5 as Q,ao as ce,d as J,A as O,b as j,o as p,w as P,l as c,m as f,h as R,q as m,t as u,f as t,x as w,aa as F,F as A,_ as X,p as ie,aD as mt,n as H,k as Ce,a1 as je,co as ye,dX as _e,I as ut,a9 as pt}from"./index-Ctdla73g.js";import{_ as ct}from"./SettingsFooter.vue_vue_type_script_setup_true_lang-oagAr_RU.js";import{_ as ae,u as yt}from"./SettingsFields.vue_vue_type_script_setup_true_lang-DLWF23H6.js";import{u as _t}from"./useUnsavedGuard-uRLPe2Bz.js";import{a as Pe,n as ft,s as gt,M as xe,i as bt,b as vt,c as xt}from"./rechargeBonus-B0ZH890K.js";import{b as ht,a as kt,e as Pt}from"./apiError-szRqMG5e.js";import{n as Ne}from"./paymentFlow-cys_N5rS.js";import{_ as se}from"./SettingsCard.vue_vue_type_script_setup_true_lang-BGHOVqm0.js";import{_ as I}from"./Label.vue_vue_type_script_setup_true_lang-D6NsLlI_.js";import{_ as G}from"./Switch.vue_vue_type_script_setup_true_lang-B-XspP6e.js";import{_ as ze}from"./index-ZdQrihZN.js";import{R as $t}from"./refresh-cw-BGZGUEb5.js";import{_ as re}from"./FormField.vue_vue_type_script_setup_true_lang-CvI0mBQ1.js";import{_ as Re}from"./NumberField.vue_vue_type_script_setup_true_lang-2Of1j8p1.js";import{_ as $e}from"./Textarea.vue_vue_type_script_setup_true_lang-CcHiPi-S.js";import{_ as St,a as wt,b as Vt,c as Ut,d as Ee}from"./SelectValue.vue_vue_type_script_setup_true_lang-B1z1Ukwx.js";import{T as Tt}from"./trash-2-BJoswCsw.js";import{P as Ct}from"./plus-CwP2JxkN.js";import{_ as Nt}from"./SvgUpload.vue_vue_type_script_setup_true_lang-C17u6zLQ.js";import{_ as Rt}from"./LocalizedTextField.vue_vue_type_script_setup_true_lang-CiuwTGbR.js";import{_ as Et}from"./DragSortList.vue_vue_type_script_setup_true_lang-Bsj6hg1j.js";import{_ as At}from"./FormDialog.vue_vue_type_script_setup_true_lang-BLsz7C73.js";import{P as Se,b as We,c as qe}from"./providerConfig-D_diwgIL.js";import"./useStepUp-DLiOWNe_.js";import"./TagInput.vue_vue_type_script_setup_true_lang-CpsyP7Vf.js";import"./Card.vue_vue_type_script_setup_true_lang-qXnS5Q3F.js";import"./CardHeader.vue_vue_type_script_setup_true_lang-D1l1d7Ag.js";import"./CardDescription.vue_vue_type_script_setup_true_lang-BzMnygBK.js";import"./CardTitle.vue_vue_type_script_setup_true_lang-CGNhLLaV.js";import"./useFormControl-__1yoZ0s.js";import"./VisuallyHiddenInput-CNqBhQVU.js";import"./usePrimitiveElement-BX6SajOK.js";import"./VisuallyHidden-CdYKjZEF.js";import"./chevron-down-A8JEIyVH.js";import"./Collection-DnN0Rg3V.js";import"./PopperContent-3_Z9zIjs.js";import"./useTypeahead-BmiCVlMO.js";import"./is-equal-B6923-1i.js";import"./image-CeUOdtXA.js";import"./upload-DKP_XuvM.js";const Kt=["payment_enabled","payment_product_name_prefix","payment_product_name_suffix","payment_min_amount","payment_max_amount","payment_daily_limit","payment_balance_recharge_multiplier","payment_subscription_usd_to_cny_rate","payment_recharge_fee_rate","payment_recharge_bonus_tiers","payment_recharge_bonus_mode","payment_recharge_bonus_notice","payment_order_timeout_minutes","payment_max_pending_orders","payment_load_balance_strategy","payment_cancel_rate_limit_enabled","payment_cancel_rate_limit_window_mode","payment_cancel_rate_limit_window","payment_cancel_rate_limit_unit","payment_cancel_rate_limit_max","payment_alipay_force_qrcode","payment_alipay_mobile_precreate_deep_link","payment_enabled_types","payment_help_image_url","payment_help_text"],Mt=["round-robin","least-amount"],Ot=["rolling","fixed"],Bt=["minute","hour","day"],It=["easypay","alipay","wxpay","stripe","airwallex","nowpayments"];function Ge(){return{payment_enabled:!1,payment_product_name_prefix:"",payment_product_name_suffix:"",payment_min_amount:0,payment_max_amount:0,payment_daily_limit:0,payment_balance_recharge_multiplier:1,payment_subscription_usd_to_cny_rate:0,payment_recharge_fee_rate:0,payment_recharge_bonus_tiers:[],payment_recharge_bonus_mode:"bonus",payment_recharge_bonus_notice:"",payment_order_timeout_minutes:30,payment_max_pending_orders:3,payment_load_balance_strategy:"round-robin",payment_cancel_rate_limit_enabled:!1,payment_cancel_rate_limit_window_mode:"rolling",payment_cancel_rate_limit_window:1,payment_cancel_rate_limit_unit:"day",payment_cancel_rate_limit_max:10,payment_alipay_force_qrcode:!1,payment_alipay_mobile_precreate_deep_link:!1,payment_enabled_types:[],payment_help_image_url:"",payment_help_text:""}}
1const K=(e,i)=>{const a=Number(e);return Number.isFinite(a)?a:i},ne=(e,i)=>{const a=Number(e);return Number.isFinite(a)&&a>0?a:i};function Dt(e){return{...Ge(),payment_enabled:e.payment_enabled??!1,payment_product_name_prefix:e.payment_product_name_prefix??"",payment_product_name_suffix:e.payment_product_name_suffix??"",payment_min_amount:K(e.payment_min_amount,0),payment_max_amount:K(e.payment_max_amount,0),payment_daily_limit:K(e.payment_daily_limit,0),payment_balance_recharge_multiplier:ne(e.payment_balance_recharge_multiplier,1),payment_subscription_usd_to_cny_rate:K(e.payment_subscription_usd_to_cny_rate,0),payment_recharge_fee_rate:K(e.payment_recharge_fee_rate,0),payment_recharge_bonus_tiers:ft(e.payment_recharge_bonus_tiers),payment_recharge_bonus_mode:Pe(e.payment_recharge_bonus_mode),payment_recharge_bonus_notice:e.payment_recharge_bonus_notice??"",payment_order_timeout_minutes:ne(e.payment_order_timeout_minutes,30),payment_max_pending_orders:ne(e.payment_max_pending_orders,3),payment_load_balance_strategy:e.payment_load_balance_strategy||"round-robin",payment_cancel_rate_limit_enabled:e.payment_cancel_rate_limit_enabled??!1,payment_cancel_rate_limit_window_mode:e.payment_cancel_rate_limit_window_mode||"rolling",payment_cancel_rate_limit_window:ne(e.payment_cancel_rate_limit_window,1),payment_cancel_rate_limit_unit:e.payment_cancel_rate_limit_unit||"day",payment_cancel_rate_limit_max:ne(e.payment_cancel_rate_limit_max,10),payment_alipay_force_qrcode:e.payment_alipay_force_qrcode??!1,payment_alipay_mobile_precreate_deep_link:e.payment_alipay_mobile_precreate_deep_link??!1,payment_enabled_types:[...e.payment_enabled_types??[]],payment_help_image_url:e.payment_help_image_url??"",payment_help_text:e.payment_help_text??""}}function Ht(e){return{payment_enabled:e.payment_enabled,payment_product_name_prefix:e.payment_product_name_prefix,payment_product_name_suffix:e.payment_product_name_suffix,payment_min_amount:K(e.payment_min_amount,0),payment_max_amount:K(e.payment_max_amount,0),payment_daily_limit:K(e.payment_daily_limit,0),payment_balance_recharge_multiplier:K(e.payment_balance_recharge_multiplier,1),payment_subscription_usd_to_cny_rate:K(e.payment_subscription_usd_to_cny_rate,0),payment_recharge_fee_rate:K(e.payment_recharge_fee_rate,0),payment_recharge_bonus_tiers:gt(e.payment_recharge_bonus_tiers),payment_recharge_bonus_mode:Pe(e.payment_recharge_bonus_mode),payment_recharge_bonus_notice:e.payment_recharge_bonus_notice,payment_order_timeout_minutes:K(e.payment_order_timeout_minutes,30),payment_max_pending_orders:K(e.payment_max_pending_orders,3),payment_load_balance_strategy:e.payment_load_balance_strategy,payment_cancel_rate_limit_enabled:e.payment_cancel_rate_limit_enabled,payment_cancel_rate_limit_window_mode:e.payment_cancel_rate_limit_window_mode,payment_cancel_rate_limit_window:K(e.payment_cancel_rate_limit_window,1),payment_cancel_rate_limit_unit:e.payment_cancel_rate_limit_unit,payment_cancel_rate_limit_max:K(e.payment_cancel_rate_limit_max,10),payment_alipay_force_qrcode:e.payment_alipay_force_qrcode,payment_alipay_mobile_precreate_deep_link:e.payment_alipay_mobile_precreate_deep_link,payment_enabled_types:[...e.payment_enabled_types],payment_help_image_url:e.payment_help_image_url,payment_help_text:e.payment_help_text}}function Lt(e,i){if(!i)return e;const{payment_subscription_usd_to_cny_rate:a,...l}=e;return l}function Ft(e,i){if(!e.payment_enabled)return[];const a=[],l=Number(e.payment_min_amount)||0,s=Number(e.payment_max_amount)||0;(l<0||s<0||Number(e.payment_daily_limit)<0)&&a.push(i("toknex.adminSettingsPayment.validation.negativeAmount")),l>0&&s>0&&s<l&&a.push(i("toknex.adminSettingsPayment.validation.maxBelowMin"));const o=Number(e.payment_recharge_fee_rate);(!Number.isFinite(o)||o<0||o>100)&&a.push(i("toknex.adminSettingsPayment.validation.feeRate"));const d=Number(e.payment_balance_recharge_multiplier);(!Number.isFinite(d)||d<.01)&&a.push(i("toknex.adminSettingsPayment.validation.multiplier"));const n=e.payment_recharge_bonus_tiers,h=Pe(e.payment_recharge_bonus_mode);return n.length>xe&&a.push(i("toknex.adminSettingsPayment.validation.bonusTierLimit")),e.payment_recharge_bonus_mode!=="bonus"&&e.payment_recharge_bonus_mode!=="discount"&&a.push(i("toknex.adminSettingsPayment.validation.bonusMode")),n.some(y=>!(y.min_amount===null&&y.bonus_percent===null)&&(!bt(y.min_amount)||!vt(y.bonus_percent,h)))&&a.push(i("toknex.adminSettingsPayment.validation.bonusTier")),n.some((y,b)=>xt(n,b))&&a.push(i("toknex.adminSettingsPayment.validation.bonusDuplicate")),Array.from(e.payment_recharge_bonus_notice).length>1e4&&a.push(i("toknex.adminSettingsPayment.validation.bonusNotice")),Number(e.payment_order_timeout_minutes)<1&&a.push(i("toknex.adminSettingsPayment.validation.orderTimeout")),Number(e.payment_max_pending_orders)<1&&a.push(i("toknex.adminSettingsPayment.validation.maxPending")),e.payment_enabled_types.length===0&&a.push(i("toknex.adminSettingsPayment.validation.noTypes")),e.payment_cancel_rate_limit_enabled&&(Number(e.payment_cancel_rate_limit_window)<1&&a.push(i("toknex.adminSettingsPayment.validation.cancelWindow")),Number(e.payment_cancel_rate_limit_max)<1&&a.push(i("toknex.adminSettingsPayment.validation.cancelMax"))),a}function Ae(e){if(!e.enabled)return[];
1const i=Array.isArray(e.supported_types)?e.supported_types:[],a=new Set,l=s=>{if(i.length===0){a.add(s);return}for(const o of i)Ne(o)===s&&a.add(s)};if(e.provider_key==="alipay")l("alipay");else if(e.provider_key==="wxpay")l("wxpay");else if(e.provider_key==="easypay")for(const s of i){const o=Ne(s);(o==="alipay"||o==="wxpay")&&a.add(o)}return Array.from(a)}function fe(e,i){const a=Ae(e);if(a.length===0)return null;for(const l of i){if(l.id===e.id||!l.enabled)continue;const s=Ae(l),o=a.find(d=>s.includes(d));if(o)return{method:o,conflicting:l}}return null}const Yt="toknex.adminSettingsPayment.errors",jt="toknex.common.state.error";function zt(){const{t:e}=z(),i=ke(),a=Y([]),l=Y(!1),s=Y(!1),o=Y(!1),d=dt(null);function n(x){i.showError(ht(x,e,Yt,e(jt)))}function h(x){return kt(x)==="PENDING_ORDERS"}async function y(){l.value=!0;try{const x=await Q.payment.getProviders();a.value=((x==null?void 0:x.data)??[]).map(S=>({...S,supported_types:Array.isArray(S.supported_types)?S.supported_types:[]}))}catch(x){n(x)}finally{l.value=!1}}async function b(x,S){d.value=null;const V=fe({id:(S==null?void 0:S.id)??0,provider_key:x.provider_key,supported_types:x.supported_types,enabled:x.enabled,name:x.name},a.value);if(V)return d.value={method:V.method,providerName:V.conflicting.name},!1;s.value=!0;try{return S?await Q.payment.updateProvider(S.id,x):await Q.payment.createProvider(x),await y(),i.showSuccess(e(S?"toknex.adminSettingsPayment.providers.updated":"toknex.adminSettingsPayment.providers.created")),!0}catch(k){return n(k),!1}finally{s.value=!1}}async function N(x){try{return await Q.payment.deleteProvider(x),await y(),i.showSuccess(e("toknex.adminSettingsPayment.providers.deleted")),!0}catch(S){return n(S),!1}}async function T(x,S){const V=!x[S];if(d.value=null,S==="enabled"&&V){const k=fe({...x,enabled:!0},a.value);if(k)return d.value={method:k.method,providerName:k.conflicting.name},!1}try{return await Q.payment.updateProvider(x.id,{[S]:V}),x[S]=V,S==="refund_enabled"&&!V&&(x.allow_user_refund=!1),i.showSuccess(e("toknex.adminSettingsPayment.providers.updated")),!0}catch(k){return n(k),!1}}async function g(x,S){const V=Array.isArray(x.supported_types)?x.supported_types:[],k=V.includes(S)?V.filter(E=>E!==S):[...V,S];d.value=null;const U=fe({...x,supported_types:k},a.value);if(U)return d.value={method:U.method,providerName:U.conflicting.name},!1;try{return await Q.payment.updateProvider(x.id,{supported_types:k}),x.supported_types=k,i.showSuccess(e("toknex.adminSettingsPayment.providers.updated")),!0}catch(E){return n(E),!1}}async function C(x){const S=a.value.filter(E=>E.provider_key===x&&E.enabled),V=[];let k=!1;for(const E of S)try{await Q.payment.updateProvider(E.id,{enabled:!1}),E.enabled=!1}catch(me){V.push(E.name),h(me)&&(k=!0)}const U=S.length-V.length;return U>0&&i.showSuccess(e("toknex.adminSettingsPayment.providers.disabledByType",{count:U})),V.length>0&&i.showError(k?e("toknex.adminSettingsPayment.errors.disableFailedPendingOrders",{names:V.join("ã"),count:V.length}):e("toknex.adminSettingsPayment.errors.disableFailed",{names:V.join("ã"),count:V.length})),V}async function Z(x){o.value=!0,a.value=[...x];try{return await Promise.all(x.map((S,V)=>Q.payment.updateProvider(S.id,{sort_order:V}))),x.forEach((S,V)=>{S.sort_order=V}),i.showSuccess(e("toknex.adminSettingsPayment.providers.reordered")),!0}catch(S){return n(S),await y(),!1}finally{o.value=!1}}return{providers:a,loading:l,saving:s,reordering:o,conflict:d,load:y,saveProvider:b,removeProvider:N,toggleField:T,toggleType:g,disableByType:C,reorder:Z}}const ge="/admin/toknex/exchange-rate",Ke="toknex.adminSettingsPayment";function Wt(){const{t:e}=z(),i=ke(),a=Y(null),l=Y(!1),s=Y(!1);function o(y){i.showError(Pt(y,e(`${Ke}.exchangeRate.failed`)))}async function d(){l.value=!0;try{const{data:y}=await ce.get(ge);a.value=y}catch(y){o(y)}finally{l.value=!1}}async function n(y){s.value=!0;try{const{data:b}=await ce.put(ge,{auto_enabled:y});return a.value=b,i.showSuccess(e(y?"toknex.adminSettingsPayment.exchangeRate.autoOn":"toknex.adminSettingsPayment.exchangeRate.autoOff")),!0}catch(b){return o(b),!1}finally{s.value=!1}}async function h(){s.value=!0;try{const{data:y}=await ce.post(`${ge}/refresh`);a.value=y,i.showSuccess(e(`${Ke}.exchangeRate.refreshed`,{rate:y.rate}))}catch(y){o(y),await d()}finally{s.value=!1}}return{status:a,loading:l,busy:s,load:d,setAuto:n,refresh:h}}
1const qt={class:"flex items-center justify-between gap-4 rounded-lg border border-border p-3"},Gt={class:"text-sm font-medium"},Jt={class:"text-xs text-muted-foreground"},Qt={key:0,class:"mt-4 grid gap-3 sm:grid-cols-2"},Xt={class:"sm:col-span-2 text-xs text-muted-foreground","data-testid":"payment-name-preview"},Zt=J({__name:"PaymentToggleCard",props:{form:{}},setup(e){const i=e,{t:a}=z(),l=O(()=>`${i.form.payment_product_name_prefix}${a("toknex.adminSettingsPayment.fields.productNameSample")}${i.form.payment_product_name_suffix}`);return(s,o)=>(p(),j(se,{id:"payment-basics",title:t(a)("toknex.adminSettingsPayment.cards.basics"),description:t(a)("toknex.adminSettingsPayment.cards.basicsHint")},{default:P(()=>[c("div",qt,[c("div",null,[c("p",Gt,u(t(a)("toknex.adminSettingsPayment.fields.enabled")),1),c("p",Jt,u(t(a)("toknex.adminSettingsPayment.fields.enabledHint")),1)]),m(t(G),{modelValue:e.form.payment_enabled,"onUpdate:modelValue":o[0]||(o[0]=d=>e.form.payment_enabled=d),"data-testid":"payment-enabled"},null,8,["modelValue"])]),e.form.payment_enabled?(p(),f("div",Qt,[c("div",null,[m(t(I),{for:"payment-prefix"},{default:P(()=>[w(u(t(a)("toknex.adminSettingsPayment.fields.namePrefix")),1)]),_:1}),m(t(F),{id:"payment-prefix",modelValue:e.form.payment_product_name_prefix,"onUpdate:modelValue":o[1]||(o[1]=d=>e.form.payment_product_name_prefix=d),"data-testid":"payment-prefix",placeholder:t(a)("toknex.adminSettingsPayment.fields.namePrefixPlaceholder")},null,8,["modelValue","placeholder"])]),c("div",null,[m(t(I),{for:"payment-suffix"},{default:P(()=>[w(u(t(a)("toknex.adminSettingsPayment.fields.nameSuffix")),1)]),_:1}),m(t(F),{id:"payment-suffix",modelValue:e.form.payment_product_name_suffix,"onUpdate:modelValue":o[2]||(o[2]=d=>e.form.payment_product_name_suffix=d),"data-testid":"payment-suffix",placeholder:t(a)("toknex.adminSettingsPayment.fields.nameSuffixPlaceholder")},null,8,["modelValue","placeholder"])]),c("p",Xt,u(t(a)("toknex.adminSettingsPayment.fields.productNameHint",{preview:l.value})),1)])):R("",!0)]),_:1},8,["title","description"]))}}),ea=[{kind:"number",key:"payment_min_amount",labelKey:"minAmount",hintKey:"minAmountHint",min:0,step:.01},{kind:"number",key:"payment_max_amount",labelKey:"maxAmount",hintKey:"maxAmountHint",min:0,step:.01},{kind:"number",key:"payment_daily_limit",labelKey:"dailyLimit",hintKey:"dailyLimitHint",min:0,step:.01},{kind:"number",key:"payment_balance_recharge_multiplier",labelKey:"multiplier",hintKey:"multiplierHint",min:.01,step:.01},{kind:"number",key:"payment_recharge_fee_rate",labelKey:"feeRate",hintKey:"feeRateHint",min:0,max:100,step:.01}],ta={kind:"number",key:"payment_subscription_usd_to_cny_rate",labelKey:"usdRate",hintKey:"usdRateHint",min:0,step:1e-4},aa=[{kind:"number",key:"payment_order_timeout_minutes",labelKey:"orderTimeout",hintKey:"orderTimeoutHint",min:1,step:1},{kind:"number",key:"payment_max_pending_orders",labelKey:"maxPending",hintKey:"maxPendingHint",min:1,step:1},{kind:"select",key:"payment_load_balance_strategy",labelKey:"loadBalance",hintKey:"loadBalanceHint",options:Mt.map(e=>({value:e,labelKey:`strategy_${e.replace("-","_")}`}))}],na=[{kind:"select",key:"payment_cancel_rate_limit_window_mode",labelKey:"cancelWindowMode",hintKey:"cancelWindowModeHint",options:Ot.map(e=>({value:e,labelKey:`cancelWindowMode_${e}`}))},{kind:"number",key:"payment_cancel_rate_limit_window",labelKey:"cancelWindow",min:1,step:1},{kind:"select",key:"payment_cancel_rate_limit_unit",labelKey:"cancelUnit",options:Bt.map(e=>({value:e,labelKey:`cancelUnit_${e}`}))},{kind:"number",key:"payment_cancel_rate_limit_max",labelKey:"cancelMax",hintKey:"cancelMaxHint",min:1,step:1}],ia=["easypay","alipay"],Je=[{kind:"switch",key:"payment_alipay_force_qrcode",labelKey:"alipayForceQrcode",hintKey:"alipayForceQrcodeHint"}],Qe=[{kind:"switch",key:"payment_alipay_mobile_precreate_deep_link",labelKey:"alipayDeepLink",hintKey:"alipayDeepLinkHint"}];[...Je,...Qe];const oa={class:"space-y-3 rounded-xl border border-border/60 bg-muted/20 p-4","data-testid":"exchange-rate"},sa={class:"mt-0.5 text-xs text-muted-foreground"},ra={class:"flex flex-wrap items-center gap-3"},la={class:"font-num text-2xl font-semibold text-foreground","data-testid":"exchange-rate-value"},da={class:"text-xs text-muted-foreground","data-testid":"exchange-rate-meta"},ma={key:0,class:"text-xs text-destructive","data-testid":"exchange-rate-error"},ua={class:"flex items-center justify-between gap-4 border-t border-border/60 pt-3"},pa={class:"min-w-0"},ca={class:"mt-0.5 text-xs text-muted-foreground"},W="toknex.adminSettingsPayment",ya=J({__name:"ExchangeRateField",props:{form:{},status:{},busy:{type:Boolean}},emits:["toggle","refresh"],setup(e,{emit:i}){const a=e,l=i,{t:s}=z(),o=O(()=>{var d;return((d=a.status)==null?void 0:d.auto_enabled)===!0});return(d,n)=>(p(),f("div",oa,[o.value&&e.status?(p(),f(A,{key:0},[c("div",null,[m(t(I),null,{default:P(()=>[w(u(t(s)(`${W}
1.fields.usdRate`)),1)]),_:1}),c("p",sa,u(t(s)(`${W}.fields.usdRateHint`)),1)]),c("div",ra,[c("span",la,u(e.status.rate),1),m(t(ze),{variant:"secondary"},{default:P(()=>[w(u(t(s)(`${W}.exchangeRate.live`)),1)]),_:1}),m(t(X),{type:"button",size:"sm",variant:"outline",class:"ml-auto",disabled:e.busy,"data-testid":"exchange-rate-refresh",onClick:n[0]||(n[0]=h=>l("refresh"))},{default:P(()=>[m(t($t),{class:ie(["h-3.5 w-3.5",e.busy&&"animate-spin"])},null,8,["class"]),w(u(t(s)(`${W}.exchangeRate.refresh`)),1)]),_:1},8,["disabled"])]),c("p",da,[e.status.fetched_at?(p(),f(A,{key:0},[w(u(t(s)(`${W}.exchangeRate.meta`,{source:e.status.source,time:t(mt)(e.status.fetched_at),minutes:e.status.interval_minutes})),1)],64)):(p(),f(A,{key:1},[w(u(t(s)(`${W}.exchangeRate.pending`)),1)],64))]),e.status.last_error?(p(),f("p",ma,u(t(s)(`${W}.exchangeRate.lastError`,{error:e.status.last_error})),1)):R("",!0)],64)):(p(),j(ae,{key:1,specs:[t(ta)],form:e.form,namespace:W},null,8,["specs","form"])),c("div",ua,[c("div",pa,[m(t(I),{for:"exchange-rate-auto"},{default:P(()=>[w(u(t(s)(`${W}.exchangeRate.auto`)),1)]),_:1}),c("p",ca,u(t(s)(`${W}
1.exchangeRate.autoHint`)),1)]),m(t(G),{id:"exchange-rate-auto","data-testid":"exchange-rate-auto","model-value":o.value,disabled:e.busy||!e.status,"onUpdate:modelValue":n[1]||(n[1]=h=>l("toggle",h))},null,8,["model-value","disabled"])])]))}}),_a="toknex.adminSettingsPayment",fa=J({__name:"PaymentAmountsCard",props:{form:{},exchangeRate:{}},setup(e){const i=e,{t:a}=z();async function l(s){var n;const o=(n=i.exchangeRate.status.value)==null?void 0:n.rate;await i.exchangeRate.setAuto(s)&&!s&&o!==void 0&&(i.form.payment_subscription_usd_to_cny_rate=o)}return(s,o)=>(p(),j(se,{id:"payment-amounts",title:t(a)("toknex.adminSettingsPayment.cards.amounts"),description:t(a)("toknex.adminSettingsPayment.cards.amountsHint")},{default:P(()=>[m(ae,{specs:t(ea),form:e.form,namespace:_a},null,8,["specs","form"]),m(ya,{form:e.form,status:e.exchangeRate.status.value,busy:e.exchangeRate.busy.value,onToggle:l,onRefresh:o[0]||(o[0]=d=>e.exchangeRate.refresh())},null,8,["form","status","busy"])]),_:1},8,["title","description"]))}}),ga={class:"space-y-3","data-testid":"promotion-tiers"},ba={key:0,class:"text-sm text-muted-foreground"},D="toknex.adminSettingsPayment",va=J({__name:"RechargePromotionCard",props:{form:{}},setup(e){const i=e,{t:a}=z(),l=new WeakMap;let s=0;function o(b){i.form.payment_recharge_bonus_mode=String(b)}function d(b){i.form.payment_recharge_bonus_notice=String(b)}function n(){i.form.payment_recharge_bonus_tiers.length<xe&&i.form.payment_recharge_bonus_tiers.push({min_amount:null,bonus_percent:null})}function h(b){i.form.payment_recharge_bonus_tiers.splice(b,1)}function y(b){const N=l.get(b);if(N!==void 0)return N;const T=s++;return l.set(b,T),T}return(b,N)=>(p(),j(se,{id:"payment-promotion",title:t(a)(`${D}.promotion.title`),description:t(a)(`${D}.promotion.hint`)},{default:P(()=>[m(re,{id:"recharge-promotion-mode",label:t(a)(`${D}.promotion.mode`)},{default:P(()=>[m(t(St),{"model-value":e.form.payment_recharge_bonus_mode,"onUpdate:modelValue":o},{default:P(()=>[m(t(wt),{id:"recharge-promotion-mode","data-testid":"promotion-mode"},{default:P(()=>[m(t(Vt))]),_:1}),m(t(Ut),null,{default:P(()=>[m(t(Ee),{value:"bonus"},{default:P(()=>[w(u(t(a)(`${D}.promotion.bonus`)),1)]),_:1}),m(t(Ee),{value:"discount"},{default:P(()=>[w(u(t(a)(`${D}.promotion.discount`)),1)]),_:1})]),_:1})]),_:1},8,["model-value"])]),_:1},8,["label"]),c("div",ga,[(p(!0),f(A,null,H(e.form.payment_recharge_bonus_tiers,(T,g)=>(p(),f("div",{key:y(T),class:"grid grid-cols-[1fr_1fr_auto] items-end gap-3"},[m(re,{id:`promotion-threshold-${g}`,label:t(a)(`${D}.promotion.threshold`)},{default:P(()=>[m(Re,{id:`promotion-threshold-${g}`,"model-value":T.min_amount,min:0,step:.01,"allow-empty":"","onUpdate:modelValue":C=>T.min_amount=C},null,8,["id","model-value","onUpdate:modelValue"])]),_:2},1032,["id","label"]),m(re,{id:`promotion-percent-${g}`,label:t(a)(`${D}.promotion.percent`)},{default:P(()=>[m(Re,{id:`promotion-percent-${g}`,"model-value":T.bonus_percent,min:0,max:e.form.payment_recharge_bonus_mode==="discount"?99.99:1e3,step:.01,"allow-empty":"","onUpdate:modelValue":C=>T.bonus_percent=C},null,8,["id","model-value","max","onUpdate:modelValue"])]),_:2},1032,["id","label"]),m(t(X),{variant:"outline",size:"icon","aria-label":t(a)(`${D}.promotion.remove`),"data-testid":"promotion-remove",onClick:C=>h(g)},{default:P(()=>[m(t(Tt),{class:"h-4 w-4"})]),_:1},8,["aria-label","onClick"])]))),128)),e.form.payment_recharge_bonus_tiers.length?R("",!0):(p(),f("p",ba,u(t(a)(`${D}.promotion.empty`)),1)),m(t(X),{variant:"outline","data-testid":"promotion-add",disabled:e.form.payment_recharge_bonus_tiers.length>=t(xe),onClick:n},{default:P(()=>[m(t(Ct),{class:"h-4 w-4"}),w(u(t(a)(`${D}.promotion.add`)),1)]),_:1},8,["disabled"])]),m(re,{id:"recharge-promotion-notice",label:t(a)(`${D}.promotion.notice`),hint:t(a)(`${D}.promotion.noticeHint`)},{default:P(()=>[m(t($e),{id:"recharge-promotion-notice","model-value":e.form.payment_recharge_bonus_notice,rows:4,"data-testid":"promotion-notice","onUpdate:modelValue":d},null,8,["model-value"])]),_:1},8,["label","hint"])]),_:1},8,["title","description"]))}}),xa={class:"mt-5 rounded-lg border border-border p-3"},ha={class:"flex items-center justify-between gap-4"},ka={class:"text-sm font-medium"},Pa={class:"text-xs text-muted-foreground"},$a={class:"mt-3"},Me="toknex.adminSettingsPayment",Sa=J({__name:"PaymentOrderCard",props:{form:{}},setup(e){const{t:i}=z();return(a,l)=>(p(),j(se,{id:"payment-orders",title:t(i)("toknex.adminSettingsPayment.cards.orders"),description:t(i)("toknex.adminSettingsPayment.cards.ordersHint")},{default:P(()=>[m(ae,{specs:t(aa),form:e.form,namespace:Me},null,8,["specs","form"]),c("div",xa,[c("div",ha,[c("div",null,[c("p",ka,u(t(i)("toknex.adminSettingsPayment.fields.cancelRateLimitEnabled")),1),c("p",Pa,u(t(i)("toknex.adminSettingsPayment.fields.cancelRateLimitEnabledHint")),1)]),m(t(G),{modelValue:e.form.payment_cancel_rate_limit_enabled,"onUpdate:modelValue":l[0]||(l[0]=s=>e.form.payment_cancel_rate_limit_enabled=s),"data-testid":"payment-cancel-limit"},null,8,["modelValue"])]),c("div",$a,[m(ae,{specs:t(na),form:e.form,namespace:Me,disabled:!e.form.payment_cancel_rate_limit_enabled},null,8,["specs","form","disabled"])])])]),_:1},8,["title","description"]))}}),wa={class:"flex flex-wrap gap-2"},Va=["data-testid","aria-pressed","onClick"],Ua={key:0,class:"mt-2 text-xs text-destructive","data-testid":"payment-no-types"},Ta={key:1,class:"mt-5"},Ca={key:2,class:"mt-5"},Na={class:"mt-5 grid gap-4 sm:grid-cols-2"},Ra={key:0,class:"mt-1 text-xs text-destructive","data-testid":"payment-help-image-error"},le="toknex.adminSettingsPayment",Ea=J({__name:"PaymentTypesCard",props:{form:{}},emits:["disable-type"],setup(e,{emit:i}){const a=e,l=i,{t:s}=z(),o=Y(""),d=O(()=>a.form.payment_enabled_types.some(h=>ia.some(y=>y===h)));function n(h){const y=a.form;y.payment_enabled_types.includes(h)?(y.payment_enabled_types=y.payment_enabled_types.filter(b=>b!==h),l("disable-type",h,()=>{y.payment_enabled_types.includes(h)||(y.payment_enabled_types=[...y.payment_enabled_types,h])}
1)):y.payment_enabled_types=[...y.payment_enabled_types,h]}return(h,y)=>(p(),j(se,{id:"payment-types",title:t(s)("toknex.adminSettingsPayment.cards.types"),description:t(s)("toknex.adminSettingsPayment.cards.typesHint")},{default:P(()=>[c("div",wa,[(p(!0),f(A,null,H(t(It),b=>(p(),f("button",{key:b,type:"button","data-testid":`payment-type-${b}`,"aria-pressed":e.form.payment_enabled_types.includes(b),class:ie(["rounded-full border px-3 py-1 text-sm transition-colors",e.form.payment_enabled_types.includes(b)?"border-primary bg-primary/10 text-primary":"border-border text-muted-foreground"]),onClick:N=>n(b)},u(t(s)(`${le}.types.${b}`)),11,Va))),128))]),e.form.payment_enabled_types.length===0?(p(),f("p",Ua,u(t(s)("toknex.adminSettingsPayment.validation.noTypes")),1)):R("",!0),d.value?(p(),f("div",Ta,[m(ae,{specs:t(Je),form:e.form,namespace:le},null,8,["specs","form"])])):R("",!0),e.form.payment_enabled_types.includes("alipay")?(p(),f("div",Ca,[m(ae,{specs:t(Qe),form:e.form,namespace:le},null,8,["specs","form"])])):R("",!0),c("div",Na,[c("div",null,[m(t(I),null,{default:P(()=>[w(u(t(s)("toknex.adminSettingsPayment.fields.helpImage")),1)]),_:1}),m(Nt,{modelValue:e.form.payment_help_image_url,"onUpdate:modelValue":y[0]||(y[0]=b=>e.form.payment_help_image_url=b),mode:"image","upload-label":t(s)("toknex.adminSettingsPayment.fields.helpImageUpload"),"remove-label":t(s)("toknex.adminSettingsPayment.fields.helpImageRemove"),hint:t(s)("toknex.adminSettingsPayment.fields.helpImageHint"),onError:y[1]||(y[1]=b=>o.value=b)},null,8,["modelValue","upload-label","remove-label","hint"]),o.value?(p(),f("p",Ra,u(t(s)(`${le}.uploadError.${o.value}`)),1)):R("",!0)]),c("div",null,[m(t(I),{for:"payment-help-text"},{default:P(()=>[w(u(t(s)("toknex.adminSettingsPayment.fields.helpText")),1)]),_:1}),m(Rt,{modelValue:e.form.payment_help_text,"onUpdate:modelValue":y[2]||(y[2]=b=>e.form.payment_help_text=b),testid:"payment-help-text-i18n"},{default:P(({value:b,update:N})=>[m(t($e),{id:"payment-help-text","model-value":b,rows:3,"data-testid":"payment-help-text",placeholder:t(s)("toknex.adminSettingsPayment.fields.helpTextPlaceholder"),"onUpdate:modelValue":T=>N(String(T))},null,8,["model-value","placeholder","onUpdate:modelValue"])]),_:1},8,["modelValue"])])])]),_:1},8,["title","description"]))}}),be=["easypay","alipay","wxpay","stripe","airwallex","nowpayments"],we={easypay:["alipay","wxpay"],alipay:["alipay"],wxpay:["wxpay"],stripe:["card","alipay","wxpay","link"],airwallex:["airwallex"],nowpayments:["nowpayments"]},Oe=["CNY","HKD","USD","EUR","GBP","AUD","CAD","SGD","JPY","KRW","NZD"],de={easypay:"/api/v1/payment/webhook/easypay",alipay:"/api/v1/payment/webhook/alipay",wxpay:"/api/v1/payment/webhook/wxpay",nowpayments:"/api/v1/payment/webhook/nowpayments"},Be="/payment/result",Ie=["https://api.nowpayments.io/v1","https://api-sandbox.nowpayments.io/v1"],Aa=["USD"],De=["false","true"],he={easypay:{notifyUrl:de.easypay,returnUrl:Be},alipay:{notifyUrl:de.alipay,returnUrl:Be},wxpay:{notifyUrl:de.wxpay},nowpayments:{notifyUrl:de.nowpayments}},M="toknex.adminSettingsPayment",oe={easypay:[{key:"pid",label:"PID",sensitive:!1},{key:"pkey",label:"PKey",sensitive:!0},{key:"apiBase",sensitive:!1},{key:"cidAlipay",sensitive:!1,optional:!0},{key:"cidWxpay",sensitive:!1,optional:!0}],alipay:[{key:"appId",label:"App ID",sensitive:!1},{key:"privateKey",sensitive:!0,multiline:!0},{key:"publicKey",sensitive:!0,multiline:!0}],wxpay:[{key:"appId",label:"App ID",sensitive:!1},{key:"mchId",sensitive:!1},{key:"privateKey",sensitive:!0,multiline:!0},{key:"apiV3Key",sensitive:!0},{key:"certSerial",sensitive:!1},{key:"publicKey",sensitive:!0,multiline:!0},{key:"publicKeyId",sensitive:!1}],stripe:[{key:"secretKey",sensitive:!0},{key:"publishableKey",sensitive:!1},{key:"webhookSecret",sensitive:!0},{key:"currency",sensitive:!1,defaultValue:"CNY",hintKey:`${M}.field_paymentCurrencyHint`,options:Oe}],airwallex:[{key:"clientId",sensitive:!1},{key:"apiKey",sensitive:!0},{key:"webhookSecret",sensitive:!0},{key:"apiBase",sensitive:!1,defaultValue:"https://api.airwallex.com/api/v1",hintKey:`${M}.field_airwallexApiBaseHint`},{key:"countryCode",sensitive:!1,defaultValue:"CN"},{key:"currency",sensitive:!1,defaultValue:"CNY",hintKey:`${M}.field_paymentCurrencyHint`,options:Oe},{key:"accountId",sensitive:!1,optional:!0,clearable:!0,hintKey:`${M}.field_accountIdHint`}],nowpayments:[{key:"apiKey",sensitive:!0},{key:"ipnSecret",sensitive:!0,hintKey:`${M}.field_ipnSecretHint`},{key:"apiBase",sensitive:!1,defaultValue:Ie[0],hintKey:`${M}.field_nowpaymentsApiBaseHint`,options:Ie},{key:"currency",sensitive:!1,defaultValue:"USD",hintKey:`${M}.field_nowpaymentsCurrencyHint`,options:Aa},{key:"payCurrency",sensitive:!1,optional:!0,hintKey:`${M}.field_payCurrencyHint`},{key:"feePaidByUser",sensitive:!1,optional:!0,defaultValue:"false",hintKey:`${M}.field_feePaidByUserHint`,options:De,optionLabelKey:`${M}.booleanOption.`},{key:"fixedRate",sensitive:!1,optional:!0,defaultValue:"false",hintKey:`${M}.field_fixedRateHint`,options:De,optionLabelKey:`${M}.booleanOption.`}]};function Xe(e){return`${M}.field_${e.key}`}function Ve(e){return[...we[e]??[]]}
1function Ze(e,i){const a=`${M}.types.${e}`;return i.te(a)?i.t(a):e}function te(e){return e.trim().toLowerCase()}function Ka(e){if(!e||!e.trim())return[];try{const i=JSON.parse(e);return Array.isArray(i)?i.map(a=>{const l=a??{};return{type:String(l.type??"").trim(),upstreamType:String(l.upstreamType??"").trim(),displayName:String(l.displayName??"").trim()}}).filter(a=>a.type&&a.upstreamType):[]}catch{return[]}}function Ma(e){const i=e.map(a=>({type:a.type.trim(),upstreamType:a.upstreamType.trim(),displayName:a.displayName.trim()})).filter(a=>a.type&&a.upstreamType);return i.length?JSON.stringify(i):""}function He(e,i){if(!e)return"";if(e.endsWith(i))return e.slice(0,-i.length);try{return new URL(e).origin}catch{return e}}const Oa={class:"mt-8","data-testid":"providers-card"},Ba={class:"mb-3 flex items-start justify-between gap-4"},Ia={class:"text-base font-semibold"},Da={class:"text-xs text-muted-foreground","data-testid":"providers-saves-immediately"},Ha={class:"text-xs text-muted-foreground"},La={key:0,class:"text-xs text-warning-foreground","data-testid":"providers-enable-types-first"},Fa={key:0,class:"text-sm text-muted-foreground","data-testid":"providers-loading"},Ya={key:1,class:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground","data-testid":"providers-empty"},ja=["title","data-type-disabled","data-testid"],za=["data-testid"],Wa=["data-testid"],qa={class:"mt-1 flex flex-wrap gap-1"},Ga=["data-testid","aria-pressed","onClick"],Ja={key:0,class:"text-xs text-muted-foreground"},Qa={class:"flex items-center gap-4"},Xa={class:"flex items-center gap-2 text-xs"},Za={class:"flex items-center gap-2 text-xs"},en={class:"flex items-center gap-2 text-xs"},tn="toknex.adminSettingsPayment",an=J({__name:"ProvidersCard",props:{providers:{},loading:{type:Boolean},reordering:{type:Boolean},enabledTypes:{}},emits:["create","reorder","edit","remove","toggle","toggle-type"],setup(e,{emit:i}){const a=e,l=i,{t:s,te:o}=z(),d=O(()=>a.enabledTypes.length>0),n=O(()=>`${s("toknex.adminSettingsPayment.providers.typeDisabled")} â ${s("toknex.adminSettingsPayment.providers.enableTypesFirst")}`);function h(N){return a.enabledTypes.includes(N.provider_key)}function y(N){const T=Ve(N.provider_key);for(const g of N.supported_types)T.includes(g)||T.push(g);return T}function b(N){return Ze(N,{t:s,te:o})}return(N,T)=>(p(),f("section",Oa,[T[2]||(T[2]=c("hr",{class:"mb-6 border-border"},null,-1)),c("div",Ba,[c("div",null,[c("h3",Ia,u(t(s)("toknex.adminSettingsPayment.providers.title")),1),c("p",Da,u(t(s)("toknex.adminSettingsPayment.providers.savesImmediately")),1),c("p",Ha,u(t(s)("toknex.adminSettingsPayment.providers.reorderHint")),1),d.value?R("",!0):(p(),f("p",La,u(t(s)("toknex.adminSettingsPayment.providers.enableTypesFirst")),1))]),m(t(X),{size:"sm",disabled:!d.value,title:d.value?void 0:t(s)("toknex.adminSettingsPayment.providers.enableTypesFirst"),"data-testid":"provider-add",onClick:T[0]||(T[0]=g=>l("create"))},{default:P(()=>[w(u(t(s)("toknex.adminSettingsPayment.providers.add")),1)]),_:1},8,["disabled","title"])]),e.loading?(p(),f("p",Fa,u(t(s)("toknex.common.state.loading")),1)):e.providers.length===0?(p(),f("p",Ya,u(t(s)("toknex.adminSettingsPayment.providers.empty")),1)):(p(),j(Et,{key:2,"model-value":e.providers,"item-key":"id","aria-busy":e.reordering?"true":void 0,"data-testid":"providers-list","onUpdate:modelValue":T[1]||(T[1]=g=>l("reorder",g))},{item:P(({item:g})=>[c("div",{class:ie(["flex flex-wrap items-center justify-between gap-3",h(g)?void 0:"opacity-50"]),title:h(g)?void 0:n.value,"data-type-disabled":String(!h(g)),"data-testid":`provider-row-${g.id}`},[c("div",null,[c("p",{class:"text-sm font-medium","data-testid":`provider-name-${g.id}`},u(g.name),9,za),c("p",{class:"text-xs text-muted-foreground","data-testid":`provider-meta-${g.id}`},[w(u(t(s)(`${tn}.types.${g.provider_key}`))+" ",1),h(g)?R("",!0):(p(),j(t(ze),{key:0,variant:"outline",class:"ml-1","data-testid":`provider-type-disabled-${g.id}`},{default:P(()=>[w(u(t(s)("toknex.adminSettingsPayment.providers.typeDisabled")),1)]),_:1},8,["data-testid"]))],8,Wa),c("div",qa,[(p(!0),f(A,null,H(y(g),C=>(p(),f("button",{key:C,type:"button","data-testid":`provider-type-${g.id}-${C}
1`,"aria-pressed":g.supported_types.includes(C),class:ie(["rounded-full border px-2 py-0.5 text-xs transition-colors",g.supported_types.includes(C)?"border-primary bg-primary/10 text-primary":"border-border text-muted-foreground"]),onClick:Z=>l("toggle-type",g,C)},u(b(C)),11,Ga))),128)),y(g).length===0?(p(),f("span",Ja,u(t(s)("toknex.adminSettingsPayment.providers.noTypes")),1)):R("",!0)])]),c("div",Qa,[c("label",Xa,[m(t(G),{"model-value":g.enabled,"data-testid":`provider-enabled-${g.id}`,"onUpdate:modelValue":C=>l("toggle",g,"enabled")},null,8,["model-value","data-testid","onUpdate:modelValue"]),w(" "+u(t(s)("toknex.adminSettingsPayment.providers.enabled")),1)]),c("label",Za,[m(t(G),{"model-value":g.refund_enabled,"data-testid":`provider-refund-${g.id}`,"onUpdate:modelValue":C=>l("toggle",g,"refund_enabled")},null,8,["model-value","data-testid","onUpdate:modelValue"]),w(" "+u(t(s)("toknex.adminSettingsPayment.providers.refund")),1)]),c("label",en,[m(t(G),{"model-value":g.allow_user_refund,disabled:!g.refund_enabled,"data-testid":`provider-user-refund-${g.id}`,"onUpdate:modelValue":C=>l("toggle",g,"allow_user_refund")},null,8,["model-value","disabled","data-testid","onUpdate:modelValue"]),w(" "+u(t(s)("toknex.adminSettingsPayment.providers.userRefund")),1)]),m(t(X),{variant:"ghost",size:"sm","data-testid":`provider-edit-${g.id}`,onClick:C=>l("edit",g)},{default:P(()=>[w(u(t(s)("toknex.common.actions.edit")),1)]),_:1},8,["data-testid","onClick"]),m(t(X),{variant:"ghost",size:"sm",class:"text-destructive","data-testid":`provider-delete-${g.id}`,onClick:C=>l("remove",g)},{default:P(()=>[w(u(t(s)("toknex.common.actions.delete")),1)]),_:1},8,["data-testid","onClick"])])],10,ja)]),_:1},8,["model-value","aria-busy"]))]))}}),q="toknex.adminSettingsPayment.validation",Le=["singleMin","singleMax","dailyLimit"];function nn(e,i){return e==="stripe"?["stripe"]:i.filter(a=>a!=="easypay")}function on(e){for(const i of Object.values(e)){const a=i.singleMin,l=i.singleMax;if(a!==void 0&&l!==void 0&&a>0&&l>0&&a>l)return[{key:`${q}.limitMinAboveMax`}]}return[]}function sn(e){if(!e||!e.trim())return{};let i;try{i=JSON.parse(e)}catch{return{}}if(!i||typeof i!="object"||Array.isArray(i))return{};const a={};for(const[l,s]of Object.entries(i)){if(!s||typeof s!="object"||Array.isArray(s))continue;const o={};for(const[d,n]of Object.entries(s))typeof n=="number"&&Number.isFinite(n)&&n>0&&(o[d]=n);a[l]=o}return a}function et(e){return e==="easypay"||e==="alipay"}function tt(e){return e==="easypay"?Se:""}function rn(e,i){return e==="easypay"?i===Se||i===We:e==="alipay"?i===""||i===qe:i===""}function ln(e,i){const a=i??"";return rn(e,a)?a:tt(e)}function ve(e){return{provider_key:e,name:"",supported_types:Ve(e),enabled:!0,payment_mode:tt(e),refund_enabled:!1,allow_user_refund:!1,config:{},limits:{},notifyBaseUrl:"",returnBaseUrl:"",easyPayCustomMethods:[]}}function Fe(e,i){for(const a of oe[e]??[])a.defaultValue&&!i[a.key]&&(i[a.key]=a.defaultValue)}function dn(e,i,a,l){const s={};for(const o of oe[e]??[]){const d=i[o.key];if(!d||!d.trim()){o.clearable&&(s[o.key]="");continue}s[o.key]=d}return e==="easypay"&&(s.customMethods=Ma(l??[])),s}function mn(e,i){const a=[];e.name.trim()||a.push({key:`${q}.nameRequired`}),e.supported_types.length===0&&a.push({key:`${q}.typesRequired`}),a.push(...on(e.limits));for(const l of oe[e.provider_key]??[])l.optional||i==="edit"&&l.sensitive||(e.config[l.key]??"").trim()||a.push({key:`${q}.fieldRequired`,params:{field:Xe(l)}});return a}function un(e){const i=new Set,a=new Set(we.easypay??[]);for(const l of e){const s=te(l.type),o=te(l.upstreamType),d=l.displayName.trim();if(!(!s&&!o&&!d)){if(!s||!o)return`${q}.easyPayMethodIncomplete`;if(!/^[a-z0-9_-]+$/.test(s))return`${q}.easyPayMethodTypeInvalid`;if(!/^[a-z0-9_.-]+$/.test(o))return`${q}.easyPayMethodUpstreamInvalid`;if(a.has(s))return`${q}.easyPayMethodReserved`;if(s.startsWith("alipay")||s.startsWith("wxpay"))return`${q}.easyPayMethodPrefixReserved`;if(i.has(s))return`${q}.easyPayMethodDuplicate`;i.add(s)}}return null}function pn(e,i){const a=new Set(we.easypay??[]),l=[],s=new Set;for(const d of i){const n=te(d.type),h=te(d.upstreamType);!n||!h||s.has(n)||(s.add(n),l.push(n))}const o=e.map(d=>te(d)).filter(d=>a.has(d)||l.includes(d));for(const d of l)o.includes(d)||o.push(d);return o}function cn(e){const i={};for(const[a,l]of Object.entries(e)){const s={};for(const[o,d]of Object.entries(l))d>0&&(s[o]=d);Object.keys(s).length>0&&(i[a]=s)}return Object.keys(i).length>0?JSON.stringify(i):""}function yn(e,i,a){const l=e.provider_key==="easypay"?e.easyPayCustomMethods.map(n=>({type:te(n.type),upstreamType:te(n.upstreamType),displayName:n.displayName.trim()})).filter(n=>n.type&&n.upstreamType):[],s=dn(e.provider_key,e.config,i,l),o=he[e.provider_key];if(o){const n=e.notifyBaseUrl.trim()||a,h=e.returnBaseUrl.trim()||a;o.notifyUrl&&(s.notifyUrl=n+o.notifyUrl),o.returnUrl&&(s.returnUrl=h+o.returnUrl)}const d=e.provider_key==="easypay"?pn(e.supported_types,l):[...e.supp
1orted_types];return{provider_key:e.provider_key,name:e.name.trim(),supported_types:d,enabled:e.enabled,payment_mode:et(e.provider_key)?e.payment_mode:"",refund_enabled:e.refund_enabled,allow_user_refund:e.refund_enabled?e.allow_user_refund:!1,config:s,limits:cn(e.limits)}}const _n={class:"space-y-4"},fn={key:0,class:"rounded-md bg-destructive/10 p-3 text-sm text-destructive","data-testid":"provider-dialog-errors"},gn=["disabled"],bn=["value"],vn={class:"mb-2 text-sm font-medium"},xn={class:"flex flex-wrap gap-2","data-testid":"provider-types"},hn=["data-testid","aria-pressed","onClick"],kn=["id","onUpdate:modelValue","data-testid"],Pn=["value"],$n={key:2,class:"flex items-center gap-2"},Sn=["aria-pressed","data-testid","onClick"],wn={key:4,class:"mt-1 text-xs text-muted-foreground"},Vn={key:5,class:"mt-1 text-xs text-muted-foreground"},Un={key:6,class:"mt-1 text-xs text-muted-foreground"},Tn={key:1},Cn={class:"mt-1 text-xs text-muted-foreground","data-testid":"notify-preview"},Nn={key:2},Rn={key:3},En=["value"],An={class:"flex flex-wrap gap-4"},Kn={class:"flex items-center gap-2 text-sm"},Mn={class:"flex items-center gap-2 text-sm"},On={class:"flex items-center gap-2 text-sm"},Bn={key:4},In={class:"mb-2 flex items-center justify-between"},Dn={class:"text-sm font-medium"},Hn={key:5,"data-testid":"provider-limits"},Ln={class:"text-sm font-medium"},Fn={class:"mb-2 text-xs text-muted-foreground"},Yn=["data-testid"],jn={class:"grid gap-2 sm:grid-cols-3"},ee="toknex.adminSettingsPayment",zn=J({__name:"ProviderDialog",props:{open:{type:Boolean},editing:{},submitting:{type:Boolean},defaultBaseUrl:{},enabledKeys:{default:()=>[]}},emits:["close","submit"],setup(e,{expose:i,emit:a}){const l=e,s=a,{t:o,te:d}=z(),n=Ce(ve("easypay")),h=Y([]),y=Ce({}),b=O(()=>l.editing?"edit":"create"),N=O(()=>{const _=be.filter(v=>l.enabledKeys.includes(v));return _.length>0?_:[...be]}),T=O(()=>b.value==="edit"?[...be]:N.value),g=O(()=>oe[n.provider_key]??[]),C=O(()=>Ve(n.provider_key)),Z=O(()=>nn(n.provider_key,n.supported_types)),x=O(()=>he[n.provider_key]??null),S=O(()=>et(n.provider_key)),V=O(()=>n.provider_key==="alipay"?[{value:"",labelKey:`${ee}.dialog.modeQrcode`},{value:qe,labelKey:`${ee}.dialog.modeRedirect`}]:[{value:Se,labelKey:`${ee}.dialog.modeQrcode`},{value:We,labelKey:`${ee}.dialog.modePopup`}]);function k(_){return _.sensitive?b.value==="edit"?o("toknex.adminSettingsPayment.dialog.secretKeepPlaceholder"):o("toknex.adminSettingsPayment.dialog.secretRequiredPlaceholder"):_.clearable?o("toknex.adminSettingsPayment.dialog.clearablePlaceholder"):""}function U(_){n.supported_types=n.supported_types.includes(_)?n.supported_types.filter(v=>v!==_):[...n.supported_types,_]}function E(){n.easyPayCustomMethods.push({type:"",upstreamType:"",displayName:""})}function me(_){return Ze(_,{t:o,te:d})}function at(_,v){var r;const B=(r=n.limits[_])==null?void 0:r[v];return B!==void 0?String(B):""}function nt(_){const v=n.limits[_];return!!v&&Le.some(B=>(v[B]??0)>0)}function it(_){return nt(_)?o("toknex.adminSettingsPayment.dialog.limitNoLimit"):o("toknex.adminSettingsPayment.dialog.limitUseGlobal")}function ot(_,v,B){n.limits[_]||(n.limits[_]={});const r=n.limits[_],$=Number(B);if(B.trim()===""||Number.isNaN($)){delete r[v];return}$<=0||(r[v]=$)}function Ue(){for(const _ of Object.keys(y))delete y[_]}function ue(_){Object.assign(n,ve(_)),Fe(_,n.config),h.value=[],Ue()}function st(){ue(n.provider_key)}function rt(_){_||s("close")}function Te(_){var B,r,$,L;Object.assign(n,ve(_.provider_key)),n.name=_.name,n.supported_types=Array.isArray(_.supported_types)?[..._.supported_types]:[],n.enabled=_.enabled,n.payment_mode=ln(_.provider_key,_.payment_mode),n.refund_enabled=_.refund_enabled,n.allow_user_refund=_.allow_user_refund,n.limits=sn(_.limits);for(const pe of oe[_.provider_key]??[])pe.sensitive||(n.config[pe.key]=((B=_.config)==null?void 0:B[pe.key])??"");Fe(_.provider_key,n.config);const v=he[_.provider_key];v!=null&&v.notifyUrl&&(n.notifyBaseUrl=He(((r=_.config)==null?void 0:r.notifyUrl)??"",v.notifyUrl)),v!=null&&v.returnUrl&&(n.returnBaseUrl=He((($=_.config)==null?void 0:$.returnUrl)??"",v.returnUrl)),_.provider_key==="easypay"&&(n.easyPayCustomMethods=Ka((L=_.config)==null?void 0:L.customMethods)),h.value=[],Ue()}je(()=>[l.open,l.editing],([_,v])=>{_&&(v?Te(v):ue(N.value[0]))},{immediate:!0});function lt(){const _=mn(n,b.value);if(n.provider_key==="easypay"){const v=un(n.easyPayCustomMethods);v&&_.push({key:v})}h.value=_,!(_.length>0)&&s("submit",yn(n,b.value,l.defaultBaseUrl))}return i({reset:ue,loadFrom:Te}),(_,v)=>(p(),j(At,{open:e.open,size:"lg",title:b.value==="create"?t(o)("toknex.adminSettingsPayment.dialog.createTitle"):t(o)("toknex.adminSettingsPayment.dialog.editTitle"),loading:e.submitting,"data-testid":"provider-dialog","onUpdate:open":rt,onSubmit:lt},{default:P(()=>{var B;return[c("div",_n,[h.value.length?(p(),f("div",fn,[(p(!0),f(A,null,H(h.value,r=>(p(),f("p",{key:r.key+JSON.stringify(r.params??{})},u(r.params?t(o)(r.key,{field:t(o)(String(r.params.field))}):t(o)(r.key)),1))),128))])):R("",!0),c("div",null,[m(t(I),{for:"provider-key"},{default:P(()=>[w(u(t(o)("toknex.adminSettingsPayment.dialog.providerKey")),1)]),_:1}),ye(c("select",{id:"provider-key","onUpdate:modelValue":v[0]||(v[0]=r=>n.provider_key=r),class:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm",disabled:b.value==="edit","data-testid":"provider-key",onChange:st},[(p(!0),f(A,null,H(T.value,r=>(p(),f("option",{key:r,value:r},u(t(o)(`${ee}.types.${r}`)),9,bn))),128))],40,gn),[[_e,n.provider_key]])]),c("div",null,[m(t(I),{for:"provider-name"},{default:P(()=>[w(u(t(o)("toknex.adminSettingsPayment.dialog.name")),1)]),_:1}),m(t(F),{id:"provider-name",modelValue:n.name,"onUpdate:modelValue":v[1]||(v[1]=r=>n.name=r),"data-testid":"provider-name"},null,8,["modelValue"])]),c("div",null,[c("p",vn,u(t(o)("toknex.adminSettingsPayment.dialog.supportedTypes")),1),c("div",xn,[(p(!0),f(A,null,H(C.value,r=>(p(),f("button",{key:r,type:"button","data-testid":`provider-type-${r}`,"aria-pressed":n.supported_types.includes(r),class:ie(["rounded-full border px-3 py-1 text-sm transition-colors",n.supported_types.includes(r)?"border-primary bg-primary/10 text-primary":"border-border text-muted-foreground"]),onClick:$=>U(r)},u(t(o)(`${ee}.types.${r}`)),11,hn))),128))])]),(p(!0),f(A,null,H(g.value,r=>(p(),f("div",{key:r.key},[m(t(I),{for:`cfg-${r.key}`},{default:P(()=>[w(u(r.label||t(o)(t(Xe)(r))),1)]),_:2},1032,["for"]),r.options?ye((p(),f("select",{key:0,id:`cfg-${r.key}`,"onUpdate:modelValue":$=>n.config[r.key]=$,class:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm","data-testid":`cfg-${r.key}`},[(p(!0),f(A,null,H(r.options,$=>(p(),f("option",{key:$,value:$},u(r.optionLabelKey?t(o)(r.optionLabelKey+$):$),9,Pn))),128))],8,kn)),[[_e,n.config[r.key]]]):r.multiline?(p(),j(t($e),{key:1,id:`cfg-${r.key}`,modelValue:n.config[r.key],"onUpdate:modelValue":$=>n.config[r.key]=$,rows:4,class:"font-mono text-xs",autocomplete:"new-password",spellcheck:"false",placeholder:k(r),"data-testid":`cfg-${r.key}`},null,8,["id","modelValue","onUpdate:modelValue","placeholder","data-testid"])):r.sensitive?(p(),f("div",$n,[m(t(F),{id:`cfg-${r.key}`,modelValue:n.config[r.key],"onUpdate:modelValue":$=>n.config[r.key]=$,type:y[r.key]?"text":"password",autocomplete:"new-password",spellcheck:"false",placeholder:k(r),"data-testid":`cfg-${r.key}`},null,8,["id","modelValue","onUpdate:modelValue","type","placeholder","data-testid"]),c("button",{type:"button",class:"shrink-0 rounded-md border border-border px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted","aria-pressed":!!y[r.key],"data-testid":`cfg-${r.key}-toggle`,onClick:$=>y[r.key]=!y[r.key]},u(y[r.key]?t(o)("toknex.adminSettingsPayment.dialog.secretHide"):t(o)("toknex.adminSettingsPayment.dialog.secretShow")),9,Sn)])):(p(),j(t(F),{key:3,id:`cfg-${r.key}`,modelValue:n.config[r.key],"onUpdate:modelValue":$=>n.config[r.key]=$,type:"text",placeholder:k(r),"data-testid":`cfg-${r.key}`},null,8,["id","modelValue","onUpdate:modelValue","placeholder","data-testid"])),r.hintKey?(p(),f("p",wn,u(t(o)(r.hintKey)),1)):r.sensitive&&b.value==="edit"?(p(),f("p",Vn,u(t(o)("toknex.adminSettingsPayment.dialog.secretKeepHint")),1)):r.clearable?(p(),f("p",Un,u(t(o)("toknex.adminSettingsPayment.dialog.clearableHint")),1)):R("",!0)]))),128)),x.value?(p(),f("div",Tn,[m(t(I),{for:"notify-base"},{default:P(()=>[w(u(t(o)("toknex.adminSettingsPayment.dialog.notifyBase")),1)]),_:1}),m(t(F),{id:"notify-base",modelValue:n.notifyBaseUrl,"onUpdate:modelValue":v[2]||(v[2]=r=>n.notifyBaseUrl=r),placeholder:e.defaultBaseUrl,"data-testid":"notify-base"},null,8,["modelValue","placeholder"]),c("p",Cn,u((n.notifyBaseUrl.trim()||e.defaultBaseUrl)+(x.value.notifyUrl??"")),1)])):R("",!0),(B=x.value)!=null&&B.returnUrl?(p(),f("div",Nn,[m(t(I),{for:"return-base"},{default:P(()=>[w(u(t(o)("toknex.adminSettingsPayment.dialog.returnBase")),1)]),_:1}),m(t(F),{id:"return-base",modelValue:n.returnBaseUrl,"onUpdate:modelValue":v[3]||(v[3]=r=>n.returnBaseUrl=r),placeholder:e.defaultBaseUrl,"data-testid":"return-base"},null,8,["modelValue","placeholder"])])):R("",!0),S.value?(p(),f("div",Rn,[m(t(I),{for:"payment-mode"},{default:P(()=>[w(u(t(o)("toknex.adminSettingsPayment.dialog.paymentMode")),1)]),_:1}),ye(c("select",{id:"payment-mode","onUpdate:modelValue":v[4]||(v[4]=r=>n.payment_mode=r),class:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm","data-testid":"payment-mode"},[(p(!0),f(A,null,H(V.value,r=>(p(),f("option",{key:r.value,value:r.value},u(t(o)(r.labelKey)),9,En))),128))],512),[[_e,n.payment_mode]])])):R("",!0),c("div",An,[c("label",Kn,[m(t(G),{modelValue:n.enabled,"onUpdate:modelValue":v[5]||(v[5]=r=>n.enabled=r),"data-testid":"provider-dialog-enabled"},null,8,["modelValue"]),w(u(t(o)("toknex.adminSettingsPayment.providers.enabled")),1)]),c("label",Mn,[m(t(G),{modelValue:n.refund_enabled,"onUpdate:modelValue":v[6]||(v[6]=r=>n.refund_enabled=r),"data-testid":"provider-dialog-refund"},null,8,["modelValue"]),w(u(t(o)("toknex.adminSettingsPayment.providers.refund")),1)]),c("label",On,[m(t(G),{modelValue:n.allow_user_refund,"onUpdate:modelValue":v[7]||
1(v[7]=r=>n.allow_user_refund=r),disabled:!n.refund_enabled,"data-testid":"provider-dialog-user-refund"},null,8,["modelValue","disabled"]),w(u(t(o)("toknex.adminSettingsPayment.providers.userRefund")),1)])]),n.provider_key==="easypay"?(p(),f("div",Bn,[c("div",In,[c("p",Dn,u(t(o)("toknex.adminSettingsPayment.dialog.customMethods")),1),m(t(X),{size:"sm",variant:"outline","data-testid":"custom-method-add",onClick:E},{default:P(()=>[w(u(t(o)("toknex.adminSettingsPayment.dialog.customMethodAdd")),1)]),_:1})]),(p(!0),f(A,null,H(n.easyPayCustomMethods,(r,$)=>(p(),f("div",{key:$,class:"mb-2 grid gap-2 sm:grid-cols-4"},[m(t(F),{modelValue:r.type,"onUpdate:modelValue":L=>r.type=L,placeholder:t(o)("toknex.adminSettingsPayment.dialog.customMethodType"),"data-testid":`custom-method-type-${$}`},null,8,["modelValue","onUpdate:modelValue","placeholder","data-testid"]),m(t(F),{modelValue:r.upstreamType,"onUpdate:modelValue":L=>r.upstreamType=L,placeholder:t(o)("toknex.adminSettingsPayment.dialog.customMethodUpstream"),"data-testid":`custom-method-upstream-${$}`},null,8,["modelValue","onUpdate:modelValue","placeholder","data-testid"]),m(t(F),{modelValue:r.displayName,"onUpdate:modelValue":L=>r.displayName=L,placeholder:t(o)("toknex.adminSettingsPayment.dialog.customMethodName"),"data-testid":`custom-method-name-${$}`},null,8,["modelValue","onUpdate:modelValue","placeholder","data-testid"]),m(t(X),{variant:"ghost",size:"sm",class:"text-destructive","data-testid":`custom-method-remove-${$}`,onClick:L=>n.easyPayCustomMethods.splice($,1)},{default:P(()=>[w(u(t(o)("toknex.common.actions.delete")),1)]),_:1},8,["data-testid","onClick"])]))),128))])):R("",!0),Z.value.length>0?(p(),f("div",Hn,[c("p",Ln,u(t(o)("toknex.adminSettingsPayment.dialog.limitsTitle")),1),c("p",Fn,u(t(o)("toknex.adminSettingsPayment.dialog.limitsHint")),1),(p(!0),f(A,null,H(Z.value,r=>(p(),f("div",{key:r,class:"mb-2 rounded-md border border-border p-3"},[c("p",{class:"mb-2 text-xs font-medium","data-testid":`bucket-title-${r}`},u(me(r)),9,Yn),c("div",jn,[(p(!0),f(A,null,H(t(Le),$=>(p(),f("div",{key:$},[m(t(I),{for:`limit-${r}-${$}`,class:"text-xs"},{default:P(()=>[w(u(t(o)(`${ee}.dialog.limit_${$}`)),1)]),_:2},1032,["for"]),m(t(F),{id:`limit-${r}-${$}`,type:"number",min:"1",step:"0.01","model-value":at(r,$),placeholder:it(r),"data-testid":`limit-${r}-${$}`,"onUpdate:modelValue":L=>ot(r,$,String(L))},null,8,["id","model-value","placeholder","data-testid","onUpdate:modelValue"])]))),128))])]))),128))])):R("",!0)])]}),_:1},8,["open","title","loading"]))}}),Wn={class:"space-y-4","data-testid":"settings-payment"},Ye="toknex.adminSettingsPayment",Ai=J({__name:"PaymentPage",setup(e,{expose:i}){const{t:a}=z(),l=ke(),{confirm:s}=pt(),o=Wt(),d=yt({fieldKeys:Kt,emptyForm:Ge,hydrate:Dt,toPayload:k=>{var U;return Lt(Ht(k),((U=o.status.value)==null?void 0:U.auto_enabled)===!0)},validate:k=>Ft(k,a),namespace:Ye}),n=zt(),h=Y(!1),y=Y(null),b=typeof window<"u"?window.location.origin:"";_t(d.dirty),ut(()=>{Promise.all([d.load(),n.load(),o.load()])}),je(n.conflict,k=>{k&&l.showError(a("toknex.adminSettingsPayment.errors.enableConflict",{method:a(`${Ye}.types.${k.method}`),provider:k.providerName}))});function N(){y.value=null,h.value=!0}function T(k){y.value=k,h.value=!0}async function g(k){await n.saveProvider(k,y.value)&&(h.value=!1)}async function C(k){await s({title:a("toknex.adminSettingsPayment.providers.deleteConfirmTitle"),description:a("toknex.adminSettingsPayment.providers.deleteConfirmBody"),destructive:!0})&&await n.removeProvider(k.id)}async function Z(k,U){await n.toggleField(k,U)}async function x(k,U){await n.toggleType(k,U)}async function S(k){await n.reorder(k)}async function V(k,U){(await n.disableByType(k)).length>0&&U()}return i({onSubmitProvider:g,onDisableType:V}),(k,U)=>(p(),f("div",Wn,[m(Zt,{form:t(d).form.value},null,8,["form"]),t(d).form.value.payment_enabled?(p(),f(A,{key:0},[m(fa,{form:t(d).form.value,"exchange-rate":t(o)},null,8,["form","exchange-rate"]),m(va,{form:t(d).form.value},null,8,["form"]),m(Sa,{form:t(d).form.value},null,8,["form"]),m(Ea,{form:t(d).form.value,onDisableType:V},null,8,["form"])],64)):R("",!0),m(an,{providers:t(n).providers.value,loading:t(n).loading.value,reordering:t(n).reordering.value,"enabled-types":t(d).form.value.payment_enabled_types,onCreate:N,onReorder:S,onEdit:T,onRemove:C,onToggle:Z,onToggleType:x},null,8,["providers","loading","reordering","enabled-types"]),m(zn,{open:h.value,editing:y.value,submitting:t(n).saving.value,"default-base-url":t(b),"enabled-keys":t(d).form.value.payment_enabled_types,onClose:U[0]||(U[0]=E=>h.value=!1),onSubmit:g},null,8,["open","editing","submitting","default-base-url","enabled-keys"]),m(ct,{dirty:t(d).dirty.value,saving:t(d).saving.value,"load-error":t(d).loadError.value,errors:t(d).errors.value,onSave:U[1]||(U[1]=E=>t(d).save()),onReset:U[2]||(U[2]=E=>t(d).reset()),onReload:U[3]||(U[3]=E=>t(d).load())},null,8,["dirty","saving","load-error","errors"])]))}});
1export{Ai 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.