@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.
Files changed (112) hide show
  1. package/bundle/blocks.schema.json +1 -1
  2. package/bundle/bundle.umd.js +170 -1
  3. package/bundle/bundle.umd.min.js +1 -1
  4. package/bundle/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
  5. package/bundle/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
  6. package/bundle/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
  7. package/bundle/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
  8. package/bundle/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
  9. package/dist/components/Blocks.js +2 -0
  10. package/dist/components/Blocks.js.map +1 -1
  11. package/dist/components/Blocks.mobile.js +2 -0
  12. package/dist/components/Blocks.mobile.js.map +1 -1
  13. package/dist/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
  14. package/dist/components/CashbackCalculator/CashbackCalculator.js +28 -0
  15. package/dist/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
  16. package/dist/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
  17. package/dist/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
  18. package/dist/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
  19. package/dist/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
  20. package/dist/components/CashbackCalculator/CashbackCalculatorResult.js +27 -0
  21. package/dist/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
  22. package/dist/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
  23. package/dist/components/CashbackCalculator/CashbackCategory.js +72 -0
  24. package/dist/components/CashbackCalculator/CashbackCategory.js.map +1 -0
  25. package/dist/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
  26. package/dist/components/CashbackCalculator/useCashbackCalculator.js +77 -0
  27. package/dist/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
  28. package/lib/common.css +1 -1
  29. package/lib/components/Blocks.js +2 -0
  30. package/lib/components/Blocks.js.map +1 -1
  31. package/lib/components/Blocks.mobile.js +2 -0
  32. package/lib/components/Blocks.mobile.js.map +1 -1
  33. package/lib/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
  34. package/lib/components/CashbackCalculator/CashbackCalculator.fixture.d.ts +6 -0
  35. package/lib/components/CashbackCalculator/CashbackCalculator.fixture.mobile.d.ts +5 -0
  36. package/lib/components/CashbackCalculator/CashbackCalculator.js +26 -0
  37. package/lib/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
  38. package/lib/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
  39. package/lib/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
  40. package/lib/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
  41. package/lib/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
  42. package/lib/components/CashbackCalculator/CashbackCalculatorResult.js +25 -0
  43. package/lib/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
  44. package/lib/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
  45. package/lib/components/CashbackCalculator/CashbackCategory.js +70 -0
  46. package/lib/components/CashbackCalculator/CashbackCategory.js.map +1 -0
  47. package/lib/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
  48. package/lib/components/CashbackCalculator/useCashbackCalculator.js +74 -0
  49. package/lib/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
  50. package/lib/components/OfficesAtmsMap/OfficesAtmsMapLayout.d.ts +1 -1
  51. package/mobile/bundle/bundle.umd.js +170 -1
  52. package/mobile/bundle/bundle.umd.min.js +1 -1
  53. package/mobile/bundle/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
  54. package/mobile/bundle/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
  55. package/mobile/bundle/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
  56. package/mobile/bundle/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
  57. package/mobile/bundle/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
  58. package/mobile/dist/components/Blocks.js +2 -0
  59. package/mobile/dist/components/Blocks.js.map +1 -1
  60. package/mobile/dist/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
  61. package/mobile/dist/components/CashbackCalculator/CashbackCalculator.js +28 -0
  62. package/mobile/dist/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
  63. package/mobile/dist/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
  64. package/mobile/dist/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
  65. package/mobile/dist/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
  66. package/mobile/dist/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
  67. package/mobile/dist/components/CashbackCalculator/CashbackCalculatorResult.js +27 -0
  68. package/mobile/dist/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
  69. package/mobile/dist/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
  70. package/mobile/dist/components/CashbackCalculator/CashbackCategory.js +72 -0
  71. package/mobile/dist/components/CashbackCalculator/CashbackCategory.js.map +1 -0
  72. package/mobile/dist/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
  73. package/mobile/dist/components/CashbackCalculator/useCashbackCalculator.js +77 -0
  74. package/mobile/dist/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
  75. package/mobile/lib/common.css +1 -1
  76. package/mobile/lib/components/Blocks.js +2 -0
  77. package/mobile/lib/components/Blocks.js.map +1 -1
  78. package/mobile/lib/components/CashbackCalculator/CashbackCalculator.d.ts +6 -0
  79. package/mobile/lib/components/CashbackCalculator/CashbackCalculator.js +26 -0
  80. package/mobile/lib/components/CashbackCalculator/CashbackCalculator.js.map +1 -0
  81. package/mobile/lib/components/CashbackCalculator/CashbackCalculatorContent.d.ts +24 -0
  82. package/mobile/lib/components/CashbackCalculator/CashbackCalculatorContent.js +2 -0
  83. package/mobile/lib/components/CashbackCalculator/CashbackCalculatorContent.js.map +1 -0
  84. package/mobile/lib/components/CashbackCalculator/CashbackCalculatorResult.d.ts +6 -0
  85. package/mobile/lib/components/CashbackCalculator/CashbackCalculatorResult.js +25 -0
  86. package/mobile/lib/components/CashbackCalculator/CashbackCalculatorResult.js.map +1 -0
  87. package/mobile/lib/components/CashbackCalculator/CashbackCategory.d.ts +14 -0
  88. package/mobile/lib/components/CashbackCalculator/CashbackCategory.js +70 -0
  89. package/mobile/lib/components/CashbackCalculator/CashbackCategory.js.map +1 -0
  90. package/mobile/lib/components/CashbackCalculator/useCashbackCalculator.d.ts +10 -0
  91. package/mobile/lib/components/CashbackCalculator/useCashbackCalculator.js +74 -0
  92. package/mobile/lib/components/CashbackCalculator/useCashbackCalculator.js.map +1 -0
  93. package/mobile/src/components/Blocks.ts +2 -0
  94. package/mobile/src/components/CashbackCalculator/CashbackCalculator.example.json +1 -0
  95. package/mobile/src/components/CashbackCalculator/CashbackCalculator.tsx +117 -0
  96. package/mobile/src/components/CashbackCalculator/CashbackCalculator.ui.json +15 -0
  97. package/mobile/src/components/CashbackCalculator/CashbackCalculatorContent.ts +27 -0
  98. package/mobile/src/components/CashbackCalculator/CashbackCalculatorResult.tsx +66 -0
  99. package/mobile/src/components/CashbackCalculator/CashbackCategory.tsx +143 -0
  100. package/mobile/src/components/CashbackCalculator/useCashbackCalculator.ts +93 -0
  101. package/package.json +1 -1
  102. package/src/components/Blocks.mobile.ts +2 -0
  103. package/src/components/Blocks.ts +2 -0
  104. package/src/components/CashbackCalculator/CashbackCalculator.example.json +1 -0
  105. package/src/components/CashbackCalculator/CashbackCalculator.fixture.mobile.tsx +45 -0
  106. package/src/components/CashbackCalculator/CashbackCalculator.fixture.tsx +54 -0
  107. package/src/components/CashbackCalculator/CashbackCalculator.tsx +117 -0
  108. package/src/components/CashbackCalculator/CashbackCalculator.ui.json +15 -0
  109. package/src/components/CashbackCalculator/CashbackCalculatorContent.ts +27 -0
  110. package/src/components/CashbackCalculator/CashbackCalculatorResult.tsx +66 -0
  111. package/src/components/CashbackCalculator/CashbackCategory.tsx +143 -0
  112. 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,15 @@
1
+ {
2
+ "style": {
3
+ "ui:options": {
4
+ "minCols": 12
5
+ }
6
+ },
7
+ "content": {
8
+ "deleteImage": {
9
+ "ui:field": "picture"
10
+ },
11
+ "infoImage": {
12
+ "ui:field": "picture"
13
+ }
14
+ }
15
+ }
@@ -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
+ };