@akinon/next 1.56.0 → 1.58.0-rc.9
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/CHANGELOG.md +660 -0
- package/api/client.ts +39 -9
- package/assets/styles/index.css +49 -0
- package/assets/styles/index.css.map +1 -0
- package/assets/styles/index.scss +50 -26
- package/bin/pz-generate-translations.js +41 -0
- package/bin/pz-prebuild.js +1 -0
- package/bin/pz-predev.js +1 -0
- package/components/file-input.tsx +8 -0
- package/components/index.ts +1 -0
- package/components/input.tsx +21 -7
- package/components/link.tsx +17 -13
- package/components/price.tsx +11 -4
- package/components/pz-root.tsx +15 -3
- package/components/selected-payment-option-view.tsx +26 -37
- package/data/client/account.ts +10 -9
- package/data/client/api.ts +1 -1
- package/data/client/b2b.ts +35 -2
- package/data/client/basket.ts +6 -5
- package/data/client/checkout.ts +37 -0
- package/data/client/user.ts +3 -2
- package/data/server/category.ts +43 -19
- package/data/server/flatpage.ts +29 -7
- package/data/server/form.ts +29 -11
- package/data/server/landingpage.ts +26 -7
- package/data/server/list.ts +16 -6
- package/data/server/menu.ts +15 -2
- package/data/server/product.ts +33 -13
- package/data/server/seo.ts +17 -24
- package/data/server/special-page.ts +15 -5
- package/data/server/widget.ts +14 -7
- package/data/urls.ts +8 -1
- package/hocs/server/with-segment-defaults.tsx +4 -1
- package/hooks/index.ts +2 -1
- package/hooks/use-message-listener.ts +24 -0
- package/hooks/use-pagination.ts +2 -2
- package/hooks/use-payment-options.ts +2 -1
- package/lib/cache-handler.mjs +33 -0
- package/lib/cache.ts +8 -6
- package/middlewares/default.ts +46 -2
- package/middlewares/pretty-url.ts +11 -1
- package/middlewares/url-redirection.ts +4 -0
- package/package.json +4 -3
- package/plugins.d.ts +1 -0
- package/plugins.js +2 -1
- package/redux/middlewares/checkout.ts +71 -11
- package/redux/reducers/checkout.ts +23 -3
- package/routes/pretty-url.tsx +192 -0
- package/types/commerce/account.ts +1 -0
- package/types/commerce/address.ts +1 -1
- package/types/commerce/b2b.ts +12 -2
- package/types/commerce/checkout.ts +30 -0
- package/types/commerce/order.ts +1 -0
- package/types/index.ts +17 -2
- package/utils/app-fetch.ts +16 -8
- package/utils/generate-commerce-search-params.ts +3 -1
- package/utils/index.ts +27 -6
- package/utils/redirection-iframe.ts +85 -0
- package/utils/server-translation.ts +11 -1
- package/with-pz-config.js +13 -2
package/data/client/basket.ts
CHANGED
|
@@ -28,7 +28,7 @@ export const basketApi = api.injectEndpoints({
|
|
|
28
28
|
query: ({ namespace }) =>
|
|
29
29
|
buildClientRequestUrl(basket.getBasketDetail(namespace)),
|
|
30
30
|
transformResponse: (response: { basket: Basket }) => response.basket,
|
|
31
|
-
providesTags: ['
|
|
31
|
+
providesTags: ['MultiBasket']
|
|
32
32
|
}),
|
|
33
33
|
getAllBaskets: build.query<Basket[], void>({
|
|
34
34
|
query: () =>
|
|
@@ -36,7 +36,7 @@ export const basketApi = api.injectEndpoints({
|
|
|
36
36
|
contentType: 'application/json'
|
|
37
37
|
}),
|
|
38
38
|
transformResponse: (response: { baskets: Basket[] }) => response.baskets,
|
|
39
|
-
providesTags: ['
|
|
39
|
+
providesTags: ['MultiBasket']
|
|
40
40
|
}),
|
|
41
41
|
removeBasket: build.mutation<Basket, { pk: number }>({
|
|
42
42
|
query: ({ pk }) => ({
|
|
@@ -46,7 +46,7 @@ export const basketApi = api.injectEndpoints({
|
|
|
46
46
|
method: 'DELETE',
|
|
47
47
|
body: { pk }
|
|
48
48
|
}),
|
|
49
|
-
invalidatesTags: ['
|
|
49
|
+
invalidatesTags: ['MultiBasket', 'Basket']
|
|
50
50
|
}),
|
|
51
51
|
selectMainBasket: build.mutation<Basket, { pk: number }>({
|
|
52
52
|
query: ({ pk }) => ({
|
|
@@ -57,7 +57,7 @@ export const basketApi = api.injectEndpoints({
|
|
|
57
57
|
body: { pk }
|
|
58
58
|
}),
|
|
59
59
|
transformResponse: (response: { baskets: Basket }) => response.baskets,
|
|
60
|
-
invalidatesTags: ['
|
|
60
|
+
invalidatesTags: ['MultiBasket', 'Basket']
|
|
61
61
|
}),
|
|
62
62
|
updateQuantity: build.mutation<
|
|
63
63
|
UpdateQuantityResponse,
|
|
@@ -69,7 +69,8 @@ export const basketApi = api.injectEndpoints({
|
|
|
69
69
|
}),
|
|
70
70
|
method: 'PUT',
|
|
71
71
|
body
|
|
72
|
-
})
|
|
72
|
+
}),
|
|
73
|
+
invalidatesTags: ['MultiBasket', 'Basket']
|
|
73
74
|
}),
|
|
74
75
|
clearBasket: build.mutation<Basket, void>({
|
|
75
76
|
query: (body) => ({
|
package/data/client/checkout.ts
CHANGED
|
@@ -380,6 +380,22 @@ export const checkoutApi = api.injectEndpoints({
|
|
|
380
380
|
dispatch(setShippingStepBusy(false));
|
|
381
381
|
}
|
|
382
382
|
}),
|
|
383
|
+
setDataSourceShippingOptions: build.mutation<CheckoutResponse, number[]>({
|
|
384
|
+
query: (pks) => ({
|
|
385
|
+
url: buildClientRequestUrl(checkout.setDataSourceShippingOption, {
|
|
386
|
+
useFormData: true
|
|
387
|
+
}),
|
|
388
|
+
method: 'POST',
|
|
389
|
+
body: {
|
|
390
|
+
data_source_shipping_options: JSON.stringify(pks)
|
|
391
|
+
}
|
|
392
|
+
}),
|
|
393
|
+
async onQueryStarted(arg, { dispatch, queryFulfilled }) {
|
|
394
|
+
dispatch(setShippingStepBusy(true));
|
|
395
|
+
await queryFulfilled;
|
|
396
|
+
dispatch(setShippingStepBusy(false));
|
|
397
|
+
}
|
|
398
|
+
}),
|
|
383
399
|
setRetailStore: build.mutation<CheckoutResponse, SetRetailStoreParams>({
|
|
384
400
|
query: ({ retailStorePk, billingAddressPk }) => ({
|
|
385
401
|
url: buildClientRequestUrl(
|
|
@@ -681,6 +697,25 @@ export const checkoutApi = api.injectEndpoints({
|
|
|
681
697
|
};
|
|
682
698
|
}
|
|
683
699
|
}),
|
|
700
|
+
setAttributeBasedShippingOptions: build.mutation<
|
|
701
|
+
CheckoutResponse,
|
|
702
|
+
Record<string, number>
|
|
703
|
+
>({
|
|
704
|
+
query: (options) => ({
|
|
705
|
+
url: buildClientRequestUrl(checkout.setAttributeBasedShippingOption, {
|
|
706
|
+
useFormData: true
|
|
707
|
+
}),
|
|
708
|
+
method: 'POST',
|
|
709
|
+
body: {
|
|
710
|
+
attribute_based_shipping_options: JSON.stringify(options)
|
|
711
|
+
}
|
|
712
|
+
}),
|
|
713
|
+
async onQueryStarted(arg, { dispatch, queryFulfilled }) {
|
|
714
|
+
dispatch(setShippingStepBusy(true));
|
|
715
|
+
await queryFulfilled;
|
|
716
|
+
dispatch(setShippingStepBusy(false));
|
|
717
|
+
}
|
|
718
|
+
}),
|
|
684
719
|
setOrderSelectionPage: build.mutation<
|
|
685
720
|
CheckoutResponse,
|
|
686
721
|
{ extra_field: ExtraField }
|
|
@@ -712,6 +747,7 @@ export const {
|
|
|
712
747
|
useSetDeliveryOptionMutation,
|
|
713
748
|
useSetAddressesMutation,
|
|
714
749
|
useSetShippingOptionMutation,
|
|
750
|
+
useSetDataSourceShippingOptionsMutation,
|
|
715
751
|
useSetPaymentOptionMutation,
|
|
716
752
|
useSetBinNumberMutation,
|
|
717
753
|
useSetInstallmentOptionMutation,
|
|
@@ -730,5 +766,6 @@ export const {
|
|
|
730
766
|
usePayWithLoyaltyBalanceMutation,
|
|
731
767
|
useSetOrderNoteMutation,
|
|
732
768
|
useSetDeliveryBagsMutation,
|
|
769
|
+
useSetAttributeBasedShippingOptionsMutation,
|
|
733
770
|
useSetOrderSelectionPageMutation
|
|
734
771
|
} = checkoutApi;
|
package/data/client/user.ts
CHANGED
|
@@ -22,11 +22,12 @@ const userApi = api.injectEndpoints({
|
|
|
22
22
|
getCaptcha: build.query<GetCaptchaResponse, void>({
|
|
23
23
|
query: () => buildClientRequestUrl(user.captcha),
|
|
24
24
|
transformResponse: (response: { html: string }) => {
|
|
25
|
-
const
|
|
25
|
+
const siteKey = response.html.match(/data-sitekey="([^"]+)"/i)[1];
|
|
26
|
+
|
|
26
27
|
const csrfTokenMatch = response.html.match(
|
|
27
28
|
/name=['|"]csrfmiddlewaretoken['|"] value=['|"][^'"]+/gi
|
|
28
29
|
);
|
|
29
|
-
|
|
30
|
+
|
|
30
31
|
const csrfToken =
|
|
31
32
|
csrfTokenMatch?.[0].replace(
|
|
32
33
|
/name=['|"]csrfmiddlewaretoken['|"] value=['|"]/gi,
|
package/data/server/category.ts
CHANGED
|
@@ -5,26 +5,32 @@ import { category, product } from '../urls';
|
|
|
5
5
|
import { Cache, CacheKey } from '../../lib/cache';
|
|
6
6
|
import { parse } from 'lossless-json';
|
|
7
7
|
import logger from '../../utils/log';
|
|
8
|
+
import { headers as nHeaders } from 'next/headers';
|
|
9
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
8
10
|
|
|
9
11
|
function getCategoryDataHandler(
|
|
10
12
|
pk: number,
|
|
13
|
+
locale: string,
|
|
14
|
+
currency: string,
|
|
11
15
|
searchParams?: URLSearchParams,
|
|
12
16
|
headers?: Record<string, string>
|
|
13
17
|
) {
|
|
14
18
|
return async function () {
|
|
15
19
|
const params = generateCommerceSearchParams(searchParams);
|
|
16
20
|
|
|
17
|
-
const rawData = await appFetch<string>(
|
|
18
|
-
`${category.getCategoryByPk(pk)}${params ? params : ''}`,
|
|
19
|
-
|
|
21
|
+
const rawData = await appFetch<string>({
|
|
22
|
+
url: `${category.getCategoryByPk(pk)}${params ? params : ''}`,
|
|
23
|
+
locale,
|
|
24
|
+
currency,
|
|
25
|
+
init: {
|
|
20
26
|
headers: {
|
|
21
27
|
Accept: 'application/json',
|
|
22
28
|
'Content-Type': 'application/json',
|
|
23
29
|
...(headers ?? {})
|
|
24
30
|
}
|
|
25
31
|
},
|
|
26
|
-
FetchResponseType.TEXT
|
|
27
|
-
);
|
|
32
|
+
responseType: FetchResponseType.TEXT
|
|
33
|
+
});
|
|
28
34
|
|
|
29
35
|
let data: GetCategoryResponse;
|
|
30
36
|
|
|
@@ -58,15 +64,17 @@ function getCategoryDataHandler(
|
|
|
58
64
|
return { data, breadcrumbData: undefined };
|
|
59
65
|
}
|
|
60
66
|
|
|
61
|
-
const breadcrumbData = await appFetch<any>(
|
|
62
|
-
product.breadcrumbUrl(menuItemModel),
|
|
63
|
-
|
|
67
|
+
const breadcrumbData = await appFetch<any>({
|
|
68
|
+
url: product.breadcrumbUrl(menuItemModel),
|
|
69
|
+
locale,
|
|
70
|
+
currency,
|
|
71
|
+
init: {
|
|
64
72
|
headers: {
|
|
65
73
|
Accept: 'application/json',
|
|
66
74
|
'Content-Type': 'application/json'
|
|
67
75
|
}
|
|
68
76
|
}
|
|
69
|
-
);
|
|
77
|
+
});
|
|
70
78
|
|
|
71
79
|
return { data, breadcrumbData: breadcrumbData?.menu };
|
|
72
80
|
};
|
|
@@ -75,33 +83,44 @@ function getCategoryDataHandler(
|
|
|
75
83
|
export const getCategoryData = ({
|
|
76
84
|
pk,
|
|
77
85
|
searchParams,
|
|
78
|
-
headers
|
|
86
|
+
headers,
|
|
87
|
+
locale = ServerVariables.locale,
|
|
88
|
+
currency = ServerVariables.currency
|
|
79
89
|
}: {
|
|
80
90
|
pk: number;
|
|
91
|
+
locale?: string;
|
|
92
|
+
currency?: string;
|
|
81
93
|
searchParams?: URLSearchParams;
|
|
82
94
|
headers?: Record<string, string>;
|
|
83
95
|
}) => {
|
|
84
96
|
return Cache.wrap(
|
|
85
97
|
CacheKey.Category(pk, searchParams, headers),
|
|
86
|
-
|
|
98
|
+
locale,
|
|
99
|
+
getCategoryDataHandler(pk, locale, currency, searchParams, headers),
|
|
87
100
|
{
|
|
88
101
|
expire: 300
|
|
89
102
|
}
|
|
90
103
|
);
|
|
91
104
|
};
|
|
92
105
|
|
|
93
|
-
function getCategoryBySlugDataHandler(
|
|
106
|
+
function getCategoryBySlugDataHandler(
|
|
107
|
+
slug: string,
|
|
108
|
+
locale: string,
|
|
109
|
+
currency: string
|
|
110
|
+
) {
|
|
94
111
|
return async function () {
|
|
95
|
-
const rawData = await appFetch<string>(
|
|
96
|
-
category.getCategoryBySlug(slug),
|
|
97
|
-
|
|
112
|
+
const rawData = await appFetch<string>({
|
|
113
|
+
url: category.getCategoryBySlug(slug),
|
|
114
|
+
locale,
|
|
115
|
+
currency,
|
|
116
|
+
init: {
|
|
98
117
|
headers: {
|
|
99
118
|
Accept: 'application/json',
|
|
100
119
|
'Content-Type': 'application/json'
|
|
101
120
|
}
|
|
102
121
|
},
|
|
103
|
-
FetchResponseType.TEXT
|
|
104
|
-
);
|
|
122
|
+
responseType: FetchResponseType.TEXT
|
|
123
|
+
});
|
|
105
124
|
|
|
106
125
|
let data: GetCategoryResponse;
|
|
107
126
|
|
|
@@ -129,10 +148,15 @@ function getCategoryBySlugDataHandler(slug: string) {
|
|
|
129
148
|
};
|
|
130
149
|
}
|
|
131
150
|
|
|
132
|
-
export const getCategoryBySlugData = async ({
|
|
151
|
+
export const getCategoryBySlugData = async ({
|
|
152
|
+
slug,
|
|
153
|
+
locale = ServerVariables.locale,
|
|
154
|
+
currency = ServerVariables.currency
|
|
155
|
+
}) => {
|
|
133
156
|
return Cache.wrap(
|
|
134
157
|
CacheKey.CategorySlug(slug),
|
|
135
|
-
|
|
158
|
+
locale,
|
|
159
|
+
getCategoryBySlugDataHandler(slug, locale, currency),
|
|
136
160
|
{
|
|
137
161
|
expire: 300
|
|
138
162
|
}
|
package/data/server/flatpage.ts
CHANGED
|
@@ -2,13 +2,23 @@ import { flatpage } from '../urls';
|
|
|
2
2
|
import { FlatPage } from '../../types';
|
|
3
3
|
import appFetch from '../../utils/app-fetch';
|
|
4
4
|
import { Cache, CacheKey } from '../../lib/cache';
|
|
5
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
5
6
|
|
|
6
|
-
const getFlatPageDataHandler = (
|
|
7
|
+
const getFlatPageDataHandler = (
|
|
8
|
+
pk: number,
|
|
9
|
+
locale: string,
|
|
10
|
+
currency: string
|
|
11
|
+
) => {
|
|
7
12
|
return async function () {
|
|
8
|
-
const data = await appFetch<FlatPage>(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
const data = await appFetch<FlatPage>({
|
|
14
|
+
url: flatpage.getFlatPageByPk(pk),
|
|
15
|
+
locale,
|
|
16
|
+
currency,
|
|
17
|
+
init: {
|
|
18
|
+
headers: {
|
|
19
|
+
Accept: 'application/json',
|
|
20
|
+
'Content-Type': 'application/json'
|
|
21
|
+
}
|
|
12
22
|
}
|
|
13
23
|
});
|
|
14
24
|
|
|
@@ -16,6 +26,18 @@ const getFlatPageDataHandler = (pk: number) => {
|
|
|
16
26
|
};
|
|
17
27
|
};
|
|
18
28
|
|
|
19
|
-
export const getFlatPageData = ({
|
|
20
|
-
|
|
29
|
+
export const getFlatPageData = ({
|
|
30
|
+
pk,
|
|
31
|
+
locale = ServerVariables.locale,
|
|
32
|
+
currency = ServerVariables.currency
|
|
33
|
+
}: {
|
|
34
|
+
pk: number;
|
|
35
|
+
locale?: string;
|
|
36
|
+
currency?: string;
|
|
37
|
+
}) => {
|
|
38
|
+
return Cache.wrap(
|
|
39
|
+
CacheKey.FlatPage(pk),
|
|
40
|
+
locale,
|
|
41
|
+
getFlatPageDataHandler(pk, locale, currency)
|
|
42
|
+
);
|
|
21
43
|
};
|
package/data/server/form.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
import { Cache, CacheKey } from
|
|
2
|
-
import { FormType } from
|
|
1
|
+
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
|
+
import { FormType } from '../../types/commerce/form';
|
|
3
3
|
|
|
4
|
-
import appFetch from
|
|
5
|
-
import {
|
|
4
|
+
import appFetch from '../../utils/app-fetch';
|
|
5
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
6
|
+
import { form } from '../urls';
|
|
6
7
|
|
|
7
|
-
const getFormDataHandler = (pk: number) => {
|
|
8
|
+
const getFormDataHandler = (pk: number, locale: string, currency: string) => {
|
|
8
9
|
return async function () {
|
|
9
|
-
const data = await appFetch<FormType>(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const data = await appFetch<FormType>({
|
|
11
|
+
url: form.getForm(pk),
|
|
12
|
+
locale,
|
|
13
|
+
currency,
|
|
14
|
+
init: {
|
|
15
|
+
headers: {
|
|
16
|
+
Accept: 'application/json',
|
|
17
|
+
'Content-Type': 'application/json'
|
|
18
|
+
}
|
|
13
19
|
}
|
|
14
20
|
});
|
|
15
21
|
|
|
@@ -17,6 +23,18 @@ const getFormDataHandler = (pk: number) => {
|
|
|
17
23
|
};
|
|
18
24
|
};
|
|
19
25
|
|
|
20
|
-
export const getFormData = ({
|
|
21
|
-
|
|
26
|
+
export const getFormData = ({
|
|
27
|
+
pk,
|
|
28
|
+
locale = ServerVariables.locale,
|
|
29
|
+
currency = ServerVariables.currency
|
|
30
|
+
}: {
|
|
31
|
+
pk: number;
|
|
32
|
+
locale?: string;
|
|
33
|
+
currency?: string;
|
|
34
|
+
}) => {
|
|
35
|
+
return Cache.wrap(
|
|
36
|
+
CacheKey.Form(pk),
|
|
37
|
+
locale,
|
|
38
|
+
getFormDataHandler(pk, locale, currency)
|
|
39
|
+
);
|
|
22
40
|
};
|
|
@@ -2,23 +2,42 @@ import { landingpage } from '../urls';
|
|
|
2
2
|
import { LandingPage } from '../../types/commerce/landingpage';
|
|
3
3
|
import appFetch from '../../utils/app-fetch';
|
|
4
4
|
import { Cache, CacheKey } from '../../lib/cache';
|
|
5
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
5
6
|
|
|
6
|
-
const getLandingPageHandler = (
|
|
7
|
+
const getLandingPageHandler = (
|
|
8
|
+
pk: number,
|
|
9
|
+
locale: string,
|
|
10
|
+
currency: string
|
|
11
|
+
) => {
|
|
7
12
|
return async function () {
|
|
8
|
-
const data = await appFetch<LandingPage>(
|
|
9
|
-
landingpage.getLandingPageByPk(pk),
|
|
10
|
-
|
|
13
|
+
const data = await appFetch<LandingPage>({
|
|
14
|
+
url: landingpage.getLandingPageByPk(pk),
|
|
15
|
+
locale,
|
|
16
|
+
currency,
|
|
17
|
+
init: {
|
|
11
18
|
headers: {
|
|
12
19
|
Accept: 'application/json',
|
|
13
20
|
'Content-Type': 'application/json'
|
|
14
21
|
}
|
|
15
22
|
}
|
|
16
|
-
);
|
|
23
|
+
});
|
|
17
24
|
|
|
18
25
|
return data;
|
|
19
26
|
};
|
|
20
27
|
};
|
|
21
28
|
|
|
22
|
-
export const getLandingPageData = ({
|
|
23
|
-
|
|
29
|
+
export const getLandingPageData = ({
|
|
30
|
+
pk,
|
|
31
|
+
locale = ServerVariables.locale,
|
|
32
|
+
currency = ServerVariables.currency
|
|
33
|
+
}: {
|
|
34
|
+
pk: number;
|
|
35
|
+
locale?: string;
|
|
36
|
+
currency?: string;
|
|
37
|
+
}) => {
|
|
38
|
+
return Cache.wrap(
|
|
39
|
+
CacheKey.LandingPage(pk),
|
|
40
|
+
locale,
|
|
41
|
+
getLandingPageHandler(pk, locale, currency)
|
|
42
|
+
);
|
|
24
43
|
};
|
package/data/server/list.ts
CHANGED
|
@@ -5,25 +5,30 @@ import { generateCommerceSearchParams } from '../../utils';
|
|
|
5
5
|
import appFetch, { FetchResponseType } from '../../utils/app-fetch';
|
|
6
6
|
import { parse } from 'lossless-json';
|
|
7
7
|
import logger from '../../utils/log';
|
|
8
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
8
9
|
|
|
9
10
|
const getListDataHandler = (
|
|
11
|
+
locale,
|
|
12
|
+
currency,
|
|
10
13
|
searchParams: URLSearchParams,
|
|
11
14
|
headers?: Record<string, string>
|
|
12
15
|
) => {
|
|
13
16
|
return async function () {
|
|
14
17
|
const params = generateCommerceSearchParams(searchParams);
|
|
15
18
|
|
|
16
|
-
const rawData = await appFetch<string>(
|
|
17
|
-
`${category.list}${params}`,
|
|
18
|
-
|
|
19
|
+
const rawData = await appFetch<string>({
|
|
20
|
+
url: `${category.list}${params}`,
|
|
21
|
+
locale,
|
|
22
|
+
currency,
|
|
23
|
+
init: {
|
|
19
24
|
headers: {
|
|
20
25
|
Accept: 'application/json',
|
|
21
26
|
'Content-Type': 'application/json',
|
|
22
27
|
...(headers ?? {})
|
|
23
28
|
}
|
|
24
29
|
},
|
|
25
|
-
FetchResponseType.TEXT
|
|
26
|
-
);
|
|
30
|
+
responseType: FetchResponseType.TEXT
|
|
31
|
+
});
|
|
27
32
|
|
|
28
33
|
let data: GetCategoryResponse;
|
|
29
34
|
|
|
@@ -51,15 +56,20 @@ const getListDataHandler = (
|
|
|
51
56
|
};
|
|
52
57
|
|
|
53
58
|
export const getListData = async ({
|
|
59
|
+
locale = ServerVariables.locale,
|
|
60
|
+
currency = ServerVariables.currency,
|
|
54
61
|
searchParams,
|
|
55
62
|
headers
|
|
56
63
|
}: {
|
|
64
|
+
locale?: string;
|
|
65
|
+
currency?: string;
|
|
57
66
|
searchParams: URLSearchParams;
|
|
58
67
|
headers?: Record<string, string>;
|
|
59
68
|
}) => {
|
|
60
69
|
return Cache.wrap(
|
|
61
70
|
CacheKey.List(searchParams, headers),
|
|
62
|
-
|
|
71
|
+
locale,
|
|
72
|
+
getListDataHandler(locale, currency, searchParams, headers),
|
|
63
73
|
{
|
|
64
74
|
expire: 300
|
|
65
75
|
}
|
package/data/server/menu.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
2
|
import { MenuItemType } from '../../types';
|
|
3
3
|
import appFetch from '../../utils/app-fetch';
|
|
4
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
4
5
|
import { misc } from '../urls';
|
|
5
6
|
|
|
6
7
|
interface MenuResponse {
|
|
@@ -8,6 +9,8 @@ interface MenuResponse {
|
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
interface MenuHandlerParams {
|
|
12
|
+
locale?: string;
|
|
13
|
+
currency?: string;
|
|
11
14
|
depth?: number;
|
|
12
15
|
parent?: string;
|
|
13
16
|
}
|
|
@@ -15,9 +18,18 @@ interface MenuHandlerParams {
|
|
|
15
18
|
const DEFAULT_DEPTH = 3;
|
|
16
19
|
|
|
17
20
|
const getMenuHandler =
|
|
18
|
-
({
|
|
21
|
+
({
|
|
22
|
+
locale = ServerVariables.locale,
|
|
23
|
+
currency = ServerVariables.currency,
|
|
24
|
+
depth,
|
|
25
|
+
parent
|
|
26
|
+
}: MenuHandlerParams = {}) =>
|
|
19
27
|
async () => {
|
|
20
|
-
const response = await appFetch<MenuResponse>(
|
|
28
|
+
const response = await appFetch<MenuResponse>({
|
|
29
|
+
url: misc.menus(depth ?? DEFAULT_DEPTH, parent),
|
|
30
|
+
locale,
|
|
31
|
+
currency
|
|
32
|
+
});
|
|
21
33
|
|
|
22
34
|
return response?.menu;
|
|
23
35
|
};
|
|
@@ -30,6 +42,7 @@ const getMenuHandler =
|
|
|
30
42
|
export const getMenu = async (params?: MenuHandlerParams) => {
|
|
31
43
|
return Cache.wrap(
|
|
32
44
|
CacheKey.Menu(params?.depth ?? DEFAULT_DEPTH, params?.parent),
|
|
45
|
+
params?.locale ?? ServerVariables.locale,
|
|
33
46
|
getMenuHandler(params)
|
|
34
47
|
);
|
|
35
48
|
};
|
package/data/server/product.ts
CHANGED
|
@@ -2,16 +2,21 @@ import { Cache, CacheKey } from '../../lib/cache';
|
|
|
2
2
|
import { product } from '../urls';
|
|
3
3
|
import { ProductCategoryResult, ProductResult } from '../../types';
|
|
4
4
|
import appFetch from '../../utils/app-fetch';
|
|
5
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
5
6
|
import logger from '../../utils/log';
|
|
6
7
|
|
|
7
8
|
type GetProduct = {
|
|
8
9
|
pk: number;
|
|
10
|
+
locale?: string;
|
|
11
|
+
currency?: string;
|
|
9
12
|
searchParams?: URLSearchParams;
|
|
10
13
|
groupProduct?: boolean;
|
|
11
14
|
};
|
|
12
15
|
|
|
13
16
|
const getProductDataHandler = ({
|
|
14
17
|
pk,
|
|
18
|
+
locale,
|
|
19
|
+
currency,
|
|
15
20
|
searchParams,
|
|
16
21
|
groupProduct
|
|
17
22
|
}: GetProduct) => {
|
|
@@ -28,24 +33,31 @@ const getProductDataHandler = ({
|
|
|
28
33
|
.join('&');
|
|
29
34
|
}
|
|
30
35
|
|
|
31
|
-
const data = await appFetch<ProductResult>(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
const data = await appFetch<ProductResult>({
|
|
37
|
+
url,
|
|
38
|
+
locale,
|
|
39
|
+
currency,
|
|
40
|
+
init: {
|
|
41
|
+
headers: {
|
|
42
|
+
Accept: 'application/json',
|
|
43
|
+
'Content-Type': 'application/json'
|
|
44
|
+
}
|
|
35
45
|
}
|
|
36
46
|
});
|
|
37
47
|
|
|
38
48
|
const categoryUrl = product.categoryUrl(data.product.pk);
|
|
39
49
|
|
|
40
|
-
const productCategoryData = await appFetch<ProductCategoryResult>(
|
|
41
|
-
categoryUrl,
|
|
42
|
-
|
|
50
|
+
const productCategoryData = await appFetch<ProductCategoryResult>({
|
|
51
|
+
url: categoryUrl,
|
|
52
|
+
locale,
|
|
53
|
+
currency,
|
|
54
|
+
init: {
|
|
43
55
|
headers: {
|
|
44
56
|
Accept: 'application/json',
|
|
45
57
|
'Content-Type': 'application/json'
|
|
46
58
|
}
|
|
47
59
|
}
|
|
48
|
-
);
|
|
60
|
+
});
|
|
49
61
|
|
|
50
62
|
const menuItemModel = productCategoryData?.results[0]?.menuitemmodel;
|
|
51
63
|
|
|
@@ -59,10 +71,15 @@ const getProductDataHandler = ({
|
|
|
59
71
|
|
|
60
72
|
const breadcrumbUrl = product.breadcrumbUrl(menuItemModel);
|
|
61
73
|
|
|
62
|
-
const breadcrumbData = await appFetch<any>(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
74
|
+
const breadcrumbData = await appFetch<any>({
|
|
75
|
+
url: breadcrumbUrl,
|
|
76
|
+
locale,
|
|
77
|
+
currency,
|
|
78
|
+
init: {
|
|
79
|
+
headers: {
|
|
80
|
+
Accept: 'application/json',
|
|
81
|
+
'Content-Type': 'application/json'
|
|
82
|
+
}
|
|
66
83
|
}
|
|
67
84
|
});
|
|
68
85
|
|
|
@@ -75,6 +92,8 @@ const getProductDataHandler = ({
|
|
|
75
92
|
|
|
76
93
|
export const getProductData = async ({
|
|
77
94
|
pk,
|
|
95
|
+
locale = ServerVariables.locale,
|
|
96
|
+
currency = ServerVariables.currency,
|
|
78
97
|
searchParams,
|
|
79
98
|
groupProduct
|
|
80
99
|
}: GetProduct) => {
|
|
@@ -83,7 +102,8 @@ export const getProductData = async ({
|
|
|
83
102
|
pk,
|
|
84
103
|
searchParams ?? new URLSearchParams()
|
|
85
104
|
),
|
|
86
|
-
|
|
105
|
+
locale,
|
|
106
|
+
getProductDataHandler({ pk, locale, currency, searchParams, groupProduct }),
|
|
87
107
|
{
|
|
88
108
|
expire: 300
|
|
89
109
|
}
|
package/data/server/seo.ts
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
import appFetch from '../../utils/app-fetch';
|
|
2
2
|
import { Cache, CacheKey } from '../../lib/cache';
|
|
3
3
|
import { misc } from '../../data/urls';
|
|
4
|
-
import
|
|
4
|
+
import { ServerVariables } from '../../utils/server-variables';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
data = await appFetch<{ [key: string]: string }>(misc.cmsSeo('/'));
|
|
12
|
-
} catch (error) {
|
|
13
|
-
logger.error('Error while fetching root seo data', error);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
return data;
|
|
17
|
-
};
|
|
6
|
+
interface SeoDataParams {
|
|
7
|
+
url: string;
|
|
8
|
+
locale?: string;
|
|
9
|
+
currency?: string;
|
|
18
10
|
}
|
|
19
11
|
|
|
20
|
-
function getSeoDataHandler(url:
|
|
12
|
+
function getSeoDataHandler({ url, locale, currency }: SeoDataParams) {
|
|
21
13
|
return async function () {
|
|
22
14
|
let data = {} as {
|
|
23
15
|
title: string;
|
|
@@ -27,7 +19,7 @@ function getSeoDataHandler(url: string) {
|
|
|
27
19
|
};
|
|
28
20
|
|
|
29
21
|
try {
|
|
30
|
-
data = await appFetch(misc.cmsSeo(url));
|
|
22
|
+
data = await appFetch({ url: misc.cmsSeo(url), locale, currency });
|
|
31
23
|
} catch (error) {
|
|
32
24
|
// logger.error('Error while fetching seo data', { url, error });
|
|
33
25
|
}
|
|
@@ -36,13 +28,14 @@ function getSeoDataHandler(url: string) {
|
|
|
36
28
|
};
|
|
37
29
|
}
|
|
38
30
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
31
|
+
export const getSeoData = async (
|
|
32
|
+
url,
|
|
33
|
+
locale = ServerVariables.locale,
|
|
34
|
+
currency = ServerVariables.currency
|
|
35
|
+
) => {
|
|
36
|
+
return Cache.wrap(
|
|
37
|
+
CacheKey.Seo(url),
|
|
38
|
+
locale,
|
|
39
|
+
getSeoDataHandler({ url, locale, currency })
|
|
40
|
+
);
|
|
48
41
|
};
|