Skip to content

Conversation

@dmallory42
Copy link
Contributor

@dmallory42 dmallory42 commented Nov 11, 2025

Fixes #

Changes proposed in this Pull Request

This implements the client-side infrastructure for WOOPMNT-5496 to fetch and manage promotional details:

PHP Backend:

  • Add PROMOTIONS_API constant to WC_Payments_API_Client
  • Create Activate_Promotion and Dismiss_Promotion request classes using modern Request pattern
  • Add REST controller with three endpoints: GET /promotions, POST /promotions/{id}/activate, POST /promotions/{id}/dismiss
  • Implement 5-minute caching with WordPress transients
  • Add helper methods for tracking dismissed and activated promotions in local state

TypeScript Data Layer:

  • Create complete Redux store at client/data/promotions/
  • Add TypeScript types, actions, reducer, selectors, and resolvers
  • Implement React hooks (usePromotions, usePromotionActions) for UI integration
  • Add proper error handling and user notifications

Testing:

  • Add unit tests for REST controller helper methods

The implementation is ready to integrate with server endpoints once available.

Testing instructions

This PR adds client-side infrastructure to fetch and manage payment method promotions. Since the wcpay-server endpoints don't exist yet, you'll need to apply test patches to use mock data.

Setup
  1. Checkout this branch and run npm install && npm start
  2. Apply the test patch:
    curl -o promotions-testing.patch https://gist.githubusercontent.com/dmallory42/152ba4be3dd00c6f3177fe0bdeb38ec4/raw/promotions-testing.patch
    git apply promotions-testing.patch

Or, view the test patch at: https://gist.github.com/dmallory42/152ba4be3dd00c6f3177fe0bdeb38ec4

Testing
  1. Navigate to WooPayments > Overview

    • You should see a "🧪 Promotions Test Display" card with 2 sample promotions
  2. Test Activate

    • Click "Activate" on a promotion and confirm
    • Should show success notice and move promotion to "Active Promotions" section
  3. Test Dismiss

    • Click "Dismiss" on a promotion and confirm
    • Should show success notice and remove promotion from list
  4. Test Persistence

    • Refresh the page after activating a promotion
    • The activated promotion should remain in "Active Promotions" with the same timestamp

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

This implements the client-side infrastructure for WOOPMNT-5496 to fetch and manage promotional details:

PHP Backend:
- Add PROMOTIONS_API constant to WC_Payments_API_Client
- Create Activate_Promotion and Dismiss_Promotion request classes using modern Request pattern
- Add REST controller with three endpoints: GET /promotions, POST /promotions/{id}/activate, POST /promotions/{id}/dismiss
- Implement 5-minute caching with WordPress transients
- Add helper methods for tracking dismissed and activated promotions in local state

TypeScript Data Layer:
- Create complete Redux store at client/data/promotions/
- Add TypeScript types, actions, reducer, selectors, and resolvers
- Implement React hooks (usePromotions, usePromotionActions) for UI integration
- Add proper error handling and user notifications

Testing:
- Add unit tests for REST controller helper methods

The implementation is ready to integrate with server endpoints once available.
@github-actions
Copy link
Contributor

github-actions bot commented Nov 11, 2025

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 11131 or branch name woopmnt-5496-add-logic-to-woopayments-client-to-fetch-promotional-details in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: 07c10ab
  • Build time: 2025-11-11 14:04:42 UTC

Note: the build is updated when a new commit is pushed to this PR.

@github-actions
Copy link
Contributor

github-actions bot commented Nov 11, 2025

Size Change: +2.66 kB (0%)

Total Size: 877 kB

Filename Size Change
release/woocommerce-payments/dist/index.js 153 kB +530 B (0%)
release/woocommerce-payments/dist/multi-currency-switcher-block.js 18.7 kB +519 B (+3%)
release/woocommerce-payments/dist/multi-currency.js 25.2 kB +505 B (+2%)
release/woocommerce-payments/dist/order.js 21.8 kB +552 B (+3%)
release/woocommerce-payments/dist/settings.js 141 kB +550 B (0%)
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.45 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.45 kB
release/woocommerce-payments/assets/css/success.css 1.06 kB
release/woocommerce-payments/assets/css/success.rtl.css 1.06 kB
release/woocommerce-payments/dist/blocks-checkout-rtl.css 3.07 kB
release/woocommerce-payments/dist/blocks-checkout.css 3.07 kB
release/woocommerce-payments/dist/blocks-checkout.js 54.5 kB
release/woocommerce-payments/dist/cart-block-rtl.css 113 B
release/woocommerce-payments/dist/cart-block.css 112 B
release/woocommerce-payments/dist/cart-block.js 16.7 kB
release/woocommerce-payments/dist/cart.js 5.27 kB
release/woocommerce-payments/dist/checkout-rtl.css 1.13 kB
release/woocommerce-payments/dist/checkout.css 1.13 kB
release/woocommerce-payments/dist/checkout.js 34.6 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 367 B
release/woocommerce-payments/dist/express-checkout.css 367 B
release/woocommerce-payments/dist/express-checkout.js 16.9 kB
release/woocommerce-payments/dist/frontend-tracks.js 833 B
release/woocommerce-payments/dist/index-rtl.css 21.2 kB
release/woocommerce-payments/dist/index.css 21.2 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.08 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.82 kB
release/woocommerce-payments/dist/multi-currency.css 3.83 kB
release/woocommerce-payments/dist/order-rtl.css 740 B
release/woocommerce-payments/dist/order.css 740 B
release/woocommerce-payments/dist/plugins-page-rtl.css 484 B
release/woocommerce-payments/dist/plugins-page.css 484 B
release/woocommerce-payments/dist/plugins-page.js 2.64 kB
release/woocommerce-payments/dist/product-details-rtl.css 433 B
release/woocommerce-payments/dist/product-details.css 436 B
release/woocommerce-payments/dist/product-details.js 12.3 kB
release/woocommerce-payments/dist/settings-rtl.css 11.8 kB
release/woocommerce-payments/dist/settings.css 11.7 kB
release/woocommerce-payments/dist/subscription-edit-page.js 703 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 1.98 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 730 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 1.9 kB
release/woocommerce-payments/dist/success.js 6.03 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 235 B
release/woocommerce-payments/dist/tos.js 3 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 5.68 kB
release/woocommerce-payments/dist/woopay-express-button.js 22.8 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.29 kB
release/woocommerce-payments/dist/woopay.css 4.27 kB
release/woocommerce-payments/dist/woopay.js 70.8 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 625 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/jetpack-script-data.js 957 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.02 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/script-data.js 69 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/babel.config.js 163 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.js 14.3 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.rtl.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.js 29.7 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.rtl.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 280 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 625 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 333 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 626 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 417 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-users-connection.js 161 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 585 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 215 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 721 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 412 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 625 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.04 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 294 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 408 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.59 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 301 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 746 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 574 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 414 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 543 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.78 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.84 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 545 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.7 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 507 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 358 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 428 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 782 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.09 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.26 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 391 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.04 kB

compressed-size-action

dmallory42 and others added 5 commits November 11, 2025 12:24
- Use $request instead of $wp_request for WP_REST_Request parameters
- Use $wcpay_request for WCPay Request objects
- Use send() instead of handle_rest_request() for caching to get raw data
- Remove incorrect $response->data access pattern
- Add require_once for WC_REST_Payments_Promotions_Controller in bootstrap.php
- Fixes class not found error in unit tests
- Tests now pass with 13 assertions
Adds the PROMOTIONS_API constant to the route_list array in the Request class to allow promotions API calls to pass validation. This enables the GET /promotions, POST /promotions/{id}/activate, and POST /promotions/{id}/dismiss endpoints to function correctly.

Without this fix, all promotions API calls would fail with an "Invalid request api route" exception.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
The selectors were incorrectly typed to expect only the PromotionsState slice, but @wordpress/data passes the full Redux store state to selectors. Updated all selectors to:

1. Accept the full Redux state with `{ promotions: PromotionsState }`
2. Access `state.promotions.promotions` instead of `state.promotions`
3. Access `state.promotions.promotionsError` for errors

This fixes the issue where usePromotions() was returning undefined for available_promotions even though the data was in the store.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
These functions are mutation actions, not data resolvers, so they need to be exported from actions.ts to be available via useDispatch.

Changes:
- Moved activatePromotion and dismissPromotion from resolvers.ts to actions.ts
- Updated to use invalidateResolution instead of calling getPromotions directly
- These are now properly available as dispatchable actions via usePromotionActions hook

This fixes the "activatePromotion is not a function" error when trying to use the promotion actions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants