Skip to content

Sprint 6/step 1 - #8

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

dlart wants to merge 3 commits into
mainfrom
sprint-6/step-1

Conversation

@dlart

@dlart dlart commented Jun 23, 2023

Copy link
Copy Markdown
Owner

No description provided.

@gennady-bars gennady-bars left a comment

Copy link
Copy Markdown

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 = {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown

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

Copy link
Copy Markdown

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

Copy link
Copy Markdown

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

Comment thread cypress/e2e/burgerConstructor.cy.js Outdated
JSON.stringify('refreshToken')
);

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

Copy link
Copy Markdown

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
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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

Comment thread cypress/e2e/burgerConstructor.cy.js Outdated
});

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Ок

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

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

Comment thread cypress/e2e/burgerConstructor.cy.js Outdated

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

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

Copy link
Copy Markdown

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
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

Ок

@dlart

dlart commented Jun 23, 2023

Copy link
Copy Markdown
Owner Author

"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х раз в коде, значит, этот селектор нужно выносить в константу, чтобы можно было одним движением изменить его и не искать по всему коду дублирования этого селектора." - Ок

@gennady-bars gennady-bars left a comment

Copy link
Copy Markdown

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