@akinon/next 1.43.0-rc.9 → 1.44.0

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 (48) hide show
  1. package/CHANGELOG.md +2 -115
  2. package/api/client.ts +9 -33
  3. package/assets/styles/index.scss +26 -50
  4. package/components/input.tsx +7 -21
  5. package/components/link.tsx +13 -17
  6. package/components/pagination.tsx +2 -1
  7. package/components/price.tsx +4 -11
  8. package/components/selected-payment-option-view.tsx +38 -26
  9. package/data/client/account.ts +9 -10
  10. package/data/client/address.ts +8 -32
  11. package/data/client/api.ts +1 -1
  12. package/data/client/checkout.ts +4 -47
  13. package/data/server/category.ts +2 -2
  14. package/data/server/list.ts +2 -2
  15. package/data/server/product.ts +13 -15
  16. package/data/server/special-page.ts +2 -2
  17. package/data/urls.ts +1 -5
  18. package/hocs/server/with-segment-defaults.tsx +2 -2
  19. package/hooks/index.ts +1 -2
  20. package/hooks/use-payment-options.ts +1 -2
  21. package/lib/cache.ts +6 -18
  22. package/middlewares/default.ts +2 -45
  23. package/middlewares/locale.ts +30 -32
  24. package/middlewares/pretty-url.ts +0 -4
  25. package/middlewares/url-redirection.ts +0 -4
  26. package/package.json +4 -5
  27. package/plugins.d.ts +0 -1
  28. package/redux/middlewares/checkout.ts +11 -70
  29. package/redux/reducers/checkout.ts +5 -24
  30. package/redux/reducers/config.ts +0 -2
  31. package/types/commerce/account.ts +0 -1
  32. package/types/commerce/address.ts +1 -1
  33. package/types/commerce/checkout.ts +0 -30
  34. package/types/commerce/misc.ts +0 -2
  35. package/types/commerce/order.ts +0 -12
  36. package/types/index.ts +2 -28
  37. package/utils/app-fetch.ts +1 -1
  38. package/utils/generate-commerce-search-params.ts +2 -6
  39. package/utils/index.ts +6 -27
  40. package/utils/menu-generator.ts +2 -2
  41. package/utils/server-translation.ts +1 -5
  42. package/with-pz-config.js +1 -11
  43. package/assets/styles/index.css +0 -49
  44. package/assets/styles/index.css.map +0 -1
  45. package/hooks/use-message-listener.ts +0 -24
  46. package/lib/cache-handler.mjs +0 -33
  47. package/routes/pretty-url.tsx +0 -194
  48. package/utils/redirection-iframe.ts +0 -85
package/CHANGELOG.md CHANGED
@@ -1,125 +1,12 @@
1
1
  # @akinon/next
2
2
 
3
- ## 1.43.0-rc.9
3
+ ## 1.44.0
4
4
 
5
- ### Minor Changes
6
-
7
- - bc2b411: ZERO-2825: Add attribute-based shipping options to checkout page
8
-
9
- ## 1.43.0-rc.8
10
-
11
- ### Minor Changes
12
-
13
- - 70279e7: ZERO-2817: Add metrics endpoint in default middleware
14
- - 9d94f7e: ZERO-2820: update parent pk usage for menu generator
15
-
16
- ## 1.43.0-rc.7
17
-
18
- ### Minor Changes
19
-
20
- - 7bd3d99: ZERO-2801: Refactor locale middleware to handle single locale configuration
21
-
22
- ## 1.43.0-rc.6
5
+ ## 1.43.0
23
6
 
24
7
  ### Minor Changes
25
8
 
26
- - 90282b5: ZERO-2729: Audit packages for yarn and npm and also update app-template
27
- - 572d2e8: ZERO-2667: Add iframe support for redirection payment methods
28
- - a4c8d6a: ZERO-2663: Fix the image url for gif and svgs and return them without options
29
- - fda5b92: ZERO-2725: fix invalid import
30
- - 2d9b2b2: ZERO-2816: Add segment to headers
31
- - c53ea3e: ZERO-2609: Reset additional form fields when selectedFormType is not company
32
- - 8d9ac9a: ZERO-2794: Add field to order type
33
- - e9541a1: ZERO-2816: Add headers to url
34
- - c53ef7b: ZERO-2668: The Link component has been updated to improve the logic for handling href values. Previously, if the href was not a string or started with 'http', it would return the href as is. Now, if the href is not provided, it will default to '#' to prevent any potential errors. Additionally, if the href is a string and does not start with 'http', it will be formatted with the locale and pathname, based on the localeUrlStrategy and defaultLocaleValue. This ensures that the correct href is generated based on the localization settings.
35
- - 64699d3: ZERO-2761: Fix invalid import for plugin module
36
- - 0d3a913: ZERO-2725: Update decimal scale in Price component
37
- - 1448a96: ZERO-2612: add errors type in CheckoutState
38
- - d3474c6: ZERO-2655: Add data source shipping option
39
- - 75080fd: ZERO-2630: Add max limit to postcode area
40
- - 17f8752: ZERO-2816: Make the incoming currency lowercase
41
- - 91265bb: ZERO-2551: Improve pretty url and caching performance
42
- - bbe18b9: ZERO-2575: Fix build error
43
- - d409996: ZERO-2781: Refactor buildClientRequestUrl function to support caching and options
44
- - 94b6928: ZERO-2551: Add cache handler check in url-redirection middleware
45
- - 98bb8dc: ZERO-2706: Cache getTranlations method
46
- - 46b7aad: ZERO-2775: Add condition and logger for menuitemmodel data
47
- - dcc8a15: ZERO-2694: added build step to RC branch pipeline
48
- - fad2768: ZERO-2739: add gpay to payment plugin map
49
- - dff0d59: ZERO-2659: add formData support to proxy api requests
50
- - eecb282: ZERO-2607: Update address-related functions to include invalidateTag option
51
9
  - 4a163f2: ZERO-2761: Add condition for basket summary
52
- - beb499e: ZERO-2551: Add new tsconfig paths
53
- - 146ea39: ZERO-2774: Update imports
54
- - f2c92d5: ZERO-2816: Update cookie name
55
- - c47be30: ZERO-2744: Update Order and OrderItem types
56
- - e9a46ac: ZERO-2738: add CVC input to registered cards in Masterpass
57
- - f046f8e: ZERO-2575: update version for react-number-format
58
- - 86d2531: ZERO-2693: resolve dependency collision warning for eslint-config-next
59
- - 3f9b8d7: ZERO-2761: Update plugins.js for akinon-next
60
-
61
- ## 1.43.0-rc.5
62
-
63
- ### Minor Changes
64
-
65
- - 17f8752: ZERO-2816: Make the incoming currency lowercase
66
-
67
- ## 1.43.0-rc.4
68
-
69
- ### Minor Changes
70
-
71
- - 3f9b8d7: ZERO-2761: Update plugins.js for akinon-next
72
-
73
- ## 1.43.0-rc.3
74
-
75
- ### Minor Changes
76
-
77
- - 64699d3: ZERO-2761: Fix invalid import for plugin module
78
-
79
- ## 1.43.0-rc.2
80
-
81
- ### Minor Changes
82
-
83
- - f2c92d5: ZERO-2816: Update cookie name
84
-
85
- ## 1.43.0-rc.1
86
-
87
- ### Minor Changes
88
-
89
- - eecb282: ZERO-2607: Update address-related functions to include invalidateTag option
90
-
91
- ## 1.43.0-rc.0
92
-
93
- ### Minor Changes
94
-
95
- - 90282b5: ZERO-2729: Audit packages for yarn and npm and also update app-template
96
- - 572d2e8: ZERO-2667: Add iframe support for redirection payment methods
97
- - a4c8d6a: ZERO-2663: Fix the image url for gif and svgs and return them without options
98
- - fda5b92: ZERO-2725: fix invalid import
99
- - 2d9b2b2: ZERO-2816: Add segment to headers
100
- - c53ea3e: ZERO-2609: Reset additional form fields when selectedFormType is not company
101
- - 8d9ac9a: ZERO-2794: Add field to order type
102
- - e9541a1: ZERO-2816: Add headers to url
103
- - c53ef7b: ZERO-2668: The Link component has been updated to improve the logic for handling href values. Previously, if the href was not a string or started with 'http', it would return the href as is. Now, if the href is not provided, it will default to '#' to prevent any potential errors. Additionally, if the href is a string and does not start with 'http', it will be formatted with the locale and pathname, based on the localeUrlStrategy and defaultLocaleValue. This ensures that the correct href is generated based on the localization settings.
104
- - 0d3a913: ZERO-2725: Update decimal scale in Price component
105
- - 1448a96: ZERO-2612: add errors type in CheckoutState
106
- - d3474c6: ZERO-2655: Add data source shipping option
107
- - 75080fd: ZERO-2630: Add max limit to postcode area
108
- - 91265bb: ZERO-2551: Improve pretty url and caching performance
109
- - bbe18b9: ZERO-2575: Fix build error
110
- - d409996: ZERO-2781: Refactor buildClientRequestUrl function to support caching and options
111
- - 94b6928: ZERO-2551: Add cache handler check in url-redirection middleware
112
- - 98bb8dc: ZERO-2706: Cache getTranlations method
113
- - 46b7aad: ZERO-2775: Add condition and logger for menuitemmodel data
114
- - dcc8a15: ZERO-2694: added build step to RC branch pipeline
115
- - fad2768: ZERO-2739: add gpay to payment plugin map
116
- - dff0d59: ZERO-2659: add formData support to proxy api requests
117
- - beb499e: ZERO-2551: Add new tsconfig paths
118
- - 146ea39: ZERO-2774: Update imports
119
- - c47be30: ZERO-2744: Update Order and OrderItem types
120
- - e9a46ac: ZERO-2738: add CVC input to registered cards in Masterpass
121
- - f046f8e: ZERO-2575: update version for react-number-format
122
- - 86d2531: ZERO-2693: resolve dependency collision warning for eslint-config-next
123
10
 
124
11
  ## 1.42.0
125
12
 
package/api/client.ts CHANGED
@@ -4,7 +4,6 @@ import settings from 'settings';
4
4
  import logger from '../utils/log';
5
5
  import formatCookieString from '../utils/format-cookie-string';
6
6
  import cookieParser from 'set-cookie-parser';
7
- import { cookies } from 'next/headers';
8
7
 
9
8
  interface RouteParams {
10
9
  params: {
@@ -75,31 +74,16 @@ async function proxyRequest(...args) {
75
74
  }
76
75
  } as RequestInit;
77
76
 
78
- const nextCookies = cookies();
79
- const segment = nextCookies.get('pz-segment')?.value;
80
- const currency = nextCookies.get('pz-external-currency')?.value;
81
-
82
- if (segment) {
83
- fetchOptions.headers['X-Segment-Id'] = segment;
84
- }
85
-
86
- if (currency) {
87
- fetchOptions.headers = Object.assign({}, fetchOptions.headers, {
88
- 'x-currency': currency
89
- });
90
- }
91
-
92
77
  if (options.contentType) {
93
78
  fetchOptions.headers['Content-Type'] = options.contentType;
94
79
  }
95
80
 
96
- const isMultipartFormData = req.headers.get('content-type')?.includes('multipart/form-data;');
97
-
98
81
  if (req.method !== 'GET') {
99
- let body: Record<string, any> | FormData = {};
82
+ const formData = new URLSearchParams();
83
+ let body = {};
100
84
 
101
85
  try {
102
- body = isMultipartFormData ? await req.formData() : await req.json();
86
+ body = await req.json();
103
87
  } catch (error) {
104
88
  logger.error(
105
89
  `Client Proxy Request - Error while parsing request body to JSON`,
@@ -110,21 +94,13 @@ async function proxyRequest(...args) {
110
94
  );
111
95
  }
112
96
 
113
- if (isMultipartFormData) {
114
- fetchOptions.body = body as FormData;
115
- } else {
116
- const formData = new FormData();
117
-
118
- Object.keys(body ?? {}).forEach((key) => {
119
- if (body[key]) {
120
- formData.append(key, body[key]);
121
- }
122
- });
97
+ Object.keys(body ?? {}).forEach((key) => {
98
+ if (body[key]) {
99
+ formData.append(key, body[key]);
100
+ }
101
+ });
123
102
 
124
- fetchOptions.body = !options.useFormData
125
- ? JSON.stringify(body)
126
- : formData;
127
- }
103
+ fetchOptions.body = !options.useFormData ? JSON.stringify(body) : formData;
128
104
  }
129
105
 
130
106
  let url = `${commerceUrl}/${slug.replace(/,/g, '/')}`;
@@ -1,53 +1,29 @@
1
1
  .checkout-payment-iframe-wrapper {
2
- position: fixed;
3
- top: 0;
4
- left: 0;
5
- width: 100%;
6
- height: 100%;
7
- border: none;
8
- z-index: 1000;
9
- background-color: white;
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100%;
6
+ height: 100%;
7
+ border: none;
8
+ z-index: 1000;
9
+ background-color: white;
10
10
 
11
- iframe {
12
- width: 100%;
13
- height: 100%;
14
- border: none;
15
- background-color: white;
16
- }
11
+ iframe {
12
+ width: 100%;
13
+ height: 100%;
14
+ border: none;
15
+ background-color: white;
16
+ }
17
17
 
18
- .close-button {
19
- position: fixed;
20
- top: 16px;
21
- right: 16px;
22
- width: 32px;
23
- height: 32px;
24
- display: flex;
25
- align-items: center;
26
- justify-content: center;
27
- z-index: 1001;
28
- }
29
- }
30
-
31
- .checkout-payment-redirection-iframe-wrapper {
32
- width: 100%;
33
- position: relative;
34
-
35
- iframe {
36
- width: 100%;
37
- height: 100%;
38
- border: none;
39
- background-color: white;
40
- }
41
-
42
- .close-button {
43
- position: absolute;
44
- top: 16px;
45
- right: 16px;
46
- width: 32px;
47
- height: 32px;
48
- display: flex;
49
- align-items: center;
50
- justify-content: center;
51
- z-index: 1001;
52
- }
53
- }
18
+ .close-button {
19
+ position: fixed;
20
+ top: 16px;
21
+ right: 16px;
22
+ width: 32px;
23
+ height: 32px;
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ z-index: 1001;
28
+ }
29
+ }
@@ -1,30 +1,17 @@
1
1
  import clsx from 'clsx';
2
- import { forwardRef, FocusEvent, useState, Ref } from 'react';
2
+ import { forwardRef, FocusEvent, useState } from 'react';
3
3
  import { Controller } from 'react-hook-form';
4
-
5
- // @ts-ignore
6
- import { PatternFormat, PatternFormatProps } from 'react-number-format';
4
+ import NumberFormat, { NumberFormatProps } from 'react-number-format';
7
5
  import { InputProps } from '../types';
8
6
  import { twMerge } from 'tailwind-merge';
9
7
 
10
- const PatternFormatWithRef = forwardRef(
11
- (props: PatternFormatProps, ref: Ref<HTMLInputElement>) => {
12
- return <PatternFormat {...props} getInputRef={ref} />;
13
- }
14
- );
15
- PatternFormatWithRef.displayName = 'PatternFormatWithRef';
16
-
17
8
  export const Input = forwardRef<
18
9
  HTMLInputElement,
19
10
  InputProps &
20
11
  Pick<
21
- PatternFormatProps,
22
- 'mask' | 'allowEmptyFormatting' | 'onValueChange'
23
- > & {
24
- format?: string;
25
- defaultValue?: string;
26
- type?: string;
27
- }
12
+ NumberFormatProps,
13
+ 'format' | 'mask' | 'allowEmptyFormatting' | 'onValueChange'
14
+ >
28
15
  >((props, ref) => {
29
16
  const [focused, setFocused] = useState(false);
30
17
  const [hasValue, setHasValue] = useState(false);
@@ -50,7 +37,6 @@ export const Input = forwardRef<
50
37
  ),
51
38
  props.className
52
39
  );
53
-
54
40
  const inputProps: any = {
55
41
  id,
56
42
  ref,
@@ -93,14 +79,14 @@ export const Input = forwardRef<
93
79
  <Controller
94
80
  name={props.name ?? ''}
95
81
  control={props.control}
82
+ defaultValue={false}
96
83
  render={({ field }) => (
97
- <PatternFormatWithRef
84
+ <NumberFormat
98
85
  format={format}
99
86
  mask={mask ?? ''}
100
87
  {...rest}
101
88
  {...field}
102
89
  {...inputProps}
103
- type={props.type as 'text' | 'password' | 'tel'}
104
90
  />
105
91
  )}
106
92
  />
@@ -10,32 +10,28 @@ type LinkProps = Omit<
10
10
  React.AnchorHTMLAttributes<HTMLAnchorElement>,
11
11
  keyof NextLinkProps
12
12
  > &
13
- NextLinkProps & {
14
- href: string;
15
- };
13
+ NextLinkProps;
16
14
 
17
15
  export const Link = ({ children, href, ...rest }: LinkProps) => {
18
16
  const { locale, defaultLocaleValue, localeUrlStrategy } = useLocalization();
19
17
  const formattedHref = useMemo(() => {
20
- if (!href) {
21
- return '#';
18
+ if (typeof href !== 'string' || href.startsWith('http')) {
19
+ return href;
22
20
  }
23
21
 
24
- if (typeof href === 'string' && !href.startsWith('http')) {
25
- const pathnameWithoutLocale = href.replace(urlLocaleMatcherRegex, '');
26
- const hrefWithLocale = `/${locale}${pathnameWithoutLocale}`;
22
+ const pathnameWithoutLocale = href.replace(urlLocaleMatcherRegex, '');
23
+ const hrefWithLocale = `/${locale}${pathnameWithoutLocale}`;
27
24
 
28
- if (localeUrlStrategy === LocaleUrlStrategy.ShowAllLocales) {
29
- return hrefWithLocale;
30
- } else if (
31
- localeUrlStrategy === LocaleUrlStrategy.HideDefaultLocale &&
32
- locale !== defaultLocaleValue
33
- ) {
34
- return hrefWithLocale;
35
- }
25
+ if (localeUrlStrategy === LocaleUrlStrategy.ShowAllLocales) {
26
+ return hrefWithLocale;
27
+ } else if (
28
+ localeUrlStrategy === LocaleUrlStrategy.HideDefaultLocale &&
29
+ locale !== defaultLocaleValue
30
+ ) {
31
+ return hrefWithLocale;
36
32
  }
37
33
 
38
- return href;
34
+ return href || '#';
39
35
  }, [href, defaultLocaleValue, locale, localeUrlStrategy]);
40
36
 
41
37
  return (
@@ -1,9 +1,10 @@
1
1
  'use client';
2
2
 
3
3
  import { MouseEvent, useCallback, useEffect, useState } from 'react';
4
- import { PaginationProps } from '../types';
4
+ import { PaginationProps } from '@theme/components/types';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import clsx from 'clsx';
7
+
7
8
  import usePagination from '@akinon/next/hooks/use-pagination';
8
9
  import { useLocalization } from '@akinon/next/hooks';
9
10
  import { useRouter } from '@akinon/next/hooks';
@@ -1,14 +1,11 @@
1
1
  import { useMemo } from 'react';
2
-
3
- // @ts-ignore
4
- import { NumericFormat, NumericFormatProps } from 'react-number-format';
2
+ import NumberFormat, { NumberFormatProps } from 'react-number-format';
5
3
  import { getCurrency } from '@akinon/next/utils';
6
4
 
7
5
  import { useLocalization } from '@akinon/next/hooks';
8
6
  import { PriceProps } from '../types';
9
- import Settings from 'settings';
10
7
 
11
- export const Price = (props: NumericFormatProps & PriceProps) => {
8
+ export const Price = (props: NumberFormatProps & PriceProps) => {
12
9
  const {
13
10
  value,
14
11
  currencyCode,
@@ -30,10 +27,6 @@ export const Price = (props: NumericFormatProps & PriceProps) => {
30
27
  // TODO: This is very bad practice. It broke decimalScale.
31
28
  const _value = value?.toString().replace('.', ',');
32
29
 
33
- const currentCurrencyDecimalScale = Settings.localization.currencies.find(
34
- (currency) => currency.code === currencyCode_
35
- ).decimalScale;
36
-
37
30
  const currency = useMemo(
38
31
  () =>
39
32
  getCurrency({
@@ -46,14 +39,14 @@ export const Price = (props: NumericFormatProps & PriceProps) => {
46
39
  );
47
40
 
48
41
  return (
49
- <NumericFormat
42
+ <NumberFormat
50
43
  value={useNegative ? `-${useNegativeSpace}${_value}` : _value}
51
44
  {...{
52
45
  [useCurrencyAfterPrice ? 'suffix' : 'prefix']: currency
53
46
  }}
54
47
  displayType={displayType}
55
48
  thousandSeparator={thousandSeparator}
56
- decimalScale={currentCurrencyDecimalScale ?? decimalScale}
49
+ decimalScale={decimalScale}
57
50
  decimalSeparator={decimalSeparator}
58
51
  fixedDecimalScale={fixedDecimalScale}
59
52
  {...rest}
@@ -6,21 +6,6 @@ import dynamic from 'next/dynamic';
6
6
  import { PaymentOptionViews } from 'views/checkout/steps/payment';
7
7
  import { useMemo } from 'react';
8
8
 
9
- const fallbackView = () => <div />;
10
-
11
- const paymentTypeToView = {
12
- bkm_express: 'bkm',
13
- credit_card: 'credit-card',
14
- credit_payment: 'credit-payment',
15
- funds_transfer: 'funds-transfer',
16
- gpay: 'gpay',
17
- loyalty_money: 'loyalty',
18
- masterpass: 'credit-card',
19
- pay_on_delivery: 'pay-on-delivery',
20
- redirection: 'redirection'
21
- // Add other mappings as needed
22
- };
23
-
24
9
  export default function SelectedPaymentOptionView() {
25
10
  const { payment_option } = useAppSelector(
26
11
  (state: RootState) => state.checkout.preOrder
@@ -29,7 +14,7 @@ export default function SelectedPaymentOptionView() {
29
14
  const Component = useMemo(
30
15
  () =>
31
16
  dynamic(
32
- async () => {
17
+ () => {
33
18
  const customOption = PaymentOptionViews.find(
34
19
  (opt) => opt.slug === payment_option.slug
35
20
  );
@@ -44,19 +29,46 @@ export default function SelectedPaymentOptionView() {
44
29
  });
45
30
  }
46
31
 
47
- const view = paymentTypeToView[payment_option.payment_type];
48
- if (view) {
49
- try {
50
- const mod = await import(
51
- `views/checkout/steps/payment/options/${view}`
32
+ let promise: any;
33
+
34
+ try {
35
+ if (payment_option.payment_type === 'credit_card') {
36
+ promise = import(
37
+ `views/checkout/steps/payment/options/credit-card`
38
+ );
39
+ } else if (payment_option.payment_type === 'funds_transfer') {
40
+ promise = import(
41
+ `views/checkout/steps/payment/options/funds-transfer`
42
+ );
43
+ } else if (payment_option.payment_type === 'redirection') {
44
+ promise = import(
45
+ `views/checkout/steps/payment/options/redirection`
46
+ );
47
+ } else if (payment_option.payment_type === 'pay_on_delivery') {
48
+ promise = import(
49
+ `views/checkout/steps/payment/options/pay-on-delivery`
50
+ );
51
+ } else if (payment_option.payment_type === 'loyalty_money') {
52
+ promise = import(`views/checkout/steps/payment/options/loyalty`);
53
+ } else if (payment_option.payment_type === 'masterpass') {
54
+ promise = import(
55
+ `views/checkout/steps/payment/options/credit-card`
52
56
  );
53
- return mod.default || fallbackView;
54
- } catch (error) {
55
- return fallbackView;
56
57
  }
57
- }
58
+ // else if (payment_option.payment_type === 'credit_payment') {
59
+ // promise = import(`views/checkout/steps/payment/options/credit-payment`);
60
+ // }
61
+ // else if (payment_option.payment_type === 'gpay') {
62
+ // promise = import(`views/checkout/steps/payment/options/gpay`);
63
+ // }
64
+ // else if (payment_option.payment_type === 'bkm_express') {
65
+ // promise = import(`views/checkout/steps/payment/options/bkm`);
66
+ // }
67
+ } catch (error) {}
58
68
 
59
- return fallbackView;
69
+ return promise
70
+ ? promise.then((mod) => mod.default).catch(() => () => null)
71
+ : new Promise<any>((resolve) => resolve(() => null));
60
72
  },
61
73
  { ssr: false }
62
74
  ),
@@ -123,16 +123,15 @@ const accountApi = api.injectEndpoints({
123
123
  query: ({ page, status, limit }) =>
124
124
  buildClientRequestUrl(account.getQuotations(page, status, limit))
125
125
  }),
126
- sendContact: builder.mutation<void, FormData>({
127
- query: (body) => {
128
- return {
129
- url: buildClientRequestUrl(account.sendContact, {
130
- useFormData: true
131
- }),
132
- method: 'POST',
133
- body
134
- };
135
- }
126
+ sendContact: builder.mutation<void, ContactFormType>({
127
+ query: (body) => ({
128
+ url: buildClientRequestUrl(account.sendContact, {
129
+ contentType: 'application/json',
130
+ responseType: 'text'
131
+ }),
132
+ method: 'POST',
133
+ body
134
+ })
136
135
  }),
137
136
  cancelOrder: builder.mutation<void, AccountOrderCancellation>({
138
137
  query: ({ id, ...body }) => ({
@@ -39,10 +39,7 @@ const addressApi = api.injectEndpoints({
39
39
  query: (city) =>
40
40
  buildClientRequestUrl(address.getRetailStoreTownships(city))
41
41
  }),
42
- addAddress: builder.mutation<
43
- Address,
44
- Partial<Address> & { invalidateTag?: 'Addresses' | 'Checkout' }
45
- >({
42
+ addAddress: builder.mutation<Address, Partial<Address>>({
46
43
  query: (body) => ({
47
44
  url: buildClientRequestUrl(address.base, {
48
45
  contentType: 'application/json'
@@ -53,16 +50,9 @@ const addressApi = api.injectEndpoints({
53
50
  type: body.is_corporate === 'true' ? 'corporate' : 'personal'
54
51
  }
55
52
  }),
56
- invalidatesTags: (_, error, arg) => {
57
- if (error) return [];
58
- if (arg.invalidateTag) return [arg.invalidateTag];
59
- return ['Addresses', 'Checkout'];
60
- }
53
+ invalidatesTags: (_, error) => (error ? [] : ['Addresses', 'Checkout'])
61
54
  }),
62
- editAddress: builder.mutation<
63
- Address,
64
- Partial<Address> & { invalidateTag?: 'Addresses' | 'Checkout' }
65
- >({
55
+ editAddress: builder.mutation<Address, Partial<Address>>({
66
56
  query: ({ pk, ...body }) => ({
67
57
  url: buildClientRequestUrl(address.editAddress(pk), {
68
58
  contentType: 'application/json'
@@ -74,28 +64,14 @@ const addressApi = api.injectEndpoints({
74
64
  type: body.is_corporate === 'true' ? 'corporate' : 'personal'
75
65
  }
76
66
  }),
77
- invalidatesTags: (_, error, arg) => {
78
- if (error) return [];
79
- if (arg.invalidateTag) return [arg.invalidateTag];
80
- return ['Addresses', 'Checkout'];
81
- }
67
+ invalidatesTags: (_, error) => (error ? [] : ['Addresses', 'Checkout']) // TODO: Invalidate one of these tags when necessary (e.g. Address page invalidates Addresses tag, Checkout page invalidates Checkout tag)
82
68
  }),
83
- removeAddress: builder.mutation<
84
- void,
85
- number | { id: number; invalidateTag: 'Addresses' | 'Checkout' }
86
- >({
87
- query: (arg) => ({
88
- url: buildClientRequestUrl(
89
- address.removeAddress(typeof arg === 'number' ? arg : arg.id)
90
- ),
69
+ removeAddress: builder.mutation<void, number>({
70
+ query: (id) => ({
71
+ url: buildClientRequestUrl(address.removeAddress(id)),
91
72
  method: 'DELETE'
92
73
  }),
93
- invalidatesTags: (_, error, arg) => {
94
- if (error) return [];
95
- if (typeof arg === 'object' && arg.invalidateTag)
96
- return [arg.invalidateTag];
97
- return ['Addresses', 'Checkout'];
98
- }
74
+ invalidatesTags: (_, error) => (error ? [] : ['Addresses', 'Checkout']) // TODO: Invalidate one of these tags when necessary (e.g. Address page invalidates Addresses tag, Checkout page invalidates Checkout tag)
99
75
  }),
100
76
  setDefaultAddress: builder.mutation<Address, Partial<Address>>({
101
77
  query: ({ pk, primary }) => ({
@@ -9,7 +9,7 @@ import {
9
9
  } from '@reduxjs/toolkit/query/react';
10
10
  import settings from 'settings';
11
11
  import { getCookie } from '../../utils';
12
- import { RootState } from 'redux/store';
12
+ import { RootState } from '@theme/redux/store';
13
13
 
14
14
  interface CustomBaseQueryApi extends BaseQueryApi {
15
15
  getState: () => RootState;