@redneckz/wildless-cms-uni-blocks 0.14.935 → 0.14.936
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/bundle/blocks.schema.json +1 -1
- package/bundle/bundle.umd.js +170 -1
- package/bundle/bundle.umd.min.js +1 -1
- package/bundle/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
- package/bundle/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
- package/bundle/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
- package/bundle/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
- package/bundle/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
- package/dist/components/Blocks.js +2 -0
- package/dist/components/Blocks.js.map +1 -1
- package/dist/components/Blocks.mobile.js +2 -0
- package/dist/components/Blocks.mobile.js.map +1 -1
- package/dist/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
- package/dist/components/CashbackCalculator/CashbackCalculator.js +28 -0
- package/dist/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
- package/dist/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
- package/dist/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
- package/dist/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
- package/dist/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
- package/dist/components/CashbackCalculator/CashbackCalculatorResult.js +27 -0
- package/dist/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
- package/dist/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
- package/dist/components/CashbackCalculator/CashbackCategory.js +72 -0
- package/dist/components/CashbackCalculator/CashbackCategory.js.map +1 -0
- package/dist/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
- package/dist/components/CashbackCalculator/useCashbackCalculator.js +77 -0
- package/dist/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
- package/lib/common.css +1 -1
- package/lib/components/Blocks.js +2 -0
- package/lib/components/Blocks.js.map +1 -1
- package/lib/components/Blocks.mobile.js +2 -0
- package/lib/components/Blocks.mobile.js.map +1 -1
- package/lib/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
- package/lib/components/CashbackCalculator/CashbackCalculator.fixture.d.ts +6 -0
- package/lib/components/CashbackCalculator/CashbackCalculator.fixture.mobile.d.ts +5 -0
- package/lib/components/CashbackCalculator/CashbackCalculator.js +26 -0
- package/lib/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
- package/lib/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
- package/lib/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
- package/lib/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
- package/lib/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
- package/lib/components/CashbackCalculator/CashbackCalculatorResult.js +25 -0
- package/lib/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
- package/lib/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
- package/lib/components/CashbackCalculator/CashbackCategory.js +70 -0
- package/lib/components/CashbackCalculator/CashbackCategory.js.map +1 -0
- package/lib/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
- package/lib/components/CashbackCalculator/useCashbackCalculator.js +74 -0
- package/lib/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
- package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.d.ts +1 -1
- package/mobile/bundle/bundle.umd.js +170 -1
- package/mobile/bundle/bundle.umd.min.js +1 -1
- package/mobile/bundle/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
- package/mobile/bundle/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
- package/mobile/bundle/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
- package/mobile/bundle/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
- package/mobile/bundle/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
- package/mobile/dist/components/Blocks.js +2 -0
- package/mobile/dist/components/Blocks.js.map +1 -1
- package/mobile/dist/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculator.js +28 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculatorResult.js +27 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCategory.js +72 -0
- package/mobile/dist/components/CashbackCalculator/CashbackCategory.js.map +1 -0
- package/mobile/dist/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
- package/mobile/dist/components/CashbackCalculator/useCashbackCalculator.js +77 -0
- package/mobile/dist/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
- package/mobile/lib/common.css +1 -1
- package/mobile/lib/components/Blocks.js +2 -0
- package/mobile/lib/components/Blocks.js.map +1 -1
- package/mobile/lib/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculator.js +26 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculatorResult.js +25 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCategory.js +70 -0
- package/mobile/lib/components/CashbackCalculator/CashbackCategory.js.map +1 -0
- package/mobile/lib/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
- package/mobile/lib/components/CashbackCalculator/useCashbackCalculator.js +74 -0
- package/mobile/lib/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
- package/mobile/src/components/Blocks.ts +2 -0
- package/mobile/src/components/CashbackCalculator/CashbackCalculator.example.json +1 -0
- package/mobile/src/components/CashbackCalculator/CashbackCalculator.tsx +117 -0
- package/mobile/src/components/CashbackCalculator/CashbackCalculator.ui.json +15 -0
- package/mobile/src/components/CashbackCalculator/CashbackCalculatorContent.ts +27 -0
- package/mobile/src/components/CashbackCalculator/CashbackCalculatorResult.tsx +66 -0
- package/mobile/src/components/CashbackCalculator/CashbackCategory.tsx +143 -0
- package/mobile/src/components/CashbackCalculator/useCashbackCalculator.ts +93 -0
- package/package.json +1 -1
- package/src/components/Blocks.mobile.ts +2 -0
- package/src/components/Blocks.ts +2 -0
- package/src/components/CashbackCalculator/CashbackCalculator.example.json +1 -0
- package/src/components/CashbackCalculator/CashbackCalculator.fixture.mobile.tsx +45 -0
- package/src/components/CashbackCalculator/CashbackCalculator.fixture.tsx +54 -0
- package/src/components/CashbackCalculator/CashbackCalculator.tsx +117 -0
- package/src/components/CashbackCalculator/CashbackCalculator.ui.json +15 -0
- package/src/components/CashbackCalculator/CashbackCalculatorContent.ts +27 -0
- package/src/components/CashbackCalculator/CashbackCalculatorResult.tsx +66 -0
- package/src/components/CashbackCalculator/CashbackCategory.tsx +143 -0
- package/src/components/CashbackCalculator/useCashbackCalculator.ts +93 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import { BlockWrapper } from '../../ui-kit/BlockWrapper';
|
|
3
|
+
import { Button } from '../../ui-kit/Button/Button';
|
|
4
|
+
import { Img } from '../../ui-kit/Img/Img';
|
|
5
|
+
import { InfoCard } from '../../ui-kit/InfoCard/InfoCard';
|
|
6
|
+
import { LinkButton } from '../../ui-kit/LinkButton/LinkButton';
|
|
7
|
+
import { type UniBlockProps } from '../../UniBlock/UniBlockProps';
|
|
8
|
+
import { style } from '../../utils/style';
|
|
9
|
+
import { Headline } from '../Headline/Headline';
|
|
10
|
+
import { type Cashback, type CashbackCalculatorContent } from './CashbackCalculatorContent';
|
|
11
|
+
import { CashbackCalculatorResult } from './CashbackCalculatorResult';
|
|
12
|
+
import { CashbackCategory } from './CashbackCategory';
|
|
13
|
+
import { useCashbackCalculator } from './useCashbackCalculator';
|
|
14
|
+
|
|
15
|
+
const INCREASED_PERCENTS = ['5', '10', '15'];
|
|
16
|
+
|
|
17
|
+
const MAX_CATEGORIES = 5;
|
|
18
|
+
|
|
19
|
+
const INFO_BLOCK_HTML = `<p>Полученные баллы можно конвертировать в рубли и компенсировать покупки у партнеров. Подробнее в <a href='#docs'>документах</a></p>`;
|
|
20
|
+
|
|
21
|
+
interface CashbackCalculatorProps extends CashbackCalculatorContent, UniBlockProps {}
|
|
22
|
+
|
|
23
|
+
export const CashbackCalculator = JSX<CashbackCalculatorProps>(
|
|
24
|
+
({
|
|
25
|
+
maxInputRange = 300000,
|
|
26
|
+
image,
|
|
27
|
+
deleteImage,
|
|
28
|
+
infoImage,
|
|
29
|
+
isMultiple = false,
|
|
30
|
+
className = '',
|
|
31
|
+
...rest
|
|
32
|
+
}) => {
|
|
33
|
+
const {
|
|
34
|
+
cashbacks,
|
|
35
|
+
categories,
|
|
36
|
+
onAddNewCashback,
|
|
37
|
+
onChangeCashback,
|
|
38
|
+
onDeleteCashback,
|
|
39
|
+
onResetCashback,
|
|
40
|
+
} = useCashbackCalculator(isMultiple);
|
|
41
|
+
|
|
42
|
+
const img = image?.src ? (
|
|
43
|
+
<Img image={image} className="hidden w-full @xl:block" imageClassName="justify-self-center" />
|
|
44
|
+
) : null;
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<BlockWrapper
|
|
48
|
+
className={style('flex flex-col justify-center items-center gap-lg', className)}
|
|
49
|
+
defaultPadding={style('p-6xl')}
|
|
50
|
+
{...rest}
|
|
51
|
+
>
|
|
52
|
+
<Headline
|
|
53
|
+
title="Калькулятор кешбэка"
|
|
54
|
+
description="Выберите 5 категорий кешбэка, и вы получите общий расчет получаемого кешбэка"
|
|
55
|
+
headlineVersion="XL"
|
|
56
|
+
isEmbedded={true}
|
|
57
|
+
/>
|
|
58
|
+
<div className="flex flex-row items-start gap-lg">
|
|
59
|
+
<div className="w-full flex flex-col justify-center items-center gap-lg">
|
|
60
|
+
{cashbacks.map((_) => (
|
|
61
|
+
<CashbackCategory
|
|
62
|
+
key={String(_.id)}
|
|
63
|
+
categories={categories}
|
|
64
|
+
cashback={_}
|
|
65
|
+
showIncreasedPercents={showIncreasedPercents(_, cashbacks)}
|
|
66
|
+
maxInputRange={maxInputRange}
|
|
67
|
+
deleteImage={deleteImage}
|
|
68
|
+
onDelete={onDeleteCashback}
|
|
69
|
+
onChange={onChangeCashback}
|
|
70
|
+
/>
|
|
71
|
+
))}
|
|
72
|
+
{renderButtons(cashbacks.length, onAddNewCashback, onResetCashback)}
|
|
73
|
+
<CashbackCalculatorResult cashbacks={cashbacks} />
|
|
74
|
+
<InfoCard __html={INFO_BLOCK_HTML} image={infoImage} />
|
|
75
|
+
<LinkButton
|
|
76
|
+
className="w-full @lg:w-auto self-start"
|
|
77
|
+
href="#zayavka"
|
|
78
|
+
text="Оформить карту"
|
|
79
|
+
version="primary"
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
82
|
+
{img}
|
|
83
|
+
</div>
|
|
84
|
+
</BlockWrapper>
|
|
85
|
+
);
|
|
86
|
+
},
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const renderButtons = (
|
|
90
|
+
cashbacksLength: number,
|
|
91
|
+
onAddNewCashback: () => void,
|
|
92
|
+
onResetCashback: () => void,
|
|
93
|
+
) => {
|
|
94
|
+
return (
|
|
95
|
+
<div className="w-full flex flex-col gap-lg">
|
|
96
|
+
{cashbacksLength < MAX_CATEGORIES ? (
|
|
97
|
+
<Button
|
|
98
|
+
className="self-start text-primary-main"
|
|
99
|
+
embedded
|
|
100
|
+
version="secondary"
|
|
101
|
+
onClick={onAddNewCashback}
|
|
102
|
+
>
|
|
103
|
+
Добавить еще
|
|
104
|
+
</Button>
|
|
105
|
+
) : null}
|
|
106
|
+
{cashbacksLength > 2 ? (
|
|
107
|
+
<Button className="self-start" version="secondary" onClick={onResetCashback}>
|
|
108
|
+
Сбросить все категории
|
|
109
|
+
</Button>
|
|
110
|
+
) : null}
|
|
111
|
+
</div>
|
|
112
|
+
);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const showIncreasedPercents = (currentCashback: Cashback, cashback: Cashback[]) =>
|
|
116
|
+
INCREASED_PERCENTS.includes(currentCashback.percent.key) ||
|
|
117
|
+
!cashback.some((_) => INCREASED_PERCENTS.includes(_.percent.key));
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type TitleProps } from '../../model/HeadlineType';
|
|
2
|
+
import { type Picture } from '../../model/Picture';
|
|
3
|
+
import { type Option } from '../../ui-kit/Select/Option';
|
|
4
|
+
import { type UniBlockContent } from '../../UniBlock/UniBlockProps';
|
|
5
|
+
|
|
6
|
+
export type Cashback = {
|
|
7
|
+
id: number;
|
|
8
|
+
percent: Option;
|
|
9
|
+
sum: number;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @title Блок калькулятора кэшбека
|
|
14
|
+
*/
|
|
15
|
+
export type CashbackCalculatorContent = UniBlockContent &
|
|
16
|
+
TitleProps & {
|
|
17
|
+
/** @title Максимальное значение поля 'Сумма покупок в категории' */
|
|
18
|
+
maxInputRange?: number;
|
|
19
|
+
/** @title Изображение */
|
|
20
|
+
image?: Picture;
|
|
21
|
+
/** @title Иконка кнопки удаления категории */
|
|
22
|
+
deleteImage?: Picture;
|
|
23
|
+
/** @title Иконка информационного блока */
|
|
24
|
+
infoImage?: Picture;
|
|
25
|
+
/** @title Предзаполнение дефолтного значения несколькими категориями */
|
|
26
|
+
isMultiple?: boolean;
|
|
27
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import { Text } from '../../ui-kit/Text/Text';
|
|
3
|
+
import { type UniBlockProps } from '../../UniBlock/UniBlockProps';
|
|
4
|
+
import { toLocalNumberFormat } from '../../utils/toLocalNumberFormat';
|
|
5
|
+
import { Headline } from '../Headline/Headline';
|
|
6
|
+
import { type Cashback } from './CashbackCalculatorContent';
|
|
7
|
+
|
|
8
|
+
const MAX_MONTH_CASHBACK = 5000;
|
|
9
|
+
const MAX_YEAR_CASHBACK = 60000;
|
|
10
|
+
|
|
11
|
+
export type CashbackCalculatorResultProps = UniBlockProps & {
|
|
12
|
+
cashbacks: Cashback[];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type ResultTextProps = {
|
|
16
|
+
text: string;
|
|
17
|
+
value: number;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const ResultText = JSX<ResultTextProps>(({ text, value }) => (
|
|
21
|
+
<div className="space-y-xs w-full">
|
|
22
|
+
<Text size="text-m" color="text-primary-text" font="font-light">
|
|
23
|
+
{text}
|
|
24
|
+
</Text>
|
|
25
|
+
<div className="w-full text-2xl bg-main-gray px-4 py-3 rounded-md">{`${toLocalNumberFormat()(
|
|
26
|
+
value,
|
|
27
|
+
)} ₽`}</div>
|
|
28
|
+
</div>
|
|
29
|
+
));
|
|
30
|
+
|
|
31
|
+
export const CashbackCalculatorResult = JSX<CashbackCalculatorResultProps>(({ cashbacks }) => {
|
|
32
|
+
const { mounth, year } = getResult(cashbacks);
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<div className="w-full flex flex-col gap-lg">
|
|
36
|
+
<Headline
|
|
37
|
+
title="Результат расчета"
|
|
38
|
+
description="Категории кешбэка предварительно"
|
|
39
|
+
headlineVersion="XS"
|
|
40
|
+
isEmbedded={true}
|
|
41
|
+
align="text-left"
|
|
42
|
+
/>
|
|
43
|
+
<div className="flex flex-col @xs:flex-row gap-lg">
|
|
44
|
+
<ResultText text="Баллов в месяц" value={mounth} />
|
|
45
|
+
<ResultText text="Баллов в год" value={year} />
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const getResult = (cashbacks: Cashback[]) => {
|
|
52
|
+
return cashbacks.reduce(
|
|
53
|
+
(acc, val) => {
|
|
54
|
+
const mounthSum = (Number(val.percent.key) / 100) * val.sum;
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
mounth: Math.min(acc.mounth + mounthSum, MAX_MONTH_CASHBACK),
|
|
58
|
+
year: Math.min(acc.year + mounthSum * 12, MAX_YEAR_CASHBACK),
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
mounth: 0,
|
|
63
|
+
year: 0,
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
};
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { JSX } from '@redneckz/uni-jsx';
|
|
2
|
+
import { useState } from '@redneckz/uni-jsx/lib/hooks';
|
|
3
|
+
import { type Picture } from '../../model/Picture';
|
|
4
|
+
import { Button } from '../../ui-kit/Button/Button';
|
|
5
|
+
import { Img } from '../../ui-kit/Img/Img';
|
|
6
|
+
import { InputRange } from '../../ui-kit/InputRange/InputRange';
|
|
7
|
+
import { type Option } from '../../ui-kit/Select/Option';
|
|
8
|
+
import { Select } from '../../ui-kit/Select/Select';
|
|
9
|
+
import { Text } from '../../ui-kit/Text/Text';
|
|
10
|
+
import { type UniBlockProps } from '../../UniBlock/UniBlockProps';
|
|
11
|
+
import { type Cashback } from './CashbackCalculatorContent';
|
|
12
|
+
|
|
13
|
+
const AllPercentCategories: Option[] = [
|
|
14
|
+
{
|
|
15
|
+
text: 'Категория на кешбэк 1,5%',
|
|
16
|
+
key: '1.5',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
text: 'Категория на кешбэк 3%',
|
|
20
|
+
key: '3',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
text: 'Категория на кешбэк 5%',
|
|
24
|
+
key: '5',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
text: 'Категория на кешбэк 10%',
|
|
28
|
+
key: '10',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
text: 'Категория на кешбэк 15%',
|
|
32
|
+
key: '15',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
const PercentCategoriesWithoutIncreased: Option[] = [
|
|
37
|
+
{
|
|
38
|
+
text: 'Категория на кешбэк 1,5%',
|
|
39
|
+
key: '1.5',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
text: 'Категория на кешбэк 3%',
|
|
43
|
+
key: '3',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
export interface CashbackCategoryProps extends UniBlockProps {
|
|
48
|
+
categories?: Option[];
|
|
49
|
+
cashback: Cashback;
|
|
50
|
+
showIncreasedPercents: boolean;
|
|
51
|
+
maxInputRange: number;
|
|
52
|
+
deleteImage?: Picture;
|
|
53
|
+
onDelete: (id: number) => void;
|
|
54
|
+
onChange: (item: Cashback) => void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const CashbackCategory = JSX<CashbackCategoryProps>(
|
|
58
|
+
({
|
|
59
|
+
categories,
|
|
60
|
+
cashback,
|
|
61
|
+
showIncreasedPercents,
|
|
62
|
+
maxInputRange,
|
|
63
|
+
deleteImage,
|
|
64
|
+
onDelete,
|
|
65
|
+
onChange,
|
|
66
|
+
}) => {
|
|
67
|
+
const [currentCategory, setCurrentCategory] = useState(getRandomElement(categories));
|
|
68
|
+
const isMainCashback = cashback.id === 0;
|
|
69
|
+
const onChangePercent = (value: Option) => {
|
|
70
|
+
onChange({
|
|
71
|
+
...cashback,
|
|
72
|
+
percent: value,
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const onChangeSum = (value: number) => {
|
|
77
|
+
onChange({
|
|
78
|
+
...cashback,
|
|
79
|
+
sum: value,
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<div className="w-full space-y-m">
|
|
85
|
+
<div className="space-y-xs">
|
|
86
|
+
<Text size="text-m" color="text-primary-text" font="font-light">
|
|
87
|
+
Выберите категорию кешбэка
|
|
88
|
+
</Text>
|
|
89
|
+
<div className="flex gap-m">
|
|
90
|
+
<Select
|
|
91
|
+
className="w-full"
|
|
92
|
+
isManualInput={isMainCashback}
|
|
93
|
+
placeholder="Выберите кэшбэк"
|
|
94
|
+
options={getPercentCategories(isMainCashback, showIncreasedPercents)}
|
|
95
|
+
value={cashback.percent}
|
|
96
|
+
onChange={onChangePercent}
|
|
97
|
+
/>
|
|
98
|
+
{!isMainCashback ? (
|
|
99
|
+
<Button
|
|
100
|
+
version="secondary"
|
|
101
|
+
onClick={() => onDelete(cashback.id)}
|
|
102
|
+
shape="round"
|
|
103
|
+
className="px-4 rounded-md"
|
|
104
|
+
>
|
|
105
|
+
<Img image={deleteImage} />
|
|
106
|
+
</Button>
|
|
107
|
+
) : null}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
{categories?.length && !isMainCashback ? (
|
|
111
|
+
<Select
|
|
112
|
+
label="Выберите катеорию"
|
|
113
|
+
placeholder="Выберите катеорию"
|
|
114
|
+
options={categories}
|
|
115
|
+
value={currentCategory}
|
|
116
|
+
onChange={setCurrentCategory}
|
|
117
|
+
/>
|
|
118
|
+
) : null}
|
|
119
|
+
<InputRange
|
|
120
|
+
step={500}
|
|
121
|
+
title="Сумма покупок в категории"
|
|
122
|
+
min={0}
|
|
123
|
+
max={maxInputRange}
|
|
124
|
+
value={cashback.sum}
|
|
125
|
+
onChange={onChangeSum}
|
|
126
|
+
/>
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
},
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const getRandomElement = <T,>(arr?: T[]): T | undefined =>
|
|
133
|
+
arr?.[new Date().getTime().toString().slice(-1)];
|
|
134
|
+
|
|
135
|
+
const getPercentCategories = (isMainCashback: boolean, showIncreasedPercents: boolean) => {
|
|
136
|
+
if (isMainCashback) {
|
|
137
|
+
return [];
|
|
138
|
+
} else if (showIncreasedPercents) {
|
|
139
|
+
return AllPercentCategories;
|
|
140
|
+
} else {
|
|
141
|
+
return PercentCategoriesWithoutIncreased;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { useState } from '@redneckz/uni-jsx/lib/hooks';
|
|
2
|
+
import { useLeadFormData } from '../../retail/hooks/useLeadFormData';
|
|
3
|
+
import { type DictionaryItem } from '../../retail/model/LeadFormData';
|
|
4
|
+
import { type Option } from '../../ui-kit/Select/Option';
|
|
5
|
+
import { type Cashback } from './CashbackCalculatorContent';
|
|
6
|
+
|
|
7
|
+
const DEFAULT_MULTIPLE_CASHBACK: Cashback[] = [
|
|
8
|
+
{
|
|
9
|
+
id: 0,
|
|
10
|
+
percent: {
|
|
11
|
+
text: 'Категория на кешбэк 1%',
|
|
12
|
+
key: '1',
|
|
13
|
+
},
|
|
14
|
+
sum: 5000,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 1,
|
|
18
|
+
percent: {
|
|
19
|
+
text: 'Категория на кешбэк 1,5%',
|
|
20
|
+
key: '1.5',
|
|
21
|
+
},
|
|
22
|
+
sum: 5000,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 2,
|
|
26
|
+
percent: {
|
|
27
|
+
text: 'Категория на кешбэк 1,5%',
|
|
28
|
+
key: '1.5',
|
|
29
|
+
},
|
|
30
|
+
sum: 5000,
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const DEFAULT_CASHBACK: Cashback[] = [
|
|
35
|
+
{
|
|
36
|
+
id: 0,
|
|
37
|
+
percent: {
|
|
38
|
+
text: 'Категория на кешбэк 1%',
|
|
39
|
+
key: '1',
|
|
40
|
+
},
|
|
41
|
+
sum: 5000,
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
export const useCashbackCalculator = (isMultiple: boolean) => {
|
|
46
|
+
const { data } = useLeadFormData('CASHBACK_CATEGORY');
|
|
47
|
+
const [cashbacks, setCashbacks] = useState<Cashback[]>(
|
|
48
|
+
isMultiple ? DEFAULT_MULTIPLE_CASHBACK : DEFAULT_CASHBACK,
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const categories: Option[] =
|
|
52
|
+
data?.map((_: DictionaryItem) => ({
|
|
53
|
+
key: _.key || '',
|
|
54
|
+
text: _.value,
|
|
55
|
+
})) || [];
|
|
56
|
+
|
|
57
|
+
const onAddNewCashback = () =>
|
|
58
|
+
setCashbacks((_) => [
|
|
59
|
+
..._,
|
|
60
|
+
{
|
|
61
|
+
id: _[_.length - 1].id + 1,
|
|
62
|
+
percent: {
|
|
63
|
+
text: 'Категория на кешбэк 1,5%',
|
|
64
|
+
key: '1.5',
|
|
65
|
+
},
|
|
66
|
+
sum: 5000,
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
|
|
70
|
+
const onChangeCashback = (item: Cashback) =>
|
|
71
|
+
setCashbacks((prev) =>
|
|
72
|
+
prev.map((_) => {
|
|
73
|
+
if (_.id === item.id) {
|
|
74
|
+
return item;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return _;
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const onDeleteCashback = (id: number) => setCashbacks((prev) => prev.filter((_) => _.id !== id));
|
|
82
|
+
|
|
83
|
+
const onResetCashback = () => setCashbacks(DEFAULT_CASHBACK);
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
cashbacks,
|
|
87
|
+
categories,
|
|
88
|
+
onAddNewCashback,
|
|
89
|
+
onChangeCashback,
|
|
90
|
+
onDeleteCashback,
|
|
91
|
+
onResetCashback,
|
|
92
|
+
};
|
|
93
|
+
};
|
package/package.json
CHANGED
|
@@ -17,6 +17,7 @@ import { Carousel } from './Carousel/Carousel';
|
|
|
17
17
|
import { CarouselCatalogCard } from './CarouselCatalogCard/CarouselCatalogCard';
|
|
18
18
|
import { CarouselRecommendationCard } from './CarouselRecommendationCard/CarouselRecommendationCard';
|
|
19
19
|
import { CarouselTariffsCard } from './CarouselTariffsCard/CarouselTariffsCard';
|
|
20
|
+
import { CashbackCalculator } from './CashbackCalculator/CashbackCalculator';
|
|
20
21
|
import { CreditCardForm } from './CreditCardForm/CreditCardForm';
|
|
21
22
|
import { CreditForm } from './CreditForm/CreditForm';
|
|
22
23
|
import { DebitForm } from './DebitForm/DebitForm';
|
|
@@ -86,4 +87,5 @@ export const Blocks: BlocksRegistry = {
|
|
|
86
87
|
CreditCardForm,
|
|
87
88
|
CreditForm,
|
|
88
89
|
DebitForm,
|
|
90
|
+
CashbackCalculator,
|
|
89
91
|
};
|
package/src/components/Blocks.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { Carousel } from './Carousel/Carousel';
|
|
|
17
17
|
import { CarouselCatalogCard } from './CarouselCatalogCard/CarouselCatalogCard';
|
|
18
18
|
import { CarouselRecommendationCard } from './CarouselRecommendationCard/CarouselRecommendationCard';
|
|
19
19
|
import { CarouselTariffsCard } from './CarouselTariffsCard/CarouselTariffsCard';
|
|
20
|
+
import { CashbackCalculator } from './CashbackCalculator/CashbackCalculator';
|
|
20
21
|
import { ContactsBlock } from './ContactsBlock/ContactsBlock';
|
|
21
22
|
import { CreditCardForm } from './CreditCardForm/CreditCardForm';
|
|
22
23
|
import { CreditForm } from './CreditForm/CreditForm';
|
|
@@ -90,4 +91,5 @@ export const Blocks: BlocksRegistry = {
|
|
|
90
91
|
CreditCardForm,
|
|
91
92
|
CreditForm,
|
|
92
93
|
DebitForm,
|
|
94
|
+
CashbackCalculator,
|
|
93
95
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Picture } from '../../model/Picture';
|
|
2
|
+
import '../../setup-fixture';
|
|
3
|
+
import { PopupManager } from '../../ui-kit/PopupManager/PopupManager';
|
|
4
|
+
|
|
5
|
+
import { CashbackCalculator } from './CashbackCalculator';
|
|
6
|
+
|
|
7
|
+
const image: Picture = {
|
|
8
|
+
src: 'money-1.png',
|
|
9
|
+
format: 'webp',
|
|
10
|
+
alt: 'Потребительский кредит наличными',
|
|
11
|
+
size: {
|
|
12
|
+
width: 540,
|
|
13
|
+
height: 366,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const deleteImage: Picture = {
|
|
18
|
+
src: 'IconDelete.svg',
|
|
19
|
+
format: 'webp',
|
|
20
|
+
alt: 'Потребительский кредит наличными',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const infoImage: Picture = {
|
|
24
|
+
src: 'IconExchange.svg',
|
|
25
|
+
format: 'webp',
|
|
26
|
+
alt: 'Потребительский кредит наличными',
|
|
27
|
+
size: {
|
|
28
|
+
width: 280,
|
|
29
|
+
height: 280,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default {
|
|
34
|
+
default: (
|
|
35
|
+
<div className="container grid grid-cols-12">
|
|
36
|
+
<CashbackCalculator
|
|
37
|
+
image={image}
|
|
38
|
+
deleteImage={deleteImage}
|
|
39
|
+
infoImage={infoImage}
|
|
40
|
+
isMultiple={false}
|
|
41
|
+
/>
|
|
42
|
+
<PopupManager />
|
|
43
|
+
</div>
|
|
44
|
+
),
|
|
45
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type Picture } from '../../model/Picture';
|
|
2
|
+
import '../../setup-fixture';
|
|
3
|
+
import { PopupManager } from '../../ui-kit/PopupManager/PopupManager';
|
|
4
|
+
|
|
5
|
+
import { CashbackCalculator } from './CashbackCalculator';
|
|
6
|
+
|
|
7
|
+
const image: Picture = {
|
|
8
|
+
src: 'money-1.png',
|
|
9
|
+
format: 'webp',
|
|
10
|
+
alt: 'Потребительский кредит наличными',
|
|
11
|
+
size: {
|
|
12
|
+
width: 540,
|
|
13
|
+
height: 366,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const deleteImage: Picture = {
|
|
18
|
+
src: 'IconDelete.svg',
|
|
19
|
+
format: 'webp',
|
|
20
|
+
alt: 'Иконка кнопки удаления блока кэшбека',
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const infoImage: Picture = {
|
|
24
|
+
src: 'IconExchange.svg',
|
|
25
|
+
format: 'webp',
|
|
26
|
+
alt: 'Иконка информационного блока',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default {
|
|
30
|
+
default: (
|
|
31
|
+
<div className="container grid grid-cols-12">
|
|
32
|
+
<CashbackCalculator
|
|
33
|
+
image={image}
|
|
34
|
+
deleteImage={deleteImage}
|
|
35
|
+
infoImage={infoImage}
|
|
36
|
+
isMultiple={false}
|
|
37
|
+
className="col-span-12"
|
|
38
|
+
/>
|
|
39
|
+
<PopupManager />
|
|
40
|
+
</div>
|
|
41
|
+
),
|
|
42
|
+
multiple: (
|
|
43
|
+
<div className="container grid grid-cols-12">
|
|
44
|
+
<CashbackCalculator
|
|
45
|
+
image={image}
|
|
46
|
+
deleteImage={deleteImage}
|
|
47
|
+
infoImage={infoImage}
|
|
48
|
+
isMultiple={true}
|
|
49
|
+
className="col-span-12"
|
|
50
|
+
/>
|
|
51
|
+
<PopupManager />
|
|
52
|
+
</div>
|
|
53
|
+
),
|
|
54
|
+
};
|