@akinon/next 2.0.0-beta.2 → 2.0.0-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/.eslintrc.js +12 -0
  2. package/CHANGELOG.md +377 -7
  3. package/__tests__/next-config.test.ts +83 -0
  4. package/__tests__/tsconfig.json +23 -0
  5. package/api/auth.ts +133 -44
  6. package/api/barcode-search.ts +59 -0
  7. package/api/cache.ts +41 -5
  8. package/api/client.ts +21 -4
  9. package/api/form.ts +85 -0
  10. package/api/image-proxy.ts +75 -0
  11. package/api/product-categories.ts +53 -0
  12. package/api/similar-product-list.ts +63 -0
  13. package/api/similar-products.ts +111 -0
  14. package/api/virtual-try-on.ts +382 -0
  15. package/assets/styles/index.scss +84 -0
  16. package/babel.config.js +6 -0
  17. package/bin/pz-generate-routes.js +115 -0
  18. package/bin/pz-prebuild.js +1 -0
  19. package/bin/pz-predev.js +1 -0
  20. package/bin/pz-run-tests.js +99 -0
  21. package/bin/run-prebuild-tests.js +46 -0
  22. package/components/accordion.tsx +20 -5
  23. package/components/button.tsx +51 -36
  24. package/components/client-root.tsx +138 -2
  25. package/components/file-input.tsx +65 -3
  26. package/components/index.ts +1 -0
  27. package/components/input.tsx +1 -1
  28. package/components/link.tsx +46 -16
  29. package/components/logger-popup.tsx +213 -0
  30. package/components/modal.tsx +32 -16
  31. package/components/plugin-module.tsx +62 -3
  32. package/components/price.tsx +2 -2
  33. package/components/select.tsx +1 -1
  34. package/components/selected-payment-option-view.tsx +21 -0
  35. package/components/theme-editor/blocks/accordion-block.tsx +136 -0
  36. package/components/theme-editor/blocks/block-renderer-registry.tsx +77 -0
  37. package/components/theme-editor/blocks/button-block.tsx +593 -0
  38. package/components/theme-editor/blocks/counter-block.tsx +348 -0
  39. package/components/theme-editor/blocks/divider-block.tsx +20 -0
  40. package/components/theme-editor/blocks/embed-block.tsx +208 -0
  41. package/components/theme-editor/blocks/group-block.tsx +116 -0
  42. package/components/theme-editor/blocks/hotspot-block.tsx +147 -0
  43. package/components/theme-editor/blocks/icon-block.tsx +230 -0
  44. package/components/theme-editor/blocks/image-block.tsx +137 -0
  45. package/components/theme-editor/blocks/image-gallery-block.tsx +269 -0
  46. package/components/theme-editor/blocks/input-block.tsx +123 -0
  47. package/components/theme-editor/blocks/link-block.tsx +216 -0
  48. package/components/theme-editor/blocks/lottie-block.tsx +325 -0
  49. package/components/theme-editor/blocks/map-block.tsx +89 -0
  50. package/components/theme-editor/blocks/slider-block.tsx +595 -0
  51. package/components/theme-editor/blocks/tab-block.tsx +10 -0
  52. package/components/theme-editor/blocks/text-block.tsx +52 -0
  53. package/components/theme-editor/blocks/video-block.tsx +122 -0
  54. package/components/theme-editor/components/action-toolbar.tsx +305 -0
  55. package/components/theme-editor/components/designer-overlay.tsx +74 -0
  56. package/components/theme-editor/components/with-designer-features.tsx +142 -0
  57. package/components/theme-editor/dynamic-font-loader.tsx +79 -0
  58. package/components/theme-editor/hooks/use-designer-features.tsx +100 -0
  59. package/components/theme-editor/hooks/use-external-designer.tsx +95 -0
  60. package/components/theme-editor/hooks/use-native-widget-data.ts +188 -0
  61. package/components/theme-editor/hooks/use-visibility-context.ts +27 -0
  62. package/components/theme-editor/placeholder-registry.ts +31 -0
  63. package/components/theme-editor/sections/before-after-section.tsx +245 -0
  64. package/components/theme-editor/sections/contact-form-section.tsx +563 -0
  65. package/components/theme-editor/sections/countdown-campaign-banner-section.tsx +433 -0
  66. package/components/theme-editor/sections/coupon-banner-section.tsx +710 -0
  67. package/components/theme-editor/sections/divider-section.tsx +62 -0
  68. package/components/theme-editor/sections/featured-product-spotlight-section.tsx +507 -0
  69. package/components/theme-editor/sections/find-in-store-section.tsx +1995 -0
  70. package/components/theme-editor/sections/hover-showcase-section.tsx +326 -0
  71. package/components/theme-editor/sections/image-hotspot-section.tsx +142 -0
  72. package/components/theme-editor/sections/installment-options-section.tsx +1065 -0
  73. package/components/theme-editor/sections/notification-banner-section.tsx +173 -0
  74. package/components/theme-editor/sections/order-tracking-lookup-section.tsx +1379 -0
  75. package/components/theme-editor/sections/posts-slider-section.tsx +472 -0
  76. package/components/theme-editor/sections/pre-order-launch-banner-section.tsx +663 -0
  77. package/components/theme-editor/sections/section-renderer-registry.tsx +89 -0
  78. package/components/theme-editor/sections/section-wrapper.tsx +135 -0
  79. package/components/theme-editor/sections/shipping-threshold-progress-section.tsx +586 -0
  80. package/components/theme-editor/sections/stats-counter-section.tsx +486 -0
  81. package/components/theme-editor/sections/tabs-section.tsx +578 -0
  82. package/components/theme-editor/theme-block.tsx +102 -0
  83. package/components/theme-editor/theme-placeholder-client.tsx +218 -0
  84. package/components/theme-editor/theme-placeholder-wrapper.tsx +732 -0
  85. package/components/theme-editor/theme-placeholder.tsx +288 -0
  86. package/components/theme-editor/theme-section.tsx +1224 -0
  87. package/components/theme-editor/theme-settings-context.tsx +13 -0
  88. package/components/theme-editor/utils/index.ts +792 -0
  89. package/components/theme-editor/utils/iterator-utils.ts +234 -0
  90. package/components/theme-editor/utils/publish-window.ts +86 -0
  91. package/components/theme-editor/utils/visibility-rules.ts +188 -0
  92. package/data/client/account.ts +17 -2
  93. package/data/client/api.ts +2 -0
  94. package/data/client/basket.ts +66 -5
  95. package/data/client/checkout.ts +391 -99
  96. package/data/client/misc.ts +38 -2
  97. package/data/client/product.ts +19 -2
  98. package/data/client/user.ts +16 -8
  99. package/data/server/category.ts +11 -9
  100. package/data/server/flatpage.ts +11 -4
  101. package/data/server/form.ts +15 -4
  102. package/data/server/landingpage.ts +11 -4
  103. package/data/server/list.ts +5 -4
  104. package/data/server/menu.ts +11 -3
  105. package/data/server/product.ts +111 -55
  106. package/data/server/seo.ts +14 -4
  107. package/data/server/special-page.ts +5 -4
  108. package/data/server/widget.ts +90 -5
  109. package/data/urls.ts +16 -5
  110. package/hocs/client/with-segment-defaults.tsx +2 -2
  111. package/hocs/server/with-segment-defaults.tsx +65 -20
  112. package/hooks/index.ts +4 -0
  113. package/hooks/use-localization.ts +24 -10
  114. package/hooks/use-logger-context.tsx +114 -0
  115. package/hooks/use-logger.ts +92 -0
  116. package/hooks/use-loyalty-availability.ts +21 -0
  117. package/hooks/use-payment-options.ts +2 -1
  118. package/hooks/use-pz-params.ts +37 -0
  119. package/hooks/use-router.ts +51 -14
  120. package/hooks/use-sentry-uncaught-errors.ts +24 -0
  121. package/instrumentation/index.ts +10 -1
  122. package/instrumentation/node.ts +2 -20
  123. package/jest.config.js +25 -0
  124. package/lib/cache-handler.mjs +534 -16
  125. package/lib/cache.ts +272 -37
  126. package/localization/index.ts +2 -1
  127. package/localization/provider.tsx +2 -5
  128. package/middlewares/bfcache-headers.ts +18 -0
  129. package/middlewares/checkout-provider.ts +1 -1
  130. package/middlewares/complete-gpay.ts +32 -26
  131. package/middlewares/complete-masterpass.ts +33 -26
  132. package/middlewares/complete-wallet.ts +182 -0
  133. package/middlewares/default.ts +360 -215
  134. package/middlewares/index.ts +10 -2
  135. package/middlewares/locale.ts +34 -11
  136. package/middlewares/masterpass-rest-callback.ts +230 -0
  137. package/middlewares/oauth-login.ts +200 -57
  138. package/middlewares/pretty-url.ts +21 -8
  139. package/middlewares/redirection-payment.ts +32 -26
  140. package/middlewares/saved-card-redirection.ts +33 -26
  141. package/middlewares/three-d-redirection.ts +32 -26
  142. package/middlewares/url-redirection.ts +11 -1
  143. package/middlewares/wallet-complete-redirection.ts +206 -0
  144. package/package.json +25 -10
  145. package/plugins.d.ts +19 -4
  146. package/plugins.js +10 -1
  147. package/redux/actions.ts +47 -0
  148. package/redux/middlewares/checkout.ts +63 -138
  149. package/redux/middlewares/index.ts +14 -10
  150. package/redux/middlewares/pre-order/address.ts +7 -2
  151. package/redux/middlewares/pre-order/attribute-based-shipping-option.ts +7 -1
  152. package/redux/middlewares/pre-order/data-source-shipping-option.ts +7 -1
  153. package/redux/middlewares/pre-order/delivery-option.ts +7 -1
  154. package/redux/middlewares/pre-order/index.ts +16 -10
  155. package/redux/middlewares/pre-order/installment-option.ts +8 -1
  156. package/redux/middlewares/pre-order/payment-option-reset.ts +37 -0
  157. package/redux/middlewares/pre-order/payment-option.ts +7 -1
  158. package/redux/middlewares/pre-order/pre-order-validation.ts +8 -3
  159. package/redux/middlewares/pre-order/redirection.ts +8 -2
  160. package/redux/middlewares/pre-order/set-pre-order.ts +6 -2
  161. package/redux/middlewares/pre-order/shipping-option.ts +7 -1
  162. package/redux/middlewares/pre-order/shipping-step.ts +5 -1
  163. package/redux/reducers/checkout.ts +23 -3
  164. package/redux/reducers/index.ts +11 -3
  165. package/redux/reducers/root.ts +7 -2
  166. package/redux/reducers/widget.ts +80 -0
  167. package/sentry/index.ts +69 -13
  168. package/tailwind/content.js +16 -0
  169. package/types/commerce/account.ts +5 -1
  170. package/types/commerce/checkout.ts +35 -1
  171. package/types/commerce/widget.ts +33 -0
  172. package/types/index.ts +101 -6
  173. package/types/next-auth.d.ts +2 -2
  174. package/types/widget.ts +80 -0
  175. package/utils/app-fetch.ts +7 -2
  176. package/utils/generate-commerce-search-params.ts +3 -2
  177. package/utils/get-checkout-path.ts +3 -0
  178. package/utils/get-root-hostname.ts +28 -0
  179. package/utils/index.ts +64 -10
  180. package/utils/localization.ts +4 -0
  181. package/utils/mobile-3d-iframe.ts +8 -2
  182. package/utils/override-middleware.ts +7 -12
  183. package/utils/pz-segments.ts +92 -0
  184. package/utils/redirect-ignore.ts +35 -0
  185. package/utils/redirect.ts +9 -3
  186. package/utils/redirection-iframe.ts +8 -2
  187. package/utils/widget-styles.ts +107 -0
  188. package/views/error-page.tsx +93 -0
  189. package/with-pz-config.js +13 -6
package/plugins.d.ts CHANGED
@@ -13,6 +13,7 @@ declare module '@akinon/pz-masterpass/src/redux/reducer' {
13
13
  export const setError: any;
14
14
  export const setOtpModalVisible: any;
15
15
  export const setCvcRequired: any;
16
+ export const resetMasterpassState: any;
16
17
  }
17
18
 
18
19
  declare module '@akinon/pz-otp' {
@@ -30,9 +31,23 @@ declare module '@akinon/pz-saved-card' {
30
31
  export const SavedCardOption: any;
31
32
  }
32
33
 
33
- declare module '@akinon/pz-iyzico-saved-card' {
34
- export const iyzicoSavedCardReducer: any;
35
- export const iyzicoSavedCardMiddleware: any;
34
+ declare module '@akinon/pz-apple-pay' {}
35
+
36
+ declare module '@akinon/pz-cybersource-uc/src/redux/middleware' {
37
+ export default middleware as any;
36
38
  }
37
39
 
38
- declare module '@akinon/pz-apple-pay' {}
40
+ declare module '@akinon/pz-cybersource-uc/src/redux/reducer' {
41
+ export default reducer as any;
42
+ }
43
+
44
+ declare module '@akinon/pz-cybersource-uc' {
45
+ export const CyberSourceUcPaymentOption: any;
46
+ }
47
+
48
+ declare module '@akinon/pz-flow-payment' {}
49
+
50
+ declare module '@akinon/pz-masterpass-rest' {
51
+ export const MasterpassRestOption: React.FC;
52
+ export const masterpassRestReducer: any;
53
+ }
package/plugins.js CHANGED
@@ -14,5 +14,14 @@ module.exports = [
14
14
  'pz-multi-basket',
15
15
  'pz-saved-card',
16
16
  'pz-tabby-extension',
17
- 'pz-apple-pay'
17
+ 'pz-apple-pay',
18
+ 'pz-tamara-extension',
19
+ 'pz-cybersource-uc',
20
+ 'pz-hepsipay',
21
+ 'pz-flow-payment',
22
+ 'pz-virtual-try-on',
23
+ 'pz-masterpass-rest',
24
+ 'pz-similar-products',
25
+ 'pz-haso',
26
+ 'pz-google-pay'
18
27
  ];
@@ -0,0 +1,47 @@
1
+ // Re-export all action creators from slice modules
2
+ export * from './reducers/root';
3
+ export * from './reducers/header';
4
+ export * from './reducers/checkout';
5
+ export * from './reducers/config';
6
+
7
+ // Import RTK Query APIs
8
+ import { basketApi } from '../data/client/basket';
9
+ import { productApi } from '../data/client/product';
10
+ import { miscApi } from '../data/client/misc';
11
+ import { checkoutApi } from '../data/client/checkout';
12
+ import { wishlistApi } from '../data/client/wishlist';
13
+
14
+ // Create RTK Query action creators
15
+ export const rtkApiActionCreators = {
16
+ // RTK Query API endpoints
17
+ ...Object.fromEntries(
18
+ Object.entries(basketApi.endpoints).map(([key, endpoint]) => [
19
+ `api_basket_${key}`,
20
+ endpoint.initiate
21
+ ])
22
+ ),
23
+ ...Object.fromEntries(
24
+ Object.entries(productApi.endpoints).map(([key, endpoint]) => [
25
+ `api_product_${key}`,
26
+ endpoint.initiate
27
+ ])
28
+ ),
29
+ ...Object.fromEntries(
30
+ Object.entries(miscApi.endpoints).map(([key, endpoint]) => [
31
+ `api_misc_${key}`,
32
+ endpoint.initiate
33
+ ])
34
+ ),
35
+ ...Object.fromEntries(
36
+ Object.entries(checkoutApi.endpoints).map(([key, endpoint]) => [
37
+ `api_checkout_${key}`,
38
+ endpoint.initiate
39
+ ])
40
+ ),
41
+ ...Object.fromEntries(
42
+ Object.entries(wishlistApi.endpoints).map(([key, endpoint]) => [
43
+ `api_wishlist_${key}`,
44
+ endpoint.initiate
45
+ ])
46
+ )
47
+ } as any;
@@ -14,14 +14,15 @@ import {
14
14
  setHasGiftBox,
15
15
  setInstallmentOptions,
16
16
  setLoyaltyBalance,
17
+ setLoyaltyBalances,
17
18
  setPaymentChoices,
18
19
  setPaymentOptions,
19
- setPreOrder,
20
20
  setRetailStores,
21
21
  setShippingOptions,
22
- setShippingStepCompleted,
23
22
  setHepsipayAvailability,
24
- setWalletPaymentData
23
+ setWalletPaymentData,
24
+ setPayOnDeliveryOtpModalActive,
25
+ setUnavailablePaymentOptions
25
26
  } from '../../redux/reducers/checkout';
26
27
  import { RootState, TypedDispatch } from 'redux/store';
27
28
  import { checkoutApi } from '../../data/client/checkout';
@@ -37,6 +38,7 @@ interface CheckoutResult {
37
38
  errors?: Record<string, string[]>;
38
39
  pre_order?: PreOrder;
39
40
  context_list?: CheckoutContext[];
41
+ redirect_url?: string;
40
42
  };
41
43
  }
42
44
 
@@ -47,10 +49,14 @@ interface MiddlewareParams {
47
49
 
48
50
  export const errorMiddleware: Middleware = ({ dispatch }: MiddlewareParams) => {
49
51
  return (next) => (action) => {
50
- const result: CheckoutResult = next(action);
52
+ const result = next(action) as CheckoutResult;
51
53
  const errors = result?.payload?.errors;
52
54
 
53
- if (errors) {
55
+ if (
56
+ !!errors &&
57
+ ((typeof errors === 'object' && Object.keys(errors).length > 0) ||
58
+ (Array.isArray(errors) && errors.length > 0))
59
+ ) {
54
60
  dispatch(setErrors(errors));
55
61
  }
56
62
 
@@ -58,142 +64,29 @@ export const errorMiddleware: Middleware = ({ dispatch }: MiddlewareParams) => {
58
64
  };
59
65
  };
60
66
 
61
- export const preOrderMiddleware: Middleware = ({
62
- getState,
63
- dispatch
64
- }: MiddlewareParams) => {
67
+ export const redirectUrlMiddleware: Middleware = () => {
65
68
  return (next) => (action) => {
66
- const result: CheckoutResult = next(action);
67
- const preOrder = result?.payload?.pre_order;
69
+ const result = next(action) as CheckoutResult;
70
+ const redirectUrl = result?.payload?.redirect_url;
68
71
 
69
- if (
70
- !preOrder ||
71
- action?.meta?.arg?.endpointName === 'guestLogin' ||
72
- action?.meta?.arg?.endpointName === 'getCheckoutLoyaltyBalance'
73
- ) {
74
- return result;
75
- }
72
+ if (redirectUrl) {
73
+ const currentLocale = getCookie('pz-locale');
76
74
 
77
- const {
78
- deliveryOptions,
79
- addressList: addresses,
80
- shippingOptions,
81
- dataSourceShippingOptions,
82
- paymentOptions,
83
- installmentOptions,
84
- attributeBasedShippingOptions
85
- } = getState().checkout;
86
- const { endpoints: apiEndpoints } = checkoutApi;
75
+ let url = redirectUrl;
87
76
 
88
- if (preOrder.is_redirected) {
89
- const contextList = result?.payload?.context_list;
77
+ if (currentLocale && !redirectUrl.includes('/orders/redirection')) {
78
+ const { defaultLocaleValue, localeUrlStrategy } = settings.localization;
90
79
 
91
- if (
92
- contextList.find(
93
- (ctx) => ctx.page_name === 'RedirectionPaymentSelectedPage'
94
- )
95
- ) {
96
- dispatch(
97
- apiEndpoints.setPaymentOption.initiate(preOrder.payment_option?.pk)
98
- );
99
- return;
80
+ url =
81
+ currentLocale === defaultLocaleValue &&
82
+ localeUrlStrategy !== LocaleUrlStrategy.ShowAllLocales
83
+ ? redirectUrl
84
+ : `/${currentLocale}${redirectUrl}`;
100
85
  }
101
- }
102
-
103
- dispatch(setPreOrder(preOrder));
104
-
105
- if (!preOrder.delivery_option && deliveryOptions.length > 0) {
106
- dispatch(
107
- apiEndpoints.setDeliveryOption.initiate(
108
- deliveryOptions.find((opt) => opt.delivery_option_type === 'customer')
109
- ?.pk
110
- )
111
- );
112
- }
113
-
114
- if (
115
- (!preOrder.shipping_address || !preOrder.billing_address) &&
116
- addresses.length > 0 &&
117
- (!preOrder.delivery_option ||
118
- preOrder.delivery_option.delivery_option_type === 'customer')
119
- ) {
120
- dispatch(
121
- apiEndpoints.setAddresses.initiate({
122
- shippingAddressPk: addresses[0].pk,
123
- billingAddressPk: addresses[0].pk
124
- })
125
- );
126
- }
127
-
128
- if (
129
- shippingOptions.length > 0 &&
130
- (!preOrder.shipping_option ||
131
- !shippingOptions.find((opt) => opt.pk === preOrder.shipping_option?.pk))
132
- ) {
133
- dispatch(apiEndpoints.setShippingOption.initiate(shippingOptions[0].pk));
134
- }
135
-
136
- if (
137
- dataSourceShippingOptions.length > 0 &&
138
- !preOrder.data_source_shipping_options
139
- ) {
140
- const selectedDataSourceShippingOptionsPks =
141
- dataSourceShippingOptions.map(
142
- (opt) => opt.data_source_shipping_options[0].pk
143
- );
144
-
145
- dispatch(
146
- apiEndpoints.setDataSourceShippingOptions.initiate(
147
- selectedDataSourceShippingOptionsPks
148
- )
149
- );
150
- }
151
-
152
- if (
153
- Object.keys(attributeBasedShippingOptions).length > 0 &&
154
- !preOrder.attribute_based_shipping_options
155
- ) {
156
- const initialSelectedOptions: Record<string, number> = Object.fromEntries(
157
- Object.entries(attributeBasedShippingOptions).map(([key, options]) => [
158
- key,
159
- options.attribute_based_shipping_options[0].pk
160
- ])
161
- );
162
86
 
163
- dispatch(
164
- apiEndpoints.setAttributeBasedShippingOptions.initiate(
165
- initialSelectedOptions
166
- )
167
- );
168
- }
169
-
170
- if (!preOrder.payment_option && paymentOptions.length > 0) {
171
- dispatch(apiEndpoints.setPaymentOption.initiate(paymentOptions[0].pk));
87
+ window.location.href = url;
172
88
  }
173
89
 
174
- if (
175
- !preOrder.installment &&
176
- preOrder.payment_option?.payment_type !== 'saved_card' &&
177
- installmentOptions.length > 0
178
- ) {
179
- dispatch(
180
- apiEndpoints.setInstallmentOption.initiate(installmentOptions[0].pk)
181
- );
182
- }
183
-
184
- dispatch(
185
- setShippingStepCompleted(
186
- [
187
- preOrder.delivery_option?.delivery_option_type === 'retail_store'
188
- ? true
189
- : preOrder.shipping_address?.pk,
190
- preOrder.billing_address?.pk,
191
- preOrder.shipping_option?.pk,
192
- addresses.length > 0
193
- ].every(Boolean)
194
- )
195
- );
196
-
197
90
  return result;
198
91
  };
199
92
  };
@@ -203,13 +96,14 @@ export const contextListMiddleware: Middleware = ({
203
96
  getState
204
97
  }: MiddlewareParams) => {
205
98
  return (next) => (action) => {
206
- const { isMobileApp } = getState().root;
207
- const result: CheckoutResult = next(action);
99
+ const { isMobileApp, userPhoneNumber } = getState().root;
100
+ const result = next(action) as CheckoutResult;
101
+ const preOrder = result?.payload?.pre_order;
208
102
 
209
103
  if (result?.payload?.context_list) {
210
104
  result.payload.context_list.forEach((context) => {
211
105
  const redirectUrl = context.page_context.redirect_url;
212
- const isIframe = context.page_context.is_frame ?? false;
106
+ const isIframe = context.page_context.is_iframe ?? false;
213
107
 
214
108
  if (redirectUrl) {
215
109
  const currentLocale = getCookie('pz-locale');
@@ -288,6 +182,14 @@ export const contextListMiddleware: Middleware = ({
288
182
  dispatch(setPaymentOptions(context.page_context.payment_options));
289
183
  }
290
184
 
185
+ if (context.page_context.unavailable_options) {
186
+ dispatch(
187
+ setUnavailablePaymentOptions(
188
+ context.page_context.unavailable_options
189
+ )
190
+ );
191
+ }
192
+
291
193
  if (context.page_context.credit_payment_options) {
292
194
  dispatch(
293
195
  setCreditPaymentOptions(context.page_context.credit_payment_options)
@@ -311,7 +213,10 @@ export const contextListMiddleware: Middleware = ({
311
213
  dispatch(setCardType(context.page_context.card_type));
312
214
  }
313
215
 
314
- if (context.page_context.installments) {
216
+ if (
217
+ context.page_context.installments &&
218
+ preOrder?.payment_option?.payment_type !== 'masterpass_rest'
219
+ ) {
315
220
  dispatch(setInstallmentOptions(context.page_context.installments));
316
221
  }
317
222
  }
@@ -320,9 +225,29 @@ export const contextListMiddleware: Middleware = ({
320
225
  dispatch(setLoyaltyBalance(context.page_context.balance));
321
226
  }
322
227
 
228
+ if (context.page_context.balances) {
229
+ dispatch(setLoyaltyBalances(context.page_context.balances));
230
+ }
231
+
232
+ if (context.page_context.accounts) {
233
+ dispatch(setLoyaltyBalances(context.page_context.accounts));
234
+ }
235
+
323
236
  if (context.page_context.retail_stores) {
324
237
  dispatch(setRetailStores(context.page_context.retail_stores));
325
238
  }
239
+
240
+ if (context.page_name === 'SendSmsPage' && !preOrder?.phone_number) {
241
+ dispatch(
242
+ checkoutApi.endpoints.sendSms.initiate({
243
+ phone_number: userPhoneNumber ?? preOrder?.user_phone_number
244
+ })
245
+ );
246
+ }
247
+
248
+ if (context.page_name === 'VerifySmsPage') {
249
+ dispatch(setPayOnDeliveryOtpModalActive(true));
250
+ }
326
251
  });
327
252
  }
328
253
 
@@ -335,7 +260,7 @@ export const hepsiPayMiddleware: Middleware = ({
335
260
  dispatch
336
261
  }: MiddlewareParams) => {
337
262
  return (next) => (action) => {
338
- const result: CheckoutResult = next(action);
263
+ const result = next(action) as CheckoutResult;
339
264
  const { payload } = result;
340
265
  const preOrder = payload?.pre_order;
341
266
  const contextList = payload?.context_list;
@@ -389,7 +314,7 @@ export const walletPaymentMiddleware: Middleware = ({
389
314
  dispatch
390
315
  }: MiddlewareParams) => {
391
316
  return (next) => (action) => {
392
- const result: CheckoutResult = next(action);
317
+ const result = next(action) as CheckoutResult;
393
318
  const { payload } = result;
394
319
  const preOrder = payload?.pre_order;
395
320
  const contextList = payload?.context_list;
@@ -3,8 +3,10 @@
3
3
  import { signOut } from 'next-auth/react';
4
4
  import { ROUTES } from 'routes';
5
5
  import type { Middleware } from '@reduxjs/toolkit';
6
+ import type { MiddlewareAction } from '../../types';
6
7
  import {
7
8
  errorMiddleware,
9
+ redirectUrlMiddleware,
8
10
  contextListMiddleware,
9
11
  hepsiPayMiddleware,
10
12
  walletPaymentMiddleware
@@ -17,17 +19,17 @@ import logger from '@akinon/next/utils/log';
17
19
 
18
20
  // Plugin middlewares
19
21
  import { savedCardMiddleware } from '@akinon/pz-saved-card';
22
+ import cyberSourceUcMiddleware from '@akinon/pz-cybersource-uc/src/redux/middleware';
20
23
 
21
- export const rtkQueryResponseHandler: Middleware =
22
- ({ dispatch }) =>
23
- (next) =>
24
- (action) => {
25
- return next(action);
26
- };
24
+ export const rtkQueryResponseHandler: Middleware = () => (next) => (action) => {
25
+ return next(action);
26
+ };
27
27
 
28
28
  export const rtkQueryErrorHandler: Middleware =
29
29
  () => (next) => async (action) => {
30
- if (action?.payload?.status === 401) {
30
+ const act = action as MiddlewareAction;
31
+
32
+ if (act?.payload?.status === 401) {
31
33
  await signOut({
32
34
  callbackUrl: `${ROUTES.AUTH}?callbackUrl=${window.location.pathname}`
33
35
  });
@@ -36,9 +38,9 @@ export const rtkQueryErrorHandler: Middleware =
36
38
  return;
37
39
  }
38
40
 
39
- if (action?.payload?.status === 404) {
41
+ if (act?.payload?.status === 404) {
40
42
  logger.warn(
41
- `404 - Not Found. Endpoint: ${action.meta.arg.endpointName}, url: ${action.meta.baseQueryMeta.request.url}`
43
+ `404 - Not Found. Endpoint: ${act.meta.arg.endpointName}, url: ${act.meta.baseQueryMeta.request.url}`
42
44
  );
43
45
  }
44
46
 
@@ -50,11 +52,13 @@ const middlewares = [
50
52
  rtkQueryResponseHandler,
51
53
  rtkQueryErrorHandler,
52
54
  errorMiddleware,
55
+ redirectUrlMiddleware,
53
56
  ...preOrderMiddlewares,
54
57
  contextListMiddleware,
55
58
  hepsiPayMiddleware,
56
59
  walletPaymentMiddleware,
57
- savedCardMiddleware
60
+ savedCardMiddleware,
61
+ cyberSourceUcMiddleware
58
62
  ];
59
63
 
60
64
  // Filter out any non-function middleware to ensure all middlewares are valid and executable
@@ -1,14 +1,13 @@
1
1
  import { Middleware } from '@reduxjs/toolkit';
2
2
  import { CheckoutResult, MiddlewareParams } from '../../../types';
3
3
  import { checkoutApi } from '../../../data/client/checkout';
4
- import { setPreOrder } from '../../../redux/reducers/checkout';
5
4
 
6
5
  export const setAddressMiddleware: Middleware = ({
7
6
  getState,
8
7
  dispatch
9
8
  }: MiddlewareParams) => {
10
9
  return (next) => (action) => {
11
- const result: CheckoutResult = next(action);
10
+ const result = next(action) as CheckoutResult;
12
11
  const preOrder = result?.payload?.pre_order;
13
12
 
14
13
  if (!preOrder) {
@@ -38,8 +37,14 @@ export const setAddressMiddleware: Middleware = ({
38
37
  billingAddressPk: firstAddressPk
39
38
  })
40
39
  );
40
+
41
+ return null;
41
42
  }
42
43
 
43
44
  return result;
44
45
  };
45
46
  };
47
+
48
+ Object.defineProperty(setAddressMiddleware, 'name', {
49
+ value: 'setAddressMiddleware'
50
+ });
@@ -7,7 +7,7 @@ export const attributeBasedShippingOptionMiddleware: Middleware = ({
7
7
  dispatch
8
8
  }: MiddlewareParams) => {
9
9
  return (next) => (action) => {
10
- const result: CheckoutResult = next(action);
10
+ const result = next(action) as CheckoutResult;
11
11
  const preOrder = result?.payload?.pre_order;
12
12
 
13
13
  if (!preOrder) {
@@ -33,8 +33,14 @@ export const attributeBasedShippingOptionMiddleware: Middleware = ({
33
33
  initialSelectedOptions
34
34
  )
35
35
  );
36
+
37
+ return null;
36
38
  }
37
39
 
38
40
  return result;
39
41
  };
40
42
  };
43
+
44
+ Object.defineProperty(attributeBasedShippingOptionMiddleware, 'name', {
45
+ value: 'attributeBasedShippingOptionMiddleware'
46
+ });
@@ -7,7 +7,7 @@ export const dataSourceShippingOptionMiddleware: Middleware = ({
7
7
  dispatch
8
8
  }: MiddlewareParams) => {
9
9
  return (next) => (action) => {
10
- const result: CheckoutResult = next(action);
10
+ const result = next(action) as CheckoutResult;
11
11
  const preOrder = result?.payload?.pre_order;
12
12
 
13
13
  if (!preOrder) {
@@ -29,9 +29,15 @@ export const dataSourceShippingOptionMiddleware: Middleware = ({
29
29
  dispatch(
30
30
  apiEndpoints.setDataSourceShippingOptions.initiate(selectedPks)
31
31
  );
32
+
33
+ return null;
32
34
  }
33
35
  }
34
36
 
35
37
  return result;
36
38
  };
37
39
  };
40
+
41
+ Object.defineProperty(dataSourceShippingOptionMiddleware, 'name', {
42
+ value: 'dataSourceShippingOptionMiddleware'
43
+ });
@@ -7,7 +7,7 @@ export const deliveryOptionMiddleware: Middleware = ({
7
7
  dispatch
8
8
  }: MiddlewareParams) => {
9
9
  return (next) => (action) => {
10
- const result: CheckoutResult = next(action);
10
+ const result = next(action) as CheckoutResult;
11
11
  const preOrder = result?.payload?.pre_order;
12
12
 
13
13
  if (!preOrder) {
@@ -26,9 +26,15 @@ export const deliveryOptionMiddleware: Middleware = ({
26
26
  dispatch(
27
27
  apiEndpoints.setDeliveryOption.initiate(customerDeliveryOption)
28
28
  );
29
+
30
+ return null;
29
31
  }
30
32
  }
31
33
 
32
34
  return result;
33
35
  };
34
36
  };
37
+
38
+ Object.defineProperty(deliveryOptionMiddleware, 'name', {
39
+ value: 'deliveryOptionMiddleware'
40
+ });
@@ -8,18 +8,24 @@ import { dataSourceShippingOptionMiddleware } from './data-source-shipping-optio
8
8
  import { attributeBasedShippingOptionMiddleware } from './attribute-based-shipping-option';
9
9
  import { paymentOptionMiddleware } from './payment-option';
10
10
  import { installmentOptionMiddleware } from './installment-option';
11
+ import { paymentOptionResetMiddleware } from './payment-option-reset';
11
12
  import { shippingStepMiddleware } from './shipping-step';
12
13
 
14
+ // ⚠️ WARNING: Redux Toolkit applies middlewares in reverse order (from last to first).
15
+ // This list is written **in reverse execution order** to ensure they run in the correct sequence.
16
+ // If you add a new middleware, make sure to insert it **in reverse order** based on execution priority.
17
+
13
18
  export const preOrderMiddlewares = [
14
- preOrderValidationMiddleware,
15
- redirectionMiddleware,
16
- setPreOrderMiddleware,
17
- deliveryOptionMiddleware,
18
- setAddressMiddleware,
19
- shippingOptionMiddleware,
20
- dataSourceShippingOptionMiddleware,
21
- attributeBasedShippingOptionMiddleware,
22
- paymentOptionMiddleware,
19
+ shippingStepMiddleware,
23
20
  installmentOptionMiddleware,
24
- shippingStepMiddleware
21
+ paymentOptionResetMiddleware,
22
+ paymentOptionMiddleware,
23
+ attributeBasedShippingOptionMiddleware,
24
+ dataSourceShippingOptionMiddleware,
25
+ shippingOptionMiddleware,
26
+ setAddressMiddleware,
27
+ deliveryOptionMiddleware,
28
+ setPreOrderMiddleware,
29
+ redirectionMiddleware,
30
+ preOrderValidationMiddleware
25
31
  ];
@@ -7,7 +7,7 @@ export const installmentOptionMiddleware: Middleware = ({
7
7
  dispatch
8
8
  }: MiddlewareParams) => {
9
9
  return (next) => (action) => {
10
- const result: CheckoutResult = next(action);
10
+ const result = next(action) as CheckoutResult;
11
11
  const preOrder = result?.payload?.pre_order;
12
12
 
13
13
  if (!preOrder) {
@@ -20,6 +20,7 @@ export const installmentOptionMiddleware: Middleware = ({
20
20
  if (
21
21
  !preOrder?.installment &&
22
22
  preOrder?.payment_option?.payment_type !== 'saved_card' &&
23
+ preOrder?.payment_option?.payment_type !== 'masterpass_rest' &&
23
24
  installmentOptions.length > 0
24
25
  ) {
25
26
  const firstInstallmentOptionPk = installmentOptions[0]?.pk;
@@ -28,9 +29,15 @@ export const installmentOptionMiddleware: Middleware = ({
28
29
  dispatch(
29
30
  apiEndpoints.setInstallmentOption.initiate(firstInstallmentOptionPk)
30
31
  );
32
+
33
+ return null;
31
34
  }
32
35
  }
33
36
 
34
37
  return result;
35
38
  };
36
39
  };
40
+
41
+ Object.defineProperty(installmentOptionMiddleware, 'name', {
42
+ value: 'installmentOptionMiddleware'
43
+ });
@@ -0,0 +1,37 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareAction, MiddlewareParams } from '../../../types';
3
+ import {
4
+ setBankAccounts,
5
+ setCardType,
6
+ setInstallmentOptions,
7
+ setSelectedBankAccountPk
8
+ } from '../../reducers/checkout';
9
+ import { resetMasterpassState } from '@akinon/pz-masterpass/src/redux/reducer';
10
+
11
+ export const paymentOptionResetMiddleware: Middleware = ({
12
+ dispatch
13
+ }: MiddlewareParams) => {
14
+ return (next) => (action) => {
15
+ const result = next(action) as CheckoutResult;
16
+ const act = action as MiddlewareAction;
17
+
18
+ if (
19
+ act.type === 'api/executeMutation/fulfilled' &&
20
+ act.meta?.arg?.endpointName === 'setPaymentOption'
21
+ ) {
22
+ dispatch(setInstallmentOptions([]));
23
+ dispatch(setBankAccounts([]));
24
+ dispatch(setSelectedBankAccountPk(null));
25
+ dispatch(setCardType(null));
26
+ if(resetMasterpassState){
27
+ dispatch(resetMasterpassState());
28
+ }
29
+ }
30
+
31
+ return result;
32
+ };
33
+ };
34
+
35
+ Object.defineProperty(paymentOptionResetMiddleware, 'name', {
36
+ value: 'paymentOptionResetMiddleware'
37
+ });
@@ -7,7 +7,7 @@ export const paymentOptionMiddleware: Middleware = ({
7
7
  dispatch
8
8
  }: MiddlewareParams) => {
9
9
  return (next) => (action) => {
10
- const result: CheckoutResult = next(action);
10
+ const result = next(action) as CheckoutResult;
11
11
  const preOrder = result?.payload?.pre_order;
12
12
 
13
13
  if (!preOrder) {
@@ -21,8 +21,14 @@ export const paymentOptionMiddleware: Middleware = ({
21
21
  const firstPaymentOptionPk = paymentOptions[0]?.pk;
22
22
 
23
23
  dispatch(apiEndpoints.setPaymentOption.initiate(firstPaymentOptionPk));
24
+
25
+ return null;
24
26
  }
25
27
 
26
28
  return result;
27
29
  };
28
30
  };
31
+
32
+ Object.defineProperty(paymentOptionMiddleware, 'name', {
33
+ value: 'paymentOptionMiddleware'
34
+ });