Merge pull request 'fix(user-center): reuse balance withdrawal modal' (#394) from fix/reuse-balance-withdraw-modal into main

Reviewed-on: CYL/wordpress-theme-aksrt#394
This commit is contained in:
2026-08-06 14:34:09 +08:00
6 changed files with 65 additions and 141 deletions
+6 -3
View File
@@ -905,9 +905,10 @@
});
}
function initWithdraw() {
var modal = document.querySelector('[data-aksrt-withdraw-modal]');
if (!modal) return;
function initWithdraw() {
var modal = document.querySelector('[data-aksrt-withdraw-modal]');
if (!modal || modal.dataset.aksrtWithdrawInitialized === '1') return;
modal.dataset.aksrtWithdrawInitialized = '1';
var form = modal.querySelector('[data-aksrt-withdraw-form]');
var tip = modal.querySelector('[data-aksrt-withdraw-tip]');
var busy = false;
@@ -1002,6 +1003,8 @@
});
}
window.AKSRTWithdrawInit = initWithdraw;
function bootAssets() {
initSignin();
initSigninGoto();
+1 -91
View File
@@ -163,97 +163,6 @@
});
});
}
var withdrawModal = root.querySelector('[data-aksrt-commission-withdraw-modal]') || document.querySelector('[data-aksrt-commission-withdraw-modal]');
var withdrawForm = withdrawModal && withdrawModal.querySelector('[data-aksrt-commission-withdraw-form]');
var withdrawTip = withdrawModal && withdrawModal.querySelector('[data-aksrt-commission-withdraw-tip]');
var withdrawSubmit = withdrawModal && withdrawModal.querySelector('[data-aksrt-commission-withdraw-submit]');
var lastWithdrawTrigger = null;
var withdrawBusy = false;
function setWithdrawTip(text, error) {
if (!withdrawTip) return;
withdrawTip.textContent = text || '';
withdrawTip.classList.toggle('is-error', !!error);
}
function setWithdrawBusy(isBusy) {
withdrawBusy = isBusy;
if (withdrawSubmit) withdrawSubmit.disabled = isBusy;
}
function getWithdrawFocusable() {
return Array.prototype.slice.call(withdrawModal.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'));
}
function closeWithdrawModal() {
if (!withdrawModal || withdrawModal.hidden) return;
withdrawModal.hidden = true;
document.body.classList.remove('uc-modal-open');
if (lastWithdrawTrigger && typeof lastWithdrawTrigger.focus === 'function') {
lastWithdrawTrigger.focus();
}
}
if (withdrawModal && withdrawForm) {
document.querySelectorAll('[data-aksrt-commission-withdraw-open]').forEach(function (button) {
button.addEventListener('click', function () {
lastWithdrawTrigger = button;
withdrawModal.hidden = false;
document.body.classList.add('uc-modal-open');
window.requestAnimationFrame(function () {
var amountInput = withdrawForm.querySelector('[data-aksrt-commission-withdraw-amount]');
if (amountInput) amountInput.focus();
});
});
});
withdrawModal.querySelectorAll('[data-aksrt-commission-withdraw-close]').forEach(function (button) {
button.addEventListener('click', closeWithdrawModal);
});
document.addEventListener('keydown', function (event) {
if (withdrawModal.hidden) return;
if (event.key === 'Escape') {
event.preventDefault();
closeWithdrawModal();
return;
}
if (event.key !== 'Tab') return;
var focusable = getWithdrawFocusable();
if (!focusable.length) return;
var first = focusable[0];
var last = focusable[focusable.length - 1];
if (event.shiftKey && document.activeElement === first) {
event.preventDefault();
last.focus();
} else if (!event.shiftKey && document.activeElement === last) {
event.preventDefault();
first.focus();
}
});
withdrawForm.addEventListener('submit', function (event) {
event.preventDefault();
if (withdrawBusy) return;
var values = new FormData(withdrawForm);
var amount = Number(values.get('amount') || 0);
var minimum = Number(root.getAttribute('data-min-amount') || 50);
var account = String(values.get('account_info') || '').trim();
if (amount < minimum) { setWithdrawTip('提现金额未达到最低额度', true); return; }
if (!account) { setWithdrawTip('请填写收款账户信息', true); return; }
setWithdrawTip('正在提交...', false);
setWithdrawBusy(true);
fetch(rest + '/pay/balance/withdraw', { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': data.restNonce || data.nonce || '' }, body: JSON.stringify({ amount: amount, method: values.get('method') || 'alipay', account_info: account }) }).then(function (response) {
return response.json().catch(function () { return {}; }).then(function (json) { return { ok: response.ok, json: json }; });
}).then(function (result) {
if (!result.ok || !result.json || !result.json.success) { setWithdrawBusy(false); setWithdrawTip((result.json && result.json.message) || '提现申请失败', true); return; }
setWithdrawTip('提现申请已提交', false);
if (result.json.data && typeof result.json.data.wallet_balance !== 'undefined') {
var balanceEl = root.querySelector('[data-aksrt-revenue-balance]');
if (balanceEl) balanceEl.textContent = Number(result.json.data.wallet_balance).toFixed(2);
}
withdrawForm.reset();
setWithdrawBusy(false);
closeWithdrawModal();
reloadRevenuePanel().catch(function () {
if (typeof showToast === 'function') showToast('提现已提交,但收益数据刷新失败');
});
}).catch(function () { setWithdrawBusy(false); setWithdrawTip('网络错误,请稍后重试', true); });
});
}
}
function initRewardNavigation(root, rest, data) {
@@ -278,6 +187,7 @@
current.replaceWith(next);
window.history.pushState({}, '', targetUrl);
window.AKSRTRevenueCenterInit(next);
if (typeof window.AKSRTWithdrawInit === 'function') window.AKSRTWithdrawInit();
});
}).catch(function () {
if (typeof showToast === 'function') showToast('加载失败,请重试');
@@ -237,37 +237,18 @@ $mark = (string) ($charge_view['currency_mark'] ?? '元');
</div>
<?php endif; ?>
<?php if ($withdraw_on) : ?>
<div class="uc-modal" id="aksrt-withdraw-modal" hidden data-aksrt-withdraw-modal>
<div class="uc-modal__overlay" data-aksrt-withdraw-close></div>
<div class="uc-modal__dialog" role="dialog" aria-modal="true">
<button type="button" class="uc-modal__close" data-aksrt-withdraw-close aria-label="<?php esc_attr_e('关闭', 'aksrt'); ?>"><i class="fas fa-times" aria-hidden="true"></i></button>
<h3 class="uc-modal__title"><?php esc_html_e('余额提现', 'aksrt'); ?></h3>
<form data-aksrt-withdraw-form>
<label class="muted-color em09"><?php esc_html_e('提现金额', 'aksrt'); ?></label>
<input type="number" class="uc-card-pass__input" name="amount" min="<?php echo esc_attr((string) $withdraw_min); ?>" step="0.01" data-aksrt-withdraw-amount>
<p class="muted-2-color em09 mt6"><?php printf(esc_html__('最低提现 %s 元,当前余额 %s', 'aksrt'), esc_html((string) $withdraw_min), esc_html($wallet_fmt)); ?></p>
<label class="muted-color em09 mt10"><?php esc_html_e('收款方式', 'aksrt'); ?></label>
<select class="uc-card-pass__input" name="method" data-aksrt-withdraw-method>
<option value="alipay"><?php esc_html_e('支付宝', 'aksrt'); ?></option>
<option value="wechat"><?php esc_html_e('微信', 'aksrt'); ?></option>
<option value="bank"><?php esc_html_e('银行卡', 'aksrt'); ?></option>
</select>
<label class="muted-color em09 mt10"><?php esc_html_e('收款账号信息', 'aksrt'); ?></label>
<textarea class="uc-card-pass__input" name="account" rows="3" data-aksrt-withdraw-account placeholder="<?php esc_attr_e('姓名 + 账号 / 卡号', 'aksrt'); ?>"></textarea>
<p class="uc-modal__tip" data-aksrt-withdraw-tip></p>
<button type="submit" class="but jb-blue btn-block" data-aksrt-withdraw-submit><?php esc_html_e('提交申请', 'aksrt'); ?></button>
</form>
</div>
</div>
<?php endif; ?>
<?php if ($withdraw_on) :
$withdraw_modal_rendered = !empty($GLOBALS['aksrt_withdraw_modal_rendered']);
if (!$withdraw_modal_rendered) {
require __DIR__ . '/withdraw-modal.php';
}
endif; ?>
<?php if ($withdraw_on) :
$status_labels = [
'pending' => __('待处理', 'aksrt'),
'approved' => __('已通过', 'aksrt'),
'processing' => __('处理中', 'aksrt'),
'processing' => __('处理中', 'aksrt'),
'completed' => __('已完成', 'aksrt'),
'rejected' => __('已拒绝', 'aksrt'),
];
@@ -30,6 +30,9 @@ if ($withdraw_on && class_exists('\AKSRT\Settings\Capabilities') && !\AKSRT\Sett
$withdraw_on = false;
}
$withdraw_min = max(1, (float) ($all_settings['pay_balance_withdraw_lowest_money'] ?? $all_settings['pay_rebate_withdraw_lowest_money'] ?? $withdrawal['min_amount'] ?? 50));
$wallet_fmt = class_exists('\AKSRT\Credits\Balance')
? \AKSRT\Credits\Balance::format((float) \AKSRT\Credits\Balance::balance($user_id))
: '0.00';
$commission_stats = class_exists('\AKSRT\Payment\Rebate')
? \AKSRT\Payment\Rebate::get_instance()->get_stats($user_id)
@@ -110,7 +113,7 @@ $status_labels = [
<span><?php printf(esc_html__('累计佣金 %s,待结算 %s', 'aksrt'), esc_html($format_amount($commission_stats['total_amount'] ?? 0)), esc_html($format_amount($commission_stats['pending_amount'] ?? 0))); ?></span>
</div>
<?php if ($withdraw_on) : ?>
<button type="button" class="uc-commission-card__action" data-aksrt-commission-withdraw-open><i class="fas fa-arrow-right" aria-hidden="true"></i><?php esc_html_e('立即提现', 'aksrt'); ?></button>
<button type="button" class="uc-commission-card__action" data-aksrt-withdraw-open><i class="fas fa-arrow-right" aria-hidden="true"></i><?php esc_html_e('立即提现', 'aksrt'); ?></button>
<?php endif; ?>
</article>
</section>
@@ -175,21 +178,6 @@ $status_labels = [
<?php endif; ?>
</section>
</div>
<?php if ($withdraw_on) : ?>
<div class="uc-modal" id="aksrt-commission-withdraw-modal" hidden data-aksrt-commission-withdraw-modal>
<div class="uc-modal__overlay" data-aksrt-commission-withdraw-close></div>
<div class="uc-modal__dialog" role="dialog" tabindex="-1" aria-modal="true" aria-labelledby="aksrt-commission-withdraw-title">
<button type="button" class="uc-modal__close" data-aksrt-commission-withdraw-close aria-label="<?php esc_attr_e('关闭', 'aksrt'); ?>"><i class="fas fa-times" aria-hidden="true"></i></button>
<h3 class="uc-modal__title" id="aksrt-commission-withdraw-title"><?php esc_html_e('立即提现', 'aksrt'); ?></h3>
<form data-aksrt-commission-withdraw-form>
<label><?php esc_html_e('提现金额', 'aksrt'); ?><input type="number" name="amount" min="<?php echo esc_attr((string) $withdraw_min); ?>" step="0.01" data-aksrt-commission-withdraw-amount required></label>
<p class="muted-2-color em09"><?php printf(esc_html__('最低提现 %s,当前可提现 %s', 'aksrt'), esc_html($format_amount($withdraw_min)), esc_html($format_amount($available_commission))); ?></p>
<label><?php esc_html_e('提现方式', 'aksrt'); ?><select name="method" data-aksrt-commission-withdraw-method><option value="alipay"><?php esc_html_e('支付宝', 'aksrt'); ?></option><option value="wechat"><?php esc_html_e('微信', 'aksrt'); ?></option><option value="bank"><?php esc_html_e('银行卡', 'aksrt'); ?></option></select></label>
<label><?php esc_html_e('收款账户信息', 'aksrt'); ?><textarea name="account_info" rows="3" data-aksrt-commission-withdraw-account required placeholder="<?php esc_attr_e('姓名 + 账号 / 卡号', 'aksrt'); ?>"></textarea></label>
<p class="uc-modal__tip" data-aksrt-commission-withdraw-tip role="status" aria-live="polite"></p>
<button type="submit" class="btn-primary btn-block" data-aksrt-commission-withdraw-submit><?php esc_html_e('提交申请', 'aksrt'); ?></button>
</form>
</div>
</div>
<?php endif; ?>
<?php if ($withdraw_on) {
require __DIR__ . '/withdraw-modal.php';
} ?>
@@ -0,0 +1,39 @@
<?php
/**
* Shared balance withdrawal modal.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
if (!empty($GLOBALS['aksrt_withdraw_modal_rendered'])) {
return;
}
$GLOBALS['aksrt_withdraw_modal_rendered'] = true;
$withdraw_min = max(1, (float) ($withdraw_min ?? 50));
$wallet_fmt = (string) ($wallet_fmt ?? '0.00');
?>
<div class="uc-modal" id="aksrt-withdraw-modal" hidden data-aksrt-withdraw-modal>
<div class="uc-modal__overlay" data-aksrt-withdraw-close></div>
<div class="uc-modal__dialog" role="dialog" aria-modal="true">
<button type="button" class="uc-modal__close" data-aksrt-withdraw-close aria-label="<?php esc_attr_e('关闭', 'aksrt'); ?>"><i class="fas fa-times" aria-hidden="true"></i></button>
<h3 class="uc-modal__title"><?php esc_html_e('余额提现', 'aksrt'); ?></h3>
<form data-aksrt-withdraw-form>
<label class="muted-color em09"><?php esc_html_e('提现金额', 'aksrt'); ?></label>
<input type="number" class="uc-card-pass__input" name="amount" min="<?php echo esc_attr((string) $withdraw_min); ?>" step="0.01" data-aksrt-withdraw-amount>
<p class="muted-2-color em09 mt6"><?php printf(esc_html__('最低提现 %s 元,当前余额 %s', 'aksrt'), esc_html((string) $withdraw_min), esc_html($wallet_fmt)); ?></p>
<label class="muted-color em09 mt10"><?php esc_html_e('收款方式', 'aksrt'); ?></label>
<select class="uc-card-pass__input" name="method" data-aksrt-withdraw-method>
<option value="alipay"><?php esc_html_e('支付宝', 'aksrt'); ?></option>
<option value="wechat"><?php esc_html_e('微信', 'aksrt'); ?></option>
<option value="bank"><?php esc_html_e('银行卡', 'aksrt'); ?></option>
</select>
<label class="muted-color em09 mt10"><?php esc_html_e('收款账号信息', 'aksrt'); ?></label>
<textarea class="uc-card-pass__input" name="account" rows="3" data-aksrt-withdraw-account placeholder="<?php esc_attr_e('姓名 + 账号 / 卡号', 'aksrt'); ?>"></textarea>
<p class="uc-modal__tip" data-aksrt-withdraw-tip></p>
<button type="submit" class="but jb-blue btn-block" data-aksrt-withdraw-submit><?php esc_html_e('提交申请', 'aksrt'); ?></button>
</form>
</div>
</div>
+5 -2
View File
@@ -215,6 +215,9 @@ $hmb_js = get_template_directory() . '/assets/js/header-newadd.js';
$credits_on = is_user_logged_in()
&& class_exists('\AKSRT\Settings\Settings')
&& \AKSRT\Settings\Settings::credits_enabled();
$balance_on = is_user_logged_in()
&& class_exists('\AKSRT\Credits\Balance')
&& \AKSRT\Credits\Balance::enabled();
$vip_coordinator = get_template_directory() . '/assets/js/vip-purchase-coordinator.js';
if (($vip_on || $credits_on) && file_exists($vip_coordinator)) {
wp_enqueue_script(
@@ -890,10 +893,10 @@ $hmb_js = get_template_directory() . '/assets/js/header-newadd.js';
}
// 积分相关:已登录 + 启用积分功能时全站加载
if ($credits_on) {
if ($credits_on || $balance_on) {
$enqueue_module('credits');
// profile 页:加载 credits.js(签到 + 邀请交互)
// profile 页:加载 credits.js(签到 + 邀请 + 提现交互)
if ($is_profile_page) {
$credits_js_path = get_template_directory() . '/assets/js/credits.js';
wp_enqueue_script(