src/ ├── app/ # Настройка и инициализация приложения │ ├── providers/ # Провайдеры для App (Redux, Router) │ │ ├── StoreProvider.tsx # Конфигурация Redux Store │ │ └── ApiProvider.tsx # Провайдер для RTK Query │ └── routes/ # Конфигурация маршрутов приложения │ └── AppRouter.tsx # Маршруты React Router ├── features/ │ ├── auth/ │ │ ├── authSlice.ts # Логика авторизации │ │ ├── authSaga.ts # │ │ ├── Auth.types.ts # Типы для authSlice │ │ └── AuthService.ts # Логика работы с API для авторизации │ ├── products/ │ │ ├── productsSlice.ts # Логика управления товарами │ │ ├── Products.types.ts # Типы для productsSlice │ │ └── ProductService.ts # Логика работы с API для продуктов │ ├── cart/ │ │ ├── cartSlice.ts # Логика управления корзиной │ │ ├── Cart.types.ts # Типы для cartSlice │ │ └── CartService.ts # Логика работы с API для корзины (опционально) │ └── user/ │ ├── userSlice.ts # Логика управления профилем пользователя │ ├── User.types.ts # Типы для userSlice │ └── UserService.ts # Логика работы с API для профиля пользователя ├── pages/ # Страницы приложения │ ├── HomePage.tsx # Главная страница с товарами │ ├── LoginPage.tsx # Страница входа │ ├── RegisterPage.tsx # Страница регистрации │ ├── ProfilePage.tsx # Страница профиля │ ├── LoginPage.tsx # Страница входа │ └── RegisterPage.tsx # Страница регистрации ├── entities/ # Основные сущности приложения │ ├── Product/ # Логика и компоненты продуктов │ │ ├── model/ # Логика продукта │ │ │ ├── productSlice.ts # Slice для продуктов │ │ │ └── productApi.ts # API запросы для продуктов │ │ └── ui/ # Компоненты интерфейса │ │ └── ProductCard.tsx # Карточка продукта │ ├── User/ # Логика и компоненты пользователя │ │ ├── model/ # Логика пользователя │ │ │ ├── userSlice.ts # Slice для пользователя │ │ │ └── userApi.ts # API запросы для пользователя │ │ └── ui/ # Компоненты интерфейса │ │ └── UserProfile.tsx # Профиль пользователя │ └── Cart/ # Логика и компоненты корзины │ ├── model/ # Логика корзины │ │ └── cartSlice.ts # Slice для корзины │ └── ui/ # Компоненты интерфейса │ └── CartItem.tsx # Компонент элемента корзины ├── shared/ │ ├── api/ │ │ └── api.ts # Настройка RTK Query │ ├── components/ │ │ ├── Button.tsx # Универсальная кнопка │ │ ├── Modal.tsx # Универсальное модальное окно │ │ ├── Input.tsx # Универсальный инпут │ │ ├── Layout.tsx # Главный макет приложения (контейнер) │ │ └── Header.tsx # Заголовок, включая меню навигации │ │ └── NavBar.tsx # Меню │ ├── styles/ │ │ ├── variables.scss # Переменные стилей │ │ ├── mixins.scss # Общие миксины │ │ └── global.scss # Глобальные стили │ └── utils/ │ ├── store.ts # Утилита для работы с localStorage │ └── helpers.ts # Вспомогательные функции ├──sagas/ └── rootSaga.ts # Главная сага для объединения всех саг └── index.tsx # Точка входа приложения
Необходимо создать хранилище данных с помощью redux toolkit
В хранилище должен быть
токен инициация приложения (булево значение, срабатывает один раз при загрузке приложения) профиль корзина (для интернет магазина) список товаров/список операций
Токен создается при авторизации Профиль зависит от токена, если токен есть - добавляем в хранилище данные профиля. Если токена нет, очищаем профиль. Токен должен сохраняться в локальном хранилище и обмениваться между вкладками.
Кнопки "в корзину" в карточке товара добавляют соответствующих товар в корзину. Кнопки "удалить" в карточке товара в корзине, соответственно удаляют товар из корзины.
Также необходимо создать защищенный роутинг, модальное окно добавления/редактирования товара должно быть доступно только админу.
Профиль доступен только авторизованным пользователям.
Задача - реализовать регистрацию нового пользователя. Используйте наш боевой rest api сервер
Необходимо создать компонент регистрации нового пользователя. Компонент представляет собой форму регистрации, содержит инпут ввода email, password и кнопку отправки данных. Компонент должен обрабатывать ошибки, которые могут приходить в сервера, в частности ошибку о том, что email не валиден. Валидации на стороне фронтенда реализовывать не надо, чтобы проверяющий мог оценить обработку ошибок.