fix(user-center): load revenue tabs without refresh
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user