@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.
Files changed (74) hide show
  1. package/.eslintrc.js +12 -0
  2. package/CHANGELOG.md +56 -0
  3. package/__tests__/next-config.test.ts +83 -0
  4. package/__tests__/tsconfig.json +23 -0
  5. package/api/auth.ts +72 -5
  6. package/api/client.ts +18 -1
  7. package/babel.config.js +6 -0
  8. package/bin/pz-prebuild.js +1 -0
  9. package/bin/pz-run-tests.js +99 -0
  10. package/bin/run-prebuild-tests.js +46 -0
  11. package/components/accordion.tsx +1 -1
  12. package/components/button.tsx +51 -36
  13. package/components/client-root.tsx +20 -0
  14. package/components/input.tsx +1 -1
  15. package/components/modal.tsx +1 -1
  16. package/components/price.tsx +2 -2
  17. package/components/select.tsx +1 -1
  18. package/components/selected-payment-option-view.tsx +1 -1
  19. package/data/client/api.ts +2 -0
  20. package/data/client/basket.ts +27 -5
  21. package/data/client/checkout.ts +62 -7
  22. package/data/client/misc.ts +25 -1
  23. package/data/client/product.ts +19 -2
  24. package/data/client/user.ts +16 -8
  25. package/data/server/flatpage.ts +8 -4
  26. package/data/server/form.ts +12 -4
  27. package/data/server/landingpage.ts +8 -4
  28. package/data/server/menu.ts +7 -2
  29. package/data/server/product.ts +16 -5
  30. package/data/server/seo.ts +11 -4
  31. package/data/server/widget.ts +19 -4
  32. package/data/urls.ts +11 -3
  33. package/hooks/index.ts +1 -0
  34. package/hooks/use-localization.ts +24 -10
  35. package/hooks/use-router.ts +5 -2
  36. package/hooks/use-sentry-uncaught-errors.ts +24 -0
  37. package/instrumentation/index.ts +10 -0
  38. package/jest.config.js +19 -0
  39. package/lib/cache-handler.mjs +2 -2
  40. package/lib/cache.ts +4 -4
  41. package/localization/index.ts +2 -1
  42. package/middlewares/default.ts +31 -4
  43. package/middlewares/locale.ts +35 -11
  44. package/middlewares/url-redirection.ts +16 -0
  45. package/package.json +8 -4
  46. package/plugins.js +2 -1
  47. package/redux/middlewares/checkout.ts +30 -130
  48. package/redux/middlewares/index.ts +6 -2
  49. package/redux/middlewares/pre-order/address.ts +50 -0
  50. package/redux/middlewares/pre-order/attribute-based-shipping-option.ts +46 -0
  51. package/redux/middlewares/pre-order/data-source-shipping-option.ts +43 -0
  52. package/redux/middlewares/pre-order/delivery-option.ts +40 -0
  53. package/redux/middlewares/pre-order/index.ts +29 -0
  54. package/redux/middlewares/pre-order/installment-option.ts +42 -0
  55. package/redux/middlewares/pre-order/payment-option.ts +34 -0
  56. package/redux/middlewares/pre-order/pre-order-validation.ts +24 -0
  57. package/redux/middlewares/pre-order/redirection.ts +40 -0
  58. package/redux/middlewares/pre-order/set-pre-order.ts +22 -0
  59. package/redux/middlewares/pre-order/shipping-option.ts +44 -0
  60. package/redux/middlewares/pre-order/shipping-step.ts +38 -0
  61. package/redux/reducers/checkout.ts +8 -2
  62. package/redux/reducers/index.ts +5 -3
  63. package/redux/reducers/root.ts +7 -2
  64. package/sentry/index.ts +36 -17
  65. package/tailwind/content.js +16 -0
  66. package/types/commerce/account.ts +5 -1
  67. package/types/commerce/checkout.ts +23 -0
  68. package/types/index.ts +7 -2
  69. package/utils/get-root-hostname.ts +28 -0
  70. package/utils/index.ts +6 -2
  71. package/utils/localization.ts +4 -0
  72. package/utils/override-middleware.ts +25 -0
  73. package/views/error-page.tsx +93 -0
  74. 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
- preOrderMiddleware,
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;
@@ -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;
@@ -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
- // TODO: Remove Zero Project DSN
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
- if (type === 'Server' || type === 'Edge') {
15
- Sentry.init({
16
- dsn:
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
  };