@akinon/next 2.0.0-beta.1 → 2.0.0-beta.11
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 +56 -0
- package/__tests__/next-config.test.ts +83 -0
- package/__tests__/tsconfig.json +23 -0
- package/api/auth.ts +72 -5
- package/api/client.ts +18 -1
- package/babel.config.js +6 -0
- package/bin/pz-prebuild.js +1 -0
- package/bin/pz-run-tests.js +99 -0
- package/bin/run-prebuild-tests.js +46 -0
- package/components/accordion.tsx +1 -1
- package/components/button.tsx +51 -36
- package/components/client-root.tsx +20 -0
- package/components/input.tsx +1 -1
- package/components/modal.tsx +1 -1
- package/components/price.tsx +2 -2
- package/components/select.tsx +1 -1
- package/components/selected-payment-option-view.tsx +1 -1
- package/data/client/api.ts +2 -0
- package/data/client/basket.ts +27 -5
- package/data/client/checkout.ts +62 -7
- package/data/client/misc.ts +25 -1
- package/data/client/product.ts +19 -2
- package/data/client/user.ts +16 -8
- package/data/server/flatpage.ts +8 -4
- package/data/server/form.ts +12 -4
- package/data/server/landingpage.ts +8 -4
- package/data/server/menu.ts +7 -2
- package/data/server/product.ts +16 -5
- package/data/server/seo.ts +11 -4
- package/data/server/widget.ts +19 -4
- package/data/urls.ts +11 -3
- package/hooks/index.ts +1 -0
- package/hooks/use-localization.ts +24 -10
- package/hooks/use-router.ts +5 -2
- package/hooks/use-sentry-uncaught-errors.ts +24 -0
- package/instrumentation/index.ts +10 -0
- package/jest.config.js +19 -0
- package/lib/cache-handler.mjs +2 -2
- package/lib/cache.ts +4 -4
- package/localization/index.ts +2 -1
- package/middlewares/default.ts +31 -4
- package/middlewares/locale.ts +35 -11
- package/middlewares/url-redirection.ts +16 -0
- package/package.json +8 -4
- package/plugins.js +2 -1
- package/redux/middlewares/checkout.ts +30 -130
- package/redux/middlewares/index.ts +6 -2
- package/redux/middlewares/pre-order/address.ts +50 -0
- package/redux/middlewares/pre-order/attribute-based-shipping-option.ts +46 -0
- package/redux/middlewares/pre-order/data-source-shipping-option.ts +43 -0
- package/redux/middlewares/pre-order/delivery-option.ts +40 -0
- package/redux/middlewares/pre-order/index.ts +29 -0
- package/redux/middlewares/pre-order/installment-option.ts +42 -0
- package/redux/middlewares/pre-order/payment-option.ts +34 -0
- package/redux/middlewares/pre-order/pre-order-validation.ts +24 -0
- package/redux/middlewares/pre-order/redirection.ts +40 -0
- package/redux/middlewares/pre-order/set-pre-order.ts +22 -0
- package/redux/middlewares/pre-order/shipping-option.ts +44 -0
- package/redux/middlewares/pre-order/shipping-step.ts +38 -0
- package/redux/reducers/checkout.ts +8 -2
- package/redux/reducers/index.ts +5 -3
- package/redux/reducers/root.ts +7 -2
- package/sentry/index.ts +36 -17
- package/tailwind/content.js +16 -0
- package/types/commerce/account.ts +5 -1
- package/types/commerce/checkout.ts +23 -0
- package/types/index.ts +7 -2
- package/utils/get-root-hostname.ts +28 -0
- package/utils/index.ts +6 -2
- package/utils/localization.ts +4 -0
- package/utils/override-middleware.ts +25 -0
- package/views/error-page.tsx +93 -0
- package/with-pz-config.js +4 -3
|
@@ -5,11 +5,14 @@ import { ROUTES } from 'routes';
|
|
|
5
5
|
import type { Middleware } from '@reduxjs/toolkit';
|
|
6
6
|
import {
|
|
7
7
|
errorMiddleware,
|
|
8
|
+
redirectUrlMiddleware,
|
|
8
9
|
contextListMiddleware,
|
|
9
|
-
preOrderMiddleware,
|
|
10
10
|
hepsiPayMiddleware,
|
|
11
11
|
walletPaymentMiddleware
|
|
12
12
|
} from './checkout';
|
|
13
|
+
|
|
14
|
+
import { preOrderMiddlewares } from './pre-order';
|
|
15
|
+
|
|
13
16
|
import { api } from '../../data/client/api';
|
|
14
17
|
import logger from '@akinon/next/utils/log';
|
|
15
18
|
|
|
@@ -48,7 +51,8 @@ const middlewares = [
|
|
|
48
51
|
rtkQueryResponseHandler,
|
|
49
52
|
rtkQueryErrorHandler,
|
|
50
53
|
errorMiddleware,
|
|
51
|
-
|
|
54
|
+
redirectUrlMiddleware,
|
|
55
|
+
...preOrderMiddlewares,
|
|
52
56
|
contextListMiddleware,
|
|
53
57
|
hepsiPayMiddleware,
|
|
54
58
|
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
|
+
});
|
|
@@ -70,6 +70,7 @@ export interface CheckoutState {
|
|
|
70
70
|
};
|
|
71
71
|
supportedMethods: string;
|
|
72
72
|
};
|
|
73
|
+
payOnDeliveryOtpModalActive: boolean;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
const initialState: CheckoutState = {
|
|
@@ -103,7 +104,8 @@ const initialState: CheckoutState = {
|
|
|
103
104
|
retailStores: [],
|
|
104
105
|
attributeBasedShippingOptions: [],
|
|
105
106
|
selectedShippingOptions: {},
|
|
106
|
-
hepsipayAvailability: false
|
|
107
|
+
hepsipayAvailability: false,
|
|
108
|
+
payOnDeliveryOtpModalActive: false
|
|
107
109
|
};
|
|
108
110
|
|
|
109
111
|
const checkoutSlice = createSlice({
|
|
@@ -193,6 +195,9 @@ const checkoutSlice = createSlice({
|
|
|
193
195
|
},
|
|
194
196
|
setWalletPaymentData(state, { payload }) {
|
|
195
197
|
state.walletPaymentData = payload;
|
|
198
|
+
},
|
|
199
|
+
setPayOnDeliveryOtpModalActive(state, { payload }) {
|
|
200
|
+
state.payOnDeliveryOtpModalActive = payload;
|
|
196
201
|
}
|
|
197
202
|
}
|
|
198
203
|
});
|
|
@@ -225,7 +230,8 @@ export const {
|
|
|
225
230
|
setAttributeBasedShippingOptions,
|
|
226
231
|
setSelectedShippingOptions,
|
|
227
232
|
setHepsipayAvailability,
|
|
228
|
-
setWalletPaymentData
|
|
233
|
+
setWalletPaymentData,
|
|
234
|
+
setPayOnDeliveryOtpModalActive
|
|
229
235
|
} = checkoutSlice.actions;
|
|
230
236
|
|
|
231
237
|
export default checkoutSlice.reducer;
|
package/redux/reducers/index.ts
CHANGED
|
@@ -9,15 +9,17 @@ import { masterpassReducer } from '@akinon/pz-masterpass';
|
|
|
9
9
|
import { otpReducer } from '@akinon/pz-otp';
|
|
10
10
|
import { savedCardReducer } from '@akinon/pz-saved-card';
|
|
11
11
|
|
|
12
|
+
const fallbackReducer = (state = {}) => state;
|
|
13
|
+
|
|
12
14
|
const reducers = {
|
|
13
15
|
[api.reducerPath]: api.reducer,
|
|
14
16
|
root: rootReducer,
|
|
15
17
|
checkout: checkoutReducer,
|
|
16
18
|
config: configReducer,
|
|
17
19
|
header: headerReducer,
|
|
18
|
-
masterpass: masterpassReducer,
|
|
19
|
-
otp: otpReducer,
|
|
20
|
-
savedCard: savedCardReducer
|
|
20
|
+
masterpass: masterpassReducer || fallbackReducer,
|
|
21
|
+
otp: otpReducer || fallbackReducer,
|
|
22
|
+
savedCard: savedCardReducer || fallbackReducer
|
|
21
23
|
};
|
|
22
24
|
|
|
23
25
|
export default reducers;
|
package/redux/reducers/root.ts
CHANGED
|
@@ -14,7 +14,8 @@ const initialState = {
|
|
|
14
14
|
open: false,
|
|
15
15
|
title: null,
|
|
16
16
|
content: null
|
|
17
|
-
}
|
|
17
|
+
},
|
|
18
|
+
userPhoneNumber: null
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
const rootSlice = createSlice({
|
|
@@ -45,6 +46,9 @@ const rootSlice = createSlice({
|
|
|
45
46
|
state.rootModal.open = false;
|
|
46
47
|
state.rootModal.title = null;
|
|
47
48
|
state.rootModal.content = null;
|
|
49
|
+
},
|
|
50
|
+
setUserPhoneNumber(state, { payload }) {
|
|
51
|
+
state.userPhoneNumber = payload;
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
});
|
|
@@ -55,7 +59,8 @@ export const {
|
|
|
55
59
|
toggleMiniBasket,
|
|
56
60
|
setHighlightedItem,
|
|
57
61
|
openRootModal,
|
|
58
|
-
closeRootModal
|
|
62
|
+
closeRootModal,
|
|
63
|
+
setUserPhoneNumber
|
|
59
64
|
} = rootSlice.actions;
|
|
60
65
|
|
|
61
66
|
export default rootSlice.reducer;
|
package/sentry/index.ts
CHANGED
|
@@ -1,29 +1,48 @@
|
|
|
1
1
|
import * as Sentry from '@sentry/nextjs';
|
|
2
2
|
|
|
3
|
-
const SENTRY_DSN: string =
|
|
3
|
+
const SENTRY_DSN: string | undefined =
|
|
4
4
|
process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN;
|
|
5
5
|
|
|
6
|
+
export enum ClientLogType {
|
|
7
|
+
UNCAUGHT_ERROR_PAGE = 'UNCAUGHT_ERROR_PAGE',
|
|
8
|
+
CHECKOUT = 'CHECKOUT'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const ALLOWED_CLIENT_LOG_TYPES: ClientLogType[] = [
|
|
12
|
+
ClientLogType.UNCAUGHT_ERROR_PAGE,
|
|
13
|
+
ClientLogType.CHECKOUT
|
|
14
|
+
];
|
|
15
|
+
|
|
6
16
|
export const initSentry = (
|
|
7
17
|
type: 'Server' | 'Client' | 'Edge',
|
|
8
18
|
options: Sentry.BrowserOptions | Sentry.NodeOptions | Sentry.EdgeOptions = {}
|
|
9
19
|
) => {
|
|
10
20
|
// TODO: Handle options with ESLint rules
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
Sentry.init({
|
|
23
|
+
dsn:
|
|
24
|
+
options.dsn ||
|
|
25
|
+
SENTRY_DSN ||
|
|
26
|
+
'https://d8558ef8997543deacf376c7d8d7cf4b@o64293.ingest.sentry.io/4504338423742464',
|
|
27
|
+
initialScope: {
|
|
28
|
+
tags: {
|
|
29
|
+
APP_TYPE: 'ProjectZeroNext',
|
|
30
|
+
TYPE: type
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
tracesSampleRate: 0,
|
|
34
|
+
integrations: [],
|
|
35
|
+
beforeSend: (event, hint) => {
|
|
36
|
+
if (
|
|
37
|
+
type === 'Client' &&
|
|
38
|
+
!ALLOWED_CLIENT_LOG_TYPES.includes(
|
|
39
|
+
event.tags?.LOG_TYPE as ClientLogType
|
|
40
|
+
)
|
|
41
|
+
) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
13
44
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
SENTRY_DSN ||
|
|
18
|
-
'https://d8558ef8997543deacf376c7d8d7cf4b@o64293.ingest.sentry.io/4504338423742464',
|
|
19
|
-
initialScope: {
|
|
20
|
-
tags: {
|
|
21
|
-
APP_TYPE: 'ProjectZeroNext',
|
|
22
|
-
TYPE: type
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
tracesSampleRate: 1.0,
|
|
26
|
-
integrations: []
|
|
27
|
-
});
|
|
28
|
-
}
|
|
45
|
+
return event;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
29
48
|
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const defaultPlugins = require('../plugins');
|
|
2
|
+
|
|
3
|
+
const getAkinonNextContent = (plugins = defaultPlugins) => {
|
|
4
|
+
return [
|
|
5
|
+
`./node_modules/@akinon/next/components/**/*.{js,ts,jsx,tsx}`,
|
|
6
|
+
`../../node_modules/@akinon/next/components/**/*.{js,ts,jsx,tsx}`,
|
|
7
|
+
...plugins
|
|
8
|
+
.map((plugin) => [
|
|
9
|
+
`./node_modules/@akinon/${plugin}/**/*.{js,ts,jsx,tsx}`,
|
|
10
|
+
`../../node_modules/@akinon/${plugin}/**/*.{js,ts,jsx,tsx}`
|
|
11
|
+
])
|
|
12
|
+
.flat()
|
|
13
|
+
];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
module.exports = getAkinonNextContent;
|
|
@@ -19,6 +19,10 @@ export type AccountOrderCancellation = {
|
|
|
19
19
|
description: string;
|
|
20
20
|
order_item: string;
|
|
21
21
|
reason: string;
|
|
22
|
+
cancellation_request_image_set?: Array<{
|
|
23
|
+
image: string;
|
|
24
|
+
description: string;
|
|
25
|
+
}>;
|
|
22
26
|
}>;
|
|
23
27
|
};
|
|
24
28
|
|
|
@@ -61,5 +65,5 @@ export type ContactFormType = {
|
|
|
61
65
|
order?: string;
|
|
62
66
|
country_code?: string;
|
|
63
67
|
order_needed?: boolean;
|
|
64
|
-
file?: FileList
|
|
68
|
+
file?: FileList;
|
|
65
69
|
};
|