Conversation
gennady-bars
left a comment
There was a problem hiding this comment.
Здравствуйте. (Нужно развернуть общий комментарий ↓)
Работа проделана огромная
- Отличное использование хука
useForm - Отлично, что обработчик сабмита вешаете на форму, а не клик на кнопку.
- Отлично сделан
ProtectedRoute
но есть некоторые недочеты:
- по заданию нужно сделать логику, при которой бы показывался попап с деталями ингредиента, если кликнуть по ингредиенту, но если скопировать ссылку на ингредиент при открытом попапе и вставить в окно браузера, то должна уже показываться страница с этими деталями.
- При входе в профиль ошибка кнопки https://disk.yandex.ru/i/E2NN9BRQYXn5bQ
<>пустые теги нужны только тогда, когда нет общего тега (компонента), который оборачивает всю верстку
| import { baseUrl } from './api'; | ||
| import { setCookie } from './cookies'; | ||
|
|
||
| export function request(url, options) { |
There was a problem hiding this comment.
Можно лучше
Если интересно, то можно создать универсальную функцию запроса 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({ |
There was a problem hiding this comment.
Отличное использование хука useForm
| const loc = useLocation(); | ||
|
|
||
| if (!isAuthenticated && !unAuthorizedOnly) { | ||
| return <Navigate to="/login" state={{ from: loc }} />; |
| </li> | ||
| </ul> | ||
| </div> | ||
| <> |
There was a problem hiding this comment.
<> пустые теги нужны только тогда, когда нет общего тега (компонента), который оборачивает всю верстку
| const { isLoading, error, allIngredients } = useSelector(store => store.burgerConstructorReducer); | ||
|
|
||
| const location = useLocation(); | ||
| const background = location.state && location.state.background; |
There was a problem hiding this comment.
Отлично сделана логика проверки, был ли пользователь на сайте, и показывать ли страницу с деталями, а не модально окно
Только теперь нужно это использовать, чтобы показывать модальное окно или страницу
| <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}> |
There was a problem hiding this comment.
Отлично, что обработчик сабмита вешаете на форму, а не клик на кнопку. Обработка события submit еще срабатывает при нажатии на Enter, так как это встроенная логика сабмитов в браузере.
No description provided.