From e429b59077d093233a021bf13f6839fb238ce2d1 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Aug 2026 03:27:42 +0800 Subject: [PATCH] (fix):update user profile toast --- assets/css/routes/profile/layout.css | 7 ---- assets/css/routes/profile/lists.css | 4 --- assets/js/routes/user-center.js | 32 +++++++++++-------- .../user-center-renderers/profile-form.php | 1 - src/Core/ScriptsPart1b.php | 4 +-- templates/pages/page-profile.php | 21 ------------ tests/widget-system/toast-contract.test.cjs | 20 ++++++++++++ 7 files changed, 41 insertions(+), 48 deletions(-) diff --git a/assets/css/routes/profile/layout.css b/assets/css/routes/profile/layout.css index c1c2a060..1a962bdf 100644 --- a/assets/css/routes/profile/layout.css +++ b/assets/css/routes/profile/layout.css @@ -419,13 +419,6 @@ background: none; border: none; } -.profile-form__submit-msg { - font-size: 14px; - color: var(--color-ink-3); -} -.profile-form__submit-msg.is-error { - color: var(--color-error); -} .profile-add-contact { margin-top: 8px; } diff --git a/assets/css/routes/profile/lists.css b/assets/css/routes/profile/lists.css index e2501d94..2f6f9ae4 100644 --- a/assets/css/routes/profile/lists.css +++ b/assets/css/routes/profile/lists.css @@ -449,10 +449,6 @@ color: var(--color-error); } -/* ---- 保存反馈 ---- */ -#profile-save-msg.success { color: var(--color-success); } -#profile-save-msg.error { color: var(--color-error); } - /* ==================== 账号设置区 ==================== */ .settings-section { margin-bottom: 20px; diff --git a/assets/js/routes/user-center.js b/assets/js/routes/user-center.js index 4ec42be7..d7554048 100644 --- a/assets/js/routes/user-center.js +++ b/assets/js/routes/user-center.js @@ -261,43 +261,49 @@ /* ==================== 个人信息保存 ==================== */ - function initProfileForm() { - var form = document.getElementById('profile-form'); + function initProfileForm(root) { + root = root || document; + var form = root.id === 'profile-form' ? root : root.querySelector('#profile-form'); if (!form) return; + if (form.dataset.aksrtProfileInitialized === 'true') return; + form.dataset.aksrtProfileInitialized = 'true'; form.addEventListener('submit', function(e) { e.preventDefault(); - var btn = document.getElementById('profile-save-btn'); - var msg = document.getElementById('profile-save-msg'); + var btn = form.querySelector('#profile-save-btn'); + if (!btn || btn.disabled) return; btn.disabled = true; btn.textContent = i18n.saving || '保存中…'; - msg.className = 'profile-form__submit-msg'; - msg.textContent = ''; + notyf(i18n.saving || '正在保存资料…', 'load', '', 'aksrt-profile-save-toast'); var data = new FormData(form); - data.append('user_id', String(userId)); + data.set('user_id', String(userId)); - fetch(ajaxUrl, { method: 'POST', body: data }) + fetch(ajaxUrl, { method: 'POST', credentials: 'same-origin', body: data }) .then(function(r) { return r.json(); }) .then(function(res) { btn.disabled = false; btn.textContent = i18n.saveBtn || '保存修改'; if (res.success) { - notyf(i18n.saved || '已保存'); + notyf((res.data && res.data.message) || i18n.saved || '保存成功!', 'success', 5, 'aksrt-profile-save-toast'); } else { - msg.className = 'profile-form__submit-msg is-error'; - msg.textContent = res.data.message || (i18n.saveFailed || '保存失败'); + notyf((res.data && res.data.message) || i18n.saveFailed || '保存失败', 'danger', 5, 'aksrt-profile-save-toast'); } }) .catch(function() { btn.disabled = false; btn.textContent = i18n.saveBtn || '保存修改'; - msg.className = 'profile-form__submit-msg is-error'; - msg.textContent = i18n.networkError || '网络错误,请重试'; + notyf(i18n.networkError || '网络错误,请重试', 'danger', 5, 'aksrt-profile-save-toast'); }); }); } + if (window.AksrtFrontend && typeof window.AksrtFrontend.register === 'function') { + window.AksrtFrontend.register('aksrt-profile-form', function(root) { + initProfileForm(root); + }); + } + function initAuthForm() { var root = document.querySelector('[data-identity-root]'); if (root && window.AKSRTUserCenterAuth && typeof window.AKSRTUserCenterAuth.init === 'function') { diff --git a/inc/helpers/user-center-renderers/profile-form.php b/inc/helpers/user-center-renderers/profile-form.php index d694fd59..97e1b065 100644 --- a/inc/helpers/user-center-renderers/profile-form.php +++ b/inc/helpers/user-center-renderers/profile-form.php @@ -64,6 +64,5 @@ $profile_details = isset($profile_details) && is_array($profile_details) ? $prof - diff --git a/src/Core/ScriptsPart1b.php b/src/Core/ScriptsPart1b.php index 4ffbe962..63ed268e 100644 --- a/src/Core/ScriptsPart1b.php +++ b/src/Core/ScriptsPart1b.php @@ -511,8 +511,8 @@ $hmb_js = get_template_directory() . '/assets/js/header-newadd.js'; ); } $user_center_deps = file_exists($identity_js) - ? ['aksrt-script', 'aksrt-route-user-center-auth'] - : ['aksrt-script']; + ? ['aksrt-script', 'aksrt-route-user-center-auth', 'aksrt-notyf'] + : ['aksrt-script', 'aksrt-notyf']; if ($has_orders_panel && wp_script_is('aksrt-order-center', 'registered')) { $user_center_deps[] = 'aksrt-order-center'; } diff --git a/templates/pages/page-profile.php b/templates/pages/page-profile.php index 1ca96564..cc6cc111 100644 --- a/templates/pages/page-profile.php +++ b/templates/pages/page-profile.php @@ -17,22 +17,6 @@ if (!is_user_logged_in()) { } $current_user = wp_get_current_user(); -$user_id = (int) $current_user->ID; - -if ('POST' === ($_SERVER['REQUEST_METHOD'] ?? '') && isset($_POST['action']) && 'aksrt_save_profile' === sanitize_key(wp_unslash($_POST['action']))) { - $nonce = isset($_POST['_profile_nonce']) ? sanitize_text_field(wp_unslash($_POST['_profile_nonce'])) : ''; - if (!wp_verify_nonce($nonce, 'aksrt_profile_save')) { - $result = new WP_Error('aksrt_profile_nonce', __('安全验证失败,请刷新页面重试', 'aksrt')); - } else { - $result = aksrt_save_user_center_profile($user_id, $_POST); - } - - $redirect_args = is_wp_error($result) - ? ['profile_error' => $result->get_error_message()] - : ['saved' => '1']; - wp_safe_redirect(add_query_arg($redirect_args, aksrt_get_user_center_tab_url('profile'))); - exit; -} $render_context = aksrt_get_user_center_render_context($current_user); @@ -49,11 +33,6 @@ get_header();
- -
- - - $render_context]); ?> $panel]); ?> diff --git a/tests/widget-system/toast-contract.test.cjs b/tests/widget-system/toast-contract.test.cjs index 16c559a8..4ca2a3ca 100644 --- a/tests/widget-system/toast-contract.test.cjs +++ b/tests/widget-system/toast-contract.test.cjs @@ -259,6 +259,26 @@ test('VIP purchase and points exchange use direct fixed-id notyf flows', () => { assert.match(scripts, /'aksrt-pay-vip',[\s\S]*?\/assets\/js\/pay-vip\.js',[\s\S]*?\[[^\]]*'aksrt-notyf'[^\]]*\]/); }); +test('profile save uses AJAX rehydrate and a fixed-id notyf flow without query feedback', () => { + const profile = read('assets/js/routes/user-center.js'); + const page = read('templates/pages/page-profile.php'); + const form = read('inc/helpers/user-center-renderers/profile-form.php'); + const layout = read('assets/css/routes/profile/layout.css'); + const lists = read('assets/css/routes/profile/lists.css'); + const scripts = read('src/Core/ScriptsPart1b.php'); + + assert.match(profile, /function initProfileForm\(root\)[\s\S]*?aksrtProfileInitialized[\s\S]*?addEventListener\('submit'/); + assert.match(profile, /register\('aksrt-profile-form',[\s\S]*?initProfileForm\(root\)/); + assert.match(profile, /notyf\([^;]+?'load'[^;]+?'aksrt-profile-save-toast'\);/); + assert.match(profile, /notyf\([^;]+?'success'[^;]+?'aksrt-profile-save-toast'\);/); + assert.match(profile, /notyf\([^;]+?'danger'[^;]+?'aksrt-profile-save-toast'\);/); + assert.match(profile, /fetch\(ajaxUrl, \{ method: 'POST', credentials: 'same-origin', body: data \}\)/); + assert.match(scripts, /\$user_center_deps[\s\S]*?\[[^\]]*'aksrt-notyf'[^\]]*\][\s\S]*?\/assets\/js\/routes\/user-center\.js/); + + assert.doesNotMatch(page, /REQUEST_METHOD|profile_error|['"]saved['"]|add_query_arg/); + assert.doesNotMatch([profile, form, layout, lists].join('\n'), /profile-save-msg|profile-form__submit-msg/); +}); + test('legacy frontend toast APIs and selectors are fully removed', () => { const files = [ 'assets/js',