@akinon/next 1.13.1 → 1.14.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 (133) hide show
  1. package/.editorconfig +7 -0
  2. package/.eslintrc.js +40 -40
  3. package/.prettierrc +13 -13
  4. package/CHANGELOG.md +13 -0
  5. package/api/auth.ts +231 -231
  6. package/api/cache.ts +44 -44
  7. package/api/client.ts +174 -174
  8. package/api/logout.ts +42 -42
  9. package/assets/styles/index.scss +28 -28
  10. package/bin/pz-check-dependencies.js +98 -98
  11. package/bin/pz-install-plugins.js +33 -33
  12. package/bin/pz-install-theme.js +58 -58
  13. package/bin/pz-postbuild.js +1 -1
  14. package/bin/pz-postdev.js +1 -1
  15. package/bin/pz-postinstall.js +6 -6
  16. package/bin/pz-poststart.js +1 -1
  17. package/bin/pz-prebuild.js +4 -4
  18. package/bin/pz-predev.js +4 -4
  19. package/bin/pz-prestart.js +1 -1
  20. package/bin/run-script.js +44 -44
  21. package/components/accordion.tsx +52 -0
  22. package/components/button.tsx +46 -0
  23. package/components/client-root.tsx +19 -19
  24. package/components/icon.tsx +18 -18
  25. package/components/image.tsx +133 -133
  26. package/components/index.ts +17 -1
  27. package/components/input.tsx +110 -0
  28. package/components/lazy-component.tsx +33 -33
  29. package/components/loader-spinner.tsx +23 -23
  30. package/components/mobile-app-toggler.tsx +26 -26
  31. package/components/oauth-login.tsx +24 -24
  32. package/components/plugin-module.tsx +11 -8
  33. package/components/price.tsx +55 -0
  34. package/components/pz-providers.tsx +24 -24
  35. package/components/pz-root.tsx +21 -21
  36. package/components/radio.tsx +18 -18
  37. package/components/react-portal.tsx +45 -45
  38. package/components/redirect-three-d/content/index.tsx +74 -74
  39. package/components/redirect-three-d/index.tsx +17 -17
  40. package/components/selected-payment-option-view.tsx +7 -0
  41. package/components/trans.tsx +39 -39
  42. package/data/client/account.ts +208 -208
  43. package/data/client/address.ts +107 -107
  44. package/data/client/api.ts +85 -84
  45. package/data/client/b2b.ts +106 -106
  46. package/data/client/basket.ts +82 -82
  47. package/data/client/checkout.ts +516 -479
  48. package/data/client/misc.ts +101 -101
  49. package/data/client/product.ts +89 -89
  50. package/data/client/user.ts +99 -99
  51. package/data/client/wishlist.ts +118 -88
  52. package/data/server/category.ts +132 -128
  53. package/data/server/flatpage.ts +21 -21
  54. package/data/server/form.ts +22 -22
  55. package/data/server/index.ts +10 -10
  56. package/data/server/landingpage.ts +24 -24
  57. package/data/server/list.ts +67 -62
  58. package/data/server/menu.ts +35 -35
  59. package/data/server/product.ts +86 -86
  60. package/data/server/seo.ts +48 -48
  61. package/data/server/special-page.ts +47 -47
  62. package/data/server/widget.ts +27 -27
  63. package/data/urls.ts +221 -210
  64. package/hocs/client/index.ts +1 -1
  65. package/hocs/client/with-segment-defaults.tsx +25 -25
  66. package/hocs/server/index.ts +1 -1
  67. package/hocs/server/with-segment-defaults.tsx +85 -85
  68. package/hooks/index.ts +10 -10
  69. package/hooks/use-captcha.tsx +76 -76
  70. package/hooks/use-common-product-attributes.ts +36 -36
  71. package/hooks/use-debounce.ts +20 -20
  72. package/hooks/use-localization.ts +78 -78
  73. package/hooks/use-media-query.ts +36 -36
  74. package/hooks/use-mobile-iframe-handler.ts +23 -23
  75. package/hooks/use-on-click-outside.tsx +28 -28
  76. package/hooks/use-payment-options.ts +2 -1
  77. package/hooks/use-router.ts +45 -45
  78. package/hooks/use-translation.ts +14 -14
  79. package/lib/cache.ts +215 -215
  80. package/localization/index.ts +5 -5
  81. package/localization/provider.tsx +58 -58
  82. package/middlewares/currency.ts +100 -100
  83. package/middlewares/default.ts +256 -256
  84. package/middlewares/index.ts +29 -29
  85. package/middlewares/locale.ts +68 -68
  86. package/middlewares/oauth-login.ts +79 -79
  87. package/middlewares/pretty-url.ts +104 -104
  88. package/middlewares/redirection-payment.ts +160 -160
  89. package/middlewares/three-d-redirection.ts +159 -159
  90. package/middlewares/url-redirection.ts +65 -65
  91. package/package.json +2 -2
  92. package/plugins.js +2 -1
  93. package/redux/hooks.ts +7 -7
  94. package/redux/middlewares/checkout.ts +265 -260
  95. package/redux/middlewares/index.ts +50 -50
  96. package/redux/reducers/checkout.ts +184 -171
  97. package/redux/reducers/config.ts +28 -28
  98. package/redux/reducers/header.ts +59 -59
  99. package/redux/reducers/index.ts +14 -14
  100. package/redux/reducers/root.ts +61 -61
  101. package/sentry/index.ts +27 -27
  102. package/tailwind/rtl.js +137 -137
  103. package/types/commerce/account.ts +64 -64
  104. package/types/commerce/address.ts +94 -94
  105. package/types/commerce/b2b.ts +117 -117
  106. package/types/commerce/basket.ts +43 -43
  107. package/types/commerce/category.ts +114 -114
  108. package/types/commerce/checkout.ts +143 -136
  109. package/types/commerce/flatpage.ts +7 -7
  110. package/types/commerce/form.ts +66 -66
  111. package/types/commerce/index.ts +12 -12
  112. package/types/commerce/landingpage.ts +7 -7
  113. package/types/commerce/misc.ts +127 -127
  114. package/types/commerce/order.ts +119 -119
  115. package/types/commerce/product.ts +109 -109
  116. package/types/commerce/widget.ts +28 -28
  117. package/types/gtm.ts +16 -16
  118. package/types/index.ts +274 -237
  119. package/types/metadata.ts +7 -7
  120. package/types/next-auth.d.ts +24 -24
  121. package/utils/app-fetch.ts +69 -69
  122. package/utils/deep-merge.js +24 -24
  123. package/utils/generate-commerce-search-params.ts +22 -22
  124. package/utils/get-currency.ts +29 -29
  125. package/utils/image-loader.ts +31 -31
  126. package/utils/index.ts +150 -150
  127. package/utils/localization.ts +29 -29
  128. package/utils/log.ts +138 -138
  129. package/utils/menu-generator.ts +27 -27
  130. package/utils/mobile-3d-iframe.ts +77 -77
  131. package/utils/server-translation.ts +57 -57
  132. package/utils/server-variables.ts +9 -9
  133. package/with-pz-config.js +94 -94
@@ -1,84 +1,85 @@
1
- import {
2
- createApi,
3
- fetchBaseQuery,
4
- retry,
5
- BaseQueryFn,
6
- FetchBaseQueryError,
7
- FetchBaseQueryMeta,
8
- FetchArgs,
9
- BaseQueryApi
10
- } from '@reduxjs/toolkit/query/react';
11
- import settings from 'settings';
12
- import { getCookie } from '../../utils';
13
- import { RootState } from '@theme/redux/store';
14
-
15
- interface CustomBaseQueryApi extends BaseQueryApi {
16
- getState: () => RootState;
17
- }
18
-
19
- const customBaseQuery: BaseQueryFn<
20
- string | FetchArgs,
21
- unknown,
22
- FetchBaseQueryError,
23
- {},
24
- FetchBaseQueryMeta
25
- > = async (args, api: CustomBaseQueryApi, extraOptions) => {
26
- const mutations = Object.entries(api.getState()?.api?.mutations ?? {}).map(
27
- (x) => x[1]
28
- );
29
-
30
- if (
31
- api.type === 'mutation' &&
32
- mutations.filter(
33
- (m) => m.status === 'pending' && m.endpointName === api.endpoint
34
- ).length > 1
35
- ) {
36
- api.abort('Mutation already in progress.');
37
- }
38
-
39
- const baseQuery = fetchBaseQuery({
40
- prepareHeaders: async (headers) => {
41
- const csrfCookie = getCookie('csrftoken');
42
- const activeLocale = getCookie('pz-locale');
43
- const localeApiValue = settings.localization.locales.find(
44
- (locale) => locale.value === activeLocale
45
- )?.apiValue;
46
- const activeCurrency = getCookie('pz-currency');
47
-
48
- headers.set('Accept-Language', `${localeApiValue}`);
49
- headers.set('x-currency', `${activeCurrency}`);
50
-
51
- if (csrfCookie) {
52
- headers.set('x-csrftoken', `${csrfCookie}`);
53
- }
54
- return headers;
55
- },
56
- credentials: 'include'
57
- });
58
- try {
59
- const result = await baseQuery(args, api, extraOptions);
60
- return result;
61
- } catch (error) {
62
- return { error };
63
- }
64
- };
65
-
66
- export const api = createApi({
67
- reducerPath: 'api',
68
- baseQuery: retry(customBaseQuery, { maxRetries: 3 }),
69
- tagTypes: [
70
- 'Basket',
71
- 'BasketB2b',
72
- 'DraftsB2b',
73
- 'Product',
74
- 'Checkout',
75
- 'Favorite',
76
- 'Addresses',
77
- 'Profile'
78
- ],
79
- endpoints: () => ({})
80
- });
81
-
82
- export const {
83
- util: { invalidateTags }
84
- } = api;
1
+ import {
2
+ createApi,
3
+ fetchBaseQuery,
4
+ retry,
5
+ BaseQueryFn,
6
+ FetchBaseQueryError,
7
+ FetchBaseQueryMeta,
8
+ FetchArgs,
9
+ BaseQueryApi
10
+ } from '@reduxjs/toolkit/query/react';
11
+ import settings from 'settings';
12
+ import { getCookie } from '../../utils';
13
+ import { RootState } from '@theme/redux/store';
14
+
15
+ interface CustomBaseQueryApi extends BaseQueryApi {
16
+ getState: () => RootState;
17
+ }
18
+
19
+ const customBaseQuery: BaseQueryFn<
20
+ string | FetchArgs,
21
+ unknown,
22
+ FetchBaseQueryError,
23
+ {},
24
+ FetchBaseQueryMeta
25
+ > = async (args, api: CustomBaseQueryApi, extraOptions) => {
26
+ const mutations = Object.entries(api.getState()?.api?.mutations ?? {}).map(
27
+ (x) => x[1]
28
+ );
29
+
30
+ if (
31
+ api.type === 'mutation' &&
32
+ mutations.filter(
33
+ (m) => m.status === 'pending' && m.endpointName === api.endpoint
34
+ ).length > 1
35
+ ) {
36
+ api.abort('Mutation already in progress.');
37
+ }
38
+
39
+ const baseQuery = fetchBaseQuery({
40
+ prepareHeaders: async (headers) => {
41
+ const csrfCookie = getCookie('csrftoken');
42
+ const activeLocale = getCookie('pz-locale');
43
+ const localeApiValue = settings.localization.locales.find(
44
+ (locale) => locale.value === activeLocale
45
+ )?.apiValue;
46
+ const activeCurrency = getCookie('pz-currency');
47
+
48
+ headers.set('Accept-Language', `${localeApiValue}`);
49
+ headers.set('x-currency', `${activeCurrency}`);
50
+
51
+ if (csrfCookie) {
52
+ headers.set('x-csrftoken', `${csrfCookie}`);
53
+ }
54
+ return headers;
55
+ },
56
+ credentials: 'include'
57
+ });
58
+ try {
59
+ const result = await baseQuery(args, api, extraOptions);
60
+ return result;
61
+ } catch (error) {
62
+ return { error };
63
+ }
64
+ };
65
+
66
+ export const api = createApi({
67
+ reducerPath: 'api',
68
+ baseQuery: retry(customBaseQuery, { maxRetries: 3 }),
69
+ tagTypes: [
70
+ 'Basket',
71
+ 'BasketB2b',
72
+ 'DraftsB2b',
73
+ 'Product',
74
+ 'Checkout',
75
+ 'Favorite',
76
+ 'Addresses',
77
+ 'Profile',
78
+ 'StockAlert'
79
+ ],
80
+ endpoints: () => ({})
81
+ });
82
+
83
+ export const {
84
+ util: { invalidateTags }
85
+ } = api;
@@ -1,106 +1,106 @@
1
- import { buildClientRequestUrl } from '../../utils';
2
- import { api } from './api';
3
- import { b2b } from '../urls';
4
- import {
5
- Basket,
6
- BasketParams,
7
- BasketResponse,
8
- Division,
9
- DraftResponse,
10
- GetResponse,
11
- LoadBasketParams,
12
- SaveBasketParams,
13
- UpdateProductParams,
14
- DeleteProductParams,
15
- CreateQuotationParams
16
- } from '../../types';
17
-
18
- const b2bApi = api.injectEndpoints({
19
- endpoints: (build) => ({
20
- getBasketB2b: build.query<BasketResponse, void>({
21
- query: () =>
22
- buildClientRequestUrl(b2b.basket, {
23
- contentType: 'application/json'
24
- }),
25
- providesTags: ['BasketB2b']
26
- }),
27
- getDivisions: build.query<GetResponse<Division>, void>({
28
- query: () => buildClientRequestUrl(b2b.divisions)
29
- }),
30
- addToBasket: build.mutation<BasketResponse, BasketParams>({
31
- query: (body) => ({
32
- url: buildClientRequestUrl(b2b.basket, {
33
- contentType: 'application/json'
34
- }),
35
- method: 'POST',
36
- body
37
- })
38
- }),
39
- saveBasket: build.mutation<BasketResponse, SaveBasketParams>({
40
- query: (body) => ({
41
- url: buildClientRequestUrl(b2b.saveBasket, {
42
- contentType: 'application/json'
43
- }),
44
- method: 'POST',
45
- body
46
- }),
47
- invalidatesTags: ['BasketB2b', 'DraftsB2b']
48
- }),
49
- getDrafts: build.query<DraftResponse[], void>({
50
- query: () => buildClientRequestUrl(b2b.draftBaskets),
51
- providesTags: ['DraftsB2b']
52
- }),
53
- loadBasket: build.mutation<string, number>({
54
- query: (id) => ({
55
- url: buildClientRequestUrl(b2b.loadBasket(id), {
56
- contentType: 'application/json'
57
- }),
58
- method: 'POST'
59
- }),
60
- invalidatesTags: ['BasketB2b']
61
- }),
62
- updateProduct: build.mutation<Basket, UpdateProductParams>({
63
- query: (body) => ({
64
- url: buildClientRequestUrl(b2b.basket, {
65
- contentType: 'application/json'
66
- }),
67
- method: 'PUT',
68
- body
69
- }),
70
- invalidatesTags: ['BasketB2b']
71
- }),
72
- deleteProduct: build.mutation<Basket, DeleteProductParams>({
73
- query: (body) => ({
74
- url: buildClientRequestUrl(b2b.basket, {
75
- contentType: 'application/json'
76
- }),
77
- method: 'DELETE',
78
- body
79
- }),
80
- invalidatesTags: ['BasketB2b']
81
- }),
82
- createQuotation: build.mutation<BasketResponse, CreateQuotationParams>({
83
- query: (body) => ({
84
- url: buildClientRequestUrl(b2b.myQuotations, {
85
- contentType: 'application/json'
86
- }),
87
- method: 'POST',
88
- body
89
- }),
90
- invalidatesTags: ['BasketB2b', 'DraftsB2b']
91
- }),
92
- }),
93
- overrideExisting: true
94
- });
95
-
96
- export const {
97
- useGetBasketB2bQuery,
98
- useLazyGetDivisionsQuery,
99
- useAddToBasketMutation,
100
- useSaveBasketMutation,
101
- useGetDraftsQuery,
102
- useLoadBasketMutation,
103
- useUpdateProductMutation,
104
- useDeleteProductMutation,
105
- useCreateQuotationMutation
106
- } = b2bApi;
1
+ import { buildClientRequestUrl } from '../../utils';
2
+ import { api } from './api';
3
+ import { b2b } from '../urls';
4
+ import {
5
+ Basket,
6
+ BasketParams,
7
+ BasketResponse,
8
+ Division,
9
+ DraftResponse,
10
+ GetResponse,
11
+ LoadBasketParams,
12
+ SaveBasketParams,
13
+ UpdateProductParams,
14
+ DeleteProductParams,
15
+ CreateQuotationParams
16
+ } from '../../types';
17
+
18
+ const b2bApi = api.injectEndpoints({
19
+ endpoints: (build) => ({
20
+ getBasketB2b: build.query<BasketResponse, void>({
21
+ query: () =>
22
+ buildClientRequestUrl(b2b.basket, {
23
+ contentType: 'application/json'
24
+ }),
25
+ providesTags: ['BasketB2b']
26
+ }),
27
+ getDivisions: build.query<GetResponse<Division>, void>({
28
+ query: () => buildClientRequestUrl(b2b.divisions)
29
+ }),
30
+ addToBasket: build.mutation<BasketResponse, BasketParams>({
31
+ query: (body) => ({
32
+ url: buildClientRequestUrl(b2b.basket, {
33
+ contentType: 'application/json'
34
+ }),
35
+ method: 'POST',
36
+ body
37
+ })
38
+ }),
39
+ saveBasket: build.mutation<BasketResponse, SaveBasketParams>({
40
+ query: (body) => ({
41
+ url: buildClientRequestUrl(b2b.saveBasket, {
42
+ contentType: 'application/json'
43
+ }),
44
+ method: 'POST',
45
+ body
46
+ }),
47
+ invalidatesTags: ['BasketB2b', 'DraftsB2b']
48
+ }),
49
+ getDrafts: build.query<DraftResponse[], void>({
50
+ query: () => buildClientRequestUrl(b2b.draftBaskets),
51
+ providesTags: ['DraftsB2b']
52
+ }),
53
+ loadBasket: build.mutation<string, number>({
54
+ query: (id) => ({
55
+ url: buildClientRequestUrl(b2b.loadBasket(id), {
56
+ contentType: 'application/json'
57
+ }),
58
+ method: 'POST'
59
+ }),
60
+ invalidatesTags: ['BasketB2b']
61
+ }),
62
+ updateProduct: build.mutation<Basket, UpdateProductParams>({
63
+ query: (body) => ({
64
+ url: buildClientRequestUrl(b2b.basket, {
65
+ contentType: 'application/json'
66
+ }),
67
+ method: 'PUT',
68
+ body
69
+ }),
70
+ invalidatesTags: ['BasketB2b']
71
+ }),
72
+ deleteProduct: build.mutation<Basket, DeleteProductParams>({
73
+ query: (body) => ({
74
+ url: buildClientRequestUrl(b2b.basket, {
75
+ contentType: 'application/json'
76
+ }),
77
+ method: 'DELETE',
78
+ body
79
+ }),
80
+ invalidatesTags: ['BasketB2b']
81
+ }),
82
+ createQuotation: build.mutation<BasketResponse, CreateQuotationParams>({
83
+ query: (body) => ({
84
+ url: buildClientRequestUrl(b2b.myQuotations, {
85
+ contentType: 'application/json'
86
+ }),
87
+ method: 'POST',
88
+ body
89
+ }),
90
+ invalidatesTags: ['BasketB2b', 'DraftsB2b']
91
+ }),
92
+ }),
93
+ overrideExisting: true
94
+ });
95
+
96
+ export const {
97
+ useGetBasketB2bQuery,
98
+ useLazyGetDivisionsQuery,
99
+ useAddToBasketMutation,
100
+ useSaveBasketMutation,
101
+ useGetDraftsQuery,
102
+ useLoadBasketMutation,
103
+ useUpdateProductMutation,
104
+ useDeleteProductMutation,
105
+ useCreateQuotationMutation
106
+ } = b2bApi;
@@ -1,82 +1,82 @@
1
- import { api } from './api';
2
- import { Basket } from '../../types';
3
- import { buildClientRequestUrl } from '../../utils';
4
- import { basket } from '../urls';
5
-
6
- export type UpdateQuantityResponse = {
7
- basket: Basket;
8
- osessionid: string;
9
- };
10
-
11
- export type UpdateQuantityRequest = {
12
- product: number;
13
- quantity: number;
14
- attributes: any;
15
- };
16
-
17
- export const basketApi = api.injectEndpoints({
18
- endpoints: (build) => ({
19
- getBasket: build.query<Basket, void>({
20
- query: () =>
21
- buildClientRequestUrl(basket.getBasket, {
22
- contentType: 'application/json'
23
- }),
24
- transformResponse: (response: { basket: Basket }) => response.basket,
25
- providesTags: ['Basket']
26
- }),
27
- updateQuantity: build.mutation<
28
- UpdateQuantityResponse,
29
- UpdateQuantityRequest
30
- >({
31
- query: (body) => ({
32
- url: buildClientRequestUrl(basket.getBasket, {
33
- contentType: 'application/json'
34
- }),
35
- method: 'PUT',
36
- body
37
- })
38
- }),
39
- clearBasket: build.mutation<Basket, void>({
40
- query: (body) => ({
41
- url: buildClientRequestUrl(basket.getBasket, {
42
- contentType: 'application/json'
43
- }),
44
- method: 'DELETE',
45
- body
46
- }),
47
- transformResponse: (response: { basket: Basket }) => response.basket,
48
- invalidatesTags: ['Basket']
49
- }),
50
- applyVoucherCode: build.mutation<Basket, { voucher_code: string }>({
51
- query: (body) => ({
52
- url: buildClientRequestUrl(basket.getBasket, {
53
- contentType: 'application/json'
54
- }),
55
- method: 'PATCH',
56
- body
57
- }),
58
- transformResponse: (response: { basket: Basket }) => response.basket
59
- }),
60
- removeVoucherCode: build.mutation<Basket, void>({
61
- query: () => ({
62
- url: buildClientRequestUrl(basket.getBasket, {
63
- contentType: 'application/json'
64
- }),
65
- method: 'PATCH',
66
- body: {
67
- remove_voucher_code: true
68
- }
69
- }),
70
- transformResponse: (response: { basket: Basket }) => response.basket
71
- })
72
- }),
73
- overrideExisting: true
74
- });
75
-
76
- export const {
77
- useGetBasketQuery,
78
- useUpdateQuantityMutation,
79
- useClearBasketMutation,
80
- useApplyVoucherCodeMutation,
81
- useRemoveVoucherCodeMutation
82
- } = basketApi;
1
+ import { api } from './api';
2
+ import { Basket } from '../../types';
3
+ import { buildClientRequestUrl } from '../../utils';
4
+ import { basket } from '../urls';
5
+
6
+ export type UpdateQuantityResponse = {
7
+ basket: Basket;
8
+ osessionid: string;
9
+ };
10
+
11
+ export type UpdateQuantityRequest = {
12
+ product: number;
13
+ quantity: number;
14
+ attributes: any;
15
+ };
16
+
17
+ export const basketApi = api.injectEndpoints({
18
+ endpoints: (build) => ({
19
+ getBasket: build.query<Basket, void>({
20
+ query: () =>
21
+ buildClientRequestUrl(basket.getBasket, {
22
+ contentType: 'application/json'
23
+ }),
24
+ transformResponse: (response: { basket: Basket }) => response.basket,
25
+ providesTags: ['Basket']
26
+ }),
27
+ updateQuantity: build.mutation<
28
+ UpdateQuantityResponse,
29
+ UpdateQuantityRequest
30
+ >({
31
+ query: (body) => ({
32
+ url: buildClientRequestUrl(basket.getBasket, {
33
+ contentType: 'application/json'
34
+ }),
35
+ method: 'PUT',
36
+ body
37
+ })
38
+ }),
39
+ clearBasket: build.mutation<Basket, void>({
40
+ query: (body) => ({
41
+ url: buildClientRequestUrl(basket.getBasket, {
42
+ contentType: 'application/json'
43
+ }),
44
+ method: 'DELETE',
45
+ body
46
+ }),
47
+ transformResponse: (response: { basket: Basket }) => response.basket,
48
+ invalidatesTags: ['Basket']
49
+ }),
50
+ applyVoucherCode: build.mutation<Basket, { voucher_code: string }>({
51
+ query: (body) => ({
52
+ url: buildClientRequestUrl(basket.getBasket, {
53
+ contentType: 'application/json'
54
+ }),
55
+ method: 'PATCH',
56
+ body
57
+ }),
58
+ transformResponse: (response: { basket: Basket }) => response.basket
59
+ }),
60
+ removeVoucherCode: build.mutation<Basket, void>({
61
+ query: () => ({
62
+ url: buildClientRequestUrl(basket.getBasket, {
63
+ contentType: 'application/json'
64
+ }),
65
+ method: 'PATCH',
66
+ body: {
67
+ remove_voucher_code: true
68
+ }
69
+ }),
70
+ transformResponse: (response: { basket: Basket }) => response.basket
71
+ })
72
+ }),
73
+ overrideExisting: true
74
+ });
75
+
76
+ export const {
77
+ useGetBasketQuery,
78
+ useUpdateQuantityMutation,
79
+ useClearBasketMutation,
80
+ useApplyVoucherCodeMutation,
81
+ useRemoveVoucherCodeMutation
82
+ } = basketApi;