Conversation
gennady-bars
left a comment
There was a problem hiding this comment.
Здравствуйте. (Нужно развернуть общий комментарий ↓)
Посмотрите на гитхабе все комментарии к коду (нужно прокрутить вниз страницу там)
Работа проделана огромная:
- Проект задеплоен
- Все юнит-тесты (48 шт) проходят успешно
- Все cypress-тесты проходят успешно
- Код тестов аккуратный и понятный
но есть некоторые недочеты:
constants.js, user.js,order.js,ingredients.js` нужно типизировать- Заказ собран, но кнопка неактивная https://disk.yandex.ru/i/11bycBRldzyJVQ . Неавторизованный пользователь не должен отправлять заказ на сервер. При клике на кнопку его нужно переводить на логин и после удачного логина обратно к заказу.
- Скрин https://disk.yandex.ru/i/Ohhav3hkFoM1Fg По заданию нужно сделать логику, при которой бы показывался попап с деталями заказа, если кликнуть по заказу, но если скопировать ссылку на заказ при открытом попапе и вставить в окно браузера, то должна уже показываться страница с этими деталями.
- Если перезагрузить страницу с открытым попапом заказа истории, то этот открытый попап опять должен появляться (или страница с деталями). А сейчас ничего не отображается после перезагрузки.
- Если пользователь не авторизован и пытается попасть на защищённый маршрут — его переадресовывает на маршрут
/login. После авторизации пользователь автоматически переадресовывается на тот маршрут, к которому у него не получилось получить доступ ранее. initialStateне нужно создавать в тестах опять. Нужно импортироватьinitialStateиз файла редьюсера. Там уже создан начальный стейт для каждого редьюсераProtectedRouteдолжен использоватьNavigateс параметрами для универсального возращения пользователя обратно туда, куда он хотел попасть.http://localhost:3000будет повторяться несколько раз в коде тестов. Нужно вынести в константуtestUrl, чтобы можно было одним движением изменить урл для тестов
А можно в документации посмотреть, как настроить быстроbaseUrlдля cypress https://docs.cypress.io/api/commands/visit#Visit-is-automatically-prefixed-with-baseUrl[data-testid="643d69a5c3f7b9001cfa093c"]дублируется 3 раза- Если строка-селектор повторяется более 2х раз в коде, значит, этот селектор нужно выносить в константу, чтобы можно было одним движением изменить его и не искать по всему коду дублирования этого селектора.
Можно лучше
- Желательно очищать конструктор после успешного получения номера заказа с сервера в блоке
then, чтобы пользователь мог следующий заказ сделать, не удаляя старые ингредиенты - лучше отображать лоадер (загрузку) при ожидании ответа от сервера с номером заказа
- при клике на логотип обычно идет переход на главную страницу
Исправьте, пожалуйста, недочеты и работа будет принята. Пожалуйста, проверьте работоспособность проекта и наличие возможных ошибок в консоли браузера (кнопка F12) перед отправкой на ревью.
Напоминаю, что работа может быть принята только после исправления всех критических замечаний Нужно исправить.
Удачного рефакторинга кода.
| import reducer, { decreaseCount, increaseCount, resetCount } from './ingredients' | ||
|
|
||
| describe('ingredients test', () => { | ||
| let initialState = { |
There was a problem hiding this comment.
initialState не нужно создавать в тестах опять. Нужно импортировать initialState из файла редьюсера. Там уже создан начальный стейт для каждого редьюсера
| modalOpen: true, | ||
| }); | ||
| }); | ||
| }); |
There was a problem hiding this comment.
Можно лучше
Можно сделать универсальный кастомный хук для контроля любого количества инпутов в любых формах:
export function useForm(inputValues={}) {
const [values, setValues] = useState(inputValues);
const handleChange = (event) => {
const {value, name} = event.target;
setValues({...values, [name]: value});
};
return {values, handleChange, setValues};
}Этот код помещают в отдельный файл useForm.js в папке hooks и импортируют функцию туда, где нужно контролировать инпуты
И Вам не нужно будет теперь вручную создавать функции обработки инпутов и т д. Все будет в одной строчке кода:
const {values, handleChange, setValues} = useForm({});| modalOpen: true, | ||
| }); | ||
| }); | ||
| }); |
There was a problem hiding this comment.
if (!isLoggedIn) {
return <Navigate to="/login" replace />;
} ProtectedRoute должен использовать Navigate с параметрами для универсального возращения пользователя обратно туда, куда он хотел попасть.
return <Navigate to="/login" state={{ from: location}}/>;| modalOpen: true, | ||
| }); | ||
| }); | ||
| }); |
There was a problem hiding this comment.
Можно лучше
Если интересно, то можно сделать вот так универсальный компонент ProtectedRoute с переадресацией
export default function ProtectedRoute({ children, anonymous = false }) {
const isLoggedIn = useSelector((store) => store.user.isLoggedIn);
const location = useLocation();
const from = location.state?.from || '/';
// Если разрешен неавторизованный доступ, а пользователь авторизован...
if (anonymous && isLoggedIn) {
// ...то отправляем его на предыдущую страницу
return <Navigate to={ from } />;
}
// Если требуется авторизация, а пользователь не авторизован...
if (!anonymous && !isLoggedIn) {
// ...то отправляем его на страницу логин
return <Navigate to="/login" state={{ from: location}}/>;
}
// Если все ок, то рендерим внутреннее содержимое
return children;
}
cypress/e2e/burgerConstructor.cy.js
Outdated
| JSON.stringify('refreshToken') | ||
| ); | ||
|
|
||
| cy.visit('http://localhost:3000/'); |
There was a problem hiding this comment.
http://localhost:3000 будет повторяться несколько раз в коде тестов. Нужно вынести в константу testUrl, чтобы можно было одним движением изменить урл для тестов
А можно в документации посмотреть, как настроить быстро baseUrl для cypress https://docs.cypress.io/api/commands/visit#Visit-is-automatically-prefixed-with-baseUrl
There was a problem hiding this comment.
Ок. Настроил в конфигурации Cypress
cypress/e2e/burgerConstructor.cy.js
Outdated
| }); | ||
|
|
||
| it('should handle ingredient modal', () => { | ||
| cy.get('[data-testid="643d69a5c3f7b9001cfa093c"]').click(); |
There was a problem hiding this comment.
[data-testid="643d69a5c3f7b9001cfa093c"] дублируется 3 раза
There was a problem hiding this comment.
Если строка-селектор повторяется более 2х раз в коде, значит, этот селектор нужно выносить в константу, чтобы можно было одним движением изменить его и не искать по всему коду дублирования этого селектора.
There was a problem hiding this comment.
Вроде все повторяющиеся вынес в константы
cypress/e2e/burgerConstructor.cy.js
Outdated
|
|
||
| cy.get('[data-testid="643d69a5c3f7b9001cfa0941"]').trigger('dragstart'); | ||
|
|
||
| cy.get('[data-testid="ingredient-drop-target"]').trigger('drop'); |
There was a problem hiding this comment.
[data-testid="ingredient-drop-target"] тоже 3 раза
и так далее
|
"constants.js, user.js, order.js, ingredients.js` нужно типизировать" - ок |
gennady-bars
left a comment
There was a problem hiding this comment.
Поздравляю! Ваша работа принята.
Вы отлично потрудились.
Удачи в Вашей новой профессии.
Несколько советов для дальнейшего развития:
- сверстайте несколько небольших проектов для себя, для закрепления знаний, и чтобы можно добавить их в портфолио
- ходите на собеседования: опыт прохождения собеседований не менее важен знаний теории, и Вы поймете, какие знания требуются на рынке, и где Вы проседаете
- читайте habr и слушаете подкаксты: они очень хорошо расширяют кругозор и позволяют узнать, что происходит в отрасли:
https://www.youtube.com/channel/UCZeU17nbVfzczAkJVTay9vw
(ссылки на каналы могут быть недоступными сейчас. Попробуйте через vpn)
https://soundcloud.com/everyonecan
https://soundcloud.com/podlodka
https://soundcloud.com/devschacht
No description provided.