Skip to content

Sprint 6/step 1#8

Open
dlart wants to merge 3 commits intomainfrom
sprint-6/step-1
Open

Sprint 6/step 1#8
dlart wants to merge 3 commits intomainfrom
sprint-6/step-1

Conversation

@dlart
Copy link
Owner

@dlart dlart commented Jun 23, 2023

No description provided.

Copy link

@gennady-bars gennady-bars left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здравствуйте. (Нужно развернуть общий комментарий ↓)

Посмотрите на гитхабе все комментарии к коду (нужно прокрутить вниз страницу там)

Работа проделана огромная:

  • Проект задеплоен
  • Все юнит-тесты (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 = {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

initialState не нужно создавать в тестах опять. Нужно импортировать initialState из файла редьюсера. Там уже создан начальный стейт для каждого редьюсера

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok

modalOpen: true,
});
});
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше

Можно сделать универсальный кастомный хук для контроля любого количества инпутов в любых формах:

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,
});
});
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  if (!isLoggedIn) {
    return <Navigate to="/login" replace />;
  }

ProtectedRoute должен использовать Navigate с параметрами для универсального возращения пользователя обратно туда, куда он хотел попасть.

    return <Navigate to="/login" state={{ from: location}}/>;

modalOpen: true,
});
});
});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно лучше

Если интересно, то можно сделать вот так универсальный компонент 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;
}

JSON.stringify('refreshToken')
);

cy.visit('http://localhost:3000/');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

http://localhost:3000 будет повторяться несколько раз в коде тестов. Нужно вынести в константу testUrl, чтобы можно было одним движением изменить урл для тестов
А можно в документации посмотреть, как настроить быстро baseUrl для cypress https://docs.cypress.io/api/commands/visit#Visit-is-automatically-prefixed-with-baseUrl

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ок. Настроил в конфигурации Cypress

});

it('should handle ingredient modal', () => {
cy.get('[data-testid="643d69a5c3f7b9001cfa093c"]').click();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[data-testid="643d69a5c3f7b9001cfa093c"] дублируется 3 раза

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если строка-селектор повторяется более 2х раз в коде, значит, этот селектор нужно выносить в константу, чтобы можно было одним движением изменить его и не искать по всему коду дублирования этого селектора.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ок

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде все повторяющиеся вынес в константы


cy.get('[data-testid="643d69a5c3f7b9001cfa0941"]').trigger('dragstart');

cy.get('[data-testid="ingredient-drop-target"]').trigger('drop');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[data-testid="ingredient-drop-target"] тоже 3 раза

и так далее

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ок

@dlart
Copy link
Owner Author

dlart commented Jun 23, 2023

"constants.js, user.js, order.js, ingredients.js` нужно типизировать" - ок
"Заказ собран, но кнопка неактивная https://disk.yandex.ru/i/11bycBRldzyJVQ . Неавторизованный пользователь не должен отправлять заказ на сервер. При клике на кнопку его нужно переводить на логин и после удачного логина обратно к заказу." - проверил, кнопка неактивна если пользователь неавторизован и активна если авторизован, тут непонятно..
"initialState не нужно создавать в тестах опять. Нужно импортировать initialState из файла редьюсера. Там уже создан начальный стейт для каждого редьюсера" -Ок
ProtectedRoute должен использовать Navigate с параметрами для универсального возращения пользователя обратно туда, куда он хотел попасть. - Ок
"http://localhost:3000 будет повторяться несколько раз в коде тестов. Нужно вынести в константу testUrl, чтобы можно было одним движением изменить урл для тестов" - Ок
"[data-testid="643d69a5c3f7b9001cfa093c"] дублируется 3 раза
Если строка-селектор повторяется более 2х раз в коде, значит, этот селектор нужно выносить в константу, чтобы можно было одним движением изменить его и не искать по всему коду дублирования этого селектора." - Ок

Copy link

@gennady-bars gennady-bars left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поздравляю! Ваша работа принята.

Вы отлично потрудились.

Удачи в Вашей новой профессии.

Несколько советов для дальнейшего развития:

  • сверстайте несколько небольших проектов для себя, для закрепления знаний, и чтобы можно добавить их в портфолио
  • ходите на собеседования: опыт прохождения собеседований не менее важен знаний теории, и Вы поймете, какие знания требуются на рынке, и где Вы проседаете
  • читайте habr и слушаете подкаксты: они очень хорошо расширяют кругозор и позволяют узнать, что происходит в отрасли:

https://www.youtube.com/channel/UCZeU17nbVfzczAkJVTay9vw
(ссылки на каналы могут быть недоступными сейчас. Попробуйте через vpn)

https://soundcloud.com/everyonecan

https://soundcloud.com/podlodka

https://soundcloud.com/devschacht

https://soundcloud.com/begebot

https://soundcloud.com/web-standards

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants