feat(ux): shared ajax-list/remote-modal + order review modal 1:1

Add zibll-parity AjaxList/RemoteModal engines and replace order-center
prompt() review flow with multi-dim star modal, multi-image upload,
auto-praise countdown, and REST review-modal endpoint.
This commit is contained in:
2026-07-18 16:26:28 +08:00
parent 081da99528
commit e2587ca3a0
12 changed files with 1499 additions and 48 deletions
+6
View File
@@ -373,6 +373,12 @@ class ShopController extends ControllerBase {
'permission_callback' => [$this, 'check_logged_in_permission'],
]);
register_rest_route(self::API_NAMESPACE, '/shop/frontend/orders/(?P<order_number>[A-Za-z0-9]+)/review-modal', [
'methods' => 'GET',
'callback' => [$this, 'get_frontend_product_review_modal'],
'permission_callback' => [$this, 'check_logged_in_permission'],
]);
register_rest_route(self::API_NAMESPACE, '/shop/frontend/products/(?P<id>\d+)/favorite', [
'methods' => 'POST',
'callback' => [$this, 'toggle_frontend_product_favorite'],
@@ -533,11 +533,35 @@ trait ShopControllerFrontendFlowOperations {
return $this->error($result['message'] ?? __('评价失败', 'aksrt'));
}
return $this->success([
'message' => __('评价已提交', 'aksrt'),
'message' => __('评价成功', 'aksrt'),
'data' => $result,
], 201);
}
/**
* GET review modal HTML for an order (zibll order_comment_modal parity).
*/
public function get_frontend_product_review_modal(\WP_REST_Request $request): \WP_REST_Response {
if (!class_exists('\AKSRT\Shop\ProductReview')) {
return $this->error(__('评价服务不可用', 'aksrt'), 500);
}
$order_number = sanitize_text_field((string) $request->get_param('order_number'));
$result = \AKSRT\Shop\ProductReview::get_instance()->get_review_modal_html(
get_current_user_id(),
$order_number
);
if (empty($result['success'])) {
return $this->error((string) ($result['message'] ?? __('无法打开评价', 'aksrt')));
}
return $this->success([
'html' => (string) ($result['html'] ?? ''),
'product_id' => (int) ($result['product_id'] ?? 0),
'need_shipping' => !empty($result['need_shipping']),
'img_max' => (int) ($result['img_max'] ?? 0),
'remain_seconds' => (int) ($result['remain_seconds'] ?? 0),
]);
}
public function create_frontend_product(\WP_REST_Request $request): \WP_REST_Response {
$params = $this->get_json_params($request);
$params['author_id'] = get_current_user_id();