diff --git a/.env b/.env index d72c52b..c8cfa8f 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ VITE_SOME_KEY = "some value" +API_ENDPOINT = "em-dev.usolcev.com" diff --git a/README.md b/README.md index a51ea37..fad39f8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,40 @@ # employee_mood_frontend -The frontend part of the "Employee mood" project curated by Yandex Accelerator + +## Фронтенд для приложения **Employee_mood_frontend** - профилактика и борьба с выгоранием сотрудников. + +## Описание проекта + +- Создан проект на базе библиотеки React и языком программирования TypeScript, сборщиком Vite и Redux Toolkit в качестве стейт-менеджера; +- Реализована cемантическая, адаптивная верстка и стилизация с использовнием CSS-модулей и препроцессора SCSS; +- Настроен роутинг с защитой роутов доступных только при авторизации; +- Регистрация и вход пользователей по токену с его по проверкой на бекенд части приложения. + +## Приложение + +- презентационный лендинг согласно макету с возможностью авторизиции и перехода непосредственно в приложение; +- страница авторизации с валидацией полей ввода и использованием LocalStorage; +- главная страница с основным функционалом пользователя и визуальной частью (графики, слайдеры, кнопка получения обратной связи и визуализации его текущего психологического состояния); +- страница с набором тестов для контроля психологического состояния работника, с возможностью их сортировки по названию, дате и результату; +- страница с полезными статьями и видео для улучшения состояния работника, с возможностью выделения понравившихся материалов и добавления их в сохраненные, а также их сортировки по тегам и поиску по названию; +- страница с мероприятиями, запланироваными в организации, и выделением понравившихся, а также возможностью создавать мероприятия для топ-менеджеров в специальной форме с валидацией вводимых значений; +- страница с сохраненными статьями, видео и поисковой строкой; +- страница "Моя команда", доступная только для топ-менеджеров, с возможностью добавления новых сотрудников, поиска сотрудника через поисковую строку и сортировка работников по имени, должности или психологическому состоянию сотрудника; + +## Стек: + +- React, TypeScript, Vite, Redux Toolkit, CSS-module, SCSS, axios; +- Пользовательские хуки; +- Взаимодействие с бекенд-частью приложения с применением библитеки axios. + +## TODO + +Проект дорабатывается с учетом индивидуальных потребностей заказчика. + +- [Ссылка на frontend часть проекта в gitHub](https://github.com/moodbeat/Frontend) + +## Запуск фронтенд части приложения + +- клонировать проект c gitHub, +- установить зависимости (npm i), +- в файле apiConfig.ts указать API_ENDPOINT, +- запустить приложение: `npm run dev`. diff --git a/package-lock.json b/package-lock.json index 11ab89f..7be559d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@nivo/bar": "^0.83.0", "@nivo/core": "^0.83.0", "@nivo/line": "^0.83.0", + "@nivo/pie": "^0.83.0", "@nivo/radar": "^0.83.0", "@reduxjs/toolkit": "^1.9.5", "axios": "^1.4.0", @@ -20,14 +21,16 @@ "formik": "^2.2.9", "modern-normalize": "^1.1.0", "react": "^18.2.0", - "react-datepicker": "^4.14.1", + "react-datepicker": "^4.16.0", "react-dom": "^18.2.0", "react-helmet-async": "^1.3.0", "react-markdown": "^8.0.7", "react-redux": "^8.0.5", + "react-responsive": "^9.0.2", "react-router": "^6.11.1", "react-router-dom": "^6.11.1", "react-select": "^5.7.3", + "swiper": "^10.0.4", "ts-node": "^10.9.1", "yup": "^1.1.1" }, @@ -3727,6 +3730,21 @@ "react": ">= 16.14.0 < 19.0.0" } }, + "node_modules/@nivo/arcs": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/arcs/-/arcs-0.83.0.tgz", + "integrity": "sha512-UcbNbtp28lbI5V/Sm6TIgYzZmtuhSxW3eTma+YBsgXi1AN/THSwEg0gSV8owyDT/8kaL+jcBQ6c54gzSLClhkw==", + "dependencies": { + "@nivo/colors": "0.83.0", + "@nivo/core": "0.83.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-shape": "^2.0.0", + "d3-shape": "^1.3.5" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, "node_modules/@nivo/axes": { "version": "0.83.0", "resolved": "https://registry.npmjs.org/@nivo/axes/-/axes-0.83.0.tgz", @@ -3853,6 +3871,23 @@ "react": ">= 16.14.0 < 19.0.0" } }, + "node_modules/@nivo/pie": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/pie/-/pie-0.83.0.tgz", + "integrity": "sha512-98j/h4T/QmQ10gFh1cMh6uLfcGurFcYZN97Lu3ig3D9bbsLuLgpUED/d5O+8w7qLJtnlg3zptqy+N9UgRAqbOg==", + "dependencies": { + "@nivo/arcs": "0.83.0", + "@nivo/colors": "0.83.0", + "@nivo/core": "0.83.0", + "@nivo/legends": "0.83.0", + "@nivo/tooltip": "0.83.0", + "@types/d3-shape": "^2.0.0", + "d3-shape": "^1.3.5" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, "node_modules/@nivo/radar": { "version": "0.83.0", "resolved": "https://registry.npmjs.org/@nivo/radar/-/radar-0.83.0.tgz", @@ -9196,6 +9231,11 @@ "webpack": "^5.0.0" } }, + "node_modules/css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==" + }, "node_modules/css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -11914,6 +11954,11 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -14030,6 +14075,14 @@ "react": ">= 0.14.0" } }, + "node_modules/matchmediaquery": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", + "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "dependencies": { + "css-mediaquery": "^0.1.2" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -16187,13 +16240,13 @@ } }, "node_modules/react-datepicker": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.14.1.tgz", - "integrity": "sha512-uiPfjD+25KI5WOfCAXlzQgSLyksTagk3wwKn1KGBdF19YtybFDregRmcoNNGveQHAbT10SJZdCvk/8pbc7zxJg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.16.0.tgz", + "integrity": "sha512-hNQ0PAg/LQoVbDUO/RWAdm/RYmPhN3cz7LuQ3hqbs24OSp69QCiKOJRrQ4jk1gv1jNR5oYu8SjjgfDh8q6Q1yw==", "dependencies": { - "@popperjs/core": "^2.9.2", + "@popperjs/core": "^2.11.8", "classnames": "^2.2.6", - "date-fns": "^2.24.0", + "date-fns": "^2.30.0", "prop-types": "^15.7.2", "react-onclickoutside": "^6.12.2", "react-popper": "^2.3.0" @@ -16494,6 +16547,23 @@ "node": ">=0.10.0" } }, + "node_modules/react-responsive": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", + "integrity": "sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ==", + "dependencies": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.2.1" + }, + "engines": { + "node": ">=0.10" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/react-router": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", @@ -17485,6 +17555,11 @@ "node": ">=8" } }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -18224,6 +18299,24 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, + "node_modules/swiper": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.0.4.tgz", + "integrity": "sha512-DlNR3KiaVkPep6RraZ2tNr7lvyuzELuR+4NZr4wO42t0UworIO3DxDlz8b5Q3uUioh7cJad99EdRJLkPF+r8Ag==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "engines": { + "node": ">= 4.7.0" + } + }, "node_modules/synchronous-promise": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", @@ -22515,6 +22608,18 @@ "prop-types": "^15.7.2" } }, + "@nivo/arcs": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/arcs/-/arcs-0.83.0.tgz", + "integrity": "sha512-UcbNbtp28lbI5V/Sm6TIgYzZmtuhSxW3eTma+YBsgXi1AN/THSwEg0gSV8owyDT/8kaL+jcBQ6c54gzSLClhkw==", + "requires": { + "@nivo/colors": "0.83.0", + "@nivo/core": "0.83.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-shape": "^2.0.0", + "d3-shape": "^1.3.5" + } + }, "@nivo/axes": { "version": "0.83.0", "resolved": "https://registry.npmjs.org/@nivo/axes/-/axes-0.83.0.tgz", @@ -22618,6 +22723,20 @@ "prop-types": "^15.7.2" } }, + "@nivo/pie": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/pie/-/pie-0.83.0.tgz", + "integrity": "sha512-98j/h4T/QmQ10gFh1cMh6uLfcGurFcYZN97Lu3ig3D9bbsLuLgpUED/d5O+8w7qLJtnlg3zptqy+N9UgRAqbOg==", + "requires": { + "@nivo/arcs": "0.83.0", + "@nivo/colors": "0.83.0", + "@nivo/core": "0.83.0", + "@nivo/legends": "0.83.0", + "@nivo/tooltip": "0.83.0", + "@types/d3-shape": "^2.0.0", + "d3-shape": "^1.3.5" + } + }, "@nivo/radar": { "version": "0.83.0", "resolved": "https://registry.npmjs.org/@nivo/radar/-/radar-0.83.0.tgz", @@ -26689,6 +26808,11 @@ "semver": "^7.3.8" } }, + "css-mediaquery": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==" + }, "css-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", @@ -28779,6 +28903,11 @@ "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -30305,6 +30434,14 @@ "dev": true, "requires": {} }, + "matchmediaquery": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", + "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "requires": { + "css-mediaquery": "^0.1.2" + } + }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -31759,13 +31896,13 @@ "requires": {} }, "react-datepicker": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.14.1.tgz", - "integrity": "sha512-uiPfjD+25KI5WOfCAXlzQgSLyksTagk3wwKn1KGBdF19YtybFDregRmcoNNGveQHAbT10SJZdCvk/8pbc7zxJg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.16.0.tgz", + "integrity": "sha512-hNQ0PAg/LQoVbDUO/RWAdm/RYmPhN3cz7LuQ3hqbs24OSp69QCiKOJRrQ4jk1gv1jNR5oYu8SjjgfDh8q6Q1yw==", "requires": { - "@popperjs/core": "^2.9.2", + "@popperjs/core": "^2.11.8", "classnames": "^2.2.6", - "date-fns": "^2.24.0", + "date-fns": "^2.30.0", "prop-types": "^15.7.2", "react-onclickoutside": "^6.12.2", "react-popper": "^2.3.0" @@ -31979,6 +32116,17 @@ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true }, + "react-responsive": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", + "integrity": "sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ==", + "requires": { + "hyphenate-style-name": "^1.0.0", + "matchmediaquery": "^0.3.0", + "prop-types": "^15.6.1", + "shallow-equal": "^1.2.1" + } + }, "react-router": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", @@ -32722,6 +32870,11 @@ "kind-of": "^6.0.2" } }, + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, "shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -33277,6 +33430,11 @@ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, + "swiper": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.0.4.tgz", + "integrity": "sha512-DlNR3KiaVkPep6RraZ2tNr7lvyuzELuR+4NZr4wO42t0UworIO3DxDlz8b5Q3uUioh7cJad99EdRJLkPF+r8Ag==" + }, "synchronous-promise": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", diff --git a/package.json b/package.json index 4ec24d4..4eab61b 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@nivo/bar": "^0.83.0", "@nivo/core": "^0.83.0", "@nivo/line": "^0.83.0", + "@nivo/pie": "^0.83.0", "@nivo/radar": "^0.83.0", "@reduxjs/toolkit": "^1.9.5", "axios": "^1.4.0", @@ -27,14 +28,16 @@ "formik": "^2.2.9", "modern-normalize": "^1.1.0", "react": "^18.2.0", - "react-datepicker": "^4.14.1", + "react-datepicker": "^4.16.0", "react-dom": "^18.2.0", "react-helmet-async": "^1.3.0", "react-markdown": "^8.0.7", "react-redux": "^8.0.5", + "react-responsive": "^9.0.2", "react-router": "^6.11.1", "react-router-dom": "^6.11.1", "react-select": "^5.7.3", + "swiper": "^10.0.4", "ts-node": "^10.9.1", "yup": "^1.1.1" }, diff --git a/public/confused-hover.svg b/public/confused-hover.svg new file mode 100644 index 0000000..f5e3b92 --- /dev/null +++ b/public/confused-hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/expressionless-hover.svg b/public/expressionless-hover.svg new file mode 100644 index 0000000..7abc6fd --- /dev/null +++ b/public/expressionless-hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/simple-smile-hover.svg b/public/simple-smile-hover.svg new file mode 100644 index 0000000..ce4c7d1 --- /dev/null +++ b/public/simple-smile-hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/slightly-smile-hover.svg b/public/slightly-smile-hover.svg new file mode 100644 index 0000000..e01bd91 --- /dev/null +++ b/public/slightly-smile-hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/worried-hover.svg b/public/worried-hover.svg new file mode 100644 index 0000000..cb96cf5 --- /dev/null +++ b/public/worried-hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/Routing.tsx b/src/Routing.tsx index b4f8167..33f5abf 100644 --- a/src/Routing.tsx +++ b/src/Routing.tsx @@ -18,6 +18,7 @@ import { RefreshPasswordPage } from "@/pages/refreshpassword/RefreshPasswordPage import { Profile } from "@/pages/profile/Profile"; import BalanceWheel from "@/pages/balancewheel/BalanceWheel"; import { UsefulItem } from "@/pages/usefulItem/UsefulItem"; +import { EventInterface } from "./types"; interface Props { loggedIn: any; @@ -29,7 +30,7 @@ interface Props { resultOfPsychoTest: any; handleChangeUserInfo: any; employees: any; - events: any; + events: EventInterface[]; handleSendInviteCode: any; handleLogin: any; handleRegister: any; @@ -69,7 +70,10 @@ export const Routing: React.FC = ({ } > - } /> + } + /> = ({ onSendTestResult={handleSendTestResult} resultOfPsychoTest={resultOfPsychoTest} openTestAlertPopup={openTestAlertPopup} - // takeNewEmployeesList={takeNewEmployeesList} /> } /> @@ -97,7 +100,6 @@ export const Routing: React.FC = ({ onSendTestResult={handleSendTestResult} resultOfPsychoTest={resultOfPsychoTest} openTestAlertPopup={openTestAlertPopup} - // takeNewEmployeesList={takeNewEmployeesList} /> } /> @@ -113,8 +115,8 @@ export const Routing: React.FC = ({ } /> - } /> - } /> + } /> + } /> = ({ } /> - } /> + } /> } /> + + + + diff --git a/src/assets/bookmark_saved.svg b/src/assets/bookmark_saved.svg new file mode 100644 index 0000000..776253e --- /dev/null +++ b/src/assets/bookmark_saved.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/chevron_up_white.svg b/src/assets/chevron_up_white.svg new file mode 100644 index 0000000..ebaf2fe --- /dev/null +++ b/src/assets/chevron_up_white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/closeButton_mobile.svg b/src/assets/closeButton_mobile.svg new file mode 100644 index 0000000..d4e6f7d --- /dev/null +++ b/src/assets/closeButton_mobile.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/closeIcon.png b/src/assets/closeIcon.png new file mode 100644 index 0000000..ae0883a Binary files /dev/null and b/src/assets/closeIcon.png differ diff --git a/src/assets/hamburger_menu.svg b/src/assets/hamburger_menu.svg new file mode 100644 index 0000000..3750745 --- /dev/null +++ b/src/assets/hamburger_menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/hero_image.png b/src/assets/hero_image.png new file mode 100644 index 0000000..e55d057 Binary files /dev/null and b/src/assets/hero_image.png differ diff --git a/src/assets/hero_screenshot.png b/src/assets/hero_screenshot.png new file mode 100644 index 0000000..6cbdebe Binary files /dev/null and b/src/assets/hero_screenshot.png differ diff --git a/src/assets/hero_wheel.png b/src/assets/hero_wheel.png new file mode 100644 index 0000000..6991bea Binary files /dev/null and b/src/assets/hero_wheel.png differ diff --git a/src/assets/index.tsx b/src/assets/index.tsx index d44c99b..c5251c7 100644 --- a/src/assets/index.tsx +++ b/src/assets/index.tsx @@ -127,141 +127,6 @@ const sortIcon = ( ); -const simpleSmileIcon = ( - - - - - - - - - - -); - -const slightlySmileIcon = ( - - - - - - - - - - -); - -const expressionlessIcon = ( - - - - - - - - - - -); - -const confusedIcon = ( - - - - - - - - - - -); - -const worriedIcon = ( - - - - - - - - - - -); - const closeBtn = @@ -296,11 +161,6 @@ export { questionIcon, myTeamIcon, sortIcon, - simpleSmileIcon, - slightlySmileIcon, - expressionlessIcon, - confusedIcon, - worriedIcon, closeBtn, greenIcon, orangeIcon, diff --git a/src/assets/landing_bg_diag.png b/src/assets/landing_bg_diag.png index 7f9d530..30f6976 100644 Binary files a/src/assets/landing_bg_diag.png and b/src/assets/landing_bg_diag.png differ diff --git a/src/assets/logo_MoodBeat_bl.svg b/src/assets/logo_MoodBeat_bl.svg new file mode 100644 index 0000000..4273705 --- /dev/null +++ b/src/assets/logo_MoodBeat_bl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Accordion/Accordion.module.scss b/src/components/Accordion/Accordion.module.scss index 8bc84cf..fae4617 100644 --- a/src/components/Accordion/Accordion.module.scss +++ b/src/components/Accordion/Accordion.module.scss @@ -24,7 +24,7 @@ color: var(--color-white); background-image: url("../../assets/accordion_up.svg"); } -.accordion p { +.text { display: block; padding: 20px 40px; margin: 0 0 4px; @@ -34,3 +34,16 @@ font-size: 18px; line-height: 22px; } + +@media screen and (max-width: 767px) { + .element { + padding: 20px 40px 20px 16px; + font-size: 16px; + line-height: 20px; + } + .text { + padding: 12px 16px; + font-size: 16px; + line-height: 20px; + } +} diff --git a/src/components/Accordion/Accordion.tsx b/src/components/Accordion/Accordion.tsx index 6738076..243b088 100644 --- a/src/components/Accordion/Accordion.tsx +++ b/src/components/Accordion/Accordion.tsx @@ -12,7 +12,7 @@ interface AccordionProps { export const Accordion: React.FC = ({ faqItems }) => { // Если установить setActiveIndex = null, все элементы будут collapsed - const [activeIndex, setActiveIndex] = useState(0); + const [activeIndex, setActiveIndex] = useState(null); const toggleAccordion = (index: number) => { if (activeIndex === index) { @@ -35,7 +35,9 @@ export const Accordion: React.FC = ({ faqItems }) => { > {item.question} - {activeIndex === index &&

{item.answer}

} + {activeIndex === index && ( +

{item.answer}

+ )} ))} diff --git a/src/components/AddUseful/AddUseful.tsx b/src/components/AddUseful/AddUseful.tsx index 91b434f..f15d62e 100644 --- a/src/components/AddUseful/AddUseful.tsx +++ b/src/components/AddUseful/AddUseful.tsx @@ -1,10 +1,11 @@ import * as React from 'react'; -import {useState} from 'react'; -import {Field, Form, Formik} from 'formik'; +import {ChangeEvent, useState} from 'react'; +import {Field, Form, Formik, useFormik} from 'formik'; import styles from "./addUseful.module.scss"; import * as Api from "@/shared/api/Api"; import Select from "react-select"; import {ClosePopup} from "@/components/EventsPage/img/closePopup"; +import CloseIcon from "@/assets/closeIcon.png"; interface CardData { @@ -16,6 +17,10 @@ interface CardData { text: string; } +interface FormValues { + preview_image: File | null; +} + const CustomStyles = { input: (provided: any) => ({ ...provided, @@ -93,6 +98,7 @@ const addCard = async (values: {}) => { const AddUseful: React.FC = ({onClose}: any) => { // const [allOptions, setAllOptions] = useState(options); const [selectedOptions, setSelectedOptions] = useState(); + const [picture, setPicture] = useState(null); // const [isLinkActive, setIsLinkActive] = useState(false); // const [isTextActive, setIsTextActive] = useState(false); @@ -117,10 +123,25 @@ const AddUseful: React.FC = ({onClose}: any) => { onClose(); }; - // @ts-ignore - // @ts-ignore - // @ts-ignore - // @ts-ignore + + const formik = useFormik({ + initialValues: { + preview_image: null, + }, + onSubmit: values => { + console.log(values); + }, + }); + + const handleFileChange = (event: ChangeEvent) => { + if (event.currentTarget.files) { + formik.setFieldValue("preview_image", event.currentTarget.files[0]); + setPicture(event.currentTarget.files[0].name); + console.log(event.currentTarget.files[0]); + } + + }; + return (

Добавить публикацию материала @@ -130,9 +151,27 @@ const AddUseful: React.FC = ({onClose}: any) => { {({isSubmitting}) => (
- - + +
+ + + { + picture ?
{picture} + +
+ : null + } + + + {/*{*/} + {/* picture ? picture && }*/} +
@@ -143,7 +182,7 @@ const AddUseful: React.FC = ({onClose}: any) => {
- +
= ({closePopupAddEvent, isPopupAddEv /> */} {/* с */} = ({closePopupAddEvent, isPopupAddEv + {valueTimeErr} {/*