Skip to content

created a branch sprint-14#3

Merged
SASMUS12 merged 2 commits intomainfrom
sprint-14
Feb 17, 2023
Merged

created a branch sprint-14#3
SASMUS12 merged 2 commits intomainfrom
sprint-14

Conversation

@SASMUS12
Copy link
Copy Markdown
Owner

No description provided.

Copy link
Copy Markdown

@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.

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

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

  • Отличное использование хука useForm
  • Отлично, что обработчик сабмита вешаете на форму, а не клик на кнопку.
  • Отлично сделан ProtectedRoute

но есть некоторые недочеты:

  • по заданию нужно сделать логику, при которой бы показывался попап с деталями ингредиента, если кликнуть по ингредиенту, но если скопировать ссылку на ингредиент при открытом попапе и вставить в окно браузера, то должна уже показываться страница с этими деталями.
  • При входе в профиль ошибка кнопки https://disk.yandex.ru/i/E2NN9BRQYXn5bQ
  • <> пустые теги нужны только тогда, когда нет общего тега (компонента), который оборачивает всю верстку

import { baseUrl } from './api';
import { setCookie } from './cookies';

export function request(url, options) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Можно лучше

Если интересно, то можно создать универсальную функцию запроса request , которая будет содержать в себе уже базовый урл, проверку на ok и проверку на success, чтобы не дублировать их в каждом запросе.

// 1 раз объявляем базовый урл
export const BASE_URL = "https://norma.nomoreparties.space/api/";

// создаем функцию проверки ответа на `ok`
const checkResponse = (res) => {
  if (res.ok) {
    return res.json();
  }
  // не забываем выкидывать ошибку, чтобы она попала в `catch`
  return Promise.reject(`Ошибка ${res.status}`);
};

// создаем функцию проверки на `success`
const checkSuccess = (res) => {
  if (res && res.success) {
    return res;
  }
  // не забываем выкидывать ошибку, чтобы она попала в `catch`
  return Promise.reject(`Ответ не success: ${res}`);
};

// создаем универсальную фукнцию запроса с проверкой ответа и `success`
// В вызов приходит `endpoint`(часть урла, которая идет после базового) и опции
const request = (endpoint, options) => {
  // а также в ней базовый урл сразу прописывается, чтобы не дублировать в каждом запросе
  return fetch(`${BASE_URL}${endpoint}`, options)
    .then(checkResponse)
    .then(checkSuccess);
};

И теперь не нужно будет дублировать все это в каждом запросе. Нужно просто заменить в запросах все fetch на request, удалив лишние проверки и базовый урл. Все остальное останется без изменений

Код станет намного чище. Будет мелкий аналог axios

Пример запроса ингредиентов

const getIngredients =  () => request("ingredients");

В get-запросах даже не нужно указывать 2й параметр. Он получится undefined, что без проблем для fetch (который внутри).


const isResettingPassword = useSelector(store => store.userReducer.isResettingPassword);

const { values, handleChange } = useForm({
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Отличное использование хука useForm

const loc = useLocation();

if (!isAuthenticated && !unAuthorizedOnly) {
return <Navigate to="/login" state={{ from: loc }} />;
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

</li>
</ul>
</div>
<>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

<> пустые теги нужны только тогда, когда нет общего тега (компонента), который оборачивает всю верстку

const { isLoading, error, allIngredients } = useSelector(store => store.burgerConstructorReducer);

const location = useLocation();
const background = location.state && location.state.background;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Отлично сделана логика проверки, был ли пользователь на сайте, и показывать ли страницу с деталями, а не модально окно

Только теперь нужно это использовать, чтобы показывать модальное окно или страницу

<div className={styles.loginForm}>
<h2 className={`${styles.loginHeader} text text_type_main-medium`}>Вход</h2>
<div className="pt-6 pb-20">
<form className={styles.loginFormBody} onSubmit={handleLogin}>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Отлично, что обработчик сабмита вешаете на форму, а не клик на кнопку. Обработка события submit еще срабатывает при нажатии на Enter, так как это встроенная логика сабмитов в браузере.

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