Compare commits

...

935 Commits

Author SHA1 Message Date
be993e2206 Merge branch 'staging'
All checks were successful
Deploy / CreateImage (push) Successful in 4m44s
Deploy / DeployService (push) Successful in 22s
2025-06-25 14:12:27 +03:00
48ae1359ac возможность убрать смайлик
All checks were successful
Deploy / CreateImage (push) Successful in 10m41s
Deploy / DeployService (push) Successful in 26s
2025-06-23 15:30:06 +03:00
7686c9e326 текст в АИ раздельный
Some checks failed
Deploy / CreateImage (push) Failing after 53s
Deploy / DeployService (push) Has been skipped
2025-06-23 08:27:39 +03:00
2d087ae113 fix опечаток в AI
All checks were successful
Deploy / CreateImage (push) Successful in 2m45s
Deploy / DeployService (push) Successful in 22s
2025-06-23 08:27:13 +03:00
43839c5879 debug: return right pipeline logic
All checks were successful
Deploy / CreateImage (push) Successful in 9m43s
Deploy / DeployService (push) Successful in 22s
2025-06-22 22:11:24 +03:00
effc4cbea9 текст в АИ раздельный
Some checks failed
Deploy / DeployService (push) Successful in 21s
Deploy / CreateImage (push) Failing after 1m5s
2025-06-22 16:03:26 +03:00
89b55d4d3e Merge branch 'staging'
Some checks failed
Deploy / DeployService (push) Successful in 22s
Deploy / CreateImage (push) Has been cancelled
2025-06-18 01:37:52 +03:00
25deb4a0f4 есть id тарифа для прода
Some checks failed
Deploy / CreateImage (push) Failing after 11m59s
Deploy / DeployService (push) Has been cancelled
2025-06-18 00:23:50 +03:00
5ad3a810ef описания
All checks were successful
Deploy / CreateImage (push) Successful in 4m58s
Deploy / DeployService (push) Successful in 25s
2025-06-16 08:24:10 +03:00
5ff3d7ae16 3 min
All checks were successful
Deploy / CreateImage (push) Successful in 4m32s
Deploy / DeployService (push) Successful in 25s
2025-06-15 20:43:39 +03:00
8604daf6a4 тултип для показа таймера
All checks were successful
Deploy / CreateImage (push) Successful in 3m21s
Deploy / DeployService (push) Successful in 25s
2025-06-15 17:20:13 +03:00
a7c78e57e7 новая логика оплаты
All checks were successful
Deploy / CreateImage (push) Successful in 6m41s
Deploy / DeployService (push) Successful in 27s
2025-06-10 23:22:18 +03:00
a8d6db9f2d реактивное отображение скелетонов вместо копирования 2025-06-10 23:04:01 +03:00
c396752ce6 --
All checks were successful
Deploy / CreateImage (push) Successful in 3m21s
Deploy / DeployService (push) Successful in 27s
2025-06-09 23:55:24 +03:00
929e6047cf fix checkbox
All checks were successful
Deploy / CreateImage (push) Successful in 7m11s
Deploy / DeployService (push) Successful in 28s
2025-06-09 18:22:41 +03:00
6465652f82 перевод на аи
All checks were successful
Deploy / CreateImage (push) Successful in 11m2s
Deploy / DeployService (push) Successful in 27s
2025-06-09 17:26:19 +03:00
9bb69f1ab2 обноление данных о юзере после покупки 2025-06-09 16:47:26 +03:00
ac7c001738 оплата через хаб
All checks were successful
Deploy / CreateImage (push) Successful in 7m43s
Deploy / DeployService (push) Successful in 24s
2025-06-08 23:23:24 +03:00
eb5f8168c8 осталось добавить пополнение счёта 2025-06-08 23:08:47 +03:00
918b6bf145 возможность выбрать и корректно отправить пол 2025-06-08 22:56:22 +03:00
61c0357adc покупка при ок
Some checks failed
Deploy / CreateImage (push) Failing after 1m27s
Deploy / DeployService (push) Has been skipped
2025-06-08 20:52:55 +03:00
5ea6d6638a вынесены запросы тарифов и привилегий в отдельный хук 2025-06-08 10:17:50 +03:00
87d4c9d53d не копировать для новых ссылок (без возможности теста пока)
All checks were successful
Deploy / CreateImage (push) Successful in 3m14s
Deploy / DeployService (push) Successful in 24s
2025-06-07 06:24:08 +03:00
98bf92466b инфо открывается при наведении
Some checks failed
Deploy / CreateImage (push) Failing after 43s
Deploy / DeployService (push) Has been skipped
2025-06-06 16:25:06 +03:00
595f4b041b Можно выбрать оба пола
Some checks are pending
Deploy / CreateImage (push) Waiting to run
Deploy / DeployService (push) Blocked by required conditions
2025-06-06 16:06:50 +03:00
2efdd0b422 теперь до выбора типа не показывается null в меню
Some checks are pending
Deploy / CreateImage (push) Waiting to run
Deploy / DeployService (push) Blocked by required conditions
2025-06-06 14:53:57 +03:00
a83214acd4 теперь до выбора типа не показывается null в меню
Some checks failed
Deploy / CreateImage (push) Failing after 1m9s
Deploy / DeployService (push) Has been skipped
2025-06-06 14:53:15 +03:00
f0a977031d дизабл кнопки при некорректных условиях
All checks were successful
Deploy / CreateImage (push) Successful in 5m0s
Deploy / DeployService (push) Successful in 27s
2025-06-03 21:50:07 +03:00
f5a4bdc36f +qid 2025-06-03 21:10:14 +03:00
8255fe6908 корректные проверки селекта возраста 2025-06-03 21:07:37 +03:00
2540dd8079 селект+штпут 2025-06-03 20:27:14 +03:00
ff2569dea8 fix: base image change
All checks were successful
Deploy / CreateImage (push) Successful in 6m15s
Deploy / DeployService (push) Successful in 26s
2025-06-03 00:06:05 +03:00
dd2a96f948 ссылки с utm метками
Some checks failed
Deploy / CreateImage (push) Failing after 3m32s
Deploy / DeployService (push) Has been skipped
2025-06-02 21:22:55 +03:00
7f024bcf78 ссылки не переполняют 2025-06-02 21:19:54 +03:00
cc6d78935c селектор для мобилки 2025-06-02 18:53:46 +03:00
14bfc6750f добавление utm меток
Some checks failed
Deploy / CreateImage (push) Failing after 1m2s
Deploy / DeployService (push) Has been skipped
2025-06-02 01:48:35 +03:00
65db81af2d меню в хедере скроллится, меню исправлено 2025-06-02 01:32:35 +03:00
fbb6025512 добавить итем 2025-06-02 01:18:12 +03:00
1e8a50077b реактивное удаление 2025-06-02 00:36:55 +03:00
e7121cb06a удаление без реактивности, выведен корректный список линков 2025-06-02 00:27:22 +03:00
c2d79c04cc api файл и отображение списка 2025-06-01 17:05:41 +03:00
6273e62e66 на главную из установки квиза
All checks were successful
Deploy / CreateImage (push) Successful in 8m0s
Deploy / DeployService (push) Successful in 23s
2025-05-30 00:37:58 +03:00
0e0376686d fix
All checks were successful
Deploy / CreateImage (push) Successful in 5m7s
Deploy / DeployService (push) Successful in 22s
2025-05-29 17:37:43 +03:00
350b28cb6b remove развёрнутый ответ
All checks were successful
Deploy / CreateImage (push) Successful in 7m17s
Deploy / DeployService (push) Successful in 22s
2025-05-29 08:42:03 +03:00
ab1e221ada detailedAnswer multi
All checks were successful
Deploy / CreateImage (push) Successful in 7m28s
Deploy / DeployService (push) Successful in 22s
2025-05-28 10:19:25 +03:00
262337272f first AI page 2025-05-25 19:36:56 +03:00
e2e391325b nko
All checks were successful
Deploy / CreateImage (push) Successful in 3m31s
Deploy / DeployService (push) Successful in 23s
2025-05-22 23:10:15 +03:00
aa917fe6ba fix dragdrop
All checks were successful
Deploy / CreateImage (push) Successful in 8m9s
Deploy / DeployService (push) Successful in 24s
2025-05-22 00:37:21 +03:00
c6cb130d5b даты на general аналитике
All checks were successful
Deploy / CreateImage (push) Successful in 6m45s
Deploy / DeployService (push) Successful in 23s
2025-05-20 16:22:17 +03:00
4eda624080 update kit
All checks were successful
Deploy / CreateImage (push) Successful in 11m21s
Deploy / DeployService (push) Successful in 23s
2025-05-18 15:54:58 +03:00
22b61bed44 delete env dev
All checks were successful
Deploy / CreateImage (push) Successful in 8m39s
Deploy / DeployService (push) Successful in 23s
2025-05-18 02:27:52 +03:00
1b32719ef7 delete env dev
All checks were successful
Deploy / CreateImage (push) Successful in 9m11s
Deploy / DeployService (push) Successful in 22s
2025-05-18 02:02:32 +03:00
b9154061ec fix deployment
All checks were successful
Deploy / CreateImage (push) Successful in 3m58s
Deploy / DeployService (push) Successful in 25s
2025-05-17 14:52:50 +03:00
93af4a0707 staging template
Some checks failed
Deploy / CreateImage (push) Successful in 3m31s
Deploy / DeployService (push) Failing after 23s
2025-05-17 02:08:08 +03:00
39b0e04293 fix deploy staging
Some checks failed
Deploy / CreateImage (push) Failing after 1m19s
Deploy / DeployService (push) Has been skipped
2025-05-14 00:07:58 +03:00
1e657569a4 fix design
Some checks failed
Deploy / CreateImage (push) Has been cancelled
Deploy / DeployService (push) Has been cancelled
2025-04-22 18:47:47 +03:00
62762c955c add ai
All checks were successful
Deploy / CreateImage (push) Successful in 3m29s
Deploy / DeployService (push) Successful in 21s
2025-04-15 23:16:01 +03:00
9336508260 fix parse-error
All checks were successful
Deploy / CreateImage (push) Successful in 3m41s
Deploy / DeployService (push) Successful in 22s
2025-04-09 16:35:40 +03:00
cf1fce88cb cut send system true
All checks were successful
Deploy / CreateImage (push) Successful in 5m28s
Deploy / DeployService (push) Successful in 22s
2025-04-03 22:22:15 +03:00
459553056d useAmoAccount слушает токен 2025-04-03 22:20:02 +03:00
8e6f756f78 Merge branch 'labmain'
All checks were successful
Deploy / CreateImage (push) Successful in 4m43s
Deploy / DeployService (push) Successful in 22s
2025-04-02 07:59:33 +03:00
f4ea6b15a7 skeleton in edit page 2025-04-02 05:26:55 +03:00
fff9560f9c Merge branch 'main' of penahub.gitlab.yandexcloud.net:frontend/squiz 2025-04-02 01:32:45 +03:00
0cdc7797f8 новый порядок для анкеты в перетаскивании вопросов 2025-04-02 01:32:10 +03:00
5bba710b91 -- 2025-04-01 14:52:46 +03:00
277a8c3076 Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!393
2025-03-31 23:44:42 +03:00
de8f66a837 автозакрытие модалки при загрузке видео 2025-03-31 21:13:19 +03:00
62a9237925 запрещено начинать диапазон с 0 2025-03-31 20:48:35 +03:00
b3537381b7 костыль для эмоджи 2025-03-31 20:19:33 +03:00
2f843b4c96 расширение лимитов инпутов 2025-03-31 19:28:55 +03:00
3d35ef033a запрещено слать системные ошибки на локалхост, урезканы картинки для шаблонов 2025-03-31 18:43:34 +03:00
99e394390c fix возможность добавить видео к вопросам 2025-03-31 16:20:50 +03:00
32e153518c Merge branch 'main' into dev 2025-03-31 16:07:15 +03:00
ff57344ee7 some edit parseerror crutch design theme 2025-03-31 15:50:55 +03:00
1ec8f34238 measure ram utilisation on staging hub
Some checks failed
Deploy / CreateImage (push) Failing after 1m14s
Deploy / DeployService (push) Has been skipped
2025-03-31 15:02:12 +03:00
28a1ee950e crutch design theme
Some checks failed
Deploy / CreateImage (push) Failing after 1m18s
Deploy / DeployService (push) Has been skipped
2025-03-28 02:05:42 +03:00
f5cf23fdef ci prod
All checks were successful
Deploy / CreateImage (push) Successful in 8m54s
Deploy / DeployService (push) Successful in 24s
2025-03-09 02:27:22 +03:00
05ffc45c18 -- 2025-02-19 21:11:59 +03:00
75c7fb55e7 update frontend package 2025-02-19 18:54:10 +03:00
fa1a907222 update kit 2025-01-24 13:04:25 +03:00
390caf646e check fetch ticket 2025-01-22 17:51:04 +03:00
cca1877021 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!390
2025-01-18 13:09:32 +00:00
1d708a9e5c растыканы рассыльщики системных ошибок 2025-01-18 16:07:35 +03:00
9783ea9033 add getList in tariff path 2025-01-10 14:01:50 +03:00
4e07c648e9 study 2025-01-04 18:48:37 +03:00
dae45927c1 Merge branch 'dev' 2024-12-30 04:37:33 +03:00
14c70d33ed -- 2024-12-30 03:55:07 +03:00
a1f0e2b7dc Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!389
2024-12-27 22:22:05 +00:00
1914c20e67 Merge branch 'dev' into 'staging'
длина заголовка вопроса 500

See merge request frontend/squiz!388
2024-12-27 07:30:27 +00:00
5b473c9971 длина заголовка вопроса 500 2024-12-27 10:29:41 +03:00
5144d1eabe Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!387
2024-12-25 11:48:18 +00:00
19c1332ad9 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!386
2024-12-22 18:58:38 +03:00
1378433baf update version squzanswerer 2024-12-22 14:52:00 +03:00
4210c752fc add isUnScreen switch 2024-12-21 21:58:59 +03:00
cdaa9db369 Merge branch 'dev' into 'staging'
кнопка добавления имени виджета

See merge request frontend/squiz!385
2024-12-20 15:27:56 +00:00
9b1410abf8 кнопка добавления имени виджета 2024-12-20 18:26:56 +03:00
607c057660 Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!384
2024-12-12 20:32:17 +00:00
fd02cb59bb Merge branch 'dev' into 'staging'
нет мусорки для настройки ветвления у предка файл

See merge request frontend/squiz!383
2024-12-12 14:13:27 +00:00
6bb0e59979 нет мусорки для настройки ветвления у предка файл 2024-12-12 17:12:37 +03:00
61a9d8e913 someconsole.log 2024-12-06 20:58:04 +03:00
d5f7e89c5f Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!382
2024-11-28 18:55:50 +00:00
5b9228d17f Merge branch 'dev' into 'staging'
fix bugname tag amo ItemsSelectionView

See merge request frontend/squiz!381
2024-11-28 17:11:14 +00:00
4e413aaa14 fix bugname tag amo ItemsSelectionView 2024-11-28 20:09:40 +03:00
00a640f2ab Merge branch 'dev' into 'staging'
перезапрос шагов в зависимости от воронки

See merge request frontend/squiz!380
2024-11-28 16:44:11 +00:00
58b45885b6 перезапрос шагов в зависимости от воронки 2024-11-28 19:42:24 +03:00
dd6b419005 Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!379
2024-11-28 12:16:15 +00:00
1bbd41f813 Merge branch 'dev' into 'staging'
amo fix urls

See merge request frontend/squiz!378
2024-11-27 21:21:16 +00:00
6151aee1a2 amo fix urls 2024-11-27 23:49:37 +03:00
ab05007b85 Merge branch 'staging' 2024-11-25 15:39:57 +03:00
6f3f4719d9 Merge branch 'dev' into 'staging'
remove test with %

See merge request frontend/squiz!377
2024-11-23 14:28:29 +00:00
ed963b33ff remove test with % 2024-11-23 17:27:36 +03:00
ca2da99b15 Merge branch 'dev' into 'staging'
смена текстов

See merge request frontend/squiz!376
2024-11-22 15:10:52 +00:00
71e4a253a0 смена текстов 2024-11-22 18:09:19 +03:00
6db1e0c2bc Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!375
2024-11-21 14:08:54 +00:00
6c3469205a заменен текст кроп кнопок 2024-11-21 17:07:24 +03:00
deecd2b0b6 вывод не 0 безлимита 2024-11-21 16:25:26 +03:00
b862e1cabe Merge branch 'dev' into 'staging'
text имеет картинку, смена типа вопроса удаляет картинки

See merge request frontend/squiz!374
2024-11-18 14:56:07 +00:00
09058ae499 text имеет картинку, смена типа вопроса удаляет картинки 2024-11-18 17:55:16 +03:00
f731197fdd Merge branch 'dev' into staging 2024-11-17 13:27:44 +03:00
6df10d1f03 Merge branch 'new-crop-modal' into dev 2024-11-17 13:21:28 +03:00
0cd932ec45 fix bugs 2024-11-17 10:26:45 +03:00
72ce4ca597 полное удаление картинки из дроп зоны-вопроса (без бд) 2024-11-16 01:41:19 +03:00
686cf6b4c1 сохранение новых картинок 2024-11-15 00:33:55 +03:00
03afb130b6 сохранение новых картинок 2024-11-15 00:33:35 +03:00
fbea252656 поворот поворотничает 2024-11-14 18:36:23 +03:00
518c4b340d Все типы вопросов открывают кроп 2024-11-13 17:45:11 +03:00
9c78e245c3 варианты с картинками открывают кроп 2024-11-13 07:40:31 +03:00
ba32cce126 some fix types 2024-11-10 22:58:18 +03:00
8f3facf08a корректная обрезка 2024-11-10 21:42:50 +03:00
06e4bed325 каждый шаг инициализирует себе обл обрезки 2024-11-10 18:32:19 +03:00
8ad1054436 reset tags&fields 2024-11-05 22:53:00 +03:00
f914eb7b31 fix tag name src/pages/IntegrationsPage/IntegrationsModal/Amo/Tags/AmoTags.tsx 2024-11-05 02:36:20 +03:00
2dfd25dc9f -- 2024-11-04 02:06:00 +03:00
2b87ec6973 все настройки подключены, записываются и отображаются 2024-11-03 11:58:54 +03:00
f43ef82c14 модалка предупреждения о удалении + подключение размера, затемнения 2024-11-03 08:49:51 +03:00
ee4120d0bc debug console 2024-10-18 01:52:16 +03:00
b3bee6e951 консультант без времени работы 2024-10-17 02:06:56 +03:00
9566243962 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!373
2024-10-08 14:41:41 +00:00
ee01b19354 Merge branch 'isRange' into dev 2024-10-08 17:41:10 +03:00
6881589a28 new footer tag 2024-10-08 17:40:41 +03:00
fabe34ecad isRange button of settings date 2024-10-08 17:39:06 +03:00
b5c0ecf509 add footer new tag 2024-10-04 21:12:24 +03:00
14965f0f39 add preload emoji library 2024-09-26 19:18:25 +03:00
ba3518b7e5 Merge branch 'dev' into 'staging'
новая обработка ответа для новых версий ответа на стр заявок

See merge request frontend/squiz!372
2024-09-23 19:37:59 +00:00
92fc18b543 новая обработка ответа для новых версий ответа на стр заявок 2024-09-23 22:09:50 +03:00
2b692028f1 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!371
2024-09-14 16:34:34 +00:00
8f401fe936 -- 2024-09-14 19:34:07 +03:00
cb11510744 fix добавьте ответ & у varimg есть многострочн ответ 2024-09-13 19:33:46 +03:00
3e10a41504 Merge branch 'dev' into staging 2024-09-12 19:24:46 +03:00
63bfe53e6c ownPlaceholder добавлен 2024-09-12 19:20:44 +03:00
22f8e80d16 ваиранты получили работающие новые фичи 2024-09-11 09:11:48 +03:00
19b80694cb Типы вопросов эмоджи, в-ы, в-ы с кртнкми, в-ы и кртинк выводят новые правила 2024-09-07 22:57:11 +03:00
b9f9c2da34 enable service discovery artefacts creation 2024-09-04 00:07:55 +03:00
f301308c74 -- 2024-09-02 23:48:06 +03:00
Надежда
f6a49fdfcb -- 2024-09-02 20:53:25 +03:00
136e68415c чистка консольлогов и вспомогательных текстов 2024-08-30 22:08:57 +03:00
7d0ad493c3 перестановка файлов 2024-08-30 22:04:59 +03:00
c5a7cc213f translate before put image 2024-08-29 01:30:06 +03:00
601fdaf161 -- 2024-08-28 03:07:23 +03:00
3f58d052a8 замена пробелов на _ у имени файлов 2024-08-28 03:02:17 +03:00
e14ecb51dd Merge branch 'tariff-refactoring' into dev 2024-08-28 02:42:15 +03:00
40147884a5 кастом карточки 2024-08-28 02:41:02 +03:00
77a32d793b fix 2024-08-24 18:47:47 +03:00
977629f5cb Merge branch 'dev' into staging 2024-08-24 16:57:29 +03:00
437ab0c22c Перевод ошибки конфликта регистрации 2024-08-24 16:56:20 +03:00
ac0ad5a49a Игнор 409 статуса при создании аккаунта 2024-08-24 16:44:56 +03:00
a01d45ed12 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!366
2024-08-22 08:37:40 +00:00
89f1917a7c -- 2024-08-22 11:37:11 +03:00
9577eeb678 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!365
2024-08-22 06:53:29 +00:00
41359f09e1 -- 2024-08-22 09:52:34 +03:00
f3a64398d3 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!364
2024-08-19 00:41:47 +00:00
4eb9a72219 -- 2024-08-19 03:41:16 +03:00
bde2b4e8d4 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!363
2024-08-19 00:09:32 +00:00
29175c3b17 -- 2024-08-19 03:08:53 +03:00
a4699983d5 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!362
2024-08-18 23:36:55 +00:00
c2ca5e527e мобильный селектор у тарифов 2024-08-18 17:23:18 +03:00
1d1fb02ca7 окошко спасиб за заявку 2024-08-18 14:33:14 +03:00
6945cf857f fix link to cc hub 2024-08-18 14:23:47 +03:00
b4e6bbc556 Merge branch 'dev' into 'staging'
автооткрытие модалки запроса после удачного и неудачного покупки тарифа на...

See merge request frontend/squiz!361
2024-08-18 09:25:04 +00:00
5a029c01a9 автооткрытие модалки запроса после удачного и неудачного покупки тарифа на создание. хранение инфо об этом 2024-08-18 12:24:27 +03:00
fbd5783061 разделение доп тарифов 2024-08-18 07:18:59 +03:00
9bee2da343 расчехлили амо и шаблоны 2024-08-15 13:50:30 +03:00
4856297998 амо модалка тухлого токена не показывается в лендосе 2024-08-15 13:49:11 +03:00
3a224b897e Merge branch 'amo' into dev 2024-08-15 13:43:48 +03:00
d1266d67ef селект перекрывает иконки под собой 2024-08-15 13:31:15 +03:00
924c488af3 корректная работа скроллов, работает удаление ячеек 2024-08-15 12:22:43 +03:00
39ae777a63 расчехлили амо и шаблоны 2024-08-14 19:05:30 +03:00
6554e248b2 create account 409 ignore 2024-08-11 09:55:39 +03:00
9cebb17a07 анкета не сбивает 1 вопрос 2024-08-11 08:37:33 +03:00
b32f771390 новая обрезка для результата 2024-08-11 08:22:33 +03:00
e29e41d8b8 pipe + автопокупка после оплаты тарифа 2024-08-11 07:42:49 +03:00
0c7a54d4ba основные окна настроек адаптивны 2024-08-11 07:14:46 +03:00
8a6efc36ed fix визуал инфо о акке, выставление заголовков на шаги 2024-08-11 02:18:27 +03:00
7766c2d3a5 настройки пользователя (обновление визуала) 2024-08-10 20:48:36 +03:00
cf3b60e19f перевод имён вопросов в амо модалке 2024-08-10 16:54:08 +03:00
4fa98f644f перевод имён вопросов в амо модалке 2024-08-10 16:45:39 +03:00
Надежда
5652ed2070 cropmodal десктоп версия 2024-08-07 20:26:57 +03:00
6a7063fe0c невывод отрицательных значений привилегий 2024-08-06 16:45:35 +03:00
ce82a0d961 перевод имён вопросов в амо модалке 2024-08-05 19:07:25 +03:00
d717322f87 amo 2024-08-05 18:39:47 +03:00
8dc2f750ae create account 409 ignore 2024-08-05 15:39:11 +03:00
c9d7da58f4 update kit 2024-08-03 12:19:35 +03:00
ec2b957450 Merge branch 'dev' into staging 2024-07-26 23:36:33 +03:00
c3313742f2 регистронезависимый поиск по сущностям амо 2024-07-26 23:34:31 +03:00
6a0f561c91 customer v1.0.1 2024-07-24 21:16:10 +03:00
69e49e8a81 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!358
2024-07-23 15:02:43 +03:00
da355e2e73 регистронезависимый поиск по сущностям амо 2024-07-23 13:57:16 +03:00
ad8538666d фильтр по введнённому началу строки 2024-07-23 02:55:58 +03:00
bb4775e18e модалка переделана под новую модель работы, открывается хардкодом. Пока не редактирует 2024-07-20 04:08:59 +03:00
e23de71f0d для картиночных вариантов новый метод вытаскивания картинки 2024-07-20 01:28:50 +03:00
5138b9ee01 update v publication 2024-07-17 03:57:36 +03:00
7d7bc941fa fix: get tariff, update publication 2024-07-17 01:18:52 +03:00
4d1074559b set user ids for main matfey 2024-07-15 11:42:35 +03:00
d10df12b7e Merge remote-tracking branch 'origin/staging' 2024-07-15 11:21:17 +03:00
100882bbda Merge branch 'dev' into 'staging'
иф для пользователя 6692e068983ee77f8e1e682e

See merge request frontend/squiz!357
2024-07-13 20:52:33 +00:00
0cfe0825ea иф для пользователя 6692e068983ee77f8e1e682e 2024-07-13 23:51:53 +03:00
0344b6ea93 Merge branch 'dev' into 'staging'
fix mobile visual

See merge request frontend/squiz!356
2024-07-13 13:27:48 +00:00
02c8d36bc8 fix mobile visual 2024-07-13 12:46:53 +03:00
34d542d40c Merge branch 'dev' into 'staging'
fix amo addQuestionHC

See merge request frontend/squiz!355
2024-07-11 13:53:29 +00:00
2041a01293 fix amo addQuestionHC 2024-07-11 16:52:33 +03:00
e210480920 Merge branch 'dev' into 'staging'
страница тарифов получает все листы, амо обрабатывает ошибку вопросов

See merge request frontend/squiz!354
2024-07-10 20:57:30 +00:00
95e2084de3 страница тарифов получает все листы, амо обрабатывает ошибку вопросов 2024-07-10 23:56:32 +03:00
09e46d10c8 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!353
2024-07-10 17:14:00 +00:00
e5be8426fa закрыть амо после отязки 2024-07-10 20:11:55 +03:00
4529839144 обработка ошибки для тарифов 2024-07-10 19:13:37 +03:00
ee788bd8ed Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!352
2024-07-10 10:40:43 +00:00
64acb5ee65 коммент неиспользуемых фич 2024-07-10 13:40:05 +03:00
421dfae1ec недостающие деньги кидают на хаб 2024-07-09 15:41:18 +03:00
5edad99ff6 Merge branch 'dev' into 'staging'
коммент неиспользуемых настроек

See merge request frontend/squiz!351
2024-07-07 17:13:04 +00:00
f02867174d коммент неиспользуемых настроек 2024-07-07 20:12:27 +03:00
3fa473b9be Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!350
2024-07-06 11:34:26 +00:00
abe303bce6 заявки отображают картинки и вопросу типа файл и вариантам с (и) img 2024-07-05 22:22:27 +03:00
8a19d41dc4 ошибка оплаты отдаёт недостающую сумму, поддержка старых способов записи картинок в стр заявок 2024-07-05 19:30:02 +03:00
ab021ab719 Merge branch 'dev' into 'staging'
amo user id settings

See merge request frontend/squiz!349
2024-07-01 21:49:55 +00:00
15379f92f7 amo user id settings 2024-07-02 00:49:20 +03:00
a634d827b7 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!348
2024-07-01 06:34:55 +00:00
607e671d9d Merge branch 'funnel-quiz' into dev 2024-07-01 09:31:42 +03:00
59687dd566 отправка амо полей в соответствии с API 2024-07-01 09:30:22 +03:00
Tamara
71f913e078 z-index селекта 2024-07-01 03:35:59 +03:00
4a0b7ba3cf Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-07-01 00:30:51 +03:00
Tamara
753ae6c4a1 мобилка для 6 шага амо 2024-07-01 00:30:24 +03:00
66aea3c6d0 -- 2024-07-01 00:24:19 +03:00
72fbb34434 новая версия api 2024-06-30 18:32:16 +03:00
Tamara
def873967d верстка статистики воронки 2024-06-30 18:18:51 +03:00
5974125cbe new window amo modal 2024-06-28 22:34:13 +03:00
91677d836a Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!347
2024-06-24 23:02:32 +03:00
6b90ca793d Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-06-24 23:02:03 +03:00
b4451fbfbe Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-06-24 22:58:13 +03:00
f62fd84b09 add getGraphics 2024-06-24 22:58:06 +03:00
nflnkr
1794ce032a show amo token expired dialog on route changes 2024-06-24 20:40:13 +03:00
bae93b1bf1 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!346
2024-06-24 16:45:46 +00:00
Tamara
55ebc8a768 перенос ссылок в амо модалке 2024-06-24 19:43:31 +03:00
Tamara
ce39371fe5 скелетон для модалки амо 2024-06-24 19:20:22 +03:00
nflnkr
fdef102baf show dialog on amo token expiration 2024-06-24 18:11:07 +03:00
8e503629b1 Merge branch 'dev' into 'staging'
remove duplicated QuizConfig type

See merge request frontend/squiz!345
2024-06-23 02:11:36 +00:00
nflnkr
e473dd051c use same image for widget preview
fix side widget preview
2024-06-22 16:28:01 +03:00
Tamara
7a64bb4372 формат и пропорции у images вопросов 2024-06-22 00:43:00 +03:00
nflnkr
fc66d44e49 fix button widget preview breaking on firefox 2024-06-21 15:44:53 +03:00
nflnkr
2bad64bf0a fix imports 2024-06-21 14:09:14 +03:00
nflnkr
67a5d3c63f Merge branch 'video-upload-modal' into dev 2024-06-21 14:06:30 +03:00
nflnkr
c81e54b06f fix quiz installation button text 2024-06-21 14:06:02 +03:00
nflnkr
f8a1a21444 Merge remote-tracking branch 'origin/dev' into video-upload-modal 2024-06-21 12:02:45 +03:00
Tamara
7e006b759f remove css for amo select 2024-06-21 02:27:53 +03:00
nflnkr
25a1b28147 use many types from squzanswerer package
fix some type errors
rename quiz question count field
remove some unused code
remove some unused imports
2024-06-19 23:22:37 +03:00
Tamara
72a9a6e343 исправлены типы для ключей амо 2024-06-19 22:38:21 +03:00
nflnkr
45a8b44c3f remove unused type 2024-06-19 18:29:27 +03:00
nflnkr
6c3d460062 remove duplicated QuizConfig type
use QuizConfig type from squizanswerer package
2024-06-19 18:24:04 +03:00
96282c2c02 разрендер модалки амо если закрыта 2024-06-19 02:28:53 +03:00
nflnkr
b41251966a add using video embeds by url 2024-06-17 17:28:24 +03:00
b3dc7adeb7 Merge branch 'dev' into 'staging'
fix: amo  build FieldsRule fild

See merge request frontend/squiz!344
2024-06-16 21:09:20 +00:00
092cc21f38 fix: amo build FieldsRule fild 2024-06-17 00:08:02 +03:00
fd2b556606 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!343
2024-06-16 10:51:21 +00:00
9e4c94d09e amo fix types, вывод названий вместо id, удаление выбранных вопросов и тегов 2024-06-16 13:50:27 +03:00
dcb254e8e4 изменены передаваемые типы в компоненты амо модалки 2024-06-15 08:00:58 +03:00
2cb1aff63a Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!342
2024-06-14 02:31:14 +00:00
4354d54346 минимально работающая амо модалка 2024-06-14 05:30:30 +03:00
179be13488 new hard model amo 2024-06-11 22:52:20 +03:00
80dd693ea9 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!341
2024-06-11 11:50:50 +00:00
f516897dad amo integration amoID is number 2024-06-11 04:33:59 +03:00
96b9d19ac5 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-06-10 23:26:29 +03:00
d9fbedcf77 переименованы хранилища амо интеграции модалки 2024-06-10 23:26:18 +03:00
5c9b0ecc0a Merge branch 'dev' into 'staging'
fix rules of hooks violation

See merge request frontend/squiz!340
2024-06-10 18:47:14 +00:00
nflnkr
4ab3d9c7ec fix rules of hooks violation 2024-06-10 13:57:57 +03:00
8dbdcd5385 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!339
2024-06-09 16:51:38 +00:00
6ae2b22d50 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-06-09 19:50:43 +03:00
853d106630 customer v1.0.0 2024-06-09 19:50:33 +03:00
nflnkr
98c0c4474a Merge branch 'widget-setup-fixes' into dev 2024-06-09 13:26:02 +03:00
nflnkr
cc4c74329a banner and button widget task icons use text color 2024-06-08 17:09:22 +03:00
nflnkr
4332bc0fe5 move file 2024-06-08 16:47:52 +03:00
nflnkr
8afeaadfcb make button widget preview button interactive 2024-06-08 16:44:25 +03:00
5fd2534216 у дропзоны больше нет мусорки 2024-06-08 06:25:44 +03:00
66b63eb3c8 fix fetch cors image 2024-06-08 06:05:39 +03:00
0df1417dda merging 2024-06-08 05:19:23 +03:00
0d6602d1a3 Merge branch 'tariff-cards-slider' into dev 2024-06-08 04:41:05 +03:00
Tamara
c979280d45 new crop-modal 2024-06-08 03:02:53 +03:00
nflnkr
b9a285b1bd fix banner widget preview transitions 2024-06-06 20:34:49 +03:00
nflnkr
46227405c1 add banner widget previews animation 2024-06-06 20:27:27 +03:00
nflnkr
018e8268af extract banner widget previews 2024-06-06 20:15:33 +03:00
nflnkr
28d2331417 fix banner widget preview mobile banner position 2024-06-06 20:02:51 +03:00
c76a4f7c5d вывод вопросов и сохранение вопросов и тегов как id 2024-06-05 18:29:46 +03:00
nflnkr
19e7dab62c fix widget script staging url 2024-06-04 12:09:22 +03:00
3aa9856566 Merge branch 'dev' into 'staging'
fix delete account amo

See merge request frontend/squiz!338
2024-06-04 08:15:03 +00:00
e7a09457ca fix delete account amo 2024-06-04 11:14:23 +03:00
aleksandr-raw
ea4c985cf0 fixed dependency and mobile paddings 2024-06-04 11:09:56 +04:00
40c029da34 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!337
2024-06-04 01:13:56 +00:00
7d435281ee Merge branch 'add-options-to-question-setting' into dev 2024-06-04 03:54:39 +03:00
7e84a3006b Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-06-04 03:08:34 +03:00
25f055cb8e амо 5-6 шаги поменяны местами, добавлено удаление аккаунта, убраны юзеры 2024-06-04 03:08:24 +03:00
nflnkr
4782800476 banner widget preview banner changes position 2024-06-03 21:12:39 +03:00
nflnkr
c8f33e8e69 replace native colorpicker with custom 2024-06-03 17:20:27 +03:00
a51c4d3b1e Merge branch 'dev' into 'staging'
heruvym version

See merge request frontend/squiz!336
2024-06-03 01:05:37 +00:00
Tamara
84c69d4ddb heruvym version 2024-06-03 02:29:40 +03:00
2659496d49 Merge branch 'dev' into 'staging'
amo fix id

See merge request frontend/squiz!335
2024-06-01 22:43:19 +00:00
b4ea040946 amo fix id 2024-06-02 01:42:52 +03:00
d20a1df067 Merge branch 'dev' into 'staging'
амо: вывод инфо о юзере, реактивность, отправка id воронки

See merge request frontend/squiz!334
2024-06-01 21:05:41 +00:00
ca132a1575 амо: вывод инфо о юзере, реактивность, отправка id воронки 2024-06-02 00:05:04 +03:00
c9b27cbef9 Merge branch 'dev' into 'staging'
версии запросов картинок тп

See merge request frontend/squiz!333
2024-05-31 22:11:09 +00:00
efe9467a88 версии запросов картинок тп 2024-06-01 01:10:40 +03:00
58dcba5ac8 Merge branch 'dev' into 'staging'
fix branching graph unmount bug

See merge request frontend/squiz!332
2024-05-31 21:48:18 +00:00
dd250bade4 Update docker-compose.yaml 2024-05-31 19:34:06 +00:00
1e804edfcd Update Dockerfile 2024-05-31 19:18:17 +00:00
aleksandr-raw
61a3214fbd added tariffs slider-swiper to landing page 2024-05-31 21:27:50 +04:00
nflnkr
a6c1b4b93a fix branching graph unmount bug
CsNodeButtons renders normally instead of portal
2024-05-30 15:05:27 +03:00
e67a9c9b8f Merge branch 'dev' into 'staging'
Merge branch 'new-api-version' into dev

See merge request frontend/squiz!330
2024-05-29 23:33:58 +00:00
03cbf1d963 Merge branch 'new-api-version' into dev 2024-05-30 02:32:27 +03:00
d5f5378f5e Merge branch 'dev' into 'staging'
add side widget installation setup

See merge request frontend/squiz!328
2024-05-29 18:42:01 +00:00
aleksandr-raw
b3444ba020 added options to question settings 2024-05-29 20:42:43 +04:00
dfc5d648f9 Merge branch 'new-api-version' into dev 2024-05-29 18:34:05 +03:00
IlyaDoronin
a44e981225 feat: new url 2024-05-29 15:14:41 +03:00
IlyaDoronin
1baf550c07 feat: new version 2024-05-29 15:12:56 +03:00
IlyaDoronin
33bdc416e6 feat 2024-05-29 14:31:20 +03:00
IlyaDoronin
14627fbc07 feat: new api verion 2024-05-29 14:29:54 +03:00
Tamara
a19efe1e99 скелетоны для листа 2024-05-28 23:39:21 +03:00
nflnkr
f71127d4d9 fix prettier config not working 2024-05-28 15:55:09 +03:00
nflnkr
ea90092c9f regenerate lockfile 2024-05-28 15:51:37 +03:00
nflnkr
f90e256be5 Merge branch 'quiz-installation-methods' into dev 2024-05-28 15:45:14 +03:00
nflnkr
0edf02ea6e remove unused files 2024-05-28 15:41:18 +03:00
nflnkr
b4b282a820 minor fixes 2024-05-28 14:17:54 +03:00
nflnkr
643c62b32a add widgets fullscreen param 2024-05-27 17:32:08 +03:00
nflnkr
59d4678afd add banner widget dimensions param 2024-05-27 12:58:35 +03:00
nflnkr
52ff0a4e6c fix import 2024-05-27 12:54:38 +03:00
nflnkr
50e2141c82 change folders 2024-05-27 12:39:14 +03:00
nflnkr
d503d83fce add side widget installation setup
minor fixes
2024-05-27 12:23:28 +03:00
5bc8bb3d9b Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!326
2024-05-25 19:15:52 +00:00
eb3c8b960a Merge branch '26' into dev 2024-05-25 22:15:15 +03:00
nflnkr
313e4626d3 add popup widget installation setup 2024-05-25 14:44:52 +03:00
nflnkr
8d9c8e4f14 remove unused files 2024-05-25 14:07:36 +03:00
aleksandr-raw
f8f22e1397 tasks 20,21,22,23,24,25,26 2024-05-25 01:24:38 +04:00
aleksandr-raw
a66a4764cf WIP... realized pipelines, users, removed utm, refactored modals with lazy 2024-05-25 01:24:38 +04:00
aleksandr-raw
73fa046cc8 realized steps, users, tags... WIP 2024-05-25 01:24:38 +04:00
aleksandr-raw
9e21fc491d restored amo modal 2024-05-25 01:24:37 +04:00
nflnkr
85b825d546 add banner widget installation setup 2024-05-24 16:44:16 +03:00
Tamara
e1ba407cc8 отключение формы контактов и антифрод 2024-05-24 03:40:01 +03:00
nflnkr
55c414d7bd increase button widget preview image resolution 2024-05-21 13:46:54 +03:00
nflnkr
e40666f0b1 add button widget installation setup 2024-05-21 13:02:46 +03:00
IlyaDoronin
addee744ef fix: crop size 2024-05-21 11:21:38 +03:00
700a3da36c Merge branch 'quiz-gallery' into dev 2024-05-20 21:15:36 +03:00
IlyaDoronin
b650ce09af feat: templates 2024-05-20 17:44:32 +03:00
c49099b52e Ленивая подгрузка страниц редактирования квиза 2024-05-20 05:54:30 +03:00
83a93574c0 Merge branch 'templates' into 'dev'
feat: templates

See merge request frontend/squiz!323
2024-05-18 03:41:08 +00:00
IlyaDoronin
bd3564dd0c fix: request 2024-05-17 17:14:34 +03:00
IlyaDoronin
c3d39cde78 feat: templates 2024-05-17 17:13:05 +03:00
nflnkr
bb4225021f fix lint-staged & prettier formatting all files instead of staged 2024-05-17 17:04:38 +03:00
nflnkr
b486b2baa4 reorganize files 2024-05-17 16:54:43 +03:00
nflnkr
679a7b6034 add widget settings card next button 2024-05-17 16:48:37 +03:00
nflnkr
a92f04a3b4 add container widget installation setup 2024-05-17 16:18:11 +03:00
aleksandr-raw
3899860109 realized lazy component, refactoring 2024-05-17 13:15:33 +04:00
aleksandr-raw
92e447cf21 WIP new design of setting modal in branching 2024-05-17 13:15:33 +04:00
aleksandr-raw
7d10cc61a9 refactored the way to select a question in the branching logic, new design 2024-05-17 13:15:33 +04:00
aleksandr-raw
a29297890e added infoBannner 2024-05-17 13:15:17 +04:00
aleksandr-raw
9131826058 WIP redesigned questions-branching window 2024-05-17 13:13:51 +04:00
IlyaDoronin
bcb8b6a988 fix: analytics percent 2024-05-17 10:56:51 +03:00
IlyaDoronin
02be15c8ea fix: conflicts resolved 2024-05-17 10:33:10 +03:00
IlyaDoronin
2f3798dc9a fix: analytics percent 2024-05-17 10:20:26 +03:00
b6e4695dcf remove dayjs 2024-05-17 05:56:05 +03:00
53cb150a66 Merge branch 'analytics-graphic-logic' into dev 2024-05-17 05:37:20 +03:00
27ba8db053 Merge branch 'api-refactoring' into 'dev'
Api refactoring

See merge request frontend/squiz!322
2024-05-16 14:12:15 +00:00
IlyaDoronin
2dab3aebe5 feat: request types 2024-05-16 16:40:52 +03:00
IlyaDoronin
4e4565813a fix: custom errors 2024-05-15 16:51:41 +03:00
IlyaDoronin
01f1e50c4a feat: errors description 2024-05-15 15:37:42 +03:00
IlyaDoronin
17a697893d fix 2024-05-15 14:44:10 +03:00
73e8a03a22 Merge branch 'requests-refactor' into 'dev'
style: requests

See merge request frontend/squiz!321
2024-05-15 00:04:50 +00:00
IlyaDoronin
7dc71b91e1 fix: requests 2024-05-14 17:27:14 +03:00
IlyaDoronin
a23181e7db style: requests 2024-05-13 16:24:41 +03:00
nflnkr
5c5890cfb6 remove useless number components 2024-05-13 15:39:13 +03:00
45d9406352 Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!320
2024-05-13 00:04:05 +00:00
b11d465c50 Merge branch 'staging' 2024-05-13 02:56:25 +03:00
700ab8dffc Merge branch 'dev' into 'staging'
метрики для зеркал и пиксель

See merge request frontend/squiz!318
2024-05-12 23:01:36 +00:00
c8d18fc625 метрики для зеркал и пиксель 2024-05-13 02:00:38 +03:00
a472b34a2c Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!317
2024-05-12 20:00:47 +00:00
5cc0240e54 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!316
2024-05-12 18:47:13 +00:00
113c4df0e1 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-05-12 21:46:18 +03:00
dc76d62de7 инструкция 2024-05-12 21:46:15 +03:00
Tamara
bc5d6b781f id вопроса и результата для копирования 2024-05-12 20:10:14 +03:00
Tamara
686c9316ce приветсвенное сообщение при применении промокода фастлинк 2024-05-12 17:17:06 +03:00
516fd5649d Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!315
2024-05-12 02:45:46 +00:00
c46c68a6a1 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!314
2024-05-12 01:58:43 +00:00
9693572f5e Merge branch 'fastlink-reactive' into 'dev'
обновление данных аккаунта при применении фастлинка

See merge request frontend/squiz!313
2024-05-12 01:58:13 +00:00
Tamara
129748a4d8 обновление данных аккаунта при применении фастлинка 2024-05-12 04:03:56 +03:00
a32870fd1a Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!312
2024-05-11 21:02:33 +00:00
7c93e99a6c -- 2024-05-11 22:28:00 +03:00
e73b92601c Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!311
2024-05-11 19:08:32 +00:00
61c0eaabd9 -- 2024-05-11 22:08:05 +03:00
9d93f0f159 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!310
2024-05-11 18:38:51 +00:00
1a8fb106bc при применении ФЛ акк и кастомер акк не null 2024-05-11 21:37:59 +03:00
nflnkr
8adedcb34b refactor quiz installation layout & components 2024-05-11 21:21:43 +03:00
ce284ee0d4 Merge branch 'support-pictures' into 'dev'
fix: images route

See merge request frontend/squiz!309
2024-05-10 21:21:06 +00:00
IlyaDoronin
f26afb2061 fix 2024-05-10 16:52:55 +03:00
IlyaDoronin
b2b5f2213d fix: images route 2024-05-10 16:50:27 +03:00
IlyaDoronin
aafb505d2b feat: gallery 2024-05-08 17:17:06 +03:00
1b57e93cec Merge branch 'dev' into 'staging'
up version publication && отступ в дизайне

See merge request frontend/squiz!306
2024-05-08 02:02:05 +03:00
f041498d05 up version publication && отступ в дизайне 2024-05-08 01:27:57 +03:00
d687722a03 Merge remote-tracking branch 'origin/staging' 2024-05-08 00:16:48 +03:00
813d9f17ae Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!305
2024-05-07 18:56:38 +00:00
f7b295551f Merge branch 'copy-quiz' into 'dev'
Copy quiz

See merge request frontend/squiz!304
2024-05-07 18:56:10 +00:00
Tamara
4de864a06a кавычки и кнопка копирования кода на стр установки квиза 2024-05-07 21:44:11 +03:00
IlyaDoronin
c30966a1ba fix: copy quiz 2024-05-07 16:57:12 +03:00
IlyaDoronin
92eafcfaa3 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-05-07 09:37:06 +03:00
43b412ec74 Merge remote-tracking branch 'origin/staging'
релиз платёги и мини партнёрки
2024-05-07 00:52:43 +03:00
9a7581cd37 вне дедлайна афтерпей не стреляет запросы 2024-05-06 18:41:18 +03:00
8caf1ca91a Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!303
2024-05-06 12:24:46 +00:00
97d9f85517 Merge branch 'vk-and-yandex-instructions' into 'dev'
added Vk and Yandex instructions

See merge request frontend/squiz!302
2024-05-06 12:24:18 +00:00
aleksandr-raw
5191282b33 added Vk and Yandex instructions 2024-05-06 16:20:51 +04:00
IlyaDoronin
56e2f34c57 fix: metrics fields 2024-05-06 10:43:52 +03:00
440d964af8 Merge branch 'dev' into 'staging'
убрана кнопка инфо у графика, статистика получает от 0:00 до 23:59 время

See merge request frontend/squiz!300
2024-05-05 23:44:47 +00:00
f40fb26ba9 убрана кнопка инфо у графика, статистика получает от 0:00 до 23:59 время 2024-05-06 02:44:12 +03:00
dc0ef0a928 Merge branch 'dev' into 'staging'
время неработы с 3 ночи до 10 утра

See merge request frontend/squiz!299
2024-05-05 18:30:53 +00:00
559f668112 время неработы с 3 ночи до 10 утра 2024-05-05 21:29:43 +03:00
669a731fbe Merge branch 'dev' into 'staging'
проверка ошибки промокода на пустую строку

See merge request frontend/squiz!298
2024-05-04 21:25:33 +00:00
Tamara
1668cbe36b проверка ошибки промокода на пустую строку 2024-05-04 04:19:46 +03:00
4e457e9294 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!297
2024-05-04 00:42:40 +00:00
Tamara
1db9e54458 процент линейного графика исправлен 2024-05-04 03:38:17 +03:00
Tamara
38ab273404 скелетон для загрузки видео, убрана возможность настройки у полей в фк, которые в ней не нуждались 2024-05-04 03:12:24 +03:00
IlyaDoronin
a1f0df3a69 fix: handle error 2024-05-02 11:43:10 +03:00
IlyaDoronin
8d455f08cc feat: getDiscounts request 2024-05-02 11:38:57 +03:00
09bab17d66 Merge branch 'dev' into 'staging'
refactor quiz install page

See merge request frontend/squiz!295
2024-05-01 10:40:29 +00:00
246a090d10 Merge branch 'add-vk-into-integrations' into 'dev'
Add vk into integrations

See merge request frontend/squiz!294
2024-05-01 10:05:18 +00:00
aleksandr-raw
7dc2dd1ec1 refactored analytics modal component 2024-05-01 13:50:29 +04:00
aleksandr-raw
93574151bb created new analytics modal design 2024-05-01 13:50:29 +04:00
aleksandr-raw
012169e12b Implemented universal usage for button and modal, added VK pixel 2024-05-01 13:50:29 +04:00
nflnkr
129b7c0c49 refactor quiz install page
extract components
replace png images with svg components
2024-04-30 20:05:44 +03:00
223b8f4856 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!293
2024-04-30 01:12:43 +00:00
fdf344fd3d -- 2024-04-30 04:12:08 +03:00
2481d57cec Merge branch 'dev' into 'staging'
в привилегии добавлено поле о последнем дне

See merge request frontend/squiz!292
2024-04-30 00:25:42 +00:00
b129058f3d в привилегии добавлено поле о последнем дне 2024-04-30 03:21:17 +03:00
f1ed8f608e Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!291
2024-04-28 19:12:45 +00:00
6ef0157afb Merge branch 'new-main-page' into dev 2024-04-28 22:10:29 +03:00
4efadbc628 Merge branch 'dev' into staging 2024-04-28 01:41:21 +03:00
f1f9d13a86 Merge branch 'improve-behavior-yandex-modal' into dev 2024-04-28 01:14:43 +03:00
5194a26395 Merge branch 'metrics' into dev 2024-04-28 00:57:07 +03:00
IlyaDoronin
0362770311 refactor: comments removed 2024-04-26 17:41:36 +03:00
ced2e8cc80 xMerge branch 'staging' into 'main'
refactored YandexModal, added yandexMetricNumber to quiz config, added logic...

See merge request frontend/squiz!282
2024-04-25 20:55:57 +03:00
IlyaDoronin
ffba0c8d04 feat: new design 2024-04-25 17:53:43 +03:00
aleksandr-raw
a398ddf872 Implemented ticket closure, message clearing, and addition of welcome message 2024-04-25 15:18:58 +04:00
IlyaDoronin
3751614acf Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-04-25 09:09:47 +03:00
IlyaDoronin
7bd832495b fix 2024-04-25 09:09:35 +03:00
aleksandr-raw
f30deceb39 renamed operator, added subtitle with working hours, added greeting message to the chat, fixted scroll 2024-04-24 18:16:42 +04:00
Tamara
66ee298e96 мета no-cache 2024-04-24 02:30:39 +03:00
IlyaDoronin
d7df648023 fix: useYandexMetrics 2024-04-22 17:14:45 +03:00
IlyaDoronin
af01e68047 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-04-22 10:18:55 +03:00
44ee0c1226 Merge branch 'dev' into 'staging'
инструкция о размерах в разделе инсталла

See merge request frontend/squiz!285
2024-04-20 11:07:07 +00:00
Tamara
4aa5f4abf0 увеличен лимит символов на заголовок и описание квиза 2024-04-20 08:22:55 +03:00
5ae83de84f инструкция о размерах в разделе инсталла 2024-04-19 20:12:34 +03:00
IlyaDoronin
b0d7bf0305 fix: qustions limit 2024-04-19 15:50:05 +03:00
aleksandr-raw
2b675e08e0 added logic for resetting the value in the input if yandexNumber is undefined and the new value wasn't saved before closing 2024-04-19 12:32:10 +04:00
aleksandr-raw
62a5b29bea replaced png to svg yandexLogo, improved behavior logic of yandexModal 2024-04-19 12:26:25 +04:00
9a473c5ff7 Merge branch 'dev' into 'staging'
refactored YandexModal, added yandexMetricNumber to quiz config, added logic...

See merge request frontend/squiz!281
2024-04-18 19:23:26 +00:00
5f93f453f5 Merge branch 'yandex-integration-add-logic' into dev 2024-04-18 22:22:35 +03:00
aleksandr-raw
b66cdcaee9 integrated yandex metrica script to publications page 2024-04-18 18:10:19 +04:00
aleksandr-raw
4e9d02efcf refactored YandexModal, added yandexMetricNumber to quiz config, added logic to set\update\delate yaNumber 2024-04-18 16:32:46 +04:00
IlyaDoronin
264dc15173 fix: GeneralItem and GeneralItemTimeConv merged 2024-04-18 14:54:39 +03:00
IlyaDoronin
6a5d46b63b fix: GeneralItemTimeConv logic 2024-04-18 11:49:38 +03:00
Tamara
b03cbef05a интеграция яндекс метрика 2024-04-18 04:32:39 +03:00
9bbc1f6d4c Merge branch 'dev' into staging 2024-04-17 19:47:14 +03:00
1e2b320f79 откат 2 графиков 2024-04-17 19:45:06 +03:00
a6a6bda089 Merge branch 'install-text' into dev 2024-04-17 19:25:19 +03:00
4bb0fcce58 Merge branch 'refactoring' into dev 2024-04-17 19:24:54 +03:00
IlyaDoronin
39ea24310c fix: conflicts 2024-04-17 17:16:49 +03:00
IlyaDoronin
24c3b45a3a fix: analytics date range 2024-04-17 17:15:13 +03:00
aleksandr-raw
d970759e2f Resized design images 2024-04-17 18:14:14 +04:00
IlyaDoronin
784a884002 fix: refactoring 2024-04-17 15:08:18 +03:00
IlyaDoronin
7ff6d4d16e fix: install text 2024-04-17 14:28:10 +03:00
IlyaDoronin
f0f08c4f7c feat: staged 2024-04-17 10:11:02 +03:00
ff4cc5f567 Merge branch 'staging' into 'main'
Релиз

See merge request frontend/squiz!274
2024-04-17 01:05:03 +00:00
04b2b6c091 -- 2024-04-17 03:30:49 +03:00
e615b395a0 Merge branch 'dev' into 'staging'
up squz version

See merge request frontend/squiz!273
2024-04-17 00:18:15 +00:00
de9107932f up squz version 2024-04-17 03:16:21 +03:00
ff93d649db Merge branch 'dev' into 'staging'
нет снекбара при нехватке денег

See merge request frontend/squiz!272
2024-04-16 21:58:30 +00:00
01f586d445 нет снекбара при нехватке денег 2024-04-17 00:57:59 +03:00
38f1c9b390 Merge branch 'dev' into staging 2024-04-16 23:25:16 +03:00
230bf79513 чистка консольлогов 2024-04-16 23:23:42 +03:00
f849bb84a1 мейк реквест в обёртке 2024-04-16 23:20:46 +03:00
06a462edfc Merge branch 'use-quizanswerer-for-quiz-preview' into dev 2024-04-16 23:00:48 +03:00
nflnkr
a30534ba61 remove useless files 2024-04-16 22:41:16 +03:00
nflnkr
ac0ca414ec replace quiz preview with QuizAnswerer 2024-04-16 22:31:51 +03:00
nflnkr
d4d252ce71 remove quiz preview from design page 2024-04-16 22:25:30 +03:00
7dc217db78 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!270
2024-04-16 16:05:45 +00:00
098fc1aeee Merge branch 'password-validation' into dev 2024-04-16 19:05:09 +03:00
aleksandr-raw
d5eacb0227 Added ascending sorting for questions in statistics 2024-04-16 19:42:55 +04:00
IlyaDoronin
d970049b37 refactor: console errors 2024-04-16 17:54:59 +03:00
IlyaDoronin
dc2a09dd83 fix: password validation 2024-04-16 16:43:22 +03:00
aleksandr-raw
bd0fd2a1fa integration modal finished 2024-04-16 15:22:08 +04:00
aleksandr-raw
28cd507004 step 7 2024-04-16 15:07:58 +04:00
aleksandr-raw
f7bca1ae82 added step6 2024-04-16 15:07:58 +04:00
aleksandr-raw
dce30ad61e WIP Step6 and Step 7 2024-04-16 15:07:58 +04:00
aleksandr-raw
64e701a036 added settings block 2024-04-16 15:07:58 +04:00
aleksandr-raw
d686290df5 WIP settings in integrations modal 2024-04-16 15:07:58 +04:00
aleksandr-raw
3f7bcc011f added 5step, refactored buttons 2024-04-16 15:07:57 +04:00
aleksandr-raw
17a0fd8bc5 WIP step 5 2024-04-16 15:07:57 +04:00
aleksandr-raw
dff10de2d7 added 3 step and refactored 2024-04-16 15:07:57 +04:00
aleksandr-raw
94134bcb46 added custom select to step 2 2024-04-16 15:07:57 +04:00
aleksandr-raw
137fa317da WIP 1step integrations, integrations modal 2024-04-16 15:07:57 +04:00
aleksandr-raw
5434d0cafc added new IntegrationsPage, setuped routing, added modal 2024-04-16 15:07:21 +04:00
IlyaDoronin
6b907e48fe Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-04-16 10:25:11 +03:00
0277ee6520 fix export response Type 2024-04-16 00:52:16 +03:00
IlyaDoronin
3001b87bdf refactor: analytics 2024-04-15 17:32:00 +03:00
93822697ae Merge branch 'dev' into 'staging'
экспорт качает файлик

See merge request frontend/squiz!264
2024-04-15 11:46:58 +00:00
4ed6f07a15 экспорт качает файлик 2024-04-15 14:44:48 +03:00
86203e1a31 Merge branch 'dev' into 'staging'
реактивность доступных привелегий, описание тарифов из description

See merge request frontend/squiz!263
2024-04-14 22:52:50 +00:00
Tamara
fcf4ce6a4f реактивность доступных привелегий, описание тарифов из description 2024-04-15 01:35:08 +03:00
0758d97297 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!262
2024-04-14 17:49:08 +00:00
nflnkr
5e19805ae6 fix calcTariffPrice userId param 2024-04-14 20:38:30 +03:00
nflnkr
85357b5973 fix calcTariffPrice params 2024-04-14 20:05:01 +03:00
45cbd55898 Merge branch 'pay-tariff' into dev 2024-04-14 02:50:56 +03:00
Tamara
f08bd29ab8 взятие недлстающей суммы для оплаты на хабе из ответа ошибки 2024-04-14 02:48:51 +03:00
4ff60c5402 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!261
2024-04-13 22:34:42 +00:00
e5d1630df3 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-04-14 01:30:05 +03:00
5146d2fa3d поднятие версии кита + костыль 2024-04-14 01:29:58 +03:00
62169bd9b7 Merge branch 'dev' into 'staging'
замена ключей привилегий в логике отображения

See merge request frontend/squiz!260
2024-04-13 19:07:41 +00:00
Tamara
a40b9ee0c8 замена ключей привилегий в логике отображения 2024-04-13 22:06:34 +03:00
b9a5a4e806 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!259
2024-04-13 17:18:50 +00:00
804dcb6679 Merge branch 'fast-link' into 'dev'
Fast link

See merge request frontend/squiz!258
2024-04-13 01:13:48 +00:00
Tamara
0e04ad4c8a доступные привилегии 2024-04-13 04:13:16 +03:00
05478ef88b Merge branch 'fast-link' into 'staging'
Fast link

See merge request frontend/squiz!257
2024-04-12 23:37:20 +00:00
Tamara
d15d5fe262 модалка фастлинкера закрывается при успешном применении нового промокода 2024-04-13 02:28:08 +03:00
Tamara
588efe0cbf фастлинк, ждет теста 2024-04-13 00:05:15 +03:00
b404f8039e Merge branch 'statistic' into 'staging'
math.trunc для карточек тарифов

See merge request frontend/squiz!256
2024-04-12 17:54:48 +00:00
961207ee4a math.trunc для карточек тарифов 2024-04-12 20:54:15 +03:00
ee73f131d5 Merge branch 'dev' into 'staging'
qaz

See merge request frontend/squiz!255
2024-04-12 15:55:02 +00:00
511738aca2 qaz 2024-04-12 18:54:23 +03:00
c5f196c1eb Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!253
2024-04-11 15:59:31 +00:00
e9faf37bdd Merge branch 'statistic' into 'dev'
отсечение будущего у статистики

See merge request frontend/squiz!252
2024-04-11 15:58:56 +00:00
9f6734456f отсечение будущего у статистики 2024-04-11 18:58:23 +03:00
5519140fc8 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!251
2024-04-11 14:26:30 +00:00
5cf68a9002 Merge branch 'payment-price' into 'dev'
fix: number

See merge request frontend/squiz!250
2024-04-11 14:25:46 +00:00
IlyaDoronin
6d14dbdd50 fix: number 2024-04-11 17:23:05 +03:00
IlyaDoronin
5ed07c758f fix: number 2024-04-11 17:21:43 +03:00
02a73096e8 Merge branch 'dev' into 'staging'
конверсия в графике в %

See merge request frontend/squiz!249
2024-04-11 06:28:58 +00:00
39f49233f0 конверсия в графике в % 2024-04-11 09:28:22 +03:00
4992737e9e Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!248
2024-04-10 23:35:16 +00:00
9f277b047c конверсия и время 2024-04-11 02:34:40 +03:00
Tamara
f0f5b1fe96 вычисление общей конверсии 2024-04-11 01:29:02 +03:00
20d7fbdc4e Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!247
2024-04-10 14:46:24 +00:00
af4c68304a Merge branch 'afterpay-checking' into 'dev'
Afterpay checking

See merge request frontend/squiz!246
2024-04-10 14:45:54 +00:00
IlyaDoronin
ea2e138f38 feat: new pay time logic 2024-04-10 16:55:08 +03:00
0e25cd7636 Merge branch 'afterpay-checking' into 'staging'
feat: afterpay userid checking

See merge request frontend/squiz!244
2024-04-09 15:09:43 +00:00
466959cda2 аналитика 2024-04-09 18:08:11 +03:00
nflnkr
bb5b9ad25a upgrade squzanswerer 2024-04-09 18:05:26 +03:00
IlyaDoronin
81fae9ad4c fix: conflicts resolved 2024-04-09 17:26:51 +03:00
IlyaDoronin
5793830b2d fix: other answers 2024-04-09 17:24:44 +03:00
43237113a0 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!245
2024-04-09 12:17:41 +00:00
IlyaDoronin
54e5f40780 fix: funnel 2024-04-09 13:56:43 +03:00
IlyaDoronin
8c76b4b801 Merge branch 'afterpay-checking' of penahub.gitlab.yandexcloud.net:frontend/squiz into afterpay-checking 2024-04-09 13:41:48 +03:00
IlyaDoronin
7d6f69396b feat: promoce errors and analytics 2024-04-09 13:41:32 +03:00
IlyaDoronin
69a1acddc7 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into afterpay-checking 2024-04-09 11:06:05 +03:00
Tamara
3c4f80056f вынесение и коррекция функции выхода 2024-04-09 02:11:19 +03:00
nflnkr
5321d45adc lock crop in crop modal 2024-04-08 18:57:29 +03:00
Tamara
121eb4036a иконки расположения стартовой страницы 2024-04-08 17:45:28 +03:00
IlyaDoronin
07c9bd06cc feat: calculateTime 2024-04-08 17:22:19 +03:00
IlyaDoronin
d07acf57fd fix: cart payment 2024-04-08 15:56:46 +03:00
IlyaDoronin
4cd7ae14a6 fix: cart payment 2024-04-08 15:56:28 +03:00
IlyaDoronin
31f103c3ab feat: afterpay userid checking 2024-04-08 12:37:42 +03:00
d80c7d6c71 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!243
2024-04-07 23:27:59 +00:00
f188bcee2d корректно выводятся карточки ответов на вопросы 2024-04-08 02:16:52 +03:00
fb223056b9 в from аналитики начало следующего дня 2024-04-08 02:03:44 +03:00
34f7493376 fix: funnel 2024-04-08 01:56:19 +03:00
Tamara
843877c570 сохранение кэша в рублях, копейках и строкой 2024-04-07 19:19:49 +03:00
4deecc2f66 Merge branch 'dev' into 'staging'
fix crop modal

See merge request frontend/squiz!242
2024-04-06 17:53:44 +00:00
nflnkr
e77e83d5d4 fix crop modal 2024-04-06 20:23:01 +03:00
60c88764af Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!241
2024-04-06 09:08:29 +00:00
859987445b общиий кеш 2024-04-06 12:07:30 +03:00
3578603293 Merge branch 'dev' into 'staging'
-

See merge request frontend/squiz!240
2024-04-05 23:03:27 +00:00
fa588d77a4 - 2024-04-06 02:02:58 +03:00
03db893403 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!239
2024-04-05 22:48:12 +00:00
7e14ebdeeb -- 2024-04-06 01:47:40 +03:00
6033cf6084 Merge branch 'dev' into 'staging'
fix: запрос деняк на хабе

See merge request frontend/squiz!238
2024-04-05 21:42:55 +00:00
0f7e134411 fix: запрос деняк на хабе 2024-04-06 00:42:02 +03:00
5098b682e9 Merge branch 'dev' into 'staging'
-cart

See merge request frontend/squiz!237
2024-04-05 21:06:29 +00:00
ec8ce9c46d -cart 2024-04-06 00:05:51 +03:00
3149250dae Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!236
2024-04-05 18:24:26 +00:00
ada81a6360 не выводить время если нет, заглушки пустых полей, имя вопроса в аналитике 2024-04-05 21:23:08 +03:00
4b87ca20fa Merge branch 'empty-analytics' into dev 2024-04-05 20:16:00 +03:00
Tamara
dc102ea323 правка верстки тарифов, порядок тарифов 2024-04-05 19:29:20 +03:00
IlyaDoronin
9ddf522eed fix: conflicts resolved 2024-04-05 17:10:40 +03:00
IlyaDoronin
2c167faa29 fix: pagination 2024-04-05 17:09:17 +03:00
IlyaDoronin
591914fdb9 fix: analytics pagination 2024-04-05 17:08:29 +03:00
IlyaDoronin
b0c15ff98f fix: empty analytics 2024-04-05 14:27:52 +03:00
a331d14445 даты в статистике 2024-04-05 13:47:16 +03:00
668c921972 update yarn 2024-04-04 17:35:54 +03:00
fb0647060c Merge branch 'dev' into 'staging'
include cart tariffs in tariff price calculation

See merge request frontend/squiz!232
2024-04-04 08:44:37 +00:00
nflnkr
53aa64e9ea include cart tariffs in tariff price calculation 2024-04-04 11:27:06 +03:00
e841fd798e Merge branch 'dev' into 'staging'
новый запрос скидок

See merge request frontend/squiz!231
2024-04-04 00:11:21 +00:00
5384455f85 новый запрос скидок 2024-04-04 03:10:08 +03:00
f1640a0bd1 Merge branch 'dev' into 'staging'
Implemented data reset on account switch, fixed jumping after reload between...

See merge request frontend/squiz!230
2024-04-03 23:43:30 +00:00
ffda341e4b Merge branch 'fix-account-logout-data-cleanup' into dev 2024-04-04 02:42:41 +03:00
c5eeec3a08 Merge branch 'image-edit-fixed-aspect-ratio' into dev 2024-04-04 02:40:36 +03:00
1ea33d4e0d возможность обновить стр аналитики, округление данных 2024-04-04 02:35:36 +03:00
3beaeedf4b Merge branch 'analytics' into dev 2024-04-04 01:09:45 +03:00
4fcd7babe5 Merge branch 'dev' into 'staging'
fix: afterpay

See merge request frontend/squiz!229
2024-04-03 22:05:52 +00:00
nflnkr
76b06f12ea fix crop 2024-04-03 23:45:48 +03:00
IlyaDoronin
6f081b0b85 fix: analytics 2024-04-03 17:22:51 +03:00
IlyaDoronin
dbd271a20a Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into analytics 2024-04-03 13:50:44 +03:00
IlyaDoronin
9df4e9f0d2 feat: dayjs to analytics 2024-04-03 13:50:17 +03:00
Илья
8a4cd00ec8 Merge branch 'analytics-page-refactoring-ts' into 'analytics'
refactored analytics page, fixed ts

See merge request frontend/squiz!227
2024-04-03 10:49:49 +00:00
aleksandr-raw
47d199ab0b refactored analytics page, fixed ts 2024-04-01 22:09:26 +04:00
nflnkr
257b027bac force aspect ratio on image editing 2024-04-01 20:09:54 +03:00
nflnkr
724e7bca32 remove unused files 2024-04-01 19:59:23 +03:00
IlyaDoronin
6c18b4cd99 fix: afterpay 2024-04-01 17:49:00 +03:00
aleksandr-raw
a8e80d88e1 Fixed logic of cleaning quiz data on logout account 2024-04-01 10:34:06 +04:00
aleksandr-raw
e8a3ca6e84 Implemented data reset on account switch, fixed jumping after reload between quiz list and create new quiz, and resolved type error. 2024-04-01 10:17:53 +04:00
18272be5ad Merge branch 'dev' into 'staging'
realized videofile component, added logic to delete uploaded video, refactored...

See merge request frontend/squiz!224
2024-03-31 00:13:42 +00:00
fe39bc1b32 Merge branch 'add-content-removal-buttons' into dev 2024-03-31 03:13:08 +03:00
1b93727d61 Merge branch 'analytics' into dev 2024-03-31 03:12:56 +03:00
Tamara
af70d8b2c6 фильтрация тарифов шильдика от базовых 2024-03-30 21:54:28 +03:00
nflnkr
d2e1e7c00a add emoji ignore list 2024-03-30 12:50:12 +03:00
93ddfb8570 бек статистики 2024-03-29 09:10:33 +03:00
aleksandr-raw
dc78c2d490 Fixed video size on startPage and refactored videoElement component 2024-03-28 14:52:24 +04:00
aleksandr-raw
41655b2dcb Refactored StartPageSetting component with switching condition: upload video input or videofile 2024-03-28 14:14:09 +04:00
aleksandr-raw
2c5c53ba57 realized videofile component, added logic to delete uploaded video, refactored mediaSelectionAndDisplay component with switching condition: uploader or file 2024-03-28 13:20:40 +04:00
dd58065255 получение данных 2024-03-28 12:18:24 +03:00
b0b6352cc0 иконка статистики на карточке 2024-03-28 11:47:51 +03:00
a6987adc0a Merge branch 'dev' into 'staging'
upgrade @frontend/kitui

See merge request frontend/squiz!220
2024-03-27 22:41:07 +00:00
30e97416fa Merge branch 'refactoring-applications-page' into dev 2024-03-28 01:36:23 +03:00
292cd0e5fa Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-03-28 01:36:01 +03:00
e41dc330bd фикс первого безтипового вопроса в списке из юзэффект и возможность удаления картинки из результата 2024-03-28 01:35:54 +03:00
Tamara
af39e627da фон стартовой страницы по-умолчанию изображение 2024-03-28 00:46:12 +03:00
0831da8403 Merge branch 'add-quiz-copy-functionality' into dev 2024-03-28 00:07:04 +03:00
c87e190706 реактивность 2024-03-28 00:03:46 +03:00
nflnkr
3d7a518208 upgrade @frontend/kitui
use cart calc functions from kitui
2024-03-27 13:53:47 +03:00
a980fe5fe4 Merge branch 'analytics' into dev 2024-03-27 09:36:43 +03:00
aleksandr-raw
4dbf8e7594 subtask #8. fixing TS 2024-03-26 22:32:28 +04:00
aleksandr-raw
68e47f26e0 Realized copying and refetch of quizzes by clicking the copy button 2024-03-26 16:52:07 +04:00
aleksandr-raw
00dde35812 added copy btn to quiz card 2024-03-26 13:03:11 +04:00
aec10b2745 remove before merge 2024-03-26 00:12:52 +03:00
aleksandr-raw
484e5336b5 WIP subtask #8 . TypeScript 2024-03-25 21:21:01 +04:00
aleksandr-raw
cfcd5bbb8e Added stopPropagation to the delete button. Moved modal outside box. subtask #7 2024-03-25 19:56:01 +04:00
IlyaDoronin
3269a0a883 feat: pagination 2024-03-25 18:02:24 +03:00
aleksandr-raw
aea8df01b7 Moved getData to a hook. Implemented error handling. Subtasks #4 and #6 2024-03-25 18:43:57 +04:00
aleksandr-raw
6a326d1fa8 Removed unused elements and files. Subtasks #3 and #5. 2024-03-25 17:06:41 +04:00
aleksandr-raw
8dc047e6bb Refactored layout into smaller components. Added QuizSettingsMenu and AnswerList components 2024-03-25 14:32:09 +04:00
aleksandr-raw
319d321a6a reset data after leaving the page 2024-03-25 11:27:00 +04:00
nflnkr
c303348e2e add promocode field 2024-03-22 22:01:48 +03:00
IlyaDoronin
16f36cf5d9 feat: Funnel and Answers 2024-03-22 17:29:51 +03:00
IlyaDoronin
31a8b613bb feat: Devices and General 2024-03-21 17:24:56 +03:00
IlyaDoronin
35a84f301f fix: Devices statistic 2024-03-20 17:44:51 +03:00
IlyaDoronin
71fb420b94 feat: lazy loading 2024-03-20 15:18:09 +03:00
IlyaDoronin
e5c1285f90 feat: lazy loading 2024-03-20 15:16:21 +03:00
7f11b79aac Merge branch 'dev' into 'staging'
адаптация тарифов, увеличено огранчения для ввода ссылки на сайт пользователя,...

See merge request frontend/squiz!216
2024-03-19 21:55:26 +00:00
0744aeb7c9 Merge branch 'fix-bag-visual' into dev 2024-03-20 00:19:29 +03:00
bfb7876f3b Merge branch 'design-scroll' into dev 2024-03-20 00:18:58 +03:00
Tamara
881822abbd устранены косяки по визуалу 2024-03-19 18:58:20 +03:00
IlyaDoronin
8709350151 fix: Drag&Drop 2024-03-19 16:52:33 +03:00
Tamara
71853901a6 станица статистики 2024-03-19 09:56:21 +03:00
1a9c26ccf7 не открывается модалка для особенных, не рисуется иконка настройки условий для особенных 2024-03-19 04:38:37 +03:00
IlyaDoronin
a9c912378b fix: scrollbar and drag&drop 2024-03-18 17:24:43 +03:00
248ffe406b у особых вопросов не более 1 потомка 2024-03-18 05:46:04 +03:00
5f42a86e1f направление на стейджинг при покупке тарифа с стейджинга или локалхост 2024-03-16 15:14:25 +03:00
6fb44e9a14 Merge branch 'full-screen' into dev 2024-03-16 15:00:30 +03:00
4c7d3b0351 Merge branch 'adaptiv-install' into dev 2024-03-16 14:59:25 +03:00
IlyaDoronin
c4ad3de036 fix: close on drag start 2024-03-15 17:56:39 +03:00
IlyaDoronin
26e41b6e2a fix: drag&drop 2024-03-15 17:24:13 +03:00
IlyaDoronin
75a3042e3b fix: drag&drop scroll 2024-03-15 17:22:36 +03:00
Tamara
0eceb3a727 адаптация тарифов, увеличено огранчения для ввода ссылки на сайт пользователя, раскрытие результатов в заявке по клмлку на саму карточку 2024-03-15 00:49:14 +03:00
IlyaDoronin
aff2120637 fix: full-screen 2024-03-14 18:13:01 +03:00
Tamara
1579ea1dd4 плавающая шапка, фиксированное нижнее меню в мобилке 2024-03-14 12:40:44 +03:00
fbbfab380d Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!212
2024-03-14 01:56:51 +00:00
da35de466f Merge branch 'adaptiv-install' into dev 2024-03-14 04:51:30 +03:00
815397c466 Merge branch 'support-video-fixes' into dev 2024-03-14 04:50:39 +03:00
IlyaDoronin
9f280de2fe fix: update messages 2024-03-13 17:40:43 +03:00
nflnkr
6f684cc191 upgrade @frontend/squzanswerer to 1.0.6 2024-03-13 13:47:14 +03:00
IlyaDoronin
e157651e6a fix: incrementUnauthMessage 2024-03-13 11:54:52 +03:00
Tamara
55aaf04f12 адаптация страницы установки квизов 2024-03-13 00:20:13 +03:00
IlyaDoronin
ce2f5b98ee fix: support 2024-03-12 16:58:26 +03:00
5c9c270f31 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!210
2024-03-11 20:49:07 +00:00
Tamara
e227ebbf25 обновлена страница установка квиза 2024-03-11 22:49:04 +03:00
IlyaDoronin
c2950872b5 feat: refactor checkAcceptableMediaType 2024-03-11 19:02:47 +03:00
IlyaDoronin
312170a560 feat: support logic 2024-03-11 13:02:16 +03:00
86da639c01 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!208
2024-03-10 15:30:33 +00:00
185a9dc6fb авторизация юзера при попадании с лендинга 2024-03-10 18:29:25 +03:00
6c4b929c68 отображение видео 2024-03-10 17:40:48 +03:00
923c64feab дисабл кнопки отправки файла 2024-03-10 03:56:34 +03:00
Tamara
dc62a16576 тип файл выводится в тп 2024-03-10 01:28:42 +03:00
Tamara
e968e5c7ee тип файл не выводится 2024-03-10 01:05:54 +03:00
Tamara
d6c8532280 свитч для отображения сообщений в тп соответственно их типу 2024-03-10 00:01:57 +03:00
60e5cbd63b Merge branch 'dev' into 'staging'
теперь модалки регистарции и авторизации , восстановления пароля открываются...

See merge request frontend/squiz!207
2024-03-09 10:13:34 +00:00
7681000440 Merge branch 'tickets' into dev 2024-03-09 13:13:00 +03:00
76b3daab25 разделение логики тп на авторизованного и неавторизованного 2024-03-09 13:10:39 +03:00
Tamara
5c8e4c22a8 иконки в мобильном меню 2024-03-08 02:07:54 +03:00
Tamara
d20a5d6435 проверка наличия токена в адресной строке 2024-03-07 01:29:10 +03:00
IlyaDoronin
55c1a75d9f fix: design pictures 2024-03-06 13:24:21 +03:00
IlyaDoronin
5654c6d502 fix: design colors 2024-03-04 19:47:06 +03:00
IlyaDoronin
7291d08d6a fix: design logic 2024-03-04 19:31:11 +03:00
755ec24ff0 Merge branch 'modal' into dev 2024-03-04 02:21:11 +03:00
Tamara
36a4049621 плашка показа результата развернута по умолчанию 2024-03-04 02:19:28 +03:00
9797f44d05 Merge branch 'data-rollback' into dev 2024-03-04 01:38:45 +03:00
nflnkr
c531b16131 memo question card parts with textfields 2024-02-29 14:23:52 +03:00
IlyaDoronin
cbda27a7e1 fix: design select theme 2024-02-28 17:09:12 +03:00
nflnkr
a58af46dac improve rendering performance
memo question title
memo question variants
2024-02-28 11:18:21 +03:00
IlyaDoronin
d211a32403 feat: types 2024-02-27 12:36:10 +03:00
85c99344f1 Merge branch 'data-rollback' into dev 2024-02-27 01:03:46 +03:00
edac95e644 Merge branch 'design-page' into tomainone 2024-02-27 00:52:18 +03:00
nflnkr
312f366501 inputs receive value from state
remove unused code
2024-02-26 18:56:07 +03:00
IlyaDoronin
c721d55246 feat: DesignPage updates 2024-02-26 17:32:32 +03:00
Tamara
d74b9159a8 отделение логики от верстки на странице результатов 2024-02-26 17:22:40 +03:00
nflnkr
bf1d150954 fix rollback 2024-02-26 14:37:54 +03:00
nflnkr
9a4f4e8a66 add questions state rollback on request error 2024-02-26 12:52:52 +03:00
nflnkr
4f68ddfad5 request queue dedupes requests by id 2024-02-26 12:51:33 +03:00
nflnkr
3f82b7d97a fix textfield ts(2590) 2024-02-26 12:45:56 +03:00
nflnkr
69e76397f5 fix broken memoization of question card component 2024-02-26 12:38:13 +03:00
nflnkr
4e915f3e39 minor fixes
remove console clutter
fix types
2024-02-24 13:10:25 +03:00
nflnkr
d20c249796 fix branchig map node delete button style 2024-02-23 17:43:13 +03:00
nflnkr
7a91c0f953 fix createResult calls params 2024-02-23 17:23:26 +03:00
nflnkr
0c7ed71d3d Merge branch 'cscomponent-refactor' into dev 2024-02-23 17:07:44 +03:00
nflnkr
4a48bef6d0 Merge branch 'staging' into dev 2024-02-23 16:37:01 +03:00
Tamara
dfa690685a вынесение компонентов на странице результатов 2024-02-22 00:16:10 +03:00
6a3036eb4a Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!203
2024-02-21 19:06:27 +00:00
d0b96ca8a0 Merge branch 'tomainone' into 'staging'
корректная передача суммы

See merge request frontend/squiz!202
2024-02-21 17:16:15 +00:00
9839f8b9de корректная передача суммы 2024-02-21 20:13:46 +03:00
4b36fa5aeb Merge branch 'tomainone' into 'staging'
feat: PaymentModal logic

See merge request frontend/squiz!201
2024-02-21 14:53:09 +00:00
IlyaDoronin
8cf57b5308 feat: PaymentModal logic 2024-02-21 13:26:06 +03:00
342c75b1c4 Merge branch 'tomainone' into 'staging'
feat: PrePaymentModal

See merge request frontend/squiz!200
2024-02-20 13:53:30 +00:00
IlyaDoronin
604c448c69 feat: PrePaymentModal 2024-02-20 14:54:08 +03:00
IlyaDoronin
04ede22e9d fix: conflicts resolved 2024-02-20 11:10:03 +03:00
IlyaDoronin
3a21410b97 feat: enqueueSnackbar close logic 2024-02-20 11:04:32 +03:00
5e4a6053d3 Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!198
2024-02-17 18:43:25 +00:00
156d34d843 Merge branch 'tomainone' into 'staging'
мобильный чат

See merge request frontend/squiz!197
2024-02-17 17:32:59 +00:00
5df9a1ea21 мобильный чат 2024-02-17 20:31:39 +03:00
Tamara
85181d0f5f мобильный чат снова работает, инпуты в анкете ограничены 2024-02-17 20:26:22 +03:00
d892bf30b3 Merge branch 'staging' into 'main'
ссылка на главную квиза во всех шильдиках, вписанное имя квиза до выбора типа...

See merge request frontend/squiz!196
2024-02-17 03:37:55 +00:00
e9dcbd931b Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!195
2024-02-17 00:26:58 +00:00
0221e61843 -- 2024-02-17 03:26:17 +03:00
57752e8eb3 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!194
2024-02-16 23:44:12 +00:00
25348fd8a7 -- 2024-02-17 02:41:38 +03:00
cd995e2075 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!193
2024-02-16 22:01:45 +00:00
d6ae91967d Merge branch 'pagination' into dev 2024-02-17 01:01:03 +03:00
00d34fd191 -- 2024-02-17 01:00:32 +03:00
Tamara
f7b73ef11e стили для пагинации результатов 2024-02-17 00:58:30 +03:00
942adbd489 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!192
2024-02-16 21:43:48 +00:00
915f178ac3 -- 2024-02-17 00:43:04 +03:00
44ed5d203b Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!191
2024-02-16 21:20:04 +00:00
c12320d60f реактивный запрос 2024-02-17 00:19:35 +03:00
Tamara
1811b3fd2e пагинация и запросы страниц с заявками 2024-02-17 00:06:22 +03:00
e25c3eb821 Merge branch 'dev' into 'staging'
upgrade squzanswerer to 1.0.4

See merge request frontend/squiz!190
2024-02-16 20:23:12 +00:00
nflnkr
1e2472fe61 upgrade squzanswerer to 1.0.5 2024-02-16 19:59:10 +03:00
nflnkr
5737ed9ed5 fix test view fetch state handling 2024-02-16 19:40:08 +03:00
c5af81174e Merge branch 'slider-logic' into 'dev'
feat: Slider logic

See merge request frontend/squiz!189
2024-02-16 16:08:56 +00:00
nflnkr
d6a029c6c0 upgrade squzanswerer to 1.0.4
fetch and transform data for QuizAnswerer
2024-02-16 18:53:44 +03:00
nflnkr
06d8ce02d8 fix svg attribute names in jsx 2024-02-16 17:29:01 +03:00
IlyaDoronin
635e485740 feat: Slider logic 2024-02-16 17:10:25 +03:00
c536bf2514 Merge branch 'dev' into 'staging'
вывод картинок в результатах заявок

See merge request frontend/squiz!187
2024-02-16 12:39:11 +03:00
Tamara
017311721d вывод картинок в результатах заявок 2024-02-16 09:44:07 +03:00
2aeb2099d2 Merge branch 'dev' into 'staging'
вывод картинок в результатах заявок

See merge request frontend/squiz!186
2024-02-16 01:12:08 +00:00
Tamara
47a818eddb вывод картинок в результатах заявок 2024-02-16 03:11:28 +03:00
3a68df687e Merge branch 'dev' into 'staging'
пакет для тестовой публикаци

See merge request frontend/squiz!185
2024-02-15 23:26:54 +00:00
Tamara
56b4580762 пакет для тестовой публикаци 2024-02-16 02:21:10 +03:00
0096c27edb Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!184
2024-02-15 23:03:42 +00:00
Tamara
2e869560c8 фикс инпутов в результатах 2024-02-16 00:49:21 +03:00
Tamara
b0faac78cf ограничение для инпута в шапке, имя анкеты 2024-02-15 22:34:13 +03:00
ab4767de07 Merge branch 'dev' into 'staging'
выводится ответ в списке

See merge request frontend/squiz!183
2024-02-15 18:40:55 +00:00
6b35f8e9a3 выводится ответ в списке 2024-02-15 21:33:08 +03:00
4a72644d92 Merge branch 'input-answer' into 'staging'
Input answer

See merge request frontend/squiz!182
2024-02-15 12:48:35 +00:00
IlyaDoronin
7cbc1e1930 fix: answer input bug 2024-02-15 15:45:14 +03:00
IlyaDoronin
a2759ae546 idk 2024-02-15 12:49:32 +03:00
IlyaDoronin
f60ca0c37e idk 2024-02-15 12:48:44 +03:00
b5d9a1f411 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!180
2024-02-15 09:41:14 +00:00
d5ad04cf3a Merge branch 'input-limit' into support-sse-logic 2024-02-15 12:40:27 +03:00
IlyaDoronin
a6d8435d5e feat: useSSETab 2024-02-15 12:37:18 +03:00
c0e7396455 Merge branch 'skeletons' into input-limit 2024-02-15 11:02:56 +03:00
Tamara
5074c37370 фикс отъезжающего нижнего меню при открытии верхнего меню в мобилке 2024-02-15 04:19:03 +03:00
Tamara
6a84f5b33d ограничения для безразмерных инпутов 2024-02-15 02:02:10 +03:00
5bbbfab6ca Merge branch 'support-chat-logic' into 'vis-fix'
feat: support chat logic

See merge request frontend/squiz!178
2024-02-14 19:04:40 +00:00
IlyaDoronin
622a587d25 feat: support chat logic 2024-02-14 19:47:30 +03:00
e121f99dc5 Merge branch 'vis-fix' into 'staging'
не ветвиться отсюда, залив без тестового просмотра

See merge request frontend/squiz!176
2024-02-14 02:46:06 +00:00
6302afa071 не ветвиться отсюда, залив без тестового просмотра 2024-02-14 05:45:13 +03:00
5489fa6955 Merge branch 'vis-fix' into 'staging'
replace quiz view page with squzanswerer component

See merge request frontend/squiz!175
2024-02-14 02:30:08 +00:00
Tamara
7c898d7e83 правки по дизайну 2024-02-14 05:24:25 +03:00
nflnkr
088589b583 upgrade @frontend/squzanswerer to 1.0.0 2024-02-13 16:16:14 +03:00
nflnkr
6964ea5c04 replace quiz view page with squzanswerer component
quiz view page uses url param for quiz id
2024-02-13 15:57:17 +03:00
32a7104cee Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!174
2024-02-12 20:58:25 +00:00
cf6e2c8cb1 полная ширина названия в карточке квиза 2024-02-12 23:58:00 +03:00
Tamara
7e65a8a112 сохранение картинок в конфиг 2024-02-12 01:03:59 +03:00
015cf35353 Merge branch 'dev' into 'staging'
ссылка на главную квиза во всех шильдиках, вписанное имя квиза до выбора типа...

See merge request frontend/squiz!173
2024-02-11 19:29:06 +00:00
f67cff7db5 Merge branch 'fix-visual' into dev 2024-02-11 22:24:36 +03:00
Tamara
698ca3a051 символы в пароле, ограничения для инпутов, округление цены, запрос вопросов в заявках вернулся 2024-02-11 22:21:12 +03:00
9c251cc81d Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!172
2024-02-11 01:14:35 +00:00
e191955adb Merge branch 'resultsPageLogic' into 'dev'
красивое отображение ответов на странице заявок

See merge request frontend/squiz!171
2024-02-11 01:14:05 +00:00
b9b027cd42 fix: export results должны получить от axios только чистый, нефильтрованый blob 2024-02-11 04:08:59 +03:00
Tamara
d0297753f0 красивое отображение ответов на странице заявок 2024-02-11 02:45:14 +03:00
75f4571864 экспорт xlsx 2024-02-10 19:31:27 +03:00
0c989614c1 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!170
2024-02-10 15:05:09 +00:00
f788c7e467 Merge branch 'button-support-vis' into dev 2024-02-10 18:03:29 +03:00
Tamara
6eebb8491f мобильный чат техподдержки, мелкие правки по дизайну 2024-02-10 17:58:36 +03:00
1390adc40f Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!169
2024-02-10 14:03:41 +00:00
b50b664d03 фильтры сразу вызывают запрос, экспорт сразу скачивает файл 2024-02-10 17:02:56 +03:00
0c2894b5fb Merge branch 'resultsPageLogic' into dev 2024-02-10 09:40:00 +03:00
Tamara
ccee8eb5e3 вывод ответов на вопросы схематично, сохранение и сброс фильтров 2024-02-10 04:41:13 +03:00
7dc9cbe8d2 Merge branch 'resultsPageLogic' of penahub.gitlab.yandexcloud.net:frontend/squiz into resultsPageLogic 2024-02-09 22:09:44 +03:00
bd2c55dd5e два стейта для фильтрации 2024-02-09 22:08:04 +03:00
Tamara
3de2c035c6 переписаны запросы и способы извлечения информации (страница результатов) 2024-02-09 22:05:40 +03:00
6efdee13ad подняла кнопку повыше 2024-02-09 20:35:16 +03:00
7e0ee868c2 кнопка экспорта работает 2024-02-09 20:07:20 +03:00
868bcf02a8 Merge branch 'resultsPageLogic' of penahub.gitlab.yandexcloud.net:frontend/squiz into resultsPageLogic 2024-02-09 18:51:17 +03:00
90dc7fef08 функция удаления новизны за 3 сек 2024-02-09 18:49:24 +03:00
Tamara
fa2c307bc6 стрелка назад в шапке 2024-02-09 18:48:26 +03:00
IlyaDoronin
b8d7ad23a7 fix: support 2024-02-09 17:04:38 +03:00
Tamara
14a9756738 ссылка на главную квиза во всех шильдиках, вписанное имя квиза до выбора типа квиза не затирается при этом выборе 2024-02-09 15:11:58 +03:00
Tamara
e910c708c6 добавлены запросы на экспорт всех ответов и на ответы конкретного респондента 2024-02-09 12:09:18 +03:00
627ead0be9 Merge branch 'dev' into 'staging'
Консультант на опроснике

See merge request frontend/squiz!167
2024-02-06 17:18:39 +00:00
331727da85 Merge branch 'support' into 'dev'
feat: Support chat

See merge request frontend/squiz!166
2024-02-06 16:48:39 +00:00
IlyaDoronin
dfb6fad6ae feat: support chat 2024-02-06 17:39:02 +03:00
7895373495 Merge branch 'dev' into 'staging'
Dev

See merge request frontend/squiz!165
2024-02-06 12:45:05 +00:00
7d7907dee8 Merge branch 'password-regex' into 'dev'
fix: Password regex

See merge request frontend/squiz!164
2024-02-06 12:42:15 +00:00
Tamara
29786ad816 поменяны местами заголовки в результатах, имя квиза растягивается на всю ширину карточки 2024-02-06 05:33:50 +03:00
Tamara
568547689a подключение страницы с заявками 2024-02-06 05:00:38 +03:00
IlyaDoronin
237e693678 fix 2024-02-05 18:19:04 +03:00
IlyaDoronin
d88fad5cb8 fix: Trash removed 2024-02-05 18:18:17 +03:00
IlyaDoronin
cc743f5915 fix: password test regex 2024-02-05 18:09:00 +03:00
1a30e2a875 Merge branch 'dev' into 'staging'
убран плюс при открытии логики ветвления добавлена быстрая ссылка на опрос в карточках квизов

See merge request frontend/squiz!163
2024-02-04 00:20:00 +00:00
Tamara
3fbe3c4cf0 Merge remote-tracking branch 'origin/quiz-answers-page' into resultsPageLogic
# Conflicts:
#	src/App.tsx
2024-02-03 01:06:52 +03:00
IlyaDoronin
d51d7ae44d fix: Drag&Drop bug 2024-02-02 17:16:27 +03:00
IlyaDoronin
38c40d1dfe Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-02-02 09:30:33 +03:00
Tamara
c73027e2d3 убран плюс при открытии логики ветвления добавлена быстрая ссылка на опрос в карточках квизов 2024-02-02 00:57:59 +03:00
5570f3a2f1 Merge branch 'staging' into 'main'
Staging

See merge request frontend/squiz!161
2024-01-31 22:58:49 +00:00
9f9cbb1e6a Merge branch 'dev' into 'staging'
генерация ссылки на тест в зависимости от домена

See merge request frontend/squiz!160
2024-01-31 22:42:59 +00:00
Tamara
737cc61cf7 генерация ссылки на тест в зависимости от домена 2024-02-01 01:31:51 +03:00
125caf4851 Merge branch 'dev' into 'staging'
--

See merge request frontend/squiz!159
2024-01-31 20:16:46 +00:00
29b5779b8e -- 2024-01-31 23:15:40 +03:00
1dd6ee8534 Merge branch 'dev' into 'staging'
фавиконки + описания

See merge request frontend/squiz!158
2024-01-31 19:43:13 +00:00
f7a00ad181 фавиконки + описания 2024-01-31 22:42:34 +03:00
730e21eec6 ci: production preparations 2024-01-30 17:09:56 +03:00
23b50cb9b7 Merge branch 'fix-error-password' into 'staging'
Fix error password

See merge request frontend/squiz!157
2024-01-29 00:25:26 +00:00
Tamara
e64adc026b логика фильтрации загрузки файлов в тестовом просмотре 2024-01-29 03:02:03 +03:00
Tamara
d2dbedc0be исправлен вывод ошибки при неправильном пароле 2024-01-28 23:45:13 +03:00
8e78fdc72e Merge branch 'fix-visual' into 'staging'
+userid

See merge request frontend/squiz!156
2024-01-28 20:08:34 +00:00
b63fb76af2 +userid 2024-01-28 23:08:06 +03:00
3339b35fc6 Merge branch 'fix-visual' into 'staging'
передача токена хабу

See merge request frontend/squiz!155
2024-01-28 16:08:16 +00:00
2c64a8e9d1 передача токена хабу 2024-01-28 19:07:17 +03:00
b5dce75489 Merge branch 'fix-visual' into 'staging'
новый путь отправки пополнения счёта

See merge request frontend/squiz!154
2024-01-28 08:51:27 +00:00
724d8b7388 новый путь отправки пополнения счёта 2024-01-28 11:50:42 +03:00
54eb5603cc Merge branch 'fix-visual' into 'staging'
при нехватке денег за тариф кидает на хаб

See merge request frontend/squiz!153
2024-01-27 16:59:38 +00:00
c4db4a80af при нехватке денег за тариф кидает на хаб 2024-01-27 19:51:28 +03:00
68ac5dfc50 Merge branch 'fix-visual' into 'staging'
Fix visual

See merge request frontend/squiz!151
2024-01-27 01:54:04 +00:00
dcc2bc3cb7 правки на главной 2024-01-27 04:52:49 +03:00
4418e14338 вопрос о покупке тарифа показывает цену после скидки 2024-01-27 03:45:48 +03:00
201b16b270 Merge branch 'fix-visual' into 'staging'
Fix visual

See merge request frontend/squiz!149
2024-01-26 21:13:02 +00:00
6a84f9c7fe название поле вместо слова подсказка в ФК 2024-01-27 00:11:50 +03:00
05851caa9f у полей кроме текста в форме контактов убраны инпуты 2024-01-27 00:04:33 +03:00
44ffba41de Merge branch 'fix-visual' into 'staging'
закомментированы ключи полей в форме контактов, фикс состояния кнопок там же

See merge request frontend/squiz!147
2024-01-26 00:30:14 +00:00
c293060068 Update file .gitlab-ci.yml 2024-01-25 23:38:58 +00:00
ba69863940 Update 2 files
- /deployments/staging/docker-compose.yaml
- /.gitlab-ci.yml
2024-01-25 23:37:32 +00:00
Tamara
a013612251 закомментированы ключи полей в форме контактов, фикс состояния кнопок там же 2024-01-26 01:36:32 +03:00
a070f9e8c3 Merge branch 'fix-visual' into 'main'
правки результатов и формы еконтактов, переполнение вариантов ответа в вопросах

See merge request frontend/squiz!146
2024-01-25 22:20:55 +00:00
Tamara
ee09655fbf правки результатов и формы еконтактов, переполнение вариантов ответа в вопросах 2024-01-25 04:26:58 +03:00
ArtChaos189
1ec03d04d7 Merge branch 'dev' of penahub.gitlab.yandexcloud.net:frontend/squiz into dev 2024-01-24 16:06:17 +03:00
a978fe7c1e Merge branch 'dev' into 'main'
fix конверсии

See merge request frontend/squiz!145
2024-01-23 13:15:18 +00:00
99c1e1a387 fix конверсии 2024-01-23 16:14:42 +03:00
4d17b0deec Merge branch 'variable-quiz' into 'main'
увеличено ограничение для полей сайт и юр информация

See merge request frontend/squiz!144
2024-01-23 12:49:09 +00:00
ArtChaos189
de774ecc6b теперь модалки регистарции и авторизации , восстановления пароля открываются на полный экран от ширины 450px 2024-01-23 12:24:52 +03:00
Tamara
ef50ddf8ac увеличено ограничение для полей сайт и юр информация 2024-01-22 01:13:05 +03:00
ArtChaos189
3acee01801 update 2024-01-22 01:09:26 +03:00
9c8fc78212 Merge branch 'variable-quiz' into 'main'
логика восстановления пароля

See merge request frontend/squiz!142
2024-01-21 02:21:03 +00:00
Tamara
571736906c логика восстановления пароля 2024-01-21 04:13:11 +03:00
017a4b26f1 починил скидку за лояльность - не учитывалось что количество потраченных денег лежит во вложенной структуре wallet 2024-01-20 19:33:46 +03:00
ArtChaos189
deb3a2c672 create 2024-01-20 13:27:21 +03:00
0f687b5643 Merge branch 'variable-quiz' into 'main'
Variable quiz

See merge request frontend/squiz!141
2024-01-19 19:45:11 +00:00
Tamara
6b31dcfd4d генерация имени по умолчанию для квизов вынесена в отдельный компонент 2024-01-19 22:41:45 +03:00
Tamara
23905636d9 переменная теперь одна убраны бесполезные кнопки информации 2024-01-19 17:24:35 +03:00
IlyaDoronin
95ae8c6a83 feat: uploading skeletons 2024-01-19 14:22:48 +03:00
ArtChaos189
5323914582 test quizResultsPage.cy update 2024-01-18 23:14:32 +03:00
ArtChaos189
7cb046b245 Merge branch 'fix' into dev 2024-01-18 20:13:26 +03:00
e9ccc51af5 Merge branch 'fix' into 'main'
s.hbpn.link

See merge request frontend/squiz!139
2024-01-18 15:30:17 +00:00
3365a6f39f s.hbpn.link 2024-01-18 18:27:04 +03:00
ArtChaos189
75e672934c create quizResultsPage 2024-01-18 18:18:32 +03:00
IlyaDoronin
9b0454eab5 fix: code style 2024-01-18 17:21:44 +03:00
IlyaDoronin
043246d2f2 feat: AddOrEditImageButton skeleton 2024-01-18 17:21:09 +03:00
7b913c59b3 Merge branch 'dev' into 'main'
s.link

See merge request frontend/squiz!138
2024-01-18 03:09:38 +00:00
80a370959a s.link 2024-01-18 06:08:47 +03:00
244918fabc Merge branch 'dev' into 'main'
переменное окружение, ссылки на доки

See merge request frontend/squiz!137
2024-01-18 02:34:51 +00:00
Tamara
ac2d91d320 переменное окружение, ссылки на доки 2024-01-18 04:56:15 +03:00
nflnkr
3889c06be1 use custom poppers 2024-01-17 18:42:25 +03:00
d90f9770f9 Merge branch 'dev' into 'main'
Dev

See merge request frontend/squiz!135
2024-01-17 10:15:16 +00:00
IlyaDoronin
dc4edf9be7 fix: conflicts resolved 2024-01-17 11:02:53 +03:00
IlyaDoronin
c15a82cda8 fix: customer account request 2024-01-17 10:49:45 +03:00
Tamara
7439ff5a62 ссылки открываются в новом окне 2024-01-17 00:28:34 +03:00
989baca61a аккаунты запрашиваются у сквиза, перезагрузка работает корректно 2024-01-17 00:18:21 +03:00
Tamara
7382d8eaa9 красивая кнопочка пополнить на черной шапке 2024-01-16 23:48:03 +03:00
Tamara
17f1a813bf красивая кнопочка пополнить 2024-01-16 23:14:34 +03:00
Tamara
772c64a33a карточки тарифов, ссылки на оферту и персональные данные кнопочка тестовая публикация 2024-01-16 21:58:39 +03:00
b59112ab35 Merge branch 'spaces' into dev 2024-01-16 18:46:27 +03:00
5816490e11 Merge branch 'dev' into accounts-fix 2024-01-16 18:42:42 +03:00
028a40b86e fix: magic of account domain 2024-01-16 18:42:35 +03:00
56202996f6 релейтив контейнера 2024-01-16 18:20:59 +03:00
ArtChaos189
16115af63a fix buttons 2024-01-16 17:37:44 +03:00
IlyaDoronin
b2c0c87d2d Merge branch 'accounts-fix' of penahub.gitlab.yandexcloud.net:frontend/squiz into accounts-fix 2024-01-16 16:42:14 +03:00
1096b16ae3 fix: magic of account domain 2024-01-16 16:25:04 +03:00
IlyaDoronin
2780cbe3c4 fix: spaces bug 2024-01-16 15:51:57 +03:00
IlyaDoronin
33e279a443 linter 2024-01-16 15:28:30 +03:00
IlyaDoronin
b3a2e3be94 fix: customer account 2024-01-16 15:25:25 +03:00
ArtChaos189
3454e63334 Убрал видиость скролла в слайдере 2024-01-16 13:20:11 +03:00
ArtChaos189
40f8698e90 style 2024-01-16 13:12:59 +03:00
ArtChaos189
9233444c11 добавил слайдер , на карточки стартовой страницы 2024-01-16 13:10:38 +03:00
028b2329db Merge branch 'tomain' into 'main'
получаемые тарифы скидываются в одну кучу, тарифы делятся на временные и по объёму

See merge request frontend/squiz!131
2024-01-15 20:43:11 +00:00
0f5b60c38a получаемые тарифы скидываются в одну кучу, тарифы делятся на временные и по объёму 2024-01-15 23:42:30 +03:00
75464d0d49 Merge branch 'tomain' into 'main'
поставила кнопки входа на место и вернула роуты

See merge request frontend/squiz!130
2024-01-15 18:43:30 +00:00
d6f566889c поставила кнопки входа на место и вернула роуты 2024-01-15 21:42:59 +03:00
c5e209e426 Merge branch 'tomain' into 'main'
Tomain

See merge request frontend/squiz!129
2024-01-15 17:59:07 +00:00
26656fe3c7 Merge branch 'without-buttons' into 'main'
Without buttons

See merge request frontend/squiz!128
2024-01-15 12:10:39 +00:00
Tamara
b8eaa5208c кнопки логики ветвления исчезают и пропадают там где нужно 2024-01-14 22:34:56 +03:00
04a195ab0e Merge branch 'quiz-first-answer-stable' into tomain 2024-01-14 17:14:30 +03:00
IlyaDoronin
e76c90cb78 fix: drag&drop bug 2024-01-12 12:35:50 +03:00
IlyaDoronin
fbde202ce5 fix: index bug 2024-01-11 12:05:59 +03:00
IlyaDoronin
28bfd30fdb feat: Form first item don't draggable 2024-01-11 11:59:59 +03:00
IlyaDoronin
605667ad0e fix: Form, delete button for first item removed 2024-01-11 11:46:50 +03:00
nflnkr
36ba2dfb61 replace mouseup with pointerup 2024-01-10 21:37:54 +03:00
nflnkr
9155f1b8ed fix adding nodes 2024-01-10 21:29:38 +03:00
nflnkr
d565a50a66 fix removePoppersOnDrag 2024-01-10 21:28:52 +03:00
nflnkr
c673b5be9f minor changes 2024-01-10 21:23:38 +03:00
nflnkr
a2296190b6 improve popper detaching on panning 2024-01-10 20:11:47 +03:00
IlyaDoronin
667a0cd069 feat: new ResultForm logic 2024-01-10 19:53:37 +03:00
77fd0b9a1a Merge branch 'tomain' into 'main'
селекты красиво скрывают переполнение, цвета текста на превью и тень, скрытие...

See merge request frontend/squiz!125
2024-01-10 13:50:15 +00:00
nflnkr
5543c9980a minor fix 2024-01-10 13:02:03 +03:00
nflnkr
588e21ef1e derive graph state from store instead of updating it manually 2024-01-09 20:01:54 +03:00
d191c18fe2 Merge branch 'tomain' into 'main'
Tomain

See merge request frontend/squiz!123
2024-01-09 12:49:37 +00:00
caeb88cc93 Merge branch 'fixes' into 'main'
Fixes

See merge request frontend/squiz!121
2024-01-09 11:13:42 +00:00
nflnkr
b8b5bc5d2e refactor cytoscape component and hooks 2024-01-05 19:48:35 +03:00
786 changed files with 61287 additions and 23822 deletions

2
CHANGELOG.md Normal file

@ -0,0 +1,2 @@
1.0.1 Страница заявок корректно отображает мультиответ
1.0.0 Добавлены фичи "мультиответ", "перенос строки в своём ответе", "свой ответ", "плейсхолдер своего ответа"

2
.env Normal file

@ -0,0 +1,2 @@
TSC_COMPILE_ON_ERROR=true
ESLINT_NO_DEV_ERRORS=true

1
.env.development.local Normal file

@ -0,0 +1 @@
REACT_APP_DOMAIN="https://squiz.pena.digital"

1
.env.production.local Normal file

@ -0,0 +1 @@
REACT_APP_DOMAIN=""

@ -0,0 +1,26 @@
name: Deploy
run-name: ${{ gitea.actor }} build image and push to container registry
on:
push:
branches:
- 'main'
jobs:
CreateImage:
runs-on: [skeris]
uses: https://gitea.pena/PenaDevops/actions.git/.gitea/workflows/build-image.yml@v1.1.6-p
with:
runner: skeris
secrets:
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
DeployService:
runs-on: [frontprod]
needs: CreateImage
uses: https://gitea.pena/PenaDevops/actions.git/.gitea/workflows/deploy.yml@v1.1.4-p7
with:
runner: hubprod
actionid: ${{ gitea.run_id }}

@ -0,0 +1,26 @@
name: Deploy
run-name: ${{ gitea.actor }} build image and push to container registry
on:
push:
branches:
- 'staging'
jobs:
CreateImage:
runs-on: [skeris]
uses: http://gitea.pena/PenaDevops/actions.git/.gitea/workflows/build-image.yml@v1.1.6-p
with:
runner: skeris
secrets:
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
DeployService:
runs-on: [frontstaging]
needs: CreateImage
uses: http://gitea.pena/PenaDevops/actions.git/.gitea/workflows/deploy.yml@v1.1.4-p7
with:
runner: frontstaging
actionid: ${{ gitea.run_id }}

14
.gitea/workflows/lint.yml Normal file

@ -0,0 +1,14 @@
name: Lint
run-name: ${{ gitea.actor }} produce linting
on:
push:
branches:
- 'dev'
jobs:
Lint:
runs-on: [hubstaging]
uses: http://gitea.pena/PenaDevops/actions.git/.gitea/workflows/lint.yml@v1.1.0
with:
runner: hubstaging

2
.gitignore vendored

@ -14,9 +14,7 @@
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*

@ -1,38 +0,0 @@
include:
- project: "devops/pena-continuous-integration"
file: "/templates/docker/build-template.gitlab-ci.yml"
- project: "devops/pena-continuous-integration"
file: "/templates/docker/clean-template.gitlab-ci.yml"
- project: "devops/pena-continuous-integration"
file: "/templates/docker/deploy-template.gitlab-ci.yml"
stages:
- clean
- build
- deploy
clear-old-images:
extends: .clean_template
variables:
STAGING_BRANCH: "main"
PRODUCTION_BRANCH: "main"
image:
name: docker/compose:1.28.0
entrypoint: [""]
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker images
script:
- docker system prune -af
build-app:
extends: .build_template
variables:
DOCKER_BUILD_PATH: "./Dockerfile"
STAGING_BRANCH: "main"
PRODUCTION_BRANCH: "main"
deploy-to-staging:
extends: .deploy_template
variables:
DEPLOY_TO: "staging"
BRANCH: "main"

1
.npmrc Normal file

@ -0,0 +1 @@
@frontend:registry=http://gitea.pena/api/packages/skeris/npm/

@ -0,0 +1,4 @@
{
"ExpandedNodes": [""],
"PreviewInSolutionExplorer": false
}

BIN
.vs/slnx.sqlite Normal file

Binary file not shown.

BIN
.vs/squiz/v15/.suo Normal file

Binary file not shown.

5
.vscode/extensions.json vendored Normal file

@ -0,0 +1,5 @@
{
"recommendations": [
"godrix.svgr-preview"
]
}

@ -1 +0,0 @@
"@frontend:registry" "https://penahub.gitlab.yandexcloud.net/api/v4/packages/npm/"

13
Containerfile Normal file

@ -0,0 +1,13 @@
FROM gitea.pena/penadevops/container-images/node:main as build
WORKDIR /usr/app
COPY . .
RUN npm install --force && yarn cache clean
RUN psstat.sh "npm run build"
FROM gitea.pena/penadevops/container-images/nginx:main as result
WORKDIR /usr/share/nginx/html
COPY --from=build /usr/app/build/ /usr/share/nginx/html
COPY hub.conf /etc/nginx/conf.d/default.conf

@ -1,14 +0,0 @@
FROM node:20.10-alpine3.18 as build
RUN apk update && rm -rf /var/cache/apk/*
WORKDIR /usr/app
COPY . .
RUN yarn install --ignore-scripts --non-interactive --frozen-lockfile && yarn cache clean
RUN yarn build
FROM nginx:latest as result
WORKDIR /usr/share/nginx/html
COPY --from=build /usr/app/build/ /usr/share/nginx/html
COPY hub.conf /etc/nginx/conf.d/default.conf

577
api-docs.html Normal file

@ -0,0 +1,577 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QUIZ Service API Documentation</title>
<style>
:root {
--primary-color: #7E2AEA;
--text-color: #333;
--bg-color: #fff;
--border-color: #e0e0e0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
line-height: 1.6;
color: var(--text-color);
margin: 0;
padding: 0;
background: var(--bg-color);
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
header {
background: var(--primary-color);
color: white;
padding: 2rem 0;
margin-bottom: 2rem;
}
h1, h2, h3 {
color: var(--primary-color);
}
.endpoint {
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 20px;
margin-bottom: 20px;
background: #fafafa;
}
.method {
display: inline-block;
padding: 4px 8px;
border-radius: 4px;
color: white;
font-weight: bold;
margin-right: 10px;
}
.get { background: #61affe; }
.post { background: #49cc90; }
.put { background: #fca130; }
.delete { background: #f93e3e; }
.patch { background: #50e3c2; }
.schema {
background: #f8f9fa;
padding: 15px;
border-radius: 4px;
margin: 10px 0;
}
.nav {
position: sticky;
top: 0;
background: white;
padding: 1rem;
border-bottom: 1px solid var(--border-color);
}
.nav a {
color: var(--primary-color);
text-decoration: none;
margin-right: 20px;
}
.nav a:hover {
text-decoration: underline;
}
code {
background: #f1f1f1;
padding: 2px 4px;
border-radius: 4px;
font-family: 'Courier New', Courier, monospace;
}
.response {
margin-top: 10px;
padding: 10px;
background: #f8f9fa;
border-left: 4px solid var(--primary-color);
}
.components {
margin: 2rem 0;
padding: 1rem;
background: #f8f9fa;
border-radius: 8px;
}
.security {
background: #fff3cd;
padding: 1rem;
border-radius: 4px;
margin: 1rem 0;
}
.parameter {
margin: 0.5rem 0;
padding: 0.5rem;
background: #f8f9fa;
border-radius: 4px;
}
.parameter.required {
border-left: 4px solid #dc3545;
}
.enum-values {
color: #666;
font-style: italic;
}
</style>
</head>
<body>
<header>
<div class="container">
<h1>QUIZ Service API Documentation</h1>
<p>Version 1.0.0</p>
</div>
</header>
<nav class="nav">
<div class="container">
<a href="#components">Components</a>
<a href="#quiz">Quiz Endpoints</a>
<a href="#question">Question Endpoints</a>
<a href="#results">Results Endpoints</a>
<a href="#statistics">Statistics Endpoints</a>
<a href="#account">Account Endpoints</a>
</div>
</nav>
<main class="container">
<section id="components">
<h2>Components</h2>
<div class="components">
<h3>Quiz Model</h3>
<div class="schema">
<pre><code>{
"id": integer, // Id of created quiz
"qid": string, // string id for customers
"deleted": boolean, // true if quiz deleted
"archived": boolean, // true if quiz archived
"fingerprinting": boolean, // set true for save deviceId
"repeatable": boolean, // set true for allow user to repeat quiz
"note_prevented": boolean, // set true for save statistic of incomplete quiz passing
"mail_notifications": boolean, // set true for mail notification for each quiz passing
"unique_answers": boolean, // set true for save statistics only for unique quiz passing
"name": string, // name of quiz. max 280 length
"description": string, // description of quiz
"config": string, // config of quiz. serialized json for rules of quiz flow
"status": string, // status of quiz. allow only '', 'draft', 'template', 'stop', 'start'
"limit": integer, // limit is count of max quiz passing
"due_to": integer, // last time when quiz is valid. timestamp in seconds
"time_of_passing": integer, // seconds to pass quiz
"pausable": boolean, // true if it is allowed for pause quiz
"version": integer, // version of quiz
"version_comment": string, // version comment to version of quiz
"parent_ids": integer[], // array of previous versions of quiz
"created_at": string, // time of creating
"updated_at": string, // time of last updating
"question_cnt": integer, // count of questions
"passed_count": integer, // count passings
"average_time": integer, // average time of passing
"super": boolean, // set true if squiz realize group functionality
"group_id": integer // group of new quiz
}</code></pre>
</div>
</div>
<div class="components">
<h3>Question Model</h3>
<div class="schema">
<pre><code>{
"id": integer, // Id of created question
"quiz_id": integer, // relation to quiz
"title": string, // title of question. max 512 length
"description": string, // description of question
"type": string, // status of question. allow only text, select, file, variant, images, varimg, emoji, date, number, page, rating
"required": boolean, // user must pass this question
"deleted": boolean, // true if question is deleted
"page": integer, // page if question
"content": string, // serialized json of created question
"version": integer, // version of quiz
"parent_ids": integer[], // array of previous versions of quiz
"created_at": string, // time of creating
"updated_at": string // time of last updating
}</code></pre>
</div>
</div>
<div class="components">
<h3>Answer Model</h3>
<div class="schema">
<pre><code>{
"Id": integer, // id ответа
"Content": string, // контент ответа
"QuestionId": integer, // id вопроса к которому ответ
"QuizId": integer, // id опроса к которому ответ
"Fingerprint": string, // fingerprint
"Session": string, // сессия
"Result": boolean, // true or false?
"CreatedAt": string, // таймшап когда ответ создан
"New": boolean, // новый ответ?
"Deleted": boolean // удален?
}</code></pre>
</div>
</div>
<div class="components">
<h3>LeadTarget Model</h3>
<div class="schema">
<pre><code>{
"ID": integer, // primary key
"AccountID": string, // account identifier
"Type": string, // type of target (mail, telegram, whatsapp)
"QuizID": integer, // ID of the quiz
"Target": string, // target address
"InviteLink": string, // invitation link
"Deleted": boolean, // is deleted
"CreatedAt": string // creation timestamp
}</code></pre>
</div>
</div>
<div class="components">
<h3>TgAccount Model</h3>
<div class="schema">
<pre><code>{
"ID": integer, // primary key
"ApiID": integer, // Telegram API ID
"ApiHash": string, // Telegram API Hash
"PhoneNumber": string, // phone number
"Password": string, // account password
"Status": string, // account status (active, inactive, ban)
"Deleted": boolean, // is deleted
"CreatedAt": string // creation timestamp
}</code></pre>
</div>
</div>
</section>
<section id="quiz">
<h2>Quiz Endpoints</h2>
<div class="endpoint">
<h3>Create Quiz</h3>
<span class="method post">POST</span>
<code>/quiz/create</code>
<p>Create a new quiz with specified parameters.</p>
<div class="security">
<h4>Security</h4>
<p>This endpoint requires authentication.</p>
</div>
<h4>Request Body:</h4>
<div class="schema">
<pre><code>{
"fingerprinting": boolean, // set true for save deviceId
"repeatable": boolean, // set true for allow user to repeat quiz
"note_prevented": boolean, // set true for save statistic of incomplete quiz passing
"mail_notifications": boolean, // set true for mail notification for each quiz passing
"unique_answers": boolean, // set true for save statistics only for unique quiz passing
"name": string, // name of quiz. max 280 length
"description": string, // description of quiz
"config": string, // config of quiz. serialized json for rules of quiz flow
"status": string, // status of quiz. allow only '', 'draft', 'template', 'stop', 'start'
"limit": integer, // limit is count of max quiz passing
"due_to": integer, // last time when quiz is valid. timestamp in seconds
"time_of_passing": integer, // seconds to pass quiz
"pausable": boolean, // true if it is allowed for pause quiz
"question_cnt": integer, // count of questions
"super": boolean, // set true if squiz realize group functionality
"group_id": integer // group of new quiz
}</code></pre>
</div>
<h4>Responses:</h4>
<div class="response">
<h5>201 Created</h5>
<p>Quiz successfully created. Returns the created quiz object.</p>
<div class="schema">
<pre><code>{
"id": integer,
"qid": string,
"name": string,
"description": string,
// ... other quiz properties
}</code></pre>
</div>
</div>
<div class="response">
<h5>422 Unprocessable Entity</h5>
<p>Name field should have less than 280 characters.</p>
</div>
<div class="response">
<h5>406 Not Acceptable</h5>
<p>Status on creating must be only draft, template, stop, start or due to time must be lesser than now.</p>
<div class="enum-values">
Allowed status values: '', 'draft', 'template', 'stop', 'start'
</div>
</div>
<div class="response">
<h5>409 Conflict</h5>
<p>You can pause quiz only if it has deadline for passing.</p>
</div>
<div class="response">
<h5>500 Internal Server Error</h5>
<p>If you get any content string send it to developer.</p>
</div>
</div>
<div class="endpoint">
<h3>Get Quiz List</h3>
<span class="method post">POST</span>
<code>/quiz/getList</code>
<p>Get paginated list of quizzes with filtering options.</p>
<h4>Request Body:</h4>
<div class="schema">
<pre><code>{
"limit": integer,
"offset": integer,
"from": integer,
"to": integer,
"search": string,
"status": string,
"deleted": boolean,
"archived": boolean,
"super": boolean,
"group_id": integer
}</code></pre>
</div>
<h4>Responses:</h4>
<div class="response">
<h5>200 OK</h5>
<p>Returns list of quizzes with total count.</p>
<div class="schema">
<pre><code>{
"count": integer,
"items": [
{
"id": integer,
"qid": string,
// ... other quiz properties
}
]
}</code></pre>
</div>
</div>
<div class="response">
<h5>406 Not Acceptable</h5>
<p>Inappropriate status, allowed only '', 'stop', 'start', 'draft', 'template', 'timeout', 'offlimit'.</p>
</div>
<div class="response">
<h5>500 Internal Server Error</h5>
<p>If you get any content string send it to developer.</p>
</div>
</div>
<!-- Add more quiz endpoints -->
</section>
<section id="question">
<h2>Question Endpoints</h2>
<div class="endpoint">
<h3>Create Question</h3>
<span class="method post">POST</span>
<code>/question/create</code>
<p>Create a new question for a quiz.</p>
</div>
<!-- Add more question endpoints -->
</section>
<section id="results">
<h2>Results Endpoints</h2>
<div class="endpoint">
<h3>Get Quiz Results</h3>
<span class="method post">POST</span>
<code>/results/getResults/{quizId}</code>
<p>Get list of quiz results with pagination.</p>
<h4>Path Parameters:</h4>
<div class="parameter">
<code>quizId</code> - ID of the quiz to get results for
</div>
<h4>Request Body:</h4>
<div class="schema">
<pre><code>{
"to": integer, // таймштамп времени, до которого выбирать статистику. если 0 или не передано - этого ограничения нет
"from": integer, // таймштамп времени, после которого выбирать статистику. если 0 или не передано - этого ограничения нет
"new": boolean, // флаг, по которому вернутся только новые результаты, ещё не просмотренные пользователем
"page": integer, // номер страницы для пагинации
"limit": integer // размер страницы для пагинации
}</code></pre>
</div>
<h4>Responses:</h4>
<div class="response">
<h5>200 OK</h5>
<p>Returns paginated list of results.</p>
<div class="schema">
<pre><code>{
"total_count": integer, // общее количество элементов удволетворяющее фильтру
"results": [
{
"content": string, // содержимое ответа
"id": integer, // айдишник ответа
"new": boolean, // статус, был ли просмотрен ответ
"created_at": string // время создания этого результата
}
]
}</code></pre>
</div>
</div>
</div>
<div class="endpoint">
<h3>Export Results</h3>
<span class="method post">POST</span>
<code>/results/{quizID}/export</code>
<p>Export quiz results to CSV format.</p>
<h4>Path Parameters:</h4>
<div class="parameter required">
<code>quizID</code> - ID of the quiz to export results from
</div>
<h4>Request Body:</h4>
<div class="schema">
<pre><code>{
"to": string, // Дата окончания диапазона времени для экспорта результатов
"from": string, // Дата начала временного диапазона для экспорта результатов
"new": boolean // Экспортировать ли только новые результаты?
}</code></pre>
</div>
<h4>Responses:</h4>
<div class="response">
<h5>200 OK</h5>
<p>Returns CSV file with quiz results.</p>
<div class="schema">
<pre><code>Content-Type: text/csv</code></pre>
</div>
</div>
</div>
</section>
<section id="telegram">
<h2>Telegram Endpoints</h2>
<div class="endpoint">
<h3>Create Telegram Account</h3>
<span class="method post">POST</span>
<code>/telegram/create</code>
<p>Authorize server in Telegram account.</p>
<h4>Request Body:</h4>
<div class="schema">
<pre><code>{
"ApiID": integer, // Telegram API ID
"ApiHash": string, // Telegram API Hash
"PhoneNumber": string, // Phone number
"Password": string // Account password
}</code></pre>
</div>
<h4>Responses:</h4>
<div class="response">
<h5>200 OK</h5>
<p>Returns signature for code verification.</p>
<div class="schema">
<pre><code>{
"signature": string // Session identifier for code verification
}</code></pre>
</div>
</div>
<div class="response">
<h5>409 Conflict</h5>
<p>Account already exists and is active.</p>
</div>
</div>
</section>
<section id="audience">
<h2>Audience Endpoints</h2>
<div class="endpoint">
<h3>Create Quiz Audience</h3>
<span class="method post">POST</span>
<code>/quiz/{quizID}/auditory</code>
<p>Create audience for a quiz.</p>
<h4>Path Parameters:</h4>
<div class="parameter required">
<code>quizID</code> - ID of the quiz
</div>
<h4>Responses:</h4>
<div class="response">
<h5>200 OK</h5>
<p>Returns ID of created audience.</p>
<div class="schema">
<pre><code>{
"id": integer // ID of created auditory
}</code></pre>
</div>
</div>
</div>
</section>
<section id="statistics">
<h2>Statistics Endpoints</h2>
<div class="endpoint">
<h3>Get Question Statistics</h3>
<span class="method post">POST</span>
<code>/statistic/{quizID}/questions</code>
<p>Get statistics for specific questions in a quiz.</p>
</div>
<!-- Add more statistics endpoints -->
</section>
<section id="account">
<h2>Account Endpoints</h2>
<div class="endpoint">
<h3>Add Lead Target</h3>
<span class="method post">POST</span>
<code>/account/leadtarget</code>
<p>Add a target destination for lead notifications.</p>
</div>
<!-- Add more account endpoints -->
</section>
</main>
<footer class="container">
<p>© 2024 QUIZ Service API Documentation</p>
</footer>
</body>
</html>

@ -1,17 +1,14 @@
const CracoAlias = require("craco-alias");
module.exports = {
plugins: [
{
plugin: CracoAlias,
options: {
source: "tsconfig",
// baseUrl SHOULD be specified
// plugin does not take it from tsconfig
baseUrl: "./src",
// tsConfigPath should point to the file where "baseUrl" and "paths" are specified
tsConfigPath: "./tsconfig.extend.json"
}
}
]
};
plugins: [
{
plugin: CracoAlias,
options: {
source: "tsconfig",
baseUrl: "./src",
tsConfigPath: "./tsconfig.extend.json",
},
},
],
};

@ -3,8 +3,23 @@ import { defineConfig } from "cypress";
export default defineConfig({
e2e: {
baseUrl: 'http://localhost:3000',
viewportWidth: 1440,
viewportHeight: 900,
supportFile: false,
viewportWidth: 1280,
viewportHeight: 720,
video: true,
screenshotOnRunFailure: true,
supportFile: 'cypress/support/e2e.ts',
defaultCommandTimeout: 10000,
pageLoadTimeout: 30000,
requestTimeout: 10000,
responseTimeout: 30000,
setupNodeEvents(on, config) {
// implement node event listeners here
},
},
component: {
devServer: {
framework: 'react',
bundler: 'vite',
},
},
});

@ -0,0 +1,75 @@
/// <reference types="cypress" />
describe('Personalization Flow', () => {
beforeEach(() => {
// Логинимся перед каждым тестом
cy.login();
});
it('should complete personalization flow and open link in new tab', () => {
// Ищем нужный квиз и нажимаем редактировать
cy.contains('Сочетание перестановки и размещения')
.parent()
.parent()
.contains('Редактировать')
.click();
// Переходим на вкладку персонализации
cy.contains('Персонализация').click();
// Ждем загрузки данных
cy.get('.MuiSkeleton-root', { timeout: 30000 }).should('not.exist');
cy.wait(6000);
// Удаляем все существующие ссылки
cy.get('body').then(($body) => {
if ($body.find('.delete_aud').length > 0) {
// Пока есть кнопки удаления - удаляем ссылки
const deleteLinks = () => {
// Находим первую кнопку удаления и кликаем по ней
cy.get('.delete_aud').first().click();
// Подтверждаем удаление
cy.get('#delete_OK').click();
// Проверяем, остались ли еще кнопки удаления
cy.get('body').then(($body) => {
if ($body.find('.delete_aud').length > 0) {
deleteLinks();
}
});
};
deleteLinks();
}
});
// Выбираем пол (М)
cy.contains('М').click();
// Генерируем случайный возраст от 1 до 99
const randomAge = Math.floor(Math.random() * 99) + 1;
// Вводим возраст
cy.get('input[placeholder="Введите возраст"]')
.type(randomAge.toString())
.should('have.value', randomAge.toString());
// Нажимаем кнопку Ок
cy.contains('Ок').click();
// Ждем появления ссылки и получаем её текст
cy.get('.link', { timeout: 30000 })
.should('be.visible')
.invoke('text')
.then((text) => {
// Исправляем домен в ссылке
const url = new URL(text);
url.hostname = 's.hbpn.link';
const correctUrl = url.toString();
// Переходим на страницу по исправленной ссылке
cy.visit(correctUrl);
// Проверяем содержимое страницы
cy.contains('Сочетание перестановки и размещения').should('exist');
});
});
});

@ -61,8 +61,6 @@ describe("Тестирование полей главной страницы",
cy.wait(500);
// cy.get('[data-cy="create-question"]').click();
cy.get(`[data-cy="select-questiontype-images"]`).click();
cy.get(
'[data-cy="checkbox-optional-question"] > .PrivateSwitchBase-input',
@ -115,8 +113,8 @@ describe("Тестирование полей главной страницы",
cy.visit(linkText);
});
cy.origin("https://hbpn.link", () => {
// <команды, направленные на https://hbpn.link, идут здесь>
cy.origin("https://s.hbpn.link", () => {
// <команды, направленные на https://s.hbpn.link, идут здесь>
cy.contains("p", "Заголовок заголовка").should("exist");
cy.wait(100);
cy.contains("p", "У нас тут какой-то текст").should("exist");

@ -22,7 +22,6 @@ describe("Тестирование полей вопросов", () => {
cy.get('[data-cy="setup-questions"]').click();
cy.wait(500);
// cy.get('[data-cy="create-question"]').click();
cy.get(`[data-cy="select-questiontype-images"]`).click();

@ -0,0 +1,141 @@
import "cypress-file-upload";
describe("Тест на появление страницы Результатов", () => {
beforeEach(() => {
cy.visit("http://localhost:3000");
cy.wait(1000);
cy.contains("Регистрация / Войти").click();
const login = "valid_user@exammple.com";
const password = "valid_password";
cy.get("#email").type(login);
cy.get("#password").type(password);
cy.get('button[type="submit"]').click();
});
it("Тест ", () => {
//создаём вопрос и выбираем стартовую страницу
cy.get('[data-cy="create-quiz"]').click();
cy.wait(1000);
cy.get('button[data-cy="create-quiz-card"]').eq(0).click();
cy.wait(1000);
cy.get('button[data-cy="select-quiz-layout-standard"]').click();
cy.get('input[type="checkbox"]').click();
cy.get('[data-cy="setup-questions"]').click();
cy.wait(500);
cy.get(`[data-cy="select-questiontype-images"]`).click();
cy.get(
'[data-cy="checkbox-optional-question"] > .PrivateSwitchBase-input',
).click();
cy.get("#questionTitle").type("Вопрос");
cy.get('[data-cy="quiz-variant-question-answer"]')
.eq(0)
.type("1")
.type("{enter}");
cy.get('[data-cy="quiz-variant-question-answer"]')
.eq(1)
.should("have.value", "")
.type("2");
cy.get('[data-cy="next-step"]').click();
//проверяем все поля на пустоту страницы результата
cy.get(`[data-cy="expand-question"]`).eq(0).click();
cy.wait(200);
cy.get("#after-the-contact-form").click();
cy.get("#heading-result").should("have.value", "");
cy.get("#headline-is-bolder").should("have.value", "");
cy.get("#heading-description").should("have.value", "");
cy.get(`[data-cy="add-button"]`).click();
cy.wait(200);
cy.get("#button-text-result").should("have.value", "");
cy.get("#link-page-result").should("have.value", "");
//перемещаемся на странице тестового просмотра
cy.visit("http://localhost:3000/view");
cy.get(".MuiFormControlLabel-label").contains("1").click();
cy.get("#buttonFurther").click();
cy.wait(1000);
cy.get("#name-input").type("Name");
cy.get("#email-input").type("valid_user@exammple.com");
cy.get("#phone-input").type("+2682585");
cy.get('input[type="checkbox"]').click();
cy.wait(200);
cy.get("#get-results").click();
//проверяем что страница результатов не отобразилась
cy.wait(2000);
cy.get("#find-out-more-button").should("not.exist");
//поселе чего заполняем все поля в результате
cy.visit("http://localhost:3000/edit");
cy.get("#heading-result").type("Результат");
cy.get("#headline-is-bolder").type("Заголовок пожирнее");
cy.get("#heading-description").type("Описание обычного заголовка");
cy.get(`[data-cy="add-button"]`).click();
cy.wait(200);
cy.get("#button-text-result").type("Узнать подробнее");
//переходим на страницу тестового просмотра
cy.visit("http://localhost:3000/view");
cy.get(".MuiFormControlLabel-label").contains("1").click();
cy.get("#buttonFurther").click();
cy.wait(1000);
cy.get("#name-input").type("Name");
cy.get("#email-input").type("valid_user@exammple.com");
cy.get("#phone-input").type("+2682585");
cy.get('input[type="checkbox"]').click();
cy.wait(200);
cy.get("#get-results").click();
cy.wait(2000);
cy.contains("p", "Заголовок пожирнее").should("exist");
//Переключаем показывания результата до формы контактов
cy.visit("http://localhost:3000/edit");
cy.get(`[data-cy="expand-question"]`).eq(0).click();
cy.wait(200);
cy.get("#before-contact-form").click();
cy.wait(2000);
cy.visit("http://localhost:3000/view");
cy.get(".MuiFormControlLabel-label").contains("1").click();
cy.get("#buttonFurther").click();
cy.wait(2000);
cy.contains("p", "Заголовок пожирнее").should("exist");
//тоже самое тольок теперь очищаем поля формы результатов
cy.visit("http://localhost:3000/edit");
cy.get("#heading-result").clear();
cy.get("#headline-is-bolder").clear();
cy.get("#heading-description").clear();
cy.get("#button-text-result").clear();
cy.visit("http://localhost:3000/view");
cy.get(".MuiFormControlLabel-label").contains("1").click();
cy.get("#buttonFurther").click();
cy.wait(2000);
cy.get("#find-out-more-button").should("not.exist");
});
});

@ -0,0 +1,28 @@
/// <reference types="cypress" />
declare global {
namespace Cypress {
interface Chainable {
login(): Chainable<void>
}
}
}
Cypress.Commands.add('login', () => {
// Пробуем перейти на страницу входа
cy.visit('/signin', {
timeout: 10000, // Увеличиваем таймаут до 10 секунд
failOnStatusCode: false // Не падаем при ошибках статуса
});
// Проверяем, что мы на странице входа
cy.url().should('include', '/signin');
// Вводим данные для входа
cy.get('#email', { timeout: 10000 }).should('be.visible').type('test@test.ru');
cy.get('#password', { timeout: 10000 }).should('be.visible').type('testtest');
cy.get('button[type="submit"]', { timeout: 10000 }).should('be.visible').click();
// Ждем успешного входа
cy.url().should('not.include', '/signin', { timeout: 10000 });
});

13
cypress/support/e2e.ts Normal file

@ -0,0 +1,13 @@
// Import commands.js using ES2015 syntax:
import './commands';
// Alternatively you can use CommonJS syntax:
// require('./commands')
declare global {
namespace Cypress {
interface Chainable {
login(): Chainable<void>
}
}
}

@ -0,0 +1,7 @@
services:
squiz:
container_name: squiz
restart: unless-stopped
image: gitea.pena/squiz/frontpanel/main:$GITHUB_RUN_NUMBER
hostname: squiz
tty: true

@ -2,12 +2,6 @@ services:
squiz:
container_name: squiz
restart: unless-stopped
image: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG.$CI_PIPELINE_ID
networks:
- marketplace_penahub_frontend
image: gitea.pena/squiz/frontpanel/staging:$GITHUB_RUN_NUMBER
hostname: squiz
tty: true
networks:
marketplace_penahub_frontend:
external: true

15
jest.config.js Normal file

@ -0,0 +1,15 @@
module.exports = {
transformIgnorePatterns: [
'/node_modules/(?!(@frontend/kitui|@frontend/squzanswerer)/)'
],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@utils/(.*)$': '<rootDir>/src/utils/$1',
'^@assets/(.*)$': '<rootDir>/src/assets/$1'
},
setupFilesAfterEnv: ['<rootDir>/src/setupTests.ts'],
testEnvironment: 'jsdom',
transform: {
'^.+\\.(ts|tsx)$': 'ts-jest'
}
};

20860
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

@ -6,9 +6,11 @@
"@craco/craco": "^7.0.0",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@frontend/kitui": "^1.0.55",
"@frontend/kitui": "^1.0.108",
"@frontend/squzanswerer": "^1.0.57",
"@mui/icons-material": "^5.10.14",
"@mui/material": "^5.10.14",
"@mui/x-charts": "^6.19.5",
"@mui/x-date-pickers": "^6.16.1",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
@ -17,25 +19,27 @@
"@types/file-saver": "^2.0.5",
"@types/jest": "^27.0.1",
"@types/node": "^16.7.13",
"@types/react": "^18.0.0",
"@types/react": "^18.2.55",
"@types/react-dnd": "^3.0.2",
"@types/react-dom": "^18.0.0",
"@types/react-dom": "^18.2.19",
"@types/react-slick": "^0.23.13",
"axios": "^1.5.1",
"cypress-file-upload": "^5.0.8",
"country-flag-emoji-polyfill": "^0.1.8",
"cytoscape": "^3.26.0",
"cytoscape-popper": "^2.0.0",
"date-fns": "^3.0.6",
"dayjs": "^1.11.10",
"emoji-mart": "^5.5.2",
"emoji-mart": "^5.6.0",
"file-saver": "^2.0.5",
"formik": "^2.4.5",
"html-to-image": "^1.11.11",
"immer": "^10.0.3",
"jszip": "^3.10.1",
"moment": "^2.30.1",
"nanoid": "^5.0.3",
"notistack": "^3.0.1",
"react": "^18.2.0",
"react-beautiful-dnd": "^13.1.1",
"react-colorful": "^5.6.1",
"react-cytoscapejs": "^2.0.0",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
@ -44,10 +48,15 @@
"react-error-boundary": "^4.0.11",
"react-image-crop": "^10.1.5",
"react-image-file-resizer": "^0.4.8",
"react-lazily": "^0.9.2",
"react-rnd": "^10.4.1",
"react-router-dom": "^6.6.2",
"react-scripts": "5.0.1",
"react-slick": "^0.29.0",
"slick-carousel": "^1.8.1",
"swiper": "^11.1.4",
"swr": "^2.2.4",
"transliteration": "^2.3.5",
"typescript": "^5.2.2",
"use-debounce": "^9.0.4",
"web-vitals": "^2.1.0",
@ -59,9 +68,10 @@
"build": "craco build",
"test": "craco test",
"eject": "craco eject",
"code:format": "prettier --write --ignore-unknown",
"prepare": "husky install",
"cypress:open": "cypress open",
"code:format": "prettier ./src --write --ignore-unknown",
"prepare": "husky install"
"cypress:run": "cypress run"
},
"browserslist": {
"production": [
@ -76,18 +86,30 @@
]
},
"devDependencies": {
"@emoji-mart/data": "^1.1.2",
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@types/cytoscape-popper": "^2.0.4",
"@types/react-beautiful-dnd": "^13.1.4",
"@types/react-cytoscapejs": "^1.2.4",
"craco-alias": "^3.0.1",
"cypress": "^13.6.1",
"husky": "^8.0.3",
"lint-staged": "^15.2.0",
"prettier": "^3.1.1"
},
"lint-staged": {
"**/*": "yarn code:format"
},
"prettier": {
"semi": true,
"trailingComma": "es5",
"singleQuote": false,
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"endOfLine": "auto",
"bracketSpacing": true,
"arrowParens": "always",
"jsxSingleQuote": false,
"singleAttributePerLine": true
}
}

@ -1,12 +0,0 @@
{
"semi": true,
"trailingComma": "es5",
"singleQuote": false,
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"endOfLine": "auto",
"bracketSpacing": true,
"arrowParens": "always",
"jsxSingleQuote": false
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

71
public/favicon.svg Normal file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="43.585045"
height="39.566273"
viewBox="0 0 63.268614 57.700814"
fill="none"
version="1.1"
id="svg8"
sodipodi:docname="favicon.svg"
inkscape:export-filename="favicon.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview8"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showguides="true" />
<g
clip-path="url(#clip0_316_1239)"
id="g8"
transform="translate(-1.6513393,-3.2563442)">
<g
id="g9"
transform="translate(0.27803262,-0.00871564)">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M 25.9138,3.31956 C 18.594,2.47167 13.5439,10.3345 8.84663,16.0182 4.72431,21.0062 1.6549,26.6402 1.29838,33.1042 0.919075,39.9813 2.16658,47.1435 6.85174,52.1873 11.6777,57.3827 18.9068,60.6653 25.9138,59.604 32.3391,58.6308 35.1822,51.5749 39.9658,47.1716 45.16,42.3905 54.837,40.1668 54.7027,33.1042 54.5683,26.0308 44.3552,24.6463 39.441,19.5621 34.3509,14.2959 33.1853,4.16185 25.9138,3.31956 Z"
fill="#7e2aea"
id="path1" />
<circle
cx="44.125999"
cy="56.918098"
r="4.0390601"
fill="#7e2aea"
id="circle1" />
<circle
cx="40.086498"
cy="12.1038"
r="1.53869"
fill="#7e2aea"
id="circle2" />
<path
d="m 64.699,31.4509 c -0.4487,-4.3618 -2.5007,-8.4017 -5.7585,-11.3366 -3.2577,-2.9349 -7.4891,-4.5558 -11.8739,-4.5485 -0.6225,3e-4 -1.2446,0.0329 -1.8638,0.0976 -4.3599,0.4578 -8.3958,2.5137 -11.3293,5.7713 -2.9336,3.2577 -4.557,7.4861 -4.5571,11.8699 v 0 25.3412 h 7.6024 v -10.77 c 2.9724,2.0679 6.5079,3.1735 10.1288,3.1676 0.6226,-2e-4 1.2447,-0.0327 1.8639,-0.0975 2.3167,-0.2435 4.5629,-0.9409 6.6101,-2.0525 2.0472,-1.1116 3.8555,-2.6155 5.3215,-4.4259 1.466,-1.8104 2.5611,-3.8918 3.2227,-6.1254 0.6616,-2.2336 0.8767,-4.5757 0.6332,-6.8924 z m -9.764,8.2359 c -0.8351,1.0374 -1.8677,1.8988 -3.038,2.5343 -1.1704,0.6355 -2.4552,1.0325 -3.78,1.168 -0.3553,0.0369 -0.7122,0.0555 -1.0694,0.0558 -2.2991,-0.0021 -4.5293,-0.7858 -6.3243,-2.2224 -1.7951,-1.4366 -3.0484,-3.4408 -3.5544,-5.6836 -0.5059,-2.2428 -0.2343,-4.5909 0.7702,-6.6591 1.0045,-2.0681 2.6822,-3.7333 4.7578,-4.7222 2.0756,-0.9889 4.4257,-1.2429 6.6647,-0.7202 2.2389,0.5228 4.2336,1.7911 5.6567,3.5969 1.4231,1.8058 2.19,4.0417 2.1749,6.3408 -0.0151,2.2991 -0.8114,4.5248 -2.2582,6.3117 z"
fill="#000000"
id="path2" />
</g>
</g>
<defs
id="defs8">
<clipPath
id="clip0_316_1239">
<rect
width="179.509"
height="69.487198"
fill="#ffffff"
id="rect8"
x="0"
y="0" />
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
public/favicon192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
public/favicon512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@ -2,19 +2,192 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<title>Pena Quiz</title>
<meta
name="description"
content="Веб-сервис с инструментами для повышения эффективности маркетологов."
/>
<meta
name="keywords"
content=" Экосистема маркетинговых инструментов,
Инструменты для социальных исследований,
Малый бизнес,
Маркетинговые инструменты,
Социальные исследования,
Бизнес-инструменты,
Исследование рынка,
Аналитика бизнеса,
Онлайн-маркетинг,
Исследования рынка,
Продвижение бизнеса,
Реклама и маркетинг,
Управление проектами,
Автоматизация процессов,
Оптимизация бюджета,
Планирование стратегии,
Оценка эффективности,
Анализ данных,
Улучшение результатов,
Увеличение прибыли,
Повышение конкурентоспособности "
/>
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" sizes="any" />
<!-- 32×32 -->
<link rel="icon" href="%PUBLIC_URL%/favicon.svg" type="image/svg+xml" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/favicon.png" />
<!-- 180×180 -->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<meta http-equiv="Pragma" content="no-cache" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600&display=swap"
rel="stylesheet"
/>
<title>Pena Quiz</title>
<!-- Yandex.Metrika counter -->
<script type="text/javascript">
(function (m, e, t, r, i, k, a) {
m[i] =
m[i] ||
function () {
(m[i].a = m[i].a || []).push(arguments);
};
m[i].l = 1 * new Date();
for (var j = 0; j < document.scripts.length; j++) {
if (document.scripts[j].src === r) {
return;
}
}
(k = e.createElement(t)),
(a = e.getElementsByTagName(t)[0]),
(k.async = 1),
(k.src = r),
a.parentNode.insertBefore(k, a);
})(
window,
document,
"script",
"https://mc.yandex.ru/metrika/tag.js",
"ym",
);
const domain = location.hostname;
if (domain === "quiz.pena.digital") {
ym(96979576, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true,
});
// <!-- Top.Mail.Ru counter -->
var _tmr = window._tmr || (window._tmr = []);
_tmr.push({
id: "3513005",
type: "pageView",
start: new Date().getTime(),
});
(function (d, w, id) {
if (d.getElementById(id)) return;
var ts = d.createElement("script");
ts.type = "text/javascript";
ts.async = true;
ts.id = id;
ts.src = "https://top-fwz1.mail.ru/js/code.js";
var f = function () {
var s = d.getElementsByTagName("script")[0];
s.parentNode.insertBefore(ts, s);
};
if (w.opera == "[object Opera]") {
d.addEventListener("DOMContentLoaded", f, false);
} else {
f();
}
})(document, window, "tmr-code");
// <!-- /Top.Mail.Ru counter -->
}
if (domain === "squiz.pena.digital") {
ym(96979625, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true,
});
}
if (domain === "penaquiz.online" || domain === "penaquiz.ru") {
ym(97241101, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true,
});
}
</script>
<noscript>
<div>
<img
src="https://mc.yandex.ru/watch/96979576"
style="position: absolute; left: -9999px"
alt=""
/>
</div>
<div>
<img
src="https://mc.yandex.ru/watch/96979625"
style="position: absolute; left: -9999px"
alt=""
/>
</div>
<div>
<img
src="https://mc.yandex.ru/watch/97241101"
style="position: absolute; left: -9999px"
alt=""
/>
</div>
<div>
<img
src="https://top-fwz1.mail.ru/counter?id=3513005;js=na"
style="position: absolute; left: -9999px"
alt="Top.Mail.Ru"
/>
</div>
</noscript>
<!-- /Yandex.Metrika counter -->
<script>
let params = new URLSearchParams(document.location.search);
console.log(params.get("debug"))
if (params.get("debug")) {
console.log(
"mhgfhdhfjhffhfhjfghjgf"
)
let scriptTag = document.createElement('script');
scriptTag.setAttribute('src', "https://markknol.github.io/console-log-viewer/console-log-viewer.js");
scriptTag.setAttribute('async', '');
document.getElementsByTagName("head")[0].append(scriptTag);
}
</script>
<script>
//Ждём время отображения сайта и оповещаем при выходе за рамки лимита.
const timeout = 25;
window.LoadingObserver = true;
setTimeout(() => {
if (window.LoadingObserver) fetch({
url: "https://squiz.pena.digital/heruvym/v1.0.0/create",
method: "POST",
body: JSON.stringify({ Title: "Error", Message: `Реакт приложение не отобразилось за ${timeout} секунд`, system: true })
});
}, timeout * 1000)
</script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>

23
public/manifest.json Executable file → Normal file

@ -1,23 +1,10 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"short_name": "PenaHub",
"name": "Pena Hub",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "android-chrome-192x192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "android-chrome-512x512.png",
"type": "image/png",
"sizes": "512x512"
}
],
{ "src": "/favicon192.png", "type": "image/png", "sizes": "192x192" },
{ "src": "/favicon512.png", "type": "image/png", "sizes": "512x512" }
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

@ -1,48 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="576.000000pt" height="576.000000pt" viewBox="0 0 576.000000 576.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,576.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1980 5475 c-206 -46 -387 -146 -578 -320 -83 -75 -199 -195 -272
-281 -48 -56 -136 -162 -155 -186 -39 -50 -211 -264 -215 -268 -4 -4 -155
-192 -188 -235 -19 -25 -131 -185 -164 -235 -46 -70 -131 -221 -161 -285 -37
-77 -75 -163 -85 -190 -6 -16 -17 -43 -23 -60 -7 -16 -13 -32 -14 -35 -2 -11
-27 -86 -32 -100 -3 -8 -8 -24 -10 -34 -2 -10 -12 -53 -23 -95 -10 -42 -21
-94 -25 -116 -3 -23 -8 -52 -10 -65 -28 -137 -27 -633 0 -798 3 -15 7 -43 10
-62 3 -19 8 -53 11 -75 7 -44 62 -265 76 -305 3 -8 16 -44 28 -80 107 -313
338 -619 641 -850 71 -55 243 -170 253 -170 3 0 28 -14 56 -30 28 -17 57 -30
65 -30 8 0 15 -4 15 -10 0 -5 9 -10 20 -10 11 0 20 -4 20 -9 0 -5 10 -11 23
-14 12 -3 65 -22 117 -42 136 -53 311 -95 465 -112 98 -11 321 -5 411 11 94
16 212 54 270 87 20 11 36 14 39 9 7 -12 684 -14 686 -2 1 4 2 169 2 368 l2
361 32 40 c87 106 95 114 117 107 12 -4 23 -10 26 -14 6 -8 147 -68 230 -98
323 -115 754 -107 1080 20 102 40 294 138 310 159 3 3 15 12 28 18 25 13 25
14 118 90 120 97 289 289 335 380 8 14 16 28 19 31 25 25 117 225 148 320 25
78 49 173 57 220 2 19 9 62 14 95 9 58 7 350 -3 407 -2 16 -7 47 -11 70 -21
133 -75 291 -151 443 -114 230 -275 416 -509 590 -84 62 -342 193 -359 182 -1
-1 -9 3 -17 10 -8 6 -41 19 -74 28 -185 51 -307 68 -485 67 -64 0 -131 -3
-150 -5 -19 -3 -57 -9 -85 -12 -39 -6 -225 -51 -280 -69 -43 -13 -187 -78
-231 -102 l-48 -27 -22 26 c-46 54 -154 244 -312 547 -94 181 -107 205 -114
208 -5 2 -8 8 -8 13 0 10 -79 140 -90 149 -4 3 -11 12 -16 21 -35 62 -167 197
-241 247 -72 48 -156 87 -208 98 -11 2 -31 7 -45 10 -55 14 -246 13 -310 -1z
m2295 -1799 c49 -5 125 -22 155 -34 8 -3 17 -6 20 -7 40 -14 157 -69 184 -87
202 -132 334 -305 395 -518 12 -41 26 -86 30 -100 8 -28 7 -276 -2 -325 -31
-171 -136 -372 -254 -488 -118 -116 -282 -209 -428 -243 -117 -27 -345 -37
-345 -15 0 5 44 35 98 66 96 58 322 203 332 214 3 3 28 24 55 45 75 59 176
165 220 231 40 61 88 174 100 235 9 46 10 187 2 225 -16 76 -20 90 -39 134
-42 94 -123 196 -223 281 -36 31 -184 134 -205 143 -8 4 -28 16 -45 26 -32 21
-153 88 -275 154 -41 22 -77 42 -79 44 -9 7 6 12 54 18 28 4 51 8 52 9 4 3
152 -3 198 -8z"/>
<path d="M3470 4818 c-28 -10 -80 -62 -81 -81 0 -7 -3 -24 -5 -39 -7 -40 19
-91 59 -122 28 -22 45 -27 79 -25 80 5 129 51 135 128 5 52 -18 98 -61 126
-30 20 -91 26 -126 13z"/>
<path d="M3759 967 c-149 -63 -230 -177 -232 -327 -2 -96 2 -114 36 -180 138
-265 520 -262 650 4 34 69 48 162 34 226 -28 127 -97 216 -207 267 -81 38
-204 43 -281 10z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

@ -1,19 +0,0 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

@ -1,104 +1,43 @@
import { clearAuthToken, getMessageFromFetchError, UserAccount, useUserFetcher } from "@frontend/kitui";
import type { OriginalUserAccount } from "@root/user";
import { clearUserData, setCustomerAccount, setUser, setUserAccount, useUserStore } from "@root/user";
import ContactFormModal from "@ui_kit/ContactForm";
import ImageCrop from "@ui_kit/Modal/ImageCrop";
import dayjs from "dayjs";
import "dayjs/locale/ru";
import FloatingSupportChat from "@ui_kit/FloatingSupportChat";
import PrivateRoute from "@ui_kit/PrivateRoute";
import { useAfterPay } from "@utils/hooks/useAutoPay";
import { useUserAccountFetcher } from "@utils/hooks/useUserAccountFetcher";
import { enqueueSnackbar } from "notistack";
import type { SuspenseProps } from "react";
import { lazy, Suspense } from "react";
import { lazily } from "react-lazily";
import { Navigate, Route, Routes, useLocation, useNavigate } from "react-router-dom";
import { useAmoAccount } from "./api/integration";
import ListPageDummy from "./components/Dummys/pageDummys/listPageDummy";
import "./index.css";
import OutdatedLink from "./pages/auth/OutdatedLink";
import RecoverPassword from "./pages/auth/RecoverPassword";
import { Restore } from "./pages/auth/Restore";
import SigninDialog from "./pages/auth/Signin";
import SignupDialog from "./pages/auth/Signup";
import { ViewPage } from "./pages/ViewPublicationPage";
import { DesignPage } from "./pages/DesignPage/DesignPage";
import {
Route,
Routes,
useLocation,
useNavigate,
Navigate,
} from "react-router-dom";
import "./index.css";
import ContactFormPage from "./pages/ContactFormPage/ContactFormPage";
import InstallQuiz from "./pages/InstallQuiz/InstallQuiz";
import { InfoPrivilege } from "./pages/InfoPrivilege";
import AmoTokenExpiredDialog from "./pages/IntegrationsPage/IntegrationsModal/Amo/AmoTokenExpiredDialog";
import Landing from "./pages/Landing/Landing";
import QuestionsPage from "./pages/Questions/QuestionsPage";
import { Result } from "./pages/ResultPage/Result";
import { ResultSettings } from "./pages/ResultPage/ResultSettings";
import MyQuizzesFull from "./pages/createQuize/MyQuizzesFull";
import Main from "./pages/main";
import EditPage from "./pages/startPage/EditPage";
import { Tariffs } from "./pages/Tariffs/Tariffs";
import {
clearAuthToken,
getMessageFromFetchError,
useUserFetcher,
UserAccount,
makeRequest,
devlog,
createUserAccount,
} from "@frontend/kitui";
import {
clearUserData,
setUser,
setUserAccount,
useUserStore,
} from "@root/user";
import { enqueueSnackbar } from "notistack";
import PrivateRoute from "@ui_kit/PrivateRoute";
import { ErrorBoundary } from "react-error-boundary";
import { Restore } from "./pages/startPage/Restore";
import { isAxiosError } from "axios";
import { useEffect, useLayoutEffect, useRef } from "react";
export function useUserAccountFetcher({
onError,
onNewUserAccount,
url,
userId,
}: {
url: string;
userId: string | null;
onNewUserAccount: (response: UserAccount) => void;
onError?: (error: any) => void;
}) {
const onNewUserAccountRef = useRef(onNewUserAccount);
const onErrorRef = useRef(onError);
useLayoutEffect(() => {
onNewUserAccountRef.current = onNewUserAccount;
onErrorRef.current = onError;
}, [onError, onNewUserAccount]);
useEffect(() => {
if (!userId) return;
const controller = new AbortController();
makeRequest<never, UserAccount>({
url,
contentType: true,
method: "GET",
useToken: true,
withCredentials: false,
signal: controller.signal,
})
.then((result) => {
devlog("User account", result);
onNewUserAccountRef.current(result);
})
.catch((error) => {
devlog("Error fetching user account", error);
if (isAxiosError(error) && error.response?.status === 404) {
createUserAccount(controller.signal, url.replace("get", "create"))
.then((result) => {
devlog("Created user account", result);
onNewUserAccountRef.current(result);
})
.catch((error) => {
devlog("Error creating user account", error);
onErrorRef.current?.(error);
});
} else {
onErrorRef.current?.(error);
}
});
return () => controller.abort();
}, [url, userId]);
}
dayjs.locale("ru");
const MyQuizzesFull = lazy(() => import("./pages/createQuize/MyQuizzesFull"));
const QuizGallery = lazy(() => import("./pages/createQuize/QuizGallery"));
const ViewPage = lazy(() => import("./pages/ViewPublicationPage"));
const Analytics = lazy(() => import("./pages/Analytics/Analytics"));
const EditPage = lazy(() => import("./pages/startPage/EditPage"));
const { Tariffs } = lazily(() => import("./pages/Tariffs/Tariffs"));
const { DesignPage } = lazily(() => import("./pages/DesignPage/DesignPage"));
const { IntegrationsPage } = lazily(() => import("./pages/IntegrationsPage/IntegrationsPage"));
const { QuizAnswersPage } = lazily(() => import("./pages/QuizAnswersPage/QuizAnswersPage"));
const ChatImageNewWindow = lazy(() => import("@ui_kit/FloatingSupportChat/ChatImageNewWindow"));
const PersonalizationAI = lazy(() => import("./pages/PersonalizationAI/PersonalizationAI"));
let params = new URLSearchParams(document.location.search);
const isTest = Boolean(params.get("test"))
const routeslink = [
{
@ -115,15 +54,34 @@ const routeslink = [
sidebar: true,
footer: true,
},
{
path: "/integrations",
page: IntegrationsPage,
header: true,
sidebar: true,
footer: true,
},
{
path: "/personalization-ai",
page: PersonalizationAI,
header: true,
sidebar: true,
},
] as const;
const LazyLoading = ({ children, fallback }: SuspenseProps) => (
<Suspense fallback={fallback ?? <></>}>{children}</Suspense>
);
export default function App() {
window.LoadingObserver = false;
const userId = useUserStore((state) => state.userId);
const location = useLocation();
const navigate = useNavigate();
const { data: amoAccount } = useAmoAccount();
useUserFetcher({
url: `https://hub.pena.digital/user/${userId}`,
url: `${process.env.REACT_APP_DOMAIN}/user/${userId}`,
userId,
onNewUser: setUser,
onError: (error) => {
@ -136,8 +94,23 @@ export default function App() {
},
});
useUserAccountFetcher({
url: "https://squiz.pena.digital/squiz/account/get",
useUserAccountFetcher<UserAccount>({
url: `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1/account`,
userId,
onNewUserAccount: setCustomerAccount,
onError: (error) => {
const errorMessage = getMessageFromFetchError(error);
if (errorMessage) {
enqueueSnackbar(errorMessage);
clearUserData();
clearAuthToken();
navigate("/signin");
}
},
});
useUserAccountFetcher<OriginalUserAccount>({
url: `${process.env.REACT_APP_DOMAIN}/squiz/account/get`,
userId,
onNewUserAccount: setUserAccount,
onError: (error) => {
@ -151,6 +124,8 @@ export default function App() {
},
});
useAfterPay();
if (location.state?.redirectTo)
return (
<Navigate
@ -162,53 +137,148 @@ export default function App() {
return (
<>
{amoAccount && <AmoTokenExpiredDialog isAmoTokenExpired={amoAccount.stale} />}
<ContactFormModal />
{!isTest && <FloatingSupportChat />}
{location.state?.backgroundLocation && (
<Routes>
<Route path="/signin" element={<SigninDialog />} />
<Route path="/signup" element={<SignupDialog />} />
<Route path="/restore" element={<Restore />} />
<Route
path="/signin"
element={<SigninDialog />}
/>
<Route
path="/signup"
element={<SignupDialog />}
/>
<Route
path="/recover"
element={<Restore />}
/>
<Route
path="/changepwd"
element={<RecoverPassword />}
/>
<Route
path="/changepwd/expired"
element={<OutdatedLink />}
/>
</Routes>
)}
<Routes location={location.state?.backgroundLocation || location}>
<Route path="/" element={<Landing />} />
{/* <Route
<Route
path="/"
element={<Landing />}
/>
<Route
path="/signin"
element={
<Navigate to="/" replace state={{ redirectTo: "/signin" }} />
<Navigate
to="/"
replace
state={{ redirectTo: "/signin" }}
/>
}
/>
<Route
path="/signup"
element={
<Navigate to="/" replace state={{ redirectTo: "/signup" }} />
<Navigate
to="/"
replace
state={{ redirectTo: "/signup" }}
/>
}
/>
<Route
path="/restore"
path="/recover"
element={
<Navigate to="/" replace state={{ redirectTo: "/restore" }} />
<Navigate
to="/"
replace
state={{ redirectTo: "/recover" }}
/>
}
/>
<Route path="/list" element={<MyQuizzesFull />} />
<Route path={"/view"} element={<ViewPage />} />
<Route path={"/tariffs"} element={<Tariffs />} />
<Route
path="/changepwd"
element={
<Navigate
to="/"
replace
state={{
redirectTo: window.location.pathname + window.location.search,
}}
/>
}
/>
<Route
path="/changepwd/expired"
element={
<Navigate
to="/"
replace
state={{ redirectTo: "/changepwd/expired" }}
/>
}
/>
<Route
path="/gallery"
element={<LazyLoading children={<QuizGallery />} />}
/>
<Route
path="/list"
element={
<LazyLoading
children={<MyQuizzesFull />}
fallback={<ListPageDummy />}
/>
}
/>
<Route
path={"/view/:quizId"}
element={<LazyLoading children={<ViewPage />} />}
/>
<Route
path={"/tariffs"}
element={<LazyLoading children={<Tariffs />} />}
/>
<Route
path={"/analytics"}
element={<LazyLoading children={<Analytics />} />}
/>
<Route
path={"/results/:quizId"}
element={<LazyLoading children={<QuizAnswersPage />} />}
/>
<Route
path={"/qaz"}
element={<LazyLoading children={<InfoPrivilege />} />}
/>
<Route
path={"/image/:srcImage"}
element={<ChatImageNewWindow />}
/>
<Route element={<PrivateRoute />}>
{routeslink.map((e, i) => (
<Route
key={i}
path={e.path}
element={
<Main
Page={e.page}
header={e.header}
sidebar={e.sidebar}
footer={e.footer}
<LazyLoading
children={
<Main
Page={e.page}
header={e.header}
sidebar={e.sidebar}
footer={e.footer}
/>
}
/>
}
/>
))}
</Route> */}
</Route>
</Routes>
</>
);

108
src/api/auditory.ts Normal file

@ -0,0 +1,108 @@
import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@utils/parse-error";
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`;
// Types
export interface AuditoryItem {
id: number;
quiz_id: number;
sex: number; // 0 - женский, 1 - мужской, 2 - оба
age: string;
deleted: boolean;
created_at: number;
}
export interface AuditoryResponse {
ID: number;
quiz_id: number;
sex: number;
age: string;
deleted: boolean;
created_at: number;
}
// Request Types
export interface AuditoryGetRequest {
quizId: number;
}
export interface AuditoryDeleteRequest {
id: number;
}
export interface AuditoryAddRequest {
sex: number;
age: string;
}
// Parameters
export interface AuditoryGetParams {
quizId: number;
}
export interface AuditoryDeleteParams {
quizId: number;
auditoryId: number;
}
export interface AuditoryAddParams {
quizId: number;
body: AuditoryAddRequest;
}
// API calls
export const auditoryGet = async ({ quizId }: AuditoryGetParams): Promise<[AuditoryItem[] | null, string?]> => {
if (!quizId) {
return [null, "Quiz ID is required"];
}
try {
const response = await makeRequest<AuditoryGetRequest, AuditoryItem[]>({
url: `${API_URL}/quiz/${quizId}/auditory`,
method: "GET",
});
return [response];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить аудиторию. ${error}`];
}
};
export const auditoryDelete = async ({ quizId, auditoryId }: AuditoryDeleteParams): Promise<[AuditoryResponse | null, string?]> => {
if (!quizId || !auditoryId) {
return [null, "Quiz ID and Auditory ID are required"];
}
try {
const response = await makeRequest<AuditoryDeleteRequest, AuditoryResponse>({
url: `${API_URL}/quiz/${quizId}/auditory/${auditoryId}`,
method: "DELETE",
});
return [response];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось удалить аудиторию. ${error}`];
}
};
export const auditoryAdd = async ({ quizId, body }: AuditoryAddParams): Promise<[AuditoryResponse | null, string?]> => {
if (!quizId) {
return [null, "Quiz ID is required"];
}
try {
const response = await makeRequest<AuditoryAddRequest, AuditoryResponse>({
url: `${API_URL}/quiz/${quizId}/auditory`,
body,
method: "POST",
});
return [response];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось добавить аудиторию. ${error}`];
}
};

@ -1,4 +1,6 @@
import { makeRequest } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type {
LoginRequest,
@ -6,24 +8,24 @@ import type {
RegisterRequest,
RegisterResponse,
} from "@frontend/kitui";
import { parseAxiosError } from "../utils/parse-error";
const apiUrl =
process.env.NODE_ENV === "production"
? "/auth"
: "https://squiz.pena.digital/auth";
type RecoverResponse = {
message: string;
};
export async function register(
const API_URL = `${process.env.REACT_APP_DOMAIN}/auth`;
export const register = async (
login: string,
password: string,
phoneNumber: string,
): Promise<[RegisterResponse | null, string?]> {
): Promise<[RegisterResponse | null, string?]> => {
try {
const registerResponse = await makeRequest<
RegisterRequest,
RegisterResponse
>({
url: apiUrl + "/register",
url: `${API_URL}/register`,
body: { login, password, phoneNumber },
useToken: false,
withCredentials: true,
@ -32,18 +34,19 @@ export async function register(
return [registerResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
console.error(error)
return [null, `Не удалось зарегестрировать аккаунт. ${error}`];
}
}
};
export async function login(
export const login = async (
login: string,
password: string,
): Promise<[LoginResponse | null, string?]> {
): Promise<[LoginResponse | null, string?]> => {
try {
const loginResponse = await makeRequest<LoginRequest, LoginResponse>({
url: apiUrl + "/login",
url: `${API_URL}/login`,
body: { login, password },
useToken: false,
withCredentials: true,
@ -55,13 +58,13 @@ export async function login(
return [null, `Не удалось войти. ${error}`];
}
}
};
export async function logout(): Promise<[unknown, string?]> {
export const logout = async (): Promise<[void | null, string?]> => {
try {
const logoutResponse = await makeRequest<never, void>({
url: apiUrl + "/logout",
method: "POST",
url: `${API_URL}/logout`,
useToken: true,
withCredentials: true,
});
@ -72,4 +75,30 @@ export async function logout(): Promise<[unknown, string?]> {
return [null, `Не удалось выйти. ${error}`];
}
}
};
export const recover = async (
email: string,
): Promise<[RecoverResponse | null, string?]> => {
try {
const formData = new FormData();
formData.append("email", email);
formData.append(
"RedirectionURL",
`${process.env.REACT_APP_DOMAIN}/changepwd`,
);
const recoverResponse = await makeRequest<FormData, RecoverResponse>({
url: `${process.env.REACT_APP_DOMAIN}/codeword/recover`,
body: formData,
useToken: false,
withCredentials: true,
});
return [recoverResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось восстановить пароль. ${error}`];
}
};

63
src/api/cart.ts Normal file

@ -0,0 +1,63 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type { UserAccount } from "@frontend/kitui";
const API_URL = `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1/cart`;
const payCart = async (): Promise<[UserAccount | null, string?]> => {
try {
const payCartResponse = await makeRequest<never, UserAccount>({
method: "POST",
url: `${API_URL}/pay`,
useToken: true,
});
return [payCartResponse];
} catch (nativeError) {
const error = parseAxiosError(nativeError);
return [null, `Не удалось оплатить товар из корзины. ${error}`];
}
};
const addCartItem = async (
id: string,
): Promise<[UserAccount | null, string?]> => {
try {
const addedItem = await makeRequest<never, UserAccount>({
method: "PATCH",
url: `${API_URL}?id=${id}`,
});
return [addedItem];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось добавить товар в корзину. ${error}`];
}
};
const deleteCartItem = async (
id: string,
): Promise<[UserAccount | null, string?]> => {
try {
const deletedItem = await makeRequest<never, UserAccount>({
method: "DELETE",
url: `${API_URL}?id=${id}`,
});
return [deletedItem];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось удалить товар из корзины. ${error}`];
}
};
export const cartApi = {
pay: payCart,
add: addCartItem,
delete: deleteCartItem,
};

@ -1,19 +1,31 @@
import axios from "axios";
import { makeRequest } from "@api/makeRequest";
const domen =
window.location.hostname === "localhost"
? "squiz.pena.digital"
: window.location.hostname;
import { parseAxiosError } from "@utils/parse-error";
export function sendContactFormRequest(body: {
const API_URL = `${process.env.REACT_APP_DOMAIN}/feedback`;
type SendContactFormBody = {
contact: string;
whoami: string;
}) {
return axios(`https://${domen}/feedback/callme`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
data: body,
});
}
};
export const sendContactFormRequest = async (
body: SendContactFormBody,
): Promise<[unknown | null, string?, number?]> => {
try {
const sendContactFormResponse = await makeRequest<
SendContactFormBody,
unknown
>({
method: "POST",
url: `${API_URL}/callme`,
body,
});
return [sendContactFormResponse];
} catch (nativeError) {
const [error, status] = parseAxiosError(nativeError);
return [null, `Не удалось отправить контакты. ${error}`, status];
}
};

24
src/api/discounts.ts Normal file

@ -0,0 +1,24 @@
import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@utils/parse-error";
import type { Discount } from "@model/discounts";
const API_URL = `${process.env.REACT_APP_DOMAIN}/price/discount`;
export const getDiscounts = async (
userId: string,
): Promise<[Discount[] | null, string?]> => {
try {
const { Discounts } = await makeRequest<never, { Discounts: Discount[] }>({
method: "GET",
url: `${API_URL}/user/${userId}`,
});
return [Discounts];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить скидки. ${error}`];
}
};

380
src/api/integration.ts Normal file

@ -0,0 +1,380 @@
import { QuestionKeys } from "@/pages/IntegrationsPage/IntegrationsModal/Amo/types";
import { makeRequest } from "@api/makeRequest";
import { useToken } from "@frontend/kitui";
import { parseAxiosError } from "@utils/parse-error";
import useSWR from "swr";
export type PaginationRequest = {
page: number;
size: number;
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz/amocrm`;
// получение информации об аккаунте
export type AccountResponse = {
id: number;
accountID: string;
amoID: number;
name: string;
deleted: boolean;
createdAt: string;
subdomain: string;
country: string;
driveURL: string;
stale: boolean;
};
export const getAccount = async (): Promise<[AccountResponse | null, string?]> => {
try {
const response = await makeRequest<void, AccountResponse>({
method: "GET",
url: `${API_URL}/account`,
useToken: true,
});
return [response];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, ""];
// return [null, `Не удалось получить информацию об аккаунте. ${error}`];
}
};
export function useAmoAccount() {
const token = useToken();
return useSWR(token ? "amoAccount" : null, () =>
makeRequest<void, AccountResponse>({
method: "GET",
url: `${API_URL}/account`,
useToken: true,
})
);
}
// подключить Amo
export const connectAmo = async (): Promise<[string | null, string?]> => {
try {
const response = await makeRequest<void, { link: string }>({
method: "POST",
url: `${API_URL}/account`,
useToken: true,
withCredentials: true,
});
return [response.link];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось подключить аккаунт. ${error}`];
}
};
// получение токена
export type TokenPair = {
accessToken: string;
refreshToken: string;
};
export const getTokens = async (): Promise<[TokenPair | null, string?]> => {
try {
const response = await makeRequest<void, TokenPair>({
method: "GET",
url: `${API_URL}/webhook/create`,
useToken: true,
});
return [response];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Failed to get tokens. ${error}`];
}
};
//получение списка тегов
export type Tag = {
ID: number;
AmoID: number;
AccountID: number;
Entity: string;
Name: string;
Color: string;
Deleted: boolean;
CreatedAt: number;
};
export type TagsResponse = {
count: number;
items: Tag[];
};
export const getTags = async ({ page, size }: PaginationRequest): Promise<[TagsResponse | null, string?]> => {
try {
const tagsResponse = await makeRequest<PaginationRequest, TagsResponse>({
method: "GET",
url: `${API_URL}/tags?page=${page}&size=${size}`,
});
return [tagsResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список тегов. ${error}`];
}
};
//получение списка пользователей
export type User = {
id: number;
amoID: number;
name: string;
email: string;
role: number;
group: number;
deleted: boolean;
createdAt: string;
amoUserID: number;
// Subdomain: string;
// AccountID: string;
};
export type UsersResponse = {
count: number;
items: User[];
};
export const getUsers = async ({ page, size }: PaginationRequest): Promise<[UsersResponse | null, string?]> => {
try {
const usersResponse = await makeRequest<PaginationRequest, UsersResponse>({
method: "GET",
url: `${API_URL}/users?page=${page}&size=${size}`,
});
return [usersResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список пользователей. ${error}`];
}
};
//получение списка шагов
export type Step = {
ID: number;
AmoID: number;
PipelineID: number;
AccountID: number;
Name: string;
Color: string;
Deleted: boolean;
CreatedAt: number;
};
export type StepsResponse = {
count: number;
items: Step[];
};
export const getSteps = async ({
page,
size,
pipelineId,
}: PaginationRequest & { pipelineId: number }): Promise<[StepsResponse | null, string?]> => {
try {
const stepsResponse = await makeRequest<PaginationRequest & { pipelineId: number }, StepsResponse>({
method: "GET",
url: `${API_URL}/steps?page=${page}&size=${size}&pipelineID=${pipelineId}`,
});
return [stepsResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список шагов. ${error}`];
}
};
//получение списка воронок
export type Pipeline = {
ID: number;
AmoID: number;
AccountID: number;
Name: string;
IsArchive: boolean;
Deleted: boolean;
CreatedAt: number;
};
export type PipelinesResponse = {
count: number;
items: Pipeline[];
};
export const getPipelines = async ({ page, size }: PaginationRequest): Promise<[PipelinesResponse | null, string?]> => {
try {
const pipelinesResponse = await makeRequest<PaginationRequest, PipelinesResponse>({
method: "GET",
url: `${API_URL}/pipelines?page=${page}&size=${size}`,
});
return [pipelinesResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список воронок. ${error}`];
}
};
//получение настроек интеграции
export type QuestionID = Record<string, number>;
export type IntegrationRules = {
PipelineID: number;
StepID: number;
PerformerID?: number;
FieldsRule: FieldsRule;
TagsToAdd: {
Lead: number[] | null;
Contact: number[] | null;
Company: number[] | null;
Customer: number[] | null;
};
};
export type FieldsRule = Record<Partial<QuestionKeys>, null | [{ QuestionID: QuestionID }]>;
export const getIntegrationRules = async (quizID: string): Promise<[IntegrationRules | null, string?]> => {
try {
const settingsResponse = await makeRequest<void, IntegrationRules>({
method: "GET",
url: `${API_URL}/rules/${quizID}`,
});
return [settingsResponse || null];
} catch (nativeError) {
if (nativeError.response.status === 404) return [null, "first"];
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить настройки интеграции. ${error}`];
}
};
//обновление настроек интеграции
export type IntegrationRulesUpdate = {
PerformerID: number;
PipelineID: number;
StepID: number;
Utms: number[];
FieldsRule: {
Lead: { QuestionID: number }[];
Contact: { ContactRuleMap: string }[];
Company: { QuestionID: number }[];
Customer: { QuestionID: number }[];
};
};
export const setIntegrationRules = async (
quizID: string,
settings: IntegrationRulesUpdate
): Promise<[string | null, string?]> => {
try {
const updateResponse = await makeRequest<IntegrationRulesUpdate, string>({
method: "POST",
url: `${API_URL}/rules/${quizID}`,
body: settings,
});
return [updateResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Failed to update integration settings. ${error}`];
}
};
export const updateIntegrationRules = async (
quizID: string,
settings: IntegrationRulesUpdate
): Promise<[string | null, string?]> => {
try {
const updateResponse = await makeRequest<IntegrationRulesUpdate, string>({
method: "PATCH",
url: `${API_URL}/rules/${quizID}`,
body: settings,
});
return [updateResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Failed to update integration settings. ${error}`];
}
};
// Получение кастомных полей
export type CustomField = {
ID: number;
AmoID: number;
Code: string;
AccountID: number;
Name: string;
EntityType: string;
Type: string;
Deleted: boolean;
CreatedAt: number;
};
export type Field = {
ID: number;
AmoID: number;
Code: string;
AccountID: number;
Name: string;
Entity: string;
Type: string;
Deleted: boolean;
CreatedAt: number;
};
export type CustomFieldsResponse = {
count: number;
items: CustomField[];
};
export type FieldsResponse = {
count: number;
items: Field[];
};
export const getCustomFields = async (
pagination: PaginationRequest
): Promise<[CustomFieldsResponse | null, string?]> => {
try {
const customFieldsResponse = await makeRequest<PaginationRequest, CustomFieldsResponse>({
method: "GET",
url: `${API_URL}/fields?page=${pagination.page}&size=${pagination.size}`,
});
return [customFieldsResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список кастомных полей. ${error}`];
}
};
//Отвязать аккаунт амо от публикации
export const removeAmoAccount = async (): Promise<[void | null, string?]> => {
try {
await makeRequest<void>({
method: "DELETE",
url: `${API_URL}/account`,
});
return [null, ""];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось отвязать аккаунт. ${error}`];
}
};
export const getFields = async (pagination: PaginationRequest): Promise<[FieldsResponse | null, string?]> => {
try {
const fieldsResponse = await makeRequest<PaginationRequest, FieldsResponse>({
method: "GET",
url: `${API_URL}/fields?page=${pagination.page}&size=${pagination.size}`,
});
return [fieldsResponse, ""];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список полей. ${error}`];
}
};

55
src/api/makeRequest.ts Normal file

@ -0,0 +1,55 @@
import * as KIT from "@frontend/kitui";
import { Method, ResponseType, AxiosError } from "axios";
import { redirect } from "react-router-dom";
import { clearAuthToken } from "@frontend/kitui";
import { cleanAuthTicketData } from "@root/ticket";
import { clearUserData } from "@root/user";
import { clearQuizData } from "@root/quizes/store";
import type { AxiosResponse } from "axios";
import { selectSendingMethod } from "@/ui_kit/FloatingSupportChat/utils";
interface MakeRequest {
method?: Method | undefined;
url: string;
body?: unknown;
useToken?: boolean | undefined;
contentType?: boolean | undefined;
responseType?: ResponseType | undefined;
signal?: AbortSignal | undefined;
withCredentials?: boolean | undefined;
}
type ExtendedAxiosResponse = AxiosResponse & { message: string };
export const makeRequest = async <TRequest = unknown, TResponse = unknown>(
data: MakeRequest,
): Promise<TResponse> => {
try {
const response = await KIT.makeRequest<unknown, TResponse>(data);
return response;
} catch (nativeError) {
const error = nativeError as AxiosError;
// if (window.location.hostname !== 'localhost') selectSendingMethod({
// messageField: `status: ${error.response?.status}. Message ${(error.response?.data as ExtendedAxiosResponse)?.message}`,
// isSnackbar: false,
// systemError: true
// });
if (
error.response?.status === 400 &&
(error.response?.data as ExtendedAxiosResponse)?.message ===
"refreshToken is empty"
) {
cleanAuthTicketData();
clearAuthToken();
clearUserData();
clearQuizData();
redirect("/");
}
throw nativeError;
}
};

30
src/api/promocode.ts Normal file

@ -0,0 +1,30 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
type ActivatePromocodeRequest = { codeword: string } | { fastLink: string };
type ActivatePromocodeResponse = { greetings: string };
const API_URL = `${process.env.REACT_APP_DOMAIN}/codeword/promocode`;
export const activatePromocode = async (
promocode: string,
): Promise<[string | null, string?]> => {
try {
const response = await makeRequest<
ActivatePromocodeRequest,
ActivatePromocodeResponse
>({
method: "POST",
url: `${API_URL}/activate`,
body: { codeword: promocode },
contentType: true,
});
return [response.greetings];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Ошибка при активации промокода. ${error}`];
}
};

@ -1,85 +1,155 @@
import { makeRequest } from "@frontend/kitui";
import { CreateQuestionRequest } from "model/question/create";
import { RawQuestion } from "model/question/question";
import {
import { makeRequest } from "@api/makeRequest";
import { replaceSpacesToEmptyLines } from "@utils/replaceSpacesToEmptyLines";
import { parseAxiosError } from "@utils/parse-error";
import type { CreateQuestionRequest } from "model/question/create";
import type { RawQuestion } from "model/question/question";
import type {
GetQuestionListRequest,
GetQuestionListResponse,
} from "@model/question/getList";
import {
import type {
EditQuestionRequest,
EditQuestionResponse,
} from "@model/question/edit";
import {
import type {
DeleteQuestionRequest,
DeleteQuestionResponse,
} from "@model/question/delete";
import {
import type {
CopyQuestionRequest,
CopyQuestionResponse,
} from "@model/question/copy";
import { replaceSpacesToEmptyLines } from "../utils/replaceSpacesToEmptyLines";
const baseUrl =
process.env.NODE_ENV === "production"
? "/squiz"
: "https://squiz.pena.digital/squiz";
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`;
function createQuestion(body: CreateQuestionRequest) {
return makeRequest<CreateQuestionRequest, RawQuestion>({
url: `${baseUrl}/question/create`,
body,
method: "POST",
});
}
export const createQuestion = async (
body: CreateQuestionRequest,
): Promise<[RawQuestion | null, string?]> => {
try {
const createdQuestion = await makeRequest<
CreateQuestionRequest,
RawQuestion
>({
method: "POST",
url: `${API_URL}/question/create`,
body,
});
async function getQuestionList(body?: Partial<GetQuestionListRequest>) {
if (!body?.quiz_id) return null;
return [createdQuestion];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
const response = await makeRequest<
GetQuestionListRequest,
GetQuestionListResponse
>({
url: `${baseUrl}/question/getList`,
body: { ...defaultGetQuestionListBody, ...body },
method: "POST",
});
const clearArrayFromEmptySpaceBlaBlaValue = response.items?.map(
(question) => {
let data = question;
for (let key in question) {
if (question[key] === " ") data[key] = "";
}
return data;
},
);
return [null, `Не удалось создать вопрос. ${error}`];
}
};
return replaceSpacesToEmptyLines(clearArrayFromEmptySpaceBlaBlaValue);
}
const getQuestionList = async (
body?: Partial<GetQuestionListRequest>,
): Promise<[RawQuestion[] | null, string?]> => {
try {
if (!body?.quiz_id) return [null, "Квиз не найден"];
function editQuestion(body: EditQuestionRequest, signal?: AbortSignal) {
return makeRequest<EditQuestionRequest, EditQuestionResponse>({
url: `${baseUrl}/question/edit`,
body,
method: "PATCH",
signal,
});
}
const response = await makeRequest<
GetQuestionListRequest,
GetQuestionListResponse
>({
method: "POST",
url: `${API_URL}/question/getList`,
body: { ...defaultGetQuestionListBody, ...body },
});
function copyQuestion(questionId: number, quizId: number) {
return makeRequest<CopyQuestionRequest, CopyQuestionResponse>({
url: `${baseUrl}/question/copy`,
body: { id: questionId, quiz_id: quizId },
method: "POST",
});
}
const clearArrayFromEmptySpaceBlaBlaValue = response.items?.map(
(question) => {
let data = question;
function deleteQuestion(id: number) {
return makeRequest<DeleteQuestionRequest, DeleteQuestionResponse>({
url: `${baseUrl}/question/delete`,
body: { id },
method: "DELETE",
});
}
for (let key in question) {
if (question[key as keyof RawQuestion] === " ") {
//@ts-ignore
data[key] = "";
}
}
return data;
},
);
return [
replaceSpacesToEmptyLines(clearArrayFromEmptySpaceBlaBlaValue) ?? null,
];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список вопросов. ${error}`];
}
};
export const editQuestion = async (
body: EditQuestionRequest,
signal?: AbortSignal,
): Promise<[EditQuestionResponse | null, string?]> => {
try {
const editedQuestion = await makeRequest<
EditQuestionRequest,
EditQuestionResponse
>({
method: "PATCH",
url: `${API_URL}/question/edit`,
body,
signal,
});
return [editedQuestion];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось изменить вопрос. ${error}`];
}
};
export const copyQuestion = async (
questionId: number,
quizId: number,
): Promise<[CopyQuestionResponse | null, string?]> => {
try {
const copiedQuestion = await makeRequest<
CopyQuestionRequest,
CopyQuestionResponse
>({
method: "POST",
url: `${API_URL}/question/copy`,
body: { id: questionId, quiz_id: quizId },
});
return [copiedQuestion];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось скопировать вопрос. ${error}`];
}
};
export const deleteQuestion = async (
id: number,
): Promise<[DeleteQuestionResponse | null, string?]> => {
try {
const deletedQuestion = await makeRequest<
DeleteQuestionRequest,
DeleteQuestionResponse
>({
url: `${API_URL}/question/delete`,
body: { id },
method: "DELETE",
});
return [deletedQuestion];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось удалить вопрос. ${error}`];
}
};
export const questionApi = {
create: createQuestion,

@ -1,85 +1,197 @@
import { makeRequest } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest";
import { defaultQuizConfig } from "@model/quizSettings";
import { CopyQuizRequest, CopyQuizResponse } from "model/quiz/copy";
import { CreateQuizRequest } from "model/quiz/create";
import { DeleteQuizRequest, DeleteQuizResponse } from "model/quiz/delete";
import { EditQuizRequest, EditQuizResponse } from "model/quiz/edit";
import { GetQuizRequest, GetQuizResponse } from "model/quiz/get";
import { GetQuizListRequest, GetQuizListResponse } from "model/quiz/getList";
import { RawQuiz } from "model/quiz/quiz";
const baseUrl =
process.env.NODE_ENV === "production"
? "/squiz"
: "https://squiz.pena.digital/squiz";
const imagesUrl =
process.env.NODE_ENV === "production"
? "/squizstorer"
: "https://squiz.pena.digital/squizstorer";
import { parseAxiosError } from "@utils/parse-error";
function createQuiz(body?: Partial<CreateQuizRequest>) {
return makeRequest<CreateQuizRequest, RawQuiz>({
url: `${baseUrl}/quiz/create`,
body: { ...defaultCreateQuizBody, ...body },
method: "POST",
});
}
import type { RawQuiz } from "model/quiz/quiz";
import type { CopyQuizRequest, CopyQuizResponse } from "model/quiz/copy";
import type { CreateQuizRequest } from "model/quiz/create";
import type { DeleteQuizRequest, DeleteQuizResponse } from "model/quiz/delete";
import type { EditQuizRequest, EditQuizResponse } from "model/quiz/edit";
import type { GetQuizRequest, GetQuizResponse } from "model/quiz/get";
import { transliterate } from 'transliteration';
import type {
GetQuizListRequest,
GetQuizListResponse,
} from "model/quiz/getList";
async function getQuizList(body?: Partial<GetQuizListRequest>) {
const response = await makeRequest<GetQuizListRequest, GetQuizListResponse>({
url: `${baseUrl}/quiz/getList`,
body: { ...defaultGetQuizListBody, ...body },
method: "POST",
});
type AddedQuizImagesResponse = {
[key: string]: string;
};
return response.items;
}
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`;
const IMAGES_URL = `${process.env.REACT_APP_DOMAIN}/squizstorer/v1.0.0`;
function getQuiz(body?: Partial<GetQuizRequest>) {
return makeRequest<GetQuizRequest, GetQuizResponse>({
url: `${baseUrl}/quiz/get`,
body: { ...defaultGetQuizBody, ...body },
method: "GET",
});
}
export const createQuiz = async (
body?: Partial<CreateQuizRequest>,
): Promise<[RawQuiz | null, string?]> => {
try {
const createdQuiz = await makeRequest<CreateQuizRequest, RawQuiz>({
method: "POST",
url: `${API_URL}/quiz/create`,
body: { ...defaultCreateQuizBody, ...body },
});
async function editQuiz(body: EditQuizRequest, signal?: AbortSignal) {
return makeRequest<EditQuizRequest, EditQuizResponse>({
url: `${baseUrl}/quiz/edit`,
body,
method: "PATCH",
signal,
});
}
return [createdQuiz];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
function copyQuiz(id: number) {
return makeRequest<CopyQuizRequest, CopyQuizResponse>({
url: `${baseUrl}/quiz/copy`,
body: { id },
method: "POST",
});
}
return [null, `Не удалось создать квиз. ${error}`];
}
};
function deleteQuiz(id: number) {
return makeRequest<DeleteQuizRequest, DeleteQuizResponse>({
url: `${baseUrl}/quiz/delete`,
body: { id },
method: "DELETE",
});
}
export const getQuizList = async (
body?: Partial<CreateQuizRequest>,
): Promise<[RawQuiz[] | null, string?]> => {
try {
const { items } = await makeRequest<
GetQuizListRequest,
GetQuizListResponse
>({
method: "POST",
url: `${API_URL}/quiz/getList`,
body: { ...defaultGetQuizListBody, ...body },
});
function addQuizImages(quizId: number, image: Blob) {
const formData = new FormData();
return [items];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
formData.append("quiz", quizId.toString());
formData.append("image", image);
return [null, `Не удалось получить список квизов. ${error}`];
}
};
return makeRequest<FormData, { [key: string]: string }>({
url: `${imagesUrl}/quiz/putImages`,
body: formData,
method: "PUT",
});
}
export const getQuiz = async (
body?: Partial<GetQuizRequest>,
): Promise<[GetQuizResponse | null, string?]> => {
try {
const quiz = await makeRequest<GetQuizRequest, GetQuizResponse>({
method: "GET",
url: `${API_URL}/quiz/get`,
body: { ...defaultGetQuizBody, ...body },
});
return [quiz];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить квиз. ${error}`];
}
};
export const editQuiz = async (
body: EditQuizRequest,
signal?: AbortSignal,
): Promise<[EditQuizResponse | null, string?]> => {
try {
const editedQuiz = await makeRequest<EditQuizRequest, EditQuizResponse>({
method: "PATCH",
url: `${API_URL}/quiz/edit`,
body,
signal,
});
return [editedQuiz];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось изменить квиз. ${error}`];
}
};
export const copyQuiz = async (
id: number,
): Promise<[EditQuizResponse | null, string?]> => {
try {
const copiedQuiz = await makeRequest<CopyQuizRequest, CopyQuizResponse>({
method: "POST",
url: `${API_URL}/quiz/copy`,
body: { id },
});
return [copiedQuiz];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось скопировать квиз. ${error}`];
}
};
export const deleteQuiz = async (
id: number,
): Promise<[DeleteQuizResponse | null, string?]> => {
try {
const deletedQuiz = await makeRequest<
DeleteQuizRequest,
DeleteQuizResponse
>({
method: "DELETE",
url: `${API_URL}/quiz/delete`,
body: { id },
});
return [deletedQuiz];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось удалить квиз. ${error}`];
}
};
export const addQuizImages = async (
quizId: number,
image: Blob,
): Promise<[AddedQuizImagesResponse | null, string?]> => {
try {
const formData = new FormData();
const name = image?.name ? transliterate(image?.name.replace(/\s/g, '_')) : "blob"
//Замена всех побелов на _
const renamedImage = new File([image], name)
formData.append("quiz", quizId.toString());
formData.append("image", renamedImage);
const addedQuizImages = await makeRequest<
FormData,
AddedQuizImagesResponse
>({
url: `${IMAGES_URL}/quiz/putImages`,
body: formData,
method: "PUT",
});
return [addedQuizImages];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось добавить изображение. ${error}`];
}
};
export const copyQuizTemplate = async (
qid: string,
): Promise<[number | null, string?]> => {
try {
const { id } = await makeRequest<{ Qid: string }, { id: number }>({
method: "POST",
url: `${API_URL}/quiz/template`,
body: { Qid: qid },
});
if (!id) {
return [null, `Не удалось скопировать шаблон квиза.`];
}
return [id];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось скопировать шаблон квиза. ${error}`];
}
};
export const quizApi = {
create: createQuiz,
@ -89,6 +201,7 @@ export const quizApi = {
copy: copyQuiz,
delete: deleteQuiz,
addImages: addQuizImages,
copyTemplate: copyQuizTemplate,
};
const defaultCreateQuizBody: CreateQuizRequest = {

@ -1,56 +0,0 @@
import { makeRequest } from "@frontend/kitui";
import { CreateQuestionRequest } from "model/question/create";
import { RawQuestion } from "model/question/question";
import {
GetQuestionListRequest,
GetQuestionListResponse,
} from "@model/question/getList";
import {
EditQuestionRequest,
EditQuestionResponse,
} from "@model/question/edit";
import {
DeleteQuestionRequest,
DeleteQuestionResponse,
} from "@model/question/delete";
import {
CopyQuestionRequest,
CopyQuestionResponse,
} from "@model/question/copy";
const baseUrl =
process.env.NODE_ENV === "production"
? "/squiz"
: "https://squiz.pena.digital";
function get(quizId: string) {
return makeRequest<any>({
url: `${baseUrl}/question/copy`,
body: { id: questionId, quiz_id: quizId },
method: "POST",
});
}
function quizRelase(quizId: string, status: "start" | "stop") {
return makeRequest<any>({
url: `https://squiz.pena.digital/answer/quiz/get`,
body: {
quiz_id: quizId,
limit: 100,
page: 0,
need_config: true,
},
method: "POST",
});
}
export const relaseApi = {
relase: quizRelase,
get: quizRelase,
};
const defaultGetQuestionListBody: GetQuestionListRequest = {
limit: 100,
offset: 0,
type: "",
};

149
src/api/result.ts Normal file

@ -0,0 +1,149 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type { RawResult } from "@model/result/result";
interface IResultListBody {
to: number;
from: string;
new: boolean;
page: number;
limit: number;
}
export interface IAnswerResult {
Browser: string;
CreatedAt: string;
Deleted: boolean;
Device: string;
DeviceType: string;
Email: string;
Fingerprint: string;
IP: string;
Id: number;
OS: string;
QuizId: number;
Result: boolean;
Session: string;
Start: boolean;
content: string;
new: boolean;
question_id: number;
}
type ResultFilter = {
from?: string;
new?: boolean;
to?: string;
};
type ObsolescenceRequest = {
answers: number[];
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`;
const getResultList = async (
quizId: number,
page: number,
body: ResultFilter,
): Promise<[RawResult | null, string?]> => {
try {
const resultList = await makeRequest<IResultListBody, RawResult>({
method: "POST",
url: `${API_URL}/results/getResults/${quizId}`,
body: { page: page, limit: 10, ...body },
});
return [resultList];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить результат. ${error}`];
}
};
const deleteResult = async (
resultId: number,
): Promise<[string | null, string?]> => {
try {
const deletedResult = await makeRequest<void, string>({
method: "DELETE",
url: `${API_URL}/results/delete/${resultId}`,
body: {},
});
return [deletedResult];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось удалить результат. ${error}`];
}
};
const obsolescenceResult = async (
idResultArray: number[],
): Promise<[null, string?]> => {
try {
const obsolescencedResult = await makeRequest<ObsolescenceRequest, null>({
method: "PATCH",
url: `${API_URL}/result/seen`,
body: { answers: idResultArray },
});
return [obsolescencedResult];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось изменить результат. ${error}`];
}
};
const getAnswerResultList = async (
resultId: number,
): Promise<[IAnswerResult[] | null, string?]> => {
try {
const answerResultList = await makeRequest<never, IAnswerResult[]>({
method: "GET",
url: `${API_URL}/result/${resultId}`,
});
return [answerResultList];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить список результатов. ${error}`];
}
};
const AnswerResultListEx = async (
quizId: number,
body: ResultFilter,
): Promise<[Blob | null, string?]> => {
try {
const answerResultListEx = await makeRequest<ResultFilter, Blob>({
method: "POST",
url: `${API_URL}/results/${quizId}/export`,
body,
responseType: "blob",
});
return [answerResultListEx];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [
null,
`Не удалось получить список устаревших результатов. ${error}`,
];
}
};
export const resultApi = {
getList: getResultList,
delete: deleteResult,
getAnswerList: getAnswerResultList,
export: AnswerResultListEx,
obsolescence: obsolescenceResult,
};

114
src/api/statistic.ts Normal file

@ -0,0 +1,114 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
export type DevicesResponse = {
Device: Record<string, number>;
OS: Record<string, number>;
Browser: Record<string, number>;
};
export type GeneralResponse = {
Open: Record<string, number>;
Result: Record<string, number>;
AvTime: Record<string, number>;
Conversion: Record<string, number>;
};
export type QuestionsResponse = {
Funnel: number[];
FunnelData: number[];
Results: Record<string, number>;
Questions: Record<string, Record<string, number>>;
};
export type GraphicsResponse = unknown;
type TRequest = {
to: number;
from: number;
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz/statistic`;
export const getDevices = async (
quizId: string,
to: number,
from: number,
): Promise<[DevicesResponse | null, string?]> => {
try {
const devicesResponse = await makeRequest<TRequest, DevicesResponse>({
method: "POST",
url: `${API_URL}/${quizId}/devices`,
withCredentials: true,
body: { to, from },
});
return [devicesResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить статистику о девайсах. ${error}`];
}
};
export const getGeneral = async (
quizId: string,
to: number,
from: number,
): Promise<[GeneralResponse | null, string?]> => {
try {
const generalResponse = await makeRequest<TRequest, GeneralResponse>({
method: "POST",
url: `${API_URL}/${quizId}/general`,
withCredentials: true,
body: { to, from },
});
return [generalResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить ключевые метрики. ${error}`];
}
};
export const getQuestions = async (
quizId: string,
to: number,
from: number,
): Promise<[QuestionsResponse | null, string?]> => {
try {
const questionsResponse = await makeRequest<TRequest, QuestionsResponse>({
method: "POST",
url: `${API_URL}/${quizId}/questions`,
withCredentials: true,
body: { to, from },
});
return [questionsResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить статистику по результатам. ${error}`];
}
};
export const getGraphics = async (
quizId: string,
to: number,
from: number,
): Promise<[GraphicsResponse | null, string?]> => {
try {
const questionsResponse = await makeRequest<TRequest, QuestionsResponse>({
method: "get",
url: `${API_URL}s/${quizId}/pipelines?from=${from}&to=${to}`,
withCredentials: true,
});
return [questionsResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить статистику. ${error}`];
}
};

45
src/api/tariff.ts Normal file

@ -0,0 +1,45 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type { GetTariffsResponse } from "@frontend/kitui";
const API_URL = `${process.env.REACT_APP_DOMAIN}/strator/tariff`;
export const getTariffs = async (
page: number = 1,
): Promise<[GetTariffsResponse | null, string?]> => {
try {
const tariffs = await makeRequest<never, GetTariffsResponse>({
method: "GET",
url: `${API_URL}/getList?page=${page}&limit=100`,
});
return [tariffs];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Ошибка при получении списка тарифов. ${error}`];
}
};
import axios from "axios";
const apiUrl = process.env.REACT_APP_DOMAIN + "/requestquiz";
export async function sendContactFormRequest(body: {
contact: string;
whoami: string;
}) {
try {
const a = await axios(apiUrl + "/callme", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
data: body,
});
return [a];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Ошибка при отправке запроса. ${error}`];
}
}

9
src/api/tariffs.ts Normal file

@ -0,0 +1,9 @@
import { makeRequest } from '@utils/makeRequest';
import type { GetTariffsResponse } from '@/model/tariff';
export const getTariffs = async (): Promise<[GetTariffsResponse | null, string?]> => {
return makeRequest<GetTariffsResponse>({
url: `${process.env.REACT_APP_DOMAIN}/tariffs`,
method: 'GET'
});
};

102
src/api/ticket.ts Normal file

@ -0,0 +1,102 @@
import { createTicket as createTicketRequest } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type {
SendTicketMessageRequest,
CreateTicketResponse,
} from "@frontend/kitui";
type SendFileResponse = {
message: string;
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/heruvym/v1.0.0`;
export const sendTicketMessage = async (
ticketId: string,
message: string,
systemError: boolean
): Promise<[null, string?]> => {
try {
const sendTicketMessageResponse = await makeRequest<
SendTicketMessageRequest,
null
>({
url: `${API_URL}/send`,
method: "POST",
useToken: true,
body: { ticket: ticketId, message: message, lang: "ru", files: [], system: systemError },
});
return [sendTicketMessageResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось отправить сообщение. ${error}`];
}
};
export const shownMessage = async (id: string): Promise<[null, string?]> => {
try {
const shownMessageResponse = await makeRequest<{ id: string }, null>({
url: `${API_URL}/shown`,
method: "POST",
useToken: true,
body: { id },
});
return [shownMessageResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось прочесть сообщение. ${error}`];
}
};
export const sendFile = async (
ticketId: string,
file: File,
): Promise<[SendFileResponse | null, string?]> => {
try {
const body = new FormData();
body.append(file.name, file);
body.append("ticket", ticketId);
const sendResponse = await makeRequest<FormData, SendFileResponse>({
method: "POST",
url: `${API_URL}/sendFiles`,
body,
});
return [sendResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось отправить файл. ${error}`];
}
};
export const createTicket = async (
message: string,
useToken: boolean,
systemError: boolean
): Promise<[CreateTicketResponse | null, string?]> => {
try {
const createdTicket = await createTicketRequest({
url: `${process.env.REACT_APP_DOMAIN}/heruvym/v1.0.0/create`,
body: { Title: "Unauth title", Message: message, system: systemError },
useToken,
});
return [createdTicket];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось создать тикет. ${error}`];
}
};

66
src/api/user.ts Normal file

@ -0,0 +1,66 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type { UserAccount } from "@frontend/kitui";
import type { OriginalUserAccount } from "@root/user";
type RecoverUserRequest = {
password: string;
};
export const getUser = async (): Promise<[UserAccount | null, string?]> => {
try {
const user = await makeRequest<never, UserAccount>({
method: "GET",
url: `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1/account`,
});
return [user];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить пользователя. ${error}`];
}
};
export const getAccount = async (): Promise<
[OriginalUserAccount | null, string?]
> => {
try {
const controller = new AbortController();
const account = await makeRequest<never, OriginalUserAccount>({
url: `${process.env.REACT_APP_DOMAIN}/squiz/account/get`,
contentType: true,
method: "GET",
useToken: true,
withCredentials: false,
signal: controller.signal,
});
return [account];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось получить данные аккаунта. ${error}`];
}
};
export const recoverUser = async (
password: string,
): Promise<[unknown | null, string?]> => {
try {
const recoverResponse = await makeRequest<RecoverUserRequest, unknown>({
url: `${process.env.REACT_APP_DOMAIN}/user`,
method: "PATCH",
body: { password },
});
return [recoverResponse];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Не удалось восстановить пароль. ${error}`];
}
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

@ -141,7 +141,6 @@ export default function Notebook({ color }: Props) {
</g>
<mask
id="mask0_3_590"
// style="mask-type:alpha"
maskUnits="userSpaceOnUse"
x="26"
y="10"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

File diff suppressed because one or more lines are too long

@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19 15L19.6668 16.2577C20.1354 17.1416 20.8584 17.8646 21.7423 18.3332L23 19L21.7423 19.6668C20.8584 20.1354 20.1354 20.8584 19.6668 21.7423L19 23L18.3332 21.7423C17.8646 20.8584 17.1416 20.1354 16.2577 19.6668L15 19L16.2577 18.3332C17.1416 17.8646 17.8646 17.1416 18.3332 16.2577L19 15Z" stroke="#7E2AEA" stroke-width="1.5" stroke-linejoin="round"/>
<path d="M20 11V7C20 4.23858 17.7614 2 15 2H7C4.23858 2 2 4.23858 2 7V15C2 17.7614 4.23858 20 7 20H11" stroke="#7E2AEA" stroke-width="1.5" stroke-linecap="round"/>
<path d="M7.5 14.5V9.25C7.5 8.78587 7.68437 8.34075 8.01256 8.01256C8.34075 7.68437 8.78587 7.5 9.25 7.5C9.71413 7.5 10.1592 7.68437 10.4874 8.01256C10.8156 8.34075 11 8.78587 11 9.25V14.5M7.5 11.875H11M14.5 7.5V14.5" stroke="#7E2AEA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 930 B

@ -0,0 +1,12 @@
import * as React from "react";
import { SvgIcon, SvgIconProps } from "@mui/material";
const AiPersonalizationIcon = (props: SvgIconProps) => (
<SvgIcon {...props} viewBox="0 0 24 24" fill="none">
<path d="M19 15L19.6668 16.2577C20.1354 17.1416 20.8584 17.8646 21.7423 18.3332L23 19L21.7423 19.6668C20.8584 20.1354 20.1354 20.8584 19.6668 21.7423L19 23L18.3332 21.7423C17.8646 20.8584 17.1416 20.1354 16.2577 19.6668L15 19L16.2577 18.3332C17.1416 17.8646 17.8646 17.1416 18.3332 16.2577L19 15Z" stroke="#7E2AEA" strokeWidth="1.5" strokeLinejoin="round"/>
<path d="M20 11V7C20 4.23858 17.7614 2 15 2H7C4.23858 2 2 4.23858 2 7V15C2 17.7614 4.23858 20 7 20H11" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round"/>
<path d="M7.5 14.5V9.25C7.5 8.78587 7.68437 8.34075 8.01256 8.01256C8.34075 7.68437 8.78587 7.5 9.25 7.5C9.71413 7.5 10.1592 7.68437 10.4874 8.01256C10.8156 8.34075 11 8.78587 11 9.25V14.5M7.5 11.875H11M14.5 7.5V14.5" stroke="#7E2AEA" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
</SvgIcon>
);
export default AiPersonalizationIcon;

@ -0,0 +1,26 @@
import { Box } from "@mui/material";
interface Props {
color?: string;
height?: string;
width?: string;
}
export default function AmoTrash({ color, height, width }: Props) {
return (
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.4994 6H4.5" stroke="#FC2012" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.5 18.7492V8.74609H18.5V18.7492C18.5 20.1299 17.3807 21.2492 16 21.2492H8C6.61929 21.2492 5.5 20.1299 5.5 18.7492Z" fill="#FC2012" stroke="#F02B2B"/>
<path d="M15.75 6V4.5C15.75 4.10218 15.592 3.72064 15.3107 3.43934C15.0294 3.15804 14.6478 3 14.25 3H9.75C9.35218 3 8.97064 3.15804 8.68934 3.43934C8.40804 3.72064 8.25 4.10218 8.25 4.5V6" stroke="#FC2012" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</Box>
);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

@ -0,0 +1,16 @@
<svg
width="30"
height="30"
viewBox="0 0 30 30"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect width="30" height="30" rx="6" fill="#FEDFD0" />
<path
d="M18.7891 11.2006L14.526 15.4943M10.3154 15.2084L14.526 19.2993L22.7891 10.7006M7.21053 15.4144L11 19.0962"
stroke="#FC712F"
stroke-width="1.5"
strokeLinecap="round"
stroke-linejoin="round"
/>
</svg>

After

Width:  |  Height:  |  Size: 394 B

@ -0,0 +1,3 @@
<svg width="7" height="12" viewBox="0 0 7 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 1.5L1 6L6 10.5" stroke="white" stroke-width="1.5" strokeLinecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 211 B

@ -0,0 +1,23 @@
<svg
width="30"
height="30"
viewBox="0 0 30 30"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect width="30" height="30" rx="6" fill="#FEDFD0" />
<path
d="M11.5 10.5L15.5 15L11.5 19.5"
stroke="#FC712F"
stroke-width="1.5"
strokeLinecap="round"
stroke-linejoin="round"
/>
<path
d="M15.5 10.5L19.5 15L15.5 19.5"
stroke="#FC712F"
stroke-width="1.5"
strokeLinecap="round"
stroke-linejoin="round"
/>
</svg>

After

Width:  |  Height:  |  Size: 466 B

@ -0,0 +1,3 @@
<svg width="14" height="7" viewBox="0 0 14 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 1L7 6L13 1" stroke="#7E2AEA" stroke-width="1.5" strokeLinecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 209 B

@ -0,0 +1,4 @@
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.8955 10.1257H22.7705V5.25073" stroke="#7E2AEA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M19.3174 19.3172C18.0677 20.5679 16.4752 21.4198 14.7413 21.7652C13.0074 22.1107 11.21 21.9341 9.57649 21.2579C7.94295 20.5816 6.54667 19.4361 5.56428 17.9662C4.5819 16.4962 4.05754 14.768 4.05754 13C4.05754 11.232 4.5819 9.50376 5.56428 8.03384C6.54667 6.56391 7.94295 5.41838 9.57649 4.74213C11.21 4.06589 13.0074 3.88932 14.7413 4.23477C16.4752 4.58022 18.0677 5.43216 19.3174 6.68282L22.7705 10.1258" stroke="#7E2AEA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 730 B

@ -0,0 +1,3 @@
<svg width="7" height="12" viewBox="0 0 7 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 1.5L6 6L1 10.5" stroke="white" stroke-width="1.5" strokeLinecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 211 B

@ -1,43 +1,35 @@
import { Box, useTheme } from "@mui/material";
export default function ChartIcon() {
const theme = useTheme();
import { Box, SxProps, Theme } from "@mui/material";
export default function ChartLineUp(sx: SxProps<Theme>) {
return (
<Box
sx={{
display: "flex",
justifyContent: "center",
alignItems: "center",
}}
>
<Box sx={sx}>
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M21 19.5H3V4.5"
stroke={theme.palette.brightPurple.main}
strokeWidth="1.5"
stroke="#7E2AEA"
stroke-width="1.5"
strokeLinecap="round"
strokeLinejoin="round"
stroke-linejoin="round"
/>
<path
d="M19.5 6L12 13.5L9 10.5L3 16.5"
stroke={theme.palette.brightPurple.main}
strokeWidth="1.5"
stroke="#7E2AEA"
stroke-width="1.5"
strokeLinecap="round"
strokeLinejoin="round"
stroke-linejoin="round"
/>
<path
d="M19.5 9.75V6H15.75"
stroke={theme.palette.brightPurple.main}
strokeWidth="1.5"
stroke="#7E2AEA"
stroke-width="1.5"
strokeLinecap="round"
strokeLinejoin="round"
stroke-linejoin="round"
/>
</svg>
</Box>

@ -3,11 +3,13 @@ import { Box, useTheme } from "@mui/material";
interface CheckboxIconProps {
checked?: boolean;
color?: string;
isRounded?: boolean;
}
export default function CheckboxIcon({
checked = false,
color = "#7E2AEA",
isRounded,
}: CheckboxIconProps) {
const theme = useTheme();
@ -16,7 +18,7 @@ export default function CheckboxIcon({
sx={{
height: "24px",
width: "24px",
borderRadius: "6px",
borderRadius: isRounded ? "50%" : "6px",
display: "flex",
justifyContent: "center",
alignItems: "center",

@ -0,0 +1,14 @@
export const ClockWiseIcon = () => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<path
d="M10.4115 22.35L11.1615 22.35L11.1615 20.85L10.4115 20.85L10.4115 22.35ZM19.2553 12L19.2553 12.75L20.7553 12.75L20.7553 12L19.2553 12ZM20.0053 13.6L19.4748 14.1302L20.0053 14.661L20.5358 14.1302L20.0053 13.6ZM10.4115 20.85C5.52885 20.85 1.56777 16.887 1.56777 12L0.0677734 12C0.0677731 17.7146 4.6995 22.35 10.4115 22.35L10.4115 20.85ZM1.56777 12C1.56777 7.11295 5.52885 3.15 10.4115 3.15L10.4115 1.65C4.6995 1.65 0.0677736 6.28545 0.0677734 12L1.56777 12ZM10.4115 3.15C15.2942 3.15 19.2553 7.11295 19.2553 12L20.7553 12C20.7553 6.28545 16.1235 1.65 10.4115 1.65L10.4115 3.15ZM22.6726 9.86985L19.4748 13.0698L20.5358 14.1302L23.7336 10.9302L22.6726 9.86985ZM20.5358 13.0698L17.3377 9.86983L16.2767 10.9302L19.4748 14.1302L20.5358 13.0698Z"
fill="#7E2AEA"
/>
</svg>
);

@ -8,8 +8,6 @@ export default function AddressIcon({ color }: Props) {
return (
<Box
sx={{
// height: "38px",
// width: "45px",
display: "flex",
alignItems: "center",
justifyContent: "center",

@ -8,8 +8,6 @@ export default function EmailIcon({ color }: Props) {
return (
<Box
sx={{
// height: "38px",
// width: "45px",
display: "flex",
alignItems: "center",
justifyContent: "center",

@ -8,8 +8,6 @@ export default function NameIcon({ color }: Props) {
return (
<Box
sx={{
// height: "38px",
// width: "45px",
display: "flex",
alignItems: "center",
justifyContent: "center",

@ -8,8 +8,6 @@ export default function PhoneIcon({ color }: Props) {
return (
<Box
sx={{
// height: "38px",
// width: "45px",
display: "flex",
alignItems: "center",
justifyContent: "center",

@ -8,8 +8,6 @@ export default function TextIcon({ color }: Props) {
return (
<Box
sx={{
// height: "38px",
// width: "45px",
display: "flex",
alignItems: "center",
justifyContent: "center",

@ -8,8 +8,6 @@ export default function SupplementIcon({ color }: Props) {
return (
<Box
sx={{
// height: "38px",
// width: "45px",
display: "flex",
alignItems: "center",
justifyContent: "center",

@ -4,9 +4,15 @@ interface Props {
color?: string;
bgcolor?: string;
marL?: string;
width?: string;
}
export default function CopyIcon({ color, bgcolor, marL }: Props) {
export default function CopyIcon({
color,
bgcolor,
marL,
width = "36px",
}: Props) {
const theme = useTheme();
return (
@ -14,8 +20,8 @@ export default function CopyIcon({ color, bgcolor, marL }: Props) {
sx={{
bgcolor,
borderRadius: "6px",
height: "36px",
width: "36px",
height: width,
width: width,
display: "flex",
justifyContent: "center",
alignItems: "center",

@ -0,0 +1,36 @@
import { Box } from "@mui/material";
interface Props {
color: string;
height: string;
width: string;
}
export default function EditPencil({ color, height, width }: Props) {
return (
<Box
sx={{
height,
width,
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
<svg
width="19"
height="18"
viewBox="0 0 19 18"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M10.5137 0.80552C11.5869 -0.269234 13.3274 -0.269892 14.4013 0.804049L16.8932 3.2959C17.958 4.36068 17.969 6.08444 16.918 7.16281L7.68486 16.6361C6.97933 17.3599 6.01167 17.7681 5.00124 17.7681L2.24909 17.768C0.969844 17.7679 -0.0517699 16.7015 0.00203171 15.4224L0.120186 12.6134C0.159684 11.6744 0.549963 10.7844 1.2138 10.1195L10.5137 0.80552ZM13.3415 1.86551C12.8533 1.37736 12.0622 1.37766 11.5744 1.86618L9.9113 3.53178L14.1911 7.81157L15.8446 6.11505C16.3224 5.62488 16.3173 4.84136 15.8333 4.35737L13.3415 1.86551ZM2.27446 11.1802L8.85145 4.59325L13.144 8.88585L6.61148 15.5883C6.18816 16.0226 5.60756 16.2675 5.0013 16.2675L2.24916 16.2674C1.82274 16.2674 1.4822 15.9119 1.50014 15.4856L1.61829 12.6765C1.64199 12.1131 1.87616 11.5791 2.27446 11.1802ZM17.5148 17.6948C17.9289 17.6948 18.2645 17.3589 18.2645 16.9445C18.2645 16.5301 17.9289 16.1942 17.5148 16.1942H11.3931C10.9791 16.1942 10.6434 16.5301 10.6434 16.9445C10.6434 17.3589 10.9791 17.6948 11.3931 17.6948H17.5148Z"
fill="#7E2AEA"
/>
</svg>
</Box>
);
}

@ -6,6 +6,7 @@ type InfoProps = {
sx?: SxProps;
onClick?: any;
className?: string;
color?: string;
};
export default function Info({
@ -14,6 +15,7 @@ export default function Info({
sx,
onClick,
className,
color = "#7e2aea",
}: InfoProps) {
return (
<IconButton sx={sx} className={className} onClick={onClick}>
@ -26,21 +28,21 @@ export default function Info({
>
<path
d="M10 19C14.9706 19 19 14.9706 19 10C19 5.02944 14.9706 1 10 1C5.02944 1 1 5.02944 1 10C1 14.9706 5.02944 19 10 19Z"
stroke="#7E2AEA"
stroke={color}
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M9.25 9.25H10V14.5H10.75"
stroke="#7E2AEA"
stroke={color}
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M9.8125 7C10.4338 7 10.9375 6.49632 10.9375 5.875C10.9375 5.25368 10.4338 4.75 9.8125 4.75C9.19118 4.75 8.6875 5.25368 8.6875 5.875C8.6875 6.49632 9.19118 7 9.8125 7Z"
fill="#7E2AEA"
fill={color}
/>
</svg>
</IconButton>

@ -3,10 +3,11 @@ import { Box, useTheme } from "@mui/material";
import type { SxProps } from "@mui/material";
type InfoIconProps = {
color?: string;
sx?: SxProps;
};
export default function InfoIcon({ sx }: InfoIconProps) {
export default function InfoIcon({ sx, color = "#7e2aea" }: InfoIconProps) {
const theme = useTheme();
return (
@ -29,21 +30,21 @@ export default function InfoIcon({ sx }: InfoIconProps) {
>
<path
d="M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z"
stroke={theme.palette.brightPurple.main}
stroke={color}
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M11.25 11.25H12V16.5H12.75"
stroke={theme.palette.brightPurple.main}
stroke={color}
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M11.8125 9C12.4338 9 12.9375 8.49632 12.9375 7.875C12.9375 7.25368 12.4338 6.75 11.8125 6.75C11.1912 6.75 10.6875 7.25368 10.6875 7.875C10.6875 8.49632 11.1912 9 11.8125 9Z"
fill={theme.palette.brightPurple.main}
fill={color}
/>
</svg>
</Box>

@ -12,23 +12,23 @@ export const LinkSimple: FC<SVGProps<SVGSVGElement>> = (props) => (
<path
d="M8.82031 15.1781L15.1766 8.8125"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M13.5949 16.7719L10.9418 19.425C10.5238 19.843 10.0276 20.1745 9.48151 20.4007C8.93541 20.6269 8.35009 20.7434 7.75899 20.7434C6.5652 20.7434 5.42031 20.2691 4.57618 19.425C3.73204 18.5809 3.25781 17.436 3.25781 16.2422C3.25781 15.0484 3.73204 13.9035 4.57618 13.0594L7.2293 10.4062"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M16.7719 13.5937L19.425 10.9406C20.2691 10.0965 20.7434 8.95159 20.7434 7.7578C20.7434 6.56401 20.2691 5.41912 19.425 4.57499C18.5809 3.73085 17.436 3.25662 16.2422 3.25662C15.0484 3.25662 13.9035 3.73085 13.0594 4.57499L10.4062 7.22811"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);

@ -0,0 +1,22 @@
import { useLocation } from "react-router-dom";
import { Box, SxProps, Theme } from "@mui/material";
interface Props {
sx?: SxProps<Theme>;
}
export default function NotebookWithPencil({ sx }: Props) {
return (
<Box
sx={{
height: "24px",
...sx
}}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.88766 6.5124H15.3537M5.88766 10.4075H12.0172M5.88766 14.398H9.18792M18.988 4.41492V3.69678C18.988 3.14449 18.5403 2.69678 17.988 2.69678H3.19922C2.64693 2.69678 2.19922 3.14449 2.19922 3.69678V19.7038C2.19922 20.5407 3.16577 21.0074 3.8211 20.4869L6.25047 18.5577C6.42733 18.4173 6.64652 18.3408 6.87236 18.3408H17.988C18.5403 18.3408 18.988 17.8931 18.988 17.3408V15.2147" stroke="#7E2AEA" stroke-width="1.5" stroke-linecap="round" />
<path d="M20.383 7.29034L20.9133 6.76001L20.383 6.22968L19.8527 6.76001L20.383 7.29034ZM15.9919 11.6815L15.4615 11.1511L14.9312 11.6815L15.4615 12.2118L15.9919 11.6815ZM16.7185 12.4081L16.1882 12.9384L16.7185 13.4688L17.2489 12.9384L16.7185 12.4081ZM21.1096 8.01698L21.64 8.54731L22.1703 8.01698L21.64 7.48665L21.1096 8.01698ZM14.4001 13.2732L14.9304 12.7429L14.4001 12.2126L13.8698 12.7429L14.4001 13.2732ZM14.0817 13.5917L13.5514 13.0613C13.5011 13.1115 13.4583 13.1686 13.4242 13.2309L14.0817 13.5917ZM13.1982 15.2018L12.5407 14.841C12.3803 15.1333 12.4321 15.4964 12.6678 15.7321C12.9036 15.9679 13.2667 16.0197 13.559 15.8593L13.1982 15.2018ZM14.8083 14.3183L15.1691 14.9758C15.2314 14.9417 15.2885 14.8988 15.3387 14.8486L14.8083 14.3183ZM15.1267 13.9999L15.6571 14.5302L16.1874 13.9999L15.6571 13.4696L15.1267 13.9999ZM21.9075 5.76585L21.3772 5.23552L20.8468 5.76585L21.3772 6.29618L21.9075 5.76585ZM22.2812 5.39209L22.8116 4.86176C22.5187 4.56887 22.0438 4.56887 21.7509 4.86176L22.2812 5.39209ZM23.0079 6.11874L23.5382 6.64907C23.8311 6.35617 23.8311 5.8813 23.5382 5.58841L23.0079 6.11874ZM22.6341 6.4925L22.1038 7.02283L22.6341 7.55316L23.1645 7.02283L22.6341 6.4925ZM19.8527 6.76001L15.4615 11.1511L16.5222 12.2118L20.9133 7.82067L19.8527 6.76001ZM15.4615 12.2118L16.1882 12.9384L17.2489 11.8778L16.5222 11.1511L15.4615 12.2118ZM17.2489 12.9384L21.64 8.54731L20.5793 7.48665L16.1882 11.8778L17.2489 12.9384ZM21.64 7.48665L20.9133 6.76001L19.8527 7.82067L20.5793 8.54731L21.64 7.48665ZM13.8698 12.7429L13.5514 13.0613L14.612 14.122L14.9304 13.8036L13.8698 12.7429ZM13.4242 13.2309L12.5407 14.841L13.8557 15.5626L14.7392 13.9524L13.4242 13.2309ZM13.559 15.8593L15.1691 14.9758L14.4475 13.6608L12.8374 14.5443L13.559 15.8593ZM15.3387 14.8486L15.6571 14.5302L14.5964 13.4696L14.278 13.788L15.3387 14.8486ZM15.6571 13.4696L14.9304 12.7429L13.8698 13.8036L14.5964 14.5302L15.6571 13.4696ZM22.4378 6.29618L22.8116 5.92242L21.7509 4.86176L21.3772 5.23552L22.4378 6.29618ZM21.7509 5.92242L22.4776 6.64907L23.5382 5.58841L22.8116 4.86176L21.7509 5.92242ZM22.4776 5.58841L22.1038 5.96217L23.1645 7.02283L23.5382 6.64907L22.4776 5.58841ZM23.1645 5.96217L22.4378 5.23552L21.3772 6.29618L22.1038 7.02283L23.1645 5.96217Z" fill="#7E2AEA" />
</svg>
</Box>
);
}

@ -1,41 +0,0 @@
import { Box } from "@mui/material";
interface Props {
color: string;
}
export default function NumberThree({ color }: Props) {
return (
<Box
sx={{
height: "30px",
width: "30px",
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
<svg
width="24"
height="25"
viewBox="0 0 24 25"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 21.1875C16.9706 21.1875 21 17.1581 21 12.1875C21 7.21694 16.9706 3.1875 12 3.1875C7.02944 3.1875 3 7.21694 3 12.1875C3 17.1581 7.02944 21.1875 12 21.1875Z"
stroke={color}
strokeWidth="1.5"
strokeMiterlimit="10"
/>
<path
d="M9.75 8.0625H14.25L11.625 11.8125C12.0567 11.8125 12.4817 11.919 12.8624 12.1225C13.243 12.326 13.5677 12.6203 13.8075 12.9792C14.0473 13.3381 14.1949 13.7507 14.2372 14.1803C14.2795 14.6099 14.2152 15.0433 14.05 15.4421C13.8848 15.8409 13.6238 16.1928 13.2901 16.4666C12.9564 16.7405 12.5603 16.9278 12.137 17.0121C11.7136 17.0963 11.276 17.0748 10.8629 16.9495C10.4498 16.8242 10.074 16.599 9.76875 16.2937"
stroke={color}
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</Box>
);
}

Some files were not shown because too many files have changed in this diff Show More