@akinon/next 1.47.0-rc.8 → 1.47.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.
- package/CHANGELOG.md +2 -455
- package/api/client.ts +17 -50
- package/assets/styles/index.scss +26 -50
- package/components/index.ts +0 -1
- package/components/input.tsx +7 -21
- package/components/link.tsx +13 -17
- package/components/pagination.tsx +2 -1
- package/components/price.tsx +4 -11
- package/components/selected-payment-option-view.tsx +38 -26
- package/data/client/account.ts +9 -10
- package/data/client/address.ts +8 -32
- package/data/client/api.ts +2 -2
- package/data/client/b2b.ts +2 -35
- package/data/client/basket.ts +5 -6
- package/data/client/checkout.ts +4 -47
- package/data/client/user.ts +2 -3
- package/data/server/category.ts +2 -2
- package/data/server/list.ts +2 -2
- package/data/server/product.ts +13 -15
- package/data/server/special-page.ts +2 -2
- package/data/urls.ts +2 -9
- package/hooks/index.ts +1 -2
- package/hooks/use-payment-options.ts +1 -2
- package/lib/cache.ts +6 -18
- package/middlewares/default.ts +8 -91
- package/middlewares/locale.ts +30 -32
- package/middlewares/pretty-url.ts +0 -4
- package/middlewares/url-redirection.ts +0 -4
- package/package.json +4 -5
- package/plugins.d.ts +0 -1
- package/redux/middlewares/checkout.ts +11 -70
- package/redux/reducers/checkout.ts +5 -24
- package/redux/reducers/config.ts +0 -2
- package/types/commerce/account.ts +0 -1
- package/types/commerce/address.ts +1 -1
- package/types/commerce/b2b.ts +2 -12
- package/types/commerce/checkout.ts +0 -30
- package/types/commerce/misc.ts +0 -2
- package/types/commerce/order.ts +0 -12
- package/types/index.ts +2 -31
- package/utils/app-fetch.ts +3 -6
- package/utils/generate-commerce-search-params.ts +2 -6
- package/utils/index.ts +6 -27
- package/utils/menu-generator.ts +2 -2
- package/utils/server-translation.ts +1 -5
- package/utils/server-variables.ts +1 -2
- package/with-pz-config.js +1 -11
- package/assets/styles/index.css +0 -49
- package/assets/styles/index.css.map +0 -1
- package/components/file-input.tsx +0 -8
- package/hooks/use-message-listener.ts +0 -24
- package/lib/cache-handler.mjs +0 -33
- package/routes/pretty-url.tsx +0 -194
- package/utils/redirection-iframe.ts +0 -85
package/components/input.tsx
CHANGED
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
|
-
import { forwardRef, FocusEvent, useState
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
/>
|
package/components/link.tsx
CHANGED
|
@@ -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 (
|
|
21
|
-
return
|
|
18
|
+
if (typeof href !== 'string' || href.startsWith('http')) {
|
|
19
|
+
return href;
|
|
22
20
|
}
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const hrefWithLocale = `/${locale}${pathnameWithoutLocale}`;
|
|
22
|
+
const pathnameWithoutLocale = href.replace(urlLocaleMatcherRegex, '');
|
|
23
|
+
const hrefWithLocale = `/${locale}${pathnameWithoutLocale}`;
|
|
27
24
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 '
|
|
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';
|
package/components/price.tsx
CHANGED
|
@@ -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:
|
|
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
|
-
<
|
|
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={
|
|
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
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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
|
),
|
package/data/client/account.ts
CHANGED
|
@@ -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,
|
|
127
|
-
query: (body) => {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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 }) => ({
|
package/data/client/address.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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
|
-
|
|
85
|
-
|
|
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,
|
|
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 }) => ({
|
package/data/client/api.ts
CHANGED
|
@@ -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;
|
|
@@ -67,7 +67,7 @@ export const api = createApi({
|
|
|
67
67
|
baseQuery: customBaseQuery,
|
|
68
68
|
tagTypes: [
|
|
69
69
|
'Basket',
|
|
70
|
-
'
|
|
70
|
+
'AllBaskets',
|
|
71
71
|
'BasketB2b',
|
|
72
72
|
'DraftsB2b',
|
|
73
73
|
'Product',
|
package/data/client/b2b.ts
CHANGED
|
@@ -12,9 +12,7 @@ import {
|
|
|
12
12
|
SaveBasketParams,
|
|
13
13
|
UpdateProductParams,
|
|
14
14
|
DeleteProductParams,
|
|
15
|
-
CreateQuotationParams
|
|
16
|
-
BasketStatusResponse,
|
|
17
|
-
ExportBasketResponse
|
|
15
|
+
CreateQuotationParams
|
|
18
16
|
} from '../../types';
|
|
19
17
|
|
|
20
18
|
const b2bApi = api.injectEndpoints({
|
|
@@ -91,34 +89,6 @@ const b2bApi = api.injectEndpoints({
|
|
|
91
89
|
}),
|
|
92
90
|
invalidatesTags: ['BasketB2b', 'DraftsB2b']
|
|
93
91
|
}),
|
|
94
|
-
exportBasket: build.mutation<ExportBasketResponse, string>({
|
|
95
|
-
query: (queryString) => {
|
|
96
|
-
return {
|
|
97
|
-
url: buildClientRequestUrl(b2b.basketExport(queryString)),
|
|
98
|
-
method: 'GET'
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
}),
|
|
102
|
-
getBasketStatus: build.mutation<BasketStatusResponse, string>({
|
|
103
|
-
query: (cacheKey) => {
|
|
104
|
-
return {
|
|
105
|
-
url: buildClientRequestUrl(b2b.statusBasket(cacheKey)),
|
|
106
|
-
method: 'GET'
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}),
|
|
110
|
-
uploadFile: build.mutation<void, FormData>({
|
|
111
|
-
query: (body) => {
|
|
112
|
-
return {
|
|
113
|
-
url: buildClientRequestUrl(b2b.basketImport, {
|
|
114
|
-
useFormData: true
|
|
115
|
-
}),
|
|
116
|
-
method: 'POST',
|
|
117
|
-
body
|
|
118
|
-
};
|
|
119
|
-
},
|
|
120
|
-
invalidatesTags: ['BasketB2b']
|
|
121
|
-
})
|
|
122
92
|
}),
|
|
123
93
|
overrideExisting: true
|
|
124
94
|
});
|
|
@@ -132,8 +102,5 @@ export const {
|
|
|
132
102
|
useLoadBasketMutation,
|
|
133
103
|
useUpdateProductMutation,
|
|
134
104
|
useDeleteProductMutation,
|
|
135
|
-
useCreateQuotationMutation
|
|
136
|
-
useGetBasketStatusMutation,
|
|
137
|
-
useExportBasketMutation,
|
|
138
|
-
useUploadFileMutation
|
|
105
|
+
useCreateQuotationMutation
|
|
139
106
|
} = b2bApi;
|
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: ['AllBaskets']
|
|
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: ['AllBaskets']
|
|
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: ['AllBaskets', '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: ['AllBaskets', 'Basket']
|
|
61
61
|
}),
|
|
62
62
|
updateQuantity: build.mutation<
|
|
63
63
|
UpdateQuantityResponse,
|
|
@@ -69,8 +69,7 @@ export const basketApi = api.injectEndpoints({
|
|
|
69
69
|
}),
|
|
70
70
|
method: 'PUT',
|
|
71
71
|
body
|
|
72
|
-
})
|
|
73
|
-
invalidatesTags: ['MultiBasket', 'Basket']
|
|
72
|
+
})
|
|
74
73
|
}),
|
|
75
74
|
clearBasket: build.mutation<Basket, void>({
|
|
76
75
|
query: (body) => ({
|
package/data/client/checkout.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
setBankAccounts,
|
|
3
|
-
setCardType,
|
|
4
3
|
setInstallmentOptions,
|
|
5
4
|
setPaymentStepBusy,
|
|
6
5
|
setSelectedBankAccountPk,
|
|
7
6
|
setSelectedCreditPaymentPk,
|
|
8
|
-
setShippingStepBusy
|
|
7
|
+
setShippingStepBusy,
|
|
8
|
+
setCardType
|
|
9
9
|
} from '../../redux/reducers/checkout';
|
|
10
10
|
import {
|
|
11
11
|
CheckoutContext,
|
|
@@ -20,7 +20,6 @@ import { AppDispatch, AppStore, store } from 'redux/store';
|
|
|
20
20
|
import settings from 'settings';
|
|
21
21
|
import { showMobile3dIframe } from '../../utils/mobile-3d-iframe';
|
|
22
22
|
import {
|
|
23
|
-
setCvcRequired,
|
|
24
23
|
setError,
|
|
25
24
|
setOtpModalVisible
|
|
26
25
|
} from '@akinon/pz-masterpass/src/redux/reducer';
|
|
@@ -114,8 +113,7 @@ const completeMasterpassPayment = async (
|
|
|
114
113
|
? await buildDirectPurchaseForm(commonFormValues, params)
|
|
115
114
|
: await buildPurchaseForm({
|
|
116
115
|
...commonFormValues,
|
|
117
|
-
selectedCard
|
|
118
|
-
cardCvc: params?.card_cvv
|
|
116
|
+
selectedCard
|
|
119
117
|
});
|
|
120
118
|
|
|
121
119
|
window.MFS?.[
|
|
@@ -153,10 +151,6 @@ const completeMasterpassPayment = async (
|
|
|
153
151
|
return;
|
|
154
152
|
}
|
|
155
153
|
|
|
156
|
-
if (['5013', '5182'].includes(response.responseCode)) {
|
|
157
|
-
dispatch(setCvcRequired(true));
|
|
158
|
-
}
|
|
159
|
-
|
|
160
154
|
if (
|
|
161
155
|
response.token &&
|
|
162
156
|
(response.responseCode == '0000' || response.responseCode == '')
|
|
@@ -379,22 +373,6 @@ export const checkoutApi = api.injectEndpoints({
|
|
|
379
373
|
dispatch(setShippingStepBusy(false));
|
|
380
374
|
}
|
|
381
375
|
}),
|
|
382
|
-
setDataSourceShippingOptions: build.mutation<CheckoutResponse, number[]>({
|
|
383
|
-
query: (pks) => ({
|
|
384
|
-
url: buildClientRequestUrl(checkout.setDataSourceShippingOption, {
|
|
385
|
-
useFormData: true
|
|
386
|
-
}),
|
|
387
|
-
method: 'POST',
|
|
388
|
-
body: {
|
|
389
|
-
data_source_shipping_options: JSON.stringify(pks)
|
|
390
|
-
}
|
|
391
|
-
}),
|
|
392
|
-
async onQueryStarted(arg, { dispatch, queryFulfilled }) {
|
|
393
|
-
dispatch(setShippingStepBusy(true));
|
|
394
|
-
await queryFulfilled;
|
|
395
|
-
dispatch(setShippingStepBusy(false));
|
|
396
|
-
}
|
|
397
|
-
}),
|
|
398
376
|
setRetailStore: build.mutation<CheckoutResponse, SetRetailStoreParams>({
|
|
399
377
|
query: ({ retailStorePk, billingAddressPk }) => ({
|
|
400
378
|
url: buildClientRequestUrl(
|
|
@@ -676,25 +654,6 @@ export const checkoutApi = api.injectEndpoints({
|
|
|
676
654
|
notes
|
|
677
655
|
}
|
|
678
656
|
})
|
|
679
|
-
}),
|
|
680
|
-
setAttributeBasedShippingOptions: build.mutation<
|
|
681
|
-
CheckoutResponse,
|
|
682
|
-
Record<string, number>
|
|
683
|
-
>({
|
|
684
|
-
query: (options) => ({
|
|
685
|
-
url: buildClientRequestUrl(checkout.setAttributeBasedShippingOption, {
|
|
686
|
-
useFormData: true
|
|
687
|
-
}),
|
|
688
|
-
method: 'POST',
|
|
689
|
-
body: {
|
|
690
|
-
attribute_based_shipping_options: JSON.stringify(options)
|
|
691
|
-
}
|
|
692
|
-
}),
|
|
693
|
-
async onQueryStarted(arg, { dispatch, queryFulfilled }) {
|
|
694
|
-
dispatch(setShippingStepBusy(true));
|
|
695
|
-
await queryFulfilled;
|
|
696
|
-
dispatch(setShippingStepBusy(false));
|
|
697
|
-
}
|
|
698
657
|
})
|
|
699
658
|
}),
|
|
700
659
|
overrideExisting: false
|
|
@@ -713,7 +672,6 @@ export const {
|
|
|
713
672
|
useSetDeliveryOptionMutation,
|
|
714
673
|
useSetAddressesMutation,
|
|
715
674
|
useSetShippingOptionMutation,
|
|
716
|
-
useSetDataSourceShippingOptionsMutation,
|
|
717
675
|
useSetPaymentOptionMutation,
|
|
718
676
|
useSetBinNumberMutation,
|
|
719
677
|
useSetInstallmentOptionMutation,
|
|
@@ -730,6 +688,5 @@ export const {
|
|
|
730
688
|
useCompleteLoyaltyPaymentMutation,
|
|
731
689
|
useGetCheckoutLoyaltyBalanceQuery,
|
|
732
690
|
usePayWithLoyaltyBalanceMutation,
|
|
733
|
-
useSetOrderNoteMutation
|
|
734
|
-
useSetAttributeBasedShippingOptionsMutation
|
|
691
|
+
useSetOrderNoteMutation
|
|
735
692
|
} = checkoutApi;
|
package/data/client/user.ts
CHANGED
|
@@ -22,12 +22,11 @@ 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
|
|
26
|
-
|
|
25
|
+
const siteKeyMatch = response.html.match(/sitekey=["|'][^"']+/gi);
|
|
27
26
|
const csrfTokenMatch = response.html.match(
|
|
28
27
|
/name=['|"]csrfmiddlewaretoken['|"] value=['|"][^'"]+/gi
|
|
29
28
|
);
|
|
30
|
-
|
|
29
|
+
const siteKey = siteKeyMatch?.[0].replace(/sitekey=["|']/, '') || '';
|
|
31
30
|
const csrfToken =
|
|
32
31
|
csrfTokenMatch?.[0].replace(
|
|
33
32
|
/name=['|"]csrfmiddlewaretoken['|"] value=['|"]/gi,
|
package/data/server/category.ts
CHANGED
|
@@ -8,7 +8,7 @@ import logger from '../../utils/log';
|
|
|
8
8
|
|
|
9
9
|
function getCategoryDataHandler(
|
|
10
10
|
pk: number,
|
|
11
|
-
searchParams?:
|
|
11
|
+
searchParams?: URLSearchParams,
|
|
12
12
|
headers?: Record<string, string>
|
|
13
13
|
) {
|
|
14
14
|
return async function () {
|
|
@@ -78,7 +78,7 @@ export const getCategoryData = ({
|
|
|
78
78
|
headers
|
|
79
79
|
}: {
|
|
80
80
|
pk: number;
|
|
81
|
-
searchParams?:
|
|
81
|
+
searchParams?: URLSearchParams;
|
|
82
82
|
headers?: Record<string, string>;
|
|
83
83
|
}) => {
|
|
84
84
|
return Cache.wrap(
|
package/data/server/list.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { parse } from 'lossless-json';
|
|
|
7
7
|
import logger from '../../utils/log';
|
|
8
8
|
|
|
9
9
|
const getListDataHandler = (
|
|
10
|
-
searchParams:
|
|
10
|
+
searchParams: URLSearchParams,
|
|
11
11
|
headers?: Record<string, string>
|
|
12
12
|
) => {
|
|
13
13
|
return async function () {
|
|
@@ -54,7 +54,7 @@ export const getListData = async ({
|
|
|
54
54
|
searchParams,
|
|
55
55
|
headers
|
|
56
56
|
}: {
|
|
57
|
-
searchParams:
|
|
57
|
+
searchParams: URLSearchParams;
|
|
58
58
|
headers?: Record<string, string>;
|
|
59
59
|
}) => {
|
|
60
60
|
return Cache.wrap(
|
package/data/server/product.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { Cache, CacheKey } from '../../lib/cache';
|
|
2
2
|
import { product } from '../urls';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
BreadcrumbResultType,
|
|
5
|
+
ProductCategoryResult,
|
|
6
|
+
ProductResult
|
|
7
|
+
} from '../../types';
|
|
4
8
|
import appFetch from '../../utils/app-fetch';
|
|
5
|
-
import logger from '../../utils/log';
|
|
6
9
|
|
|
7
10
|
type GetProduct = {
|
|
8
11
|
pk: number;
|
|
9
|
-
searchParams?:
|
|
12
|
+
searchParams?: URLSearchParams;
|
|
10
13
|
groupProduct?: boolean;
|
|
11
14
|
};
|
|
12
15
|
|
|
@@ -47,17 +50,9 @@ const getProductDataHandler = ({
|
|
|
47
50
|
}
|
|
48
51
|
);
|
|
49
52
|
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
logger.warn('menuItemModel is undefined, skipping breadcrumbData fetch', {
|
|
54
|
-
handler: 'getProductDataHandler',
|
|
55
|
-
pk
|
|
56
|
-
});
|
|
57
|
-
return { data, breadcrumbData: undefined };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const breadcrumbUrl = product.breadcrumbUrl(menuItemModel);
|
|
53
|
+
const breadcrumbUrl = product.breadcrumbUrl(
|
|
54
|
+
productCategoryData.results[0].menuitemmodel
|
|
55
|
+
);
|
|
61
56
|
|
|
62
57
|
const breadcrumbData = await appFetch<any>(breadcrumbUrl, {
|
|
63
58
|
headers: {
|
|
@@ -79,7 +74,10 @@ export const getProductData = async ({
|
|
|
79
74
|
groupProduct
|
|
80
75
|
}: GetProduct) => {
|
|
81
76
|
return Cache.wrap(
|
|
82
|
-
CacheKey[groupProduct ? 'GroupProduct' : 'Product'](
|
|
77
|
+
CacheKey[groupProduct ? 'GroupProduct' : 'Product'](
|
|
78
|
+
pk,
|
|
79
|
+
searchParams ?? new URLSearchParams()
|
|
80
|
+
),
|
|
83
81
|
getProductDataHandler({ pk, searchParams, groupProduct }),
|
|
84
82
|
{
|
|
85
83
|
expire: 300
|