- Зарегистрироваться на гитхабе (если нет аккаунта) и создать публичный репозиторий для домашнего проекта - https://github.com/
- Для отработки механизма проверки ДЗ, нужно создать ветку hw-1, в рамках нее создать readme файл, сделать коммит и создать пулреквест. Ссылку на пулреквест скинуть в чатик в тред по ДЗ-1. После аппрува можно мержить и подтягивать изменения в main ветку в локальный репозиторий
- Скинуть логин для доступа к лекционному репозиторию
- В качестве ide советую использовать vs code - https://code.visualstudio.com/. Если уже есть ide (например, webstorm), можете продолжать использовать
- поставить node.js - https://nodejs.org/en
- Крэш курс по гиту - https://www.youtube.com/playlist?list=PLDyvV36pndZEgSRzWGuXFrTRUFuAAMciE
- поставить расширение prettier https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode и форматировать свой код. В vs code можно настроить прогон на сохранения файла
- создать ветку для ДЗ - hw-2
- создать проект с помощью vite - https://vitejs.dev/guide/#scaffolding-your-first-vite-project (можете использовать любой пакетный менеджер)
- почистить проект и установить зависимости
- скопировать к себе моковые данные из этого проекта (materials/mock.js)
- Отобразить все рестораны из моковых данных (импортируем константу в main.jsx и используем данные). Отображаем рестораны друг за другом.
- Название ресторана
- Заголовок - Меню (h3)
- Список названий блюд (используем тег ul и li)
- Заголовок - Отзывы (h3)
- Список текстов отзывов (используем тег ul и li)
- сделать коммит и запушить
- открыть ПР из ветки с ДЗ в основную ветку
- отправить ссылку на ПР в ветку ДЗ-2
- установить расширение eslint - https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint и поправить конфиг в соответствии с лекционным проектом (нужно еще добавить зависимость eslint-plugin-react)
- добавить в eslint правило "react/prop-types": 0. https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-proptypes-and-defaultprops
- установить react расширение для браузера - https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi
- разбить приложение на компоненты
- необходимо в блюдо добавить счетчик. Минимальное значение 0, максимальное 5, по умолчанию 0. Кнопки +-
- реализовать компонент лейаута с хедером, футером и обернуть приложение
- добавить условный рендеринг, где могут отсутствовать данные
Реализовать табы - кнопки с названием ресторана, по одной на каждый ресторан
- Кнопки отображаем между хедером и рестораном
- Единовременно отображаем только 1 ресторан
- По умолчанию - отображаем первый
- По клику на кнопку отображаем соответствующий ей ресторан. При повторном клике на активную кнопку ничего не происходит.
- сделать форму отзыва ReviewForm: имя, текст, рейтинг (от 1 до 5). Добавить кнопку “clear”, по клику на которую форма сбрасывается в изначальное состояние. Использовать хук useReducer
- форма рисуется после всех отзывов о ресторане
- переиспользовать компонент счетчика Counter между блюдом и отзывом. Важно, именно компонент, который отвечает за UI, логика счетчика блюда лежит отдельно. Можно создать DishCounter и в нем реализовать необходимую логику, но использовать для UI компонент Counter
- реализовать scroll progress - https://www.cssscript.com/demo/scroll-progress-bar/
- https://react.dev/learn/preserving-and-resetting-state прочитать статью
- стилизовать приложение, используя css модули (в свободном формате, на ваше усмотрение). Еще раз подумать над разбивкой UI по отдельным компонентам (ресторан, меню, блюдо, отзыв и тд)
- для удобства предлагается использовать библиотеку classnames, чтобы подключать условно несколько классов - https://www.npmjs.com/package/classnames
- подключить корневой css файл, чтобы почистить ненужные стили
- расширение для удобства работы с css модулями - https://marketplace.visualstudio.com/items?itemName=clinyong.vscode-css-modules
- Добавляем контекст темы. Кнопка переключения темы в шапке. По клику на кнопку все кнопки меняют тему (стили с дефолтных на альтернативные).
- Добавляем контекст пользователя. В шапке делаем кнопку войти, по клику на кнопку добавляем в контекст мок-пользователя (просто имя любое). Если пользователь авторизован (есть в контексте имя), то кнопку войти меняем на имя пользователя и кнопку выйти, по клику на выйти убираем пользователя из контекста и снова рисуем кнопку войти. Кнопки +/- у блюда и форма отзыва рисуются только для авторизованного пользователя.
- установить библиотеки redux-toolkit, react-redux - https://redux-toolkit.js.org/introduction/getting-started#an-existing-app
- установить redux расширения для браузера - https://chromewebstore.google.com/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd
- сконфигурировать стор
- скопировать к себе в репозиторий нормализованные моковые данные (materials/normalized-mock.js в этом проекте)
- создать слайсы данных (рестораны, блюда, отзывы, юзеры) и отказаться от моковых данных (перейти на механизмы rtk)
- реализовать компонент корзины: добавляем блюда из ресторанов по кнопкам +- в каунтере. Текущее значение берем из слайса данных с корзиной
- репозиторий с кастомным редаксом - https://github.com/zubkov7/custom-redux
- применить createSelector, где необходима мемоизация (например, селектор корзины)
- добавить RRD - https://reactrouter.com/start/library/installation
- сделать страницу HomePage (контент на ваше усмотрение)
- сделать страницу /restaurants. На ней рисуем табы ресторанов
- по клику на таб открываем подстраницу restaurants/:restaurantId с названием ресторана и двумя табами - меню и отзывы. Дефолтно открыт таб меню
- по клику на табы меню, отзывы открываем подстраницу с меню или отзывами. restaurants/:restaurantId/menu и restaurants/:restaurantId/reviews
- по клику на блюдо открываем отдельную страницу блюда. На ней отображаем инфу о блюде и количество с кнопками. Страница блюда не является подстраницей ресторана. ее путь dish/:dishId
- скопировать директорию сервера simple_api в корень проекта (materials/simple_api в этом проекте)
- установить зависимости сервера (любым менеджером зависимостей внутри папки сервера)
- скопировать в основной package.json команду start-server (из package.json лекционного проекта)
- запустить сервер
- перестать использовать моковые данные и начать использовать данные с сервера. Удалить моковые константы, чтобы было явно видно
- на странице списка ресторанов /restaurants грузить данные о ресторанах (api /restaurants). Добавить проверку на наличие данных и если в сторе уже есть данные, то не грузить их
- на странице ресторана restaurants/:restaurantId грузить данные о ресторане (api /restaurant/:restaurantId)
- на странице меню ресторана restaurants/:restaurantId/menu грузить блюда ресторана (api /dishes?restaurantId=restaurantId)
- на странице отзывов ресторана restaurants/:restaurantId/reviews грузить отзывы ресторана (api /reviews?restaurantId=restaurantId) и пользователей (api /users. Добавить проверку на пользователей, если они есть в сторе, то не грузить)
- на странице блюда dish/:dishId грузить данные о блюде (api /dish/:dishId). Добавить проверку на наличие данных и если в сторе уже есть данные, то не грузить их
- использовать createEntityAdapter
- В компонентах необходимо отображать состояния загрузки и ошибки. Для статусов запроса сделать константы
- почему thunk имеет такую структуру - https://redux.js.org/understanding/history-and-design/middleware#understanding-middleware