@akinon/next 2.0.0-beta.1 → 2.0.0-beta.10

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 (63) hide show
  1. package/.eslintrc.js +12 -0
  2. package/CHANGELOG.md +50 -0
  3. package/api/auth.ts +17 -0
  4. package/bin/run-prebuild-tests.js +46 -0
  5. package/components/accordion.tsx +1 -1
  6. package/components/button.tsx +51 -36
  7. package/components/client-root.tsx +20 -0
  8. package/components/input.tsx +1 -1
  9. package/components/modal.tsx +1 -1
  10. package/components/select.tsx +1 -1
  11. package/components/selected-payment-option-view.tsx +1 -1
  12. package/data/client/api.ts +2 -0
  13. package/data/client/basket.ts +27 -5
  14. package/data/client/checkout.ts +62 -7
  15. package/data/client/misc.ts +25 -1
  16. package/data/client/product.ts +19 -2
  17. package/data/client/user.ts +16 -8
  18. package/data/server/flatpage.ts +8 -4
  19. package/data/server/form.ts +12 -4
  20. package/data/server/landingpage.ts +8 -4
  21. package/data/server/menu.ts +7 -2
  22. package/data/server/product.ts +16 -5
  23. package/data/server/seo.ts +11 -4
  24. package/data/server/widget.ts +19 -4
  25. package/data/urls.ts +11 -3
  26. package/hooks/index.ts +1 -0
  27. package/hooks/use-router.ts +5 -2
  28. package/hooks/use-sentry-uncaught-errors.ts +24 -0
  29. package/instrumentation/index.ts +10 -0
  30. package/lib/cache-handler.mjs +2 -2
  31. package/lib/cache.ts +4 -4
  32. package/localization/index.ts +2 -1
  33. package/middlewares/default.ts +6 -15
  34. package/middlewares/locale.ts +31 -10
  35. package/middlewares/url-redirection.ts +16 -0
  36. package/package.json +4 -3
  37. package/plugins.js +2 -1
  38. package/redux/middlewares/checkout.ts +16 -144
  39. package/redux/middlewares/index.ts +4 -2
  40. package/redux/middlewares/pre-order/address.ts +50 -0
  41. package/redux/middlewares/pre-order/attribute-based-shipping-option.ts +46 -0
  42. package/redux/middlewares/pre-order/data-source-shipping-option.ts +43 -0
  43. package/redux/middlewares/pre-order/delivery-option.ts +40 -0
  44. package/redux/middlewares/pre-order/index.ts +29 -0
  45. package/redux/middlewares/pre-order/installment-option.ts +42 -0
  46. package/redux/middlewares/pre-order/payment-option.ts +34 -0
  47. package/redux/middlewares/pre-order/pre-order-validation.ts +24 -0
  48. package/redux/middlewares/pre-order/redirection.ts +40 -0
  49. package/redux/middlewares/pre-order/set-pre-order.ts +22 -0
  50. package/redux/middlewares/pre-order/shipping-option.ts +44 -0
  51. package/redux/middlewares/pre-order/shipping-step.ts +38 -0
  52. package/redux/reducers/checkout.ts +8 -2
  53. package/redux/reducers/index.ts +5 -3
  54. package/redux/reducers/root.ts +7 -2
  55. package/sentry/index.ts +36 -17
  56. package/types/commerce/account.ts +5 -1
  57. package/types/commerce/checkout.ts +23 -0
  58. package/types/index.ts +6 -2
  59. package/utils/index.ts +11 -8
  60. package/utils/localization.ts +4 -0
  61. package/utils/override-middleware.ts +25 -0
  62. package/views/error-page.tsx +93 -0
  63. package/with-pz-config.js +4 -3
@@ -16,12 +16,11 @@ import {
16
16
  setLoyaltyBalance,
17
17
  setPaymentChoices,
18
18
  setPaymentOptions,
19
- setPreOrder,
20
19
  setRetailStores,
21
20
  setShippingOptions,
22
- setShippingStepCompleted,
23
21
  setHepsipayAvailability,
24
- setWalletPaymentData
22
+ setWalletPaymentData,
23
+ setPayOnDeliveryOtpModalActive
25
24
  } from '../../redux/reducers/checkout';
26
25
  import { RootState, TypedDispatch } from 'redux/store';
27
26
  import { checkoutApi } from '../../data/client/checkout';
@@ -58,153 +57,14 @@ export const errorMiddleware: Middleware = ({ dispatch }: MiddlewareParams) => {
58
57
  };
59
58
  };
60
59
 
61
- export const preOrderMiddleware: Middleware = ({
62
- getState,
63
- dispatch
64
- }: MiddlewareParams) => {
65
- return (next) => (action) => {
66
- const result: CheckoutResult = next(action);
67
- const preOrder = result?.payload?.pre_order;
68
-
69
- if (
70
- !preOrder ||
71
- action?.meta?.arg?.endpointName === 'guestLogin' ||
72
- action?.meta?.arg?.endpointName === 'getCheckoutLoyaltyBalance'
73
- ) {
74
- return result;
75
- }
76
-
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;
87
-
88
- if (preOrder.is_redirected) {
89
- const contextList = result?.payload?.context_list;
90
-
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;
100
- }
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
-
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));
172
- }
173
-
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
- return result;
198
- };
199
- };
200
-
201
60
  export const contextListMiddleware: Middleware = ({
202
61
  dispatch,
203
62
  getState
204
63
  }: MiddlewareParams) => {
205
64
  return (next) => (action) => {
206
- const { isMobileApp } = getState().root;
65
+ const { isMobileApp, userPhoneNumber } = getState().root;
207
66
  const result: CheckoutResult = next(action);
67
+ const preOrder = result?.payload?.pre_order;
208
68
 
209
69
  if (result?.payload?.context_list) {
210
70
  result.payload.context_list.forEach((context) => {
@@ -323,6 +183,18 @@ export const contextListMiddleware: Middleware = ({
323
183
  if (context.page_context.retail_stores) {
324
184
  dispatch(setRetailStores(context.page_context.retail_stores));
325
185
  }
186
+
187
+ if (context.page_name === 'SendSmsPage' && !preOrder?.phone_number) {
188
+ dispatch(
189
+ checkoutApi.endpoints.sendSms.initiate({
190
+ phone_number: userPhoneNumber ?? preOrder?.user_phone_number
191
+ })
192
+ );
193
+ }
194
+
195
+ if (context.page_name === 'VerifySmsPage') {
196
+ dispatch(setPayOnDeliveryOtpModalActive(true));
197
+ }
326
198
  });
327
199
  }
328
200
 
@@ -6,10 +6,12 @@ import type { Middleware } from '@reduxjs/toolkit';
6
6
  import {
7
7
  errorMiddleware,
8
8
  contextListMiddleware,
9
- preOrderMiddleware,
10
9
  hepsiPayMiddleware,
11
10
  walletPaymentMiddleware
12
11
  } from './checkout';
12
+
13
+ import { preOrderMiddlewares } from './pre-order';
14
+
13
15
  import { api } from '../../data/client/api';
14
16
  import logger from '@akinon/next/utils/log';
15
17
 
@@ -48,7 +50,7 @@ const middlewares = [
48
50
  rtkQueryResponseHandler,
49
51
  rtkQueryErrorHandler,
50
52
  errorMiddleware,
51
- preOrderMiddleware,
53
+ ...preOrderMiddlewares,
52
54
  contextListMiddleware,
53
55
  hepsiPayMiddleware,
54
56
  walletPaymentMiddleware,
@@ -0,0 +1,50 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const setAddressMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { addressList: addresses } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ const hasNoAddresses =
21
+ !preOrder?.shipping_address || !preOrder?.billing_address;
22
+ const isCustomerDelivery =
23
+ !preOrder?.delivery_option ||
24
+ preOrder.delivery_option.delivery_option_type === 'customer';
25
+
26
+ const firstAddressPk = addresses?.[0]?.pk;
27
+
28
+ if (
29
+ hasNoAddresses &&
30
+ addresses?.length > 0 &&
31
+ isCustomerDelivery &&
32
+ firstAddressPk
33
+ ) {
34
+ dispatch(
35
+ apiEndpoints.setAddresses.initiate({
36
+ shippingAddressPk: firstAddressPk,
37
+ billingAddressPk: firstAddressPk
38
+ })
39
+ );
40
+
41
+ return null;
42
+ }
43
+
44
+ return result;
45
+ };
46
+ };
47
+
48
+ Object.defineProperty(setAddressMiddleware, 'name', {
49
+ value: 'setAddressMiddleware'
50
+ });
@@ -0,0 +1,46 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const attributeBasedShippingOptionMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { attributeBasedShippingOptions } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ if (
21
+ Object.keys(attributeBasedShippingOptions).length > 0 &&
22
+ !preOrder.attribute_based_shipping_options
23
+ ) {
24
+ const initialSelectedOptions: Record<string, number> = Object.fromEntries(
25
+ Object.entries(attributeBasedShippingOptions).map(([key, options]) => [
26
+ key,
27
+ options.attribute_based_shipping_options[0].pk
28
+ ])
29
+ );
30
+
31
+ dispatch(
32
+ apiEndpoints.setAttributeBasedShippingOptions.initiate(
33
+ initialSelectedOptions
34
+ )
35
+ );
36
+
37
+ return null;
38
+ }
39
+
40
+ return result;
41
+ };
42
+ };
43
+
44
+ Object.defineProperty(attributeBasedShippingOptionMiddleware, 'name', {
45
+ value: 'attributeBasedShippingOptionMiddleware'
46
+ });
@@ -0,0 +1,43 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const dataSourceShippingOptionMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { dataSourceShippingOptions } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ if (
21
+ dataSourceShippingOptions?.length > 0 &&
22
+ !preOrder?.data_source_shipping_options
23
+ ) {
24
+ const selectedPks = dataSourceShippingOptions
25
+ .map((opt) => opt.data_source_shipping_options?.[0]?.pk)
26
+ .filter((pk) => pk);
27
+
28
+ if (selectedPks.length > 0) {
29
+ dispatch(
30
+ apiEndpoints.setDataSourceShippingOptions.initiate(selectedPks)
31
+ );
32
+
33
+ return null;
34
+ }
35
+ }
36
+
37
+ return result;
38
+ };
39
+ };
40
+
41
+ Object.defineProperty(dataSourceShippingOptionMiddleware, 'name', {
42
+ value: 'dataSourceShippingOptionMiddleware'
43
+ });
@@ -0,0 +1,40 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const deliveryOptionMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { deliveryOptions } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ if (!preOrder?.delivery_option && deliveryOptions?.length > 0) {
21
+ const customerDeliveryOption = deliveryOptions.find(
22
+ (opt) => opt.delivery_option_type === 'customer'
23
+ )?.pk;
24
+
25
+ if (customerDeliveryOption) {
26
+ dispatch(
27
+ apiEndpoints.setDeliveryOption.initiate(customerDeliveryOption)
28
+ );
29
+
30
+ return null;
31
+ }
32
+ }
33
+
34
+ return result;
35
+ };
36
+ };
37
+
38
+ Object.defineProperty(deliveryOptionMiddleware, 'name', {
39
+ value: 'deliveryOptionMiddleware'
40
+ });
@@ -0,0 +1,29 @@
1
+ import { preOrderValidationMiddleware } from './pre-order-validation';
2
+ import { redirectionMiddleware } from './redirection';
3
+ import { setPreOrderMiddleware } from './set-pre-order';
4
+ import { deliveryOptionMiddleware } from './delivery-option';
5
+ import { setAddressMiddleware } from './address';
6
+ import { shippingOptionMiddleware } from './shipping-option';
7
+ import { dataSourceShippingOptionMiddleware } from './data-source-shipping-option';
8
+ import { attributeBasedShippingOptionMiddleware } from './attribute-based-shipping-option';
9
+ import { paymentOptionMiddleware } from './payment-option';
10
+ import { installmentOptionMiddleware } from './installment-option';
11
+ import { shippingStepMiddleware } from './shipping-step';
12
+
13
+ // ⚠️ WARNING: Redux Toolkit applies middlewares in reverse order (from last to first).
14
+ // This list is written **in reverse execution order** to ensure they run in the correct sequence.
15
+ // If you add a new middleware, make sure to insert it **in reverse order** based on execution priority.
16
+
17
+ export const preOrderMiddlewares = [
18
+ shippingStepMiddleware,
19
+ installmentOptionMiddleware,
20
+ paymentOptionMiddleware,
21
+ attributeBasedShippingOptionMiddleware,
22
+ dataSourceShippingOptionMiddleware,
23
+ shippingOptionMiddleware,
24
+ setAddressMiddleware,
25
+ deliveryOptionMiddleware,
26
+ setPreOrderMiddleware,
27
+ redirectionMiddleware,
28
+ preOrderValidationMiddleware
29
+ ];
@@ -0,0 +1,42 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const installmentOptionMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { installmentOptions } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ if (
21
+ !preOrder?.installment &&
22
+ preOrder?.payment_option?.payment_type !== 'saved_card' &&
23
+ installmentOptions.length > 0
24
+ ) {
25
+ const firstInstallmentOptionPk = installmentOptions[0]?.pk;
26
+
27
+ if (firstInstallmentOptionPk) {
28
+ dispatch(
29
+ apiEndpoints.setInstallmentOption.initiate(firstInstallmentOptionPk)
30
+ );
31
+
32
+ return null;
33
+ }
34
+ }
35
+
36
+ return result;
37
+ };
38
+ };
39
+
40
+ Object.defineProperty(installmentOptionMiddleware, 'name', {
41
+ value: 'installmentOptionMiddleware'
42
+ });
@@ -0,0 +1,34 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const paymentOptionMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { paymentOptions } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ if (!preOrder?.payment_option && paymentOptions.length > 0) {
21
+ const firstPaymentOptionPk = paymentOptions[0]?.pk;
22
+
23
+ dispatch(apiEndpoints.setPaymentOption.initiate(firstPaymentOptionPk));
24
+
25
+ return null;
26
+ }
27
+
28
+ return result;
29
+ };
30
+ };
31
+
32
+ Object.defineProperty(paymentOptionMiddleware, 'name', {
33
+ value: 'paymentOptionMiddleware'
34
+ });
@@ -0,0 +1,24 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult } from '../../../types';
3
+
4
+ export const preOrderValidationMiddleware: Middleware = () => {
5
+ return (next) => (action) => {
6
+ const result: CheckoutResult = next(action);
7
+ const preOrder = result?.payload?.pre_order;
8
+
9
+ if (
10
+ !preOrder ||
11
+ ['guestLogin', 'getCheckoutLoyaltyBalance'].includes(
12
+ action?.meta?.arg?.endpointName
13
+ )
14
+ ) {
15
+ return result;
16
+ }
17
+
18
+ return result;
19
+ };
20
+ };
21
+
22
+ Object.defineProperty(preOrderValidationMiddleware, 'name', {
23
+ value: 'preOrderValidationMiddleware'
24
+ });
@@ -0,0 +1,40 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const redirectionMiddleware: Middleware = ({
6
+ dispatch
7
+ }: MiddlewareParams) => {
8
+ return (next) => (action) => {
9
+ const result = next(action);
10
+ const preOrder = result?.payload?.pre_order;
11
+
12
+ if (!preOrder) {
13
+ return result;
14
+ }
15
+
16
+ if (preOrder?.is_redirected) {
17
+ const contextList = result?.payload?.context_list;
18
+
19
+ if (
20
+ contextList?.find(
21
+ (ctx) => ctx.page_name === 'RedirectionPaymentSelectedPage'
22
+ )
23
+ ) {
24
+ dispatch(
25
+ checkoutApi.endpoints.setPaymentOption.initiate(
26
+ preOrder.payment_option?.pk
27
+ )
28
+ );
29
+
30
+ return null;
31
+ }
32
+ }
33
+
34
+ return result;
35
+ };
36
+ };
37
+
38
+ Object.defineProperty(redirectionMiddleware, 'name', {
39
+ value: 'redirectionMiddleware'
40
+ });
@@ -0,0 +1,22 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { MiddlewareParams } from '../../../types';
3
+ import { setPreOrder } from '../../../redux/reducers/checkout';
4
+
5
+ export const setPreOrderMiddleware: Middleware = ({
6
+ dispatch
7
+ }: MiddlewareParams) => {
8
+ return (next) => (action) => {
9
+ const result = next(action);
10
+ const preOrder = result?.payload?.pre_order;
11
+
12
+ if (preOrder) {
13
+ dispatch(setPreOrder(preOrder));
14
+ }
15
+
16
+ return result;
17
+ };
18
+ };
19
+
20
+ Object.defineProperty(setPreOrderMiddleware, 'name', {
21
+ value: 'setPreOrderMiddleware'
22
+ });
@@ -0,0 +1,44 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { checkoutApi } from '../../../data/client/checkout';
4
+
5
+ export const shippingOptionMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { shippingOptions } = getState().checkout;
18
+ const { endpoints: apiEndpoints } = checkoutApi;
19
+
20
+ const hasShippingOptions = shippingOptions?.length > 0;
21
+
22
+ const isShippingOptionValid = preOrder?.shipping_option
23
+ ? shippingOptions.some((opt) => opt.pk === preOrder.shipping_option.pk)
24
+ : false;
25
+
26
+ if (hasShippingOptions && !isShippingOptionValid) {
27
+ const defaultShippingOption = shippingOptions[0]?.pk;
28
+
29
+ if (defaultShippingOption) {
30
+ dispatch(
31
+ apiEndpoints.setShippingOption.initiate(defaultShippingOption)
32
+ );
33
+
34
+ return null;
35
+ }
36
+ }
37
+
38
+ return result;
39
+ };
40
+ };
41
+
42
+ Object.defineProperty(shippingOptionMiddleware, 'name', {
43
+ value: 'shippingOptionMiddleware'
44
+ });
@@ -0,0 +1,38 @@
1
+ import { Middleware } from '@reduxjs/toolkit';
2
+ import { CheckoutResult, MiddlewareParams } from '../../../types';
3
+ import { setShippingStepCompleted } from '../../reducers/checkout';
4
+
5
+ export const shippingStepMiddleware: Middleware = ({
6
+ getState,
7
+ dispatch
8
+ }: MiddlewareParams) => {
9
+ return (next) => (action) => {
10
+ const result: CheckoutResult = next(action);
11
+ const preOrder = result?.payload?.pre_order;
12
+
13
+ if (!preOrder) {
14
+ return result;
15
+ }
16
+
17
+ const { addressList: addresses } = getState().checkout;
18
+
19
+ if (preOrder) {
20
+ const stepCompleted = [
21
+ preOrder.delivery_option?.delivery_option_type === 'retail_store'
22
+ ? true
23
+ : preOrder.shipping_address?.pk,
24
+ preOrder.billing_address?.pk,
25
+ preOrder.shipping_option?.pk,
26
+ addresses.length > 0
27
+ ].every(Boolean);
28
+
29
+ dispatch(setShippingStepCompleted(stepCompleted));
30
+ }
31
+
32
+ return result;
33
+ };
34
+ };
35
+
36
+ Object.defineProperty(shippingStepMiddleware, 'name', {
37
+ value: 'shippingStepMiddleware'
38
+ });