fix(user-center): load revenue tabs without refresh

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 10:42:32 +08:00
co-authored by Claude Fable 5
parent 39c92017d9
commit 02fcde3c84
7 changed files with 169 additions and 41 deletions
+74
View File
@@ -25,6 +25,80 @@ class Center {
public function init(): void {
$this->register_default_panels();
add_action('rest_api_init', [$this, 'register_rest_routes']);
}
/**
* Register user-center fragment routes.
*/
public function register_rest_routes(): void {
register_rest_route('aksrt/v1', '/user-center/panel/(?P<tab>[a-z0-9_-]+)', [
'methods' => \WP_REST_Server::READABLE,
'callback' => [$this, 'rest_panel'],
'permission_callback' => static function (): bool {
return is_user_logged_in();
},
'args' => [
'tab' => [
'required' => true,
'sanitize_callback' => 'sanitize_key',
'validate_callback' => static function ($value): bool {
return preg_match('/^[a-z0-9_-]+$/', (string) $value) === 1;
},
],
],
]);
}
/**
* Render a user-center panel or a revenue reward fragment.
*/
public function rest_panel(\WP_REST_Request $request) {
$tab = sanitize_key((string) $request->get_param('tab'));
$tabs = $this->get_dashboard_tabs();
if (!isset($tabs[$tab])) {
return new \WP_Error('aksrt_user_center_panel', __('用户中心面板不存在', 'aksrt'), ['status' => 404]);
}
$user = wp_get_current_user();
$context = function_exists('aksrt_get_user_center_render_context')
? aksrt_get_user_center_render_context($user)
: [];
if (!is_array($context) || !$context) {
return new \WP_Error('aksrt_user_center_context', __('用户中心数据加载失败', 'aksrt'), ['status' => 500]);
}
$revenue_request = [];
if ($tab === 'revenue') {
$reward_tab = sanitize_key((string) $request->get_param('reward_tab'));
if (!in_array($reward_tab, ['detail', 'orders', 'users'], true)) {
$reward_tab = 'detail';
}
$revenue_request = [
'reward_tab' => $reward_tab,
'commission_page' => max(1, min(100, (int) $request->get_param('commission_page'))),
'invite_page' => max(1, min(100, (int) $request->get_param('invite_page'))),
];
$context['revenue_request'] = $revenue_request;
}
$html = function_exists('aksrt_capture_user_center_panel')
? aksrt_capture_user_center_panel($tab, $tabs[$tab], $context)
: '';
if ($html === '') {
return new \WP_Error('aksrt_user_center_panel_empty', __('用户中心面板暂不可用', 'aksrt'), ['status' => 500]);
}
return rest_ensure_response([
'success' => true,
'data' => [
'tab' => $tab,
'html' => $html,
'reward_tab' => $revenue_request['reward_tab'] ?? '',
'commission_page' => $revenue_request['commission_page'] ?? 1,
'invite_page' => $revenue_request['invite_page'] ?? 1,
],
]);
}
/**