@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.
- package/.eslintrc.js +12 -0
- package/CHANGELOG.md +377 -7
- package/__tests__/next-config.test.ts +83 -0
- package/__tests__/tsconfig.json +23 -0
- package/api/auth.ts +133 -44
- package/api/barcode-search.ts +59 -0
- package/api/cache.ts +41 -5
- package/api/client.ts +21 -4
- package/api/form.ts +85 -0
- package/api/image-proxy.ts +75 -0
- package/api/product-categories.ts +53 -0
- package/api/similar-product-list.ts +63 -0
- package/api/similar-products.ts +111 -0
- package/api/virtual-try-on.ts +382 -0
- package/assets/styles/index.scss +84 -0
- package/babel.config.js +6 -0
- package/bin/pz-generate-routes.js +115 -0
- package/bin/pz-prebuild.js +1 -0
- package/bin/pz-predev.js +1 -0
- package/bin/pz-run-tests.js +99 -0
- package/bin/run-prebuild-tests.js +46 -0
- package/components/accordion.tsx +20 -5
- package/components/button.tsx +51 -36
- package/components/client-root.tsx +138 -2
- package/components/file-input.tsx +65 -3
- package/components/index.ts +1 -0
- package/components/input.tsx +1 -1
- package/components/link.tsx +46 -16
- package/components/logger-popup.tsx +213 -0
- package/components/modal.tsx +32 -16
- package/components/plugin-module.tsx +62 -3
- package/components/price.tsx +2 -2
- package/components/select.tsx +1 -1
- package/components/selected-payment-option-view.tsx +21 -0
- package/components/theme-editor/blocks/accordion-block.tsx +136 -0
- package/components/theme-editor/blocks/block-renderer-registry.tsx +77 -0
- package/components/theme-editor/blocks/button-block.tsx +593 -0
- package/components/theme-editor/blocks/counter-block.tsx +348 -0
- package/components/theme-editor/blocks/divider-block.tsx +20 -0
- package/components/theme-editor/blocks/embed-block.tsx +208 -0
- package/components/theme-editor/blocks/group-block.tsx +116 -0
- package/components/theme-editor/blocks/hotspot-block.tsx +147 -0
- package/components/theme-editor/blocks/icon-block.tsx +230 -0
- package/components/theme-editor/blocks/image-block.tsx +137 -0
- package/components/theme-editor/blocks/image-gallery-block.tsx +269 -0
- package/components/theme-editor/blocks/input-block.tsx +123 -0
- package/components/theme-editor/blocks/link-block.tsx +216 -0
- package/components/theme-editor/blocks/lottie-block.tsx +325 -0
- package/components/theme-editor/blocks/map-block.tsx +89 -0
- package/components/theme-editor/blocks/slider-block.tsx +595 -0
- package/components/theme-editor/blocks/tab-block.tsx +10 -0
- package/components/theme-editor/blocks/text-block.tsx +52 -0
- package/components/theme-editor/blocks/video-block.tsx +122 -0
- package/components/theme-editor/components/action-toolbar.tsx +305 -0
- package/components/theme-editor/components/designer-overlay.tsx +74 -0
- package/components/theme-editor/components/with-designer-features.tsx +142 -0
- package/components/theme-editor/dynamic-font-loader.tsx +79 -0
- package/components/theme-editor/hooks/use-designer-features.tsx +100 -0
- package/components/theme-editor/hooks/use-external-designer.tsx +95 -0
- package/components/theme-editor/hooks/use-native-widget-data.ts +188 -0
- package/components/theme-editor/hooks/use-visibility-context.ts +27 -0
- package/components/theme-editor/placeholder-registry.ts +31 -0
- package/components/theme-editor/sections/before-after-section.tsx +245 -0
- package/components/theme-editor/sections/contact-form-section.tsx +563 -0
- package/components/theme-editor/sections/countdown-campaign-banner-section.tsx +433 -0
- package/components/theme-editor/sections/coupon-banner-section.tsx +710 -0
- package/components/theme-editor/sections/divider-section.tsx +62 -0
- package/components/theme-editor/sections/featured-product-spotlight-section.tsx +507 -0
- package/components/theme-editor/sections/find-in-store-section.tsx +1995 -0
- package/components/theme-editor/sections/hover-showcase-section.tsx +326 -0
- package/components/theme-editor/sections/image-hotspot-section.tsx +142 -0
- package/components/theme-editor/sections/installment-options-section.tsx +1065 -0
- package/components/theme-editor/sections/notification-banner-section.tsx +173 -0
- package/components/theme-editor/sections/order-tracking-lookup-section.tsx +1379 -0
- package/components/theme-editor/sections/posts-slider-section.tsx +472 -0
- package/components/theme-editor/sections/pre-order-launch-banner-section.tsx +663 -0
- package/components/theme-editor/sections/section-renderer-registry.tsx +89 -0
- package/components/theme-editor/sections/section-wrapper.tsx +135 -0
- package/components/theme-editor/sections/shipping-threshold-progress-section.tsx +586 -0
- package/components/theme-editor/sections/stats-counter-section.tsx +486 -0
- package/components/theme-editor/sections/tabs-section.tsx +578 -0
- package/components/theme-editor/theme-block.tsx +102 -0
- package/components/theme-editor/theme-placeholder-client.tsx +218 -0
- package/components/theme-editor/theme-placeholder-wrapper.tsx +732 -0
- package/components/theme-editor/theme-placeholder.tsx +288 -0
- package/components/theme-editor/theme-section.tsx +1224 -0
- package/components/theme-editor/theme-settings-context.tsx +13 -0
- package/components/theme-editor/utils/index.ts +792 -0
- package/components/theme-editor/utils/iterator-utils.ts +234 -0
- package/components/theme-editor/utils/publish-window.ts +86 -0
- package/components/theme-editor/utils/visibility-rules.ts +188 -0
- package/data/client/account.ts +17 -2
- package/data/client/api.ts +2 -0
- package/data/client/basket.ts +66 -5
- package/data/client/checkout.ts +391 -99
- package/data/client/misc.ts +38 -2
- package/data/client/product.ts +19 -2
- package/data/client/user.ts +16 -8
- package/data/server/category.ts +11 -9
- package/data/server/flatpage.ts +11 -4
- package/data/server/form.ts +15 -4
- package/data/server/landingpage.ts +11 -4
- package/data/server/list.ts +5 -4
- package/data/server/menu.ts +11 -3
- package/data/server/product.ts +111 -55
- package/data/server/seo.ts +14 -4
- package/data/server/special-page.ts +5 -4
- package/data/server/widget.ts +90 -5
- package/data/urls.ts +16 -5
- package/hocs/client/with-segment-defaults.tsx +2 -2
- package/hocs/server/with-segment-defaults.tsx +65 -20
- package/hooks/index.ts +4 -0
- package/hooks/use-localization.ts +24 -10
- package/hooks/use-logger-context.tsx +114 -0
- package/hooks/use-logger.ts +92 -0
- package/hooks/use-loyalty-availability.ts +21 -0
- package/hooks/use-payment-options.ts +2 -1
- package/hooks/use-pz-params.ts +37 -0
- package/hooks/use-router.ts +51 -14
- package/hooks/use-sentry-uncaught-errors.ts +24 -0
- package/instrumentation/index.ts +10 -1
- package/instrumentation/node.ts +2 -20
- package/jest.config.js +25 -0
- package/lib/cache-handler.mjs +534 -16
- package/lib/cache.ts +272 -37
- package/localization/index.ts +2 -1
- package/localization/provider.tsx +2 -5
- package/middlewares/bfcache-headers.ts +18 -0
- package/middlewares/checkout-provider.ts +1 -1
- package/middlewares/complete-gpay.ts +32 -26
- package/middlewares/complete-masterpass.ts +33 -26
- package/middlewares/complete-wallet.ts +182 -0
- package/middlewares/default.ts +360 -215
- package/middlewares/index.ts +10 -2
- package/middlewares/locale.ts +34 -11
- package/middlewares/masterpass-rest-callback.ts +230 -0
- package/middlewares/oauth-login.ts +200 -57
- package/middlewares/pretty-url.ts +21 -8
- package/middlewares/redirection-payment.ts +32 -26
- package/middlewares/saved-card-redirection.ts +33 -26
- package/middlewares/three-d-redirection.ts +32 -26
- package/middlewares/url-redirection.ts +11 -1
- package/middlewares/wallet-complete-redirection.ts +206 -0
- package/package.json +25 -10
- package/plugins.d.ts +19 -4
- package/plugins.js +10 -1
- package/redux/actions.ts +47 -0
- package/redux/middlewares/checkout.ts +63 -138
- package/redux/middlewares/index.ts +14 -10
- package/redux/middlewares/pre-order/address.ts +7 -2
- package/redux/middlewares/pre-order/attribute-based-shipping-option.ts +7 -1
- package/redux/middlewares/pre-order/data-source-shipping-option.ts +7 -1
- package/redux/middlewares/pre-order/delivery-option.ts +7 -1
- package/redux/middlewares/pre-order/index.ts +16 -10
- package/redux/middlewares/pre-order/installment-option.ts +8 -1
- package/redux/middlewares/pre-order/payment-option-reset.ts +37 -0
- package/redux/middlewares/pre-order/payment-option.ts +7 -1
- package/redux/middlewares/pre-order/pre-order-validation.ts +8 -3
- package/redux/middlewares/pre-order/redirection.ts +8 -2
- package/redux/middlewares/pre-order/set-pre-order.ts +6 -2
- package/redux/middlewares/pre-order/shipping-option.ts +7 -1
- package/redux/middlewares/pre-order/shipping-step.ts +5 -1
- package/redux/reducers/checkout.ts +23 -3
- package/redux/reducers/index.ts +11 -3
- package/redux/reducers/root.ts +7 -2
- package/redux/reducers/widget.ts +80 -0
- package/sentry/index.ts +69 -13
- package/tailwind/content.js +16 -0
- package/types/commerce/account.ts +5 -1
- package/types/commerce/checkout.ts +35 -1
- package/types/commerce/widget.ts +33 -0
- package/types/index.ts +101 -6
- package/types/next-auth.d.ts +2 -2
- package/types/widget.ts +80 -0
- package/utils/app-fetch.ts +7 -2
- package/utils/generate-commerce-search-params.ts +3 -2
- package/utils/get-checkout-path.ts +3 -0
- package/utils/get-root-hostname.ts +28 -0
- package/utils/index.ts +64 -10
- package/utils/localization.ts +4 -0
- package/utils/mobile-3d-iframe.ts +8 -2
- package/utils/override-middleware.ts +7 -12
- package/utils/pz-segments.ts +92 -0
- package/utils/redirect-ignore.ts +35 -0
- package/utils/redirect.ts +9 -3
- package/utils/redirection-iframe.ts +8 -2
- package/utils/widget-styles.ts +107 -0
- package/views/error-page.tsx +93 -0
- 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-
|
|
34
|
-
|
|
35
|
-
|
|
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-
|
|
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
|
];
|
package/redux/actions.ts
ADDED
|
@@ -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
|
|
52
|
+
const result = next(action) as CheckoutResult;
|
|
51
53
|
const errors = result?.payload?.errors;
|
|
52
54
|
|
|
53
|
-
if (
|
|
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
|
|
62
|
-
getState,
|
|
63
|
-
dispatch
|
|
64
|
-
}: MiddlewareParams) => {
|
|
67
|
+
export const redirectUrlMiddleware: Middleware = () => {
|
|
65
68
|
return (next) => (action) => {
|
|
66
|
-
const result
|
|
67
|
-
const
|
|
69
|
+
const result = next(action) as CheckoutResult;
|
|
70
|
+
const redirectUrl = result?.payload?.redirect_url;
|
|
68
71
|
|
|
69
|
-
if (
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
77
|
+
if (currentLocale && !redirectUrl.includes('/orders/redirection')) {
|
|
78
|
+
const { defaultLocaleValue, localeUrlStrategy } = settings.localization;
|
|
90
79
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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 (
|
|
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
|
|
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
|
|
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
|
-
(
|
|
23
|
-
|
|
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
|
-
|
|
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 (
|
|
41
|
+
if (act?.payload?.status === 404) {
|
|
40
42
|
logger.warn(
|
|
41
|
-
`404 - Not Found. Endpoint: ${
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
15
|
-
redirectionMiddleware,
|
|
16
|
-
setPreOrderMiddleware,
|
|
17
|
-
deliveryOptionMiddleware,
|
|
18
|
-
setAddressMiddleware,
|
|
19
|
-
shippingOptionMiddleware,
|
|
20
|
-
dataSourceShippingOptionMiddleware,
|
|
21
|
-
attributeBasedShippingOptionMiddleware,
|
|
22
|
-
paymentOptionMiddleware,
|
|
19
|
+
shippingStepMiddleware,
|
|
23
20
|
installmentOptionMiddleware,
|
|
24
|
-
|
|
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
|
|
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
|
|
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
|
+
});
|