Conversation
…хранилища даннях пользователя и ингридиентов
ArslanMustafin
left a comment
There was a problem hiding this comment.
Code Review
Здравствуйте!
Отличная работа.
Вы молодец!
- Сборка и запуск проекта выполняются без ошибок;
- Проект теперь типизирован;
Но есть несколько замечаний, которые нужно исправить:
- Отметил замечания в коде;
Сделает код лучше:
- Стоит обращать внимание на предупреждения в терминале, в котором запущен проект. Это хорошие рекомендации, которых следовало бы придерживаться. В противном случае, лучше отключить линтер у строки (куска кода) eslint-disable. Так же добавить комментарий (TODO), объясняющий причину блокировки линтера в данном месте. Суть в том, что мы стараемся писать более чистый код, а если видим, что порой выскакивают предупреждения того же линтера, то оставляем комментарий, объясняющий причину. В коммерческой разработке, когда есть целая команда разработчиков, работающих над одним проектом, эта рекомендация послужит правилом хорошего тона. Неплохая статься по поводу локального отключения линтера: https://learn.coderslang.com/ru/0023-eslint-disable-for-specific-lines-files-and-folders
Подробно эти и более мелкие замечания, отмечены в коде.
После исправления всех замечаний, работа будет принята)
src/services/actions/user.tsx
Outdated
| * @param {string} onFail - функция для обработки ошибок | ||
| */ | ||
|
|
||
| // TODO что делать с options и getRequest??? |
There was a problem hiding this comment.
Ну у options есть специальный тип RequestInit, но не вижу типизировать. getRequest - Тут только дженериками (с extends) решать вопрос))
src/services/reducers/ws.tsx
Outdated
| connectionError: '' | ||
| } | ||
|
|
||
| export const wsReducer = createReducer(initialWSState as TWSState, (builder: any) => { |
There was a problem hiding this comment.
Надо исправить:
здесь и далее.
Правильно, что ts ругается, не нужно указывать везде тип (у state, builder и т.п.), тут всё само подхватывается.
А ругается ts потому что у вас расходится тип TWSState, он не должен состоять из нескольких.
| const active: string = AppHeaderStyles.link + ' ' + AppHeaderStyles.active + ' pl-5 pt-4 pr-5 pb-4 text text_type_main-default'; | ||
| const link: string = AppHeaderStyles.link + ' pl-5 pt-4 pr-5 pb-4 text text_type_main-default text_color_inactive'; | ||
| const activeAccountLink: string = AppHeaderStyles.link + ' ' + AppHeaderStyles.active + ' ' + AppHeaderStyles.account + ' pl-5 pt-4 pr-5 pb-4 text text_type_main-default'; | ||
| const accountLink: string = AppHeaderStyles.link + ' ' + AppHeaderStyles.account + ' pl-5 pt-4 pr-5 pb-4 text text_type_main-default text_color_inactive'; |
There was a problem hiding this comment.
Можно лучше:
Тут не обязательно указывать тип, т.к. ts сам подхватывает литеральные (простые типы) типы;
|
|
||
|
|
||
| function BurgerConstructor({ openOrderDetailsModal }) { | ||
| const BurgerConstructor: FC<{openOrderDetailsModal: () => void}> = ({ openOrderDetailsModal }) => { |
There was a problem hiding this comment.
Можно лучше:
лучше вынести описание пропсов, в отдельный тип.
| const targetElement = e.target.parentNode.parentNode; | ||
| // TODO | ||
| const handleDeleteIngredient = (e: MouseEvent<HTMLLIElement>) => { | ||
| console.log('e', e.target); |
There was a problem hiding this comment.
Надо исправить:
В приложении не должно быть консоль логов или дебаггеров. Вместо console.log используйте console.error() для ошибок.
src/components/Orders/Orders.tsx
Outdated
| const { total, totalToday, orders } = useSelector((state) => ( | ||
| state.ws.status === WS_STATUS_ONLINE && state.ws.feed?.success ? state.ws.feed as TFeedData : {orders: [], total: 0, totalToday: 0} | ||
| )); |
There was a problem hiding this comment.
Надо исправить:
вы не должны тут сами задавать default значения полей, это всё должно быть в редьюсере.
|
|
||
| const TotalPrice: FC = () => { | ||
|
|
||
| const { addedIngredients: { bun, others } }: TMenuState = useSelector((state: TRootState) => state.menu); |
There was a problem hiding this comment.
Надо исправить:
вы типизировали useSelector, поэтому не стоит дополнительно указывать тип TMenuState.
| } else { | ||
| // Пробрасывать ошибку и обрабатывать все только в catch | ||
| dispatch(getIngredientsFailedAction()); | ||
| } |
There was a problem hiding this comment.
Тут можно просто вызывать ошибку - throw new Error("Message")
src/utils/constants.tsx
Outdated
| export const WS_STATUS_OFFLINE: 'OFFLINE' = 'OFFLINE'; | ||
| export const WS_STATUS_ONLINE: 'ONLINE' = 'ONLINE'; | ||
| export const WS_STATUS_CONNECTING: 'CONNECTING...' = 'CONNECTING...'; | ||
|
|
||
| export const WS_MESSAGE: 'WS_MESSAGE' = 'WS_MESSAGE'; | ||
| export const WS_CONNECT: 'WS_CONNECT' = 'WS_CONNECT'; | ||
| export const WS_DISCONNECT: 'WS_DISCONNECT' = 'WS_DISCONNECT'; | ||
| export const WS_CONNECTING: 'WS_CONNECTING' = 'WS_CONNECTING'; | ||
| export const WS_OPEN: 'WS_OPEN' = 'WS_OPEN'; | ||
| export const WS_CLOSE: 'WS_CLOSE' = 'WS_CLOSE'; | ||
| export const WS_ERROR: 'WS_ERROR' = 'WS_ERROR'; | ||
|
|
||
| // Константы для обработки запроса для получения всех ингридиентов | ||
| export const GET_INGREDIENTS_REQUEST: 'GET_INGREDIENTS_REQUEST' = 'GET_INGREDIENTS_REQUEST'; | ||
| export const GET_INGREDIENTS_SUCCESS: 'GET_INGREDIENTS_SUCCESS' = 'GET_INGREDIENTS_SUCCESS'; | ||
| export const GET_INGREDIENTS_FAILED: 'GET_INGREDIENTS_FAILED' = 'GET_INGREDIENTS_FAILED'; | ||
|
|
||
| // Константы для обработки запроса оформления заказа | ||
| export const SEND_ORDER_REQUEST: 'SEND_ORDER_REQUEST'= 'SEND_ORDER_REQUEST'; | ||
| export const SEND_ORDER_SUCCESS: 'SEND_ORDER_SUCCESS' = 'SEND_ORDER_SUCCESS'; | ||
| export const SEND_ORDER_FAILED: 'SEND_ORDER_FAILED' = 'SEND_ORDER_FAILED'; | ||
|
|
||
| // Константы для получения/удаления данных об отдельном ингридиенте | ||
| export const SHOW_INGREDIENT: 'SHOW_INGREDIENT' = 'SHOW_INGREDIENT'; | ||
| export const HIDE_INGREDIENT: 'HIDE_INGREDIENT' = 'HIDE_INGREDIENT'; | ||
|
|
||
| // Константы для добавления ингридиента в конструктор бургера | ||
| export const ADD_INGREDIENT: 'ADD_INGREDIENT' = 'ADD_INGREDIENT'; | ||
| export const DELETE_INGREDIENT: 'DELETE_INGREDIENT' = 'DELETE_INGREDIENT'; | ||
| export const ADD_BUN: 'ADD_BUN' = 'ADD_BUN'; | ||
|
|
||
| // Константы для сортировки ингридиентов бургера | ||
| export const CHANGE_INGREDIENT_ORDER: 'CHANGE_INGREDIENT_ORDER' = 'CHANGE_INGREDIENT_ORDER'; | ||
|
|
||
| // Константа для изменения активного таба | ||
| export const SET_ACTIVE_TAB: 'SET_ACTIVE_TAB' = 'SET_ACTIVE_TAB'; | ||
|
|
||
| // Константы для обработки запроса получения данных о пользователе | ||
| export const SET_REGISTER_FORM_VALUE: 'SET_REGISTER_FORM_VALUE' = 'SET_REGISTER_FORM_VALUE'; | ||
| export const SET_EDIT_USER_FORM: 'SET_EDIT_USER_FORM' = 'SET_EDIT_USER_FORM'; | ||
|
|
||
| export const ADD_USER_REQUEST: 'ADD_USER_REQUEST' = 'ADD_USER_REQUEST'; | ||
| export const ADD_USER_SUCCESS: 'ADD_USER_SUCCESS' = 'ADD_USER_SUCCESS'; | ||
| export const ADD_USER_FAILED: 'ADD_USER_FAILED' = 'ADD_USER_FAILED'; | ||
|
|
||
| export const LOGIN_USER_REQUEST: 'LOGIN_USER_REQUEST' = 'LOGIN_USER_REQUEST'; | ||
| export const LOGIN_USER_SUCCESS: 'LOGIN_USER_SUCCESS' = 'LOGIN_USER_SUCCESS'; | ||
| export const LOGIN_USER_FAILED: 'LOGIN_USER_FAILED' = 'LOGIN_USER_FAILED'; | ||
|
|
||
| export const LOGOUT_USER_SUCCESS: 'LOGOUT_USER_SUCCESS' = 'LOGOUT_USER_SUCCESS'; | ||
| export const LOGOUT_USER_FAILED: 'LOGOUT_USER_FAILED' = 'LOGOUT_USER_FAILED'; | ||
|
|
||
| export const GET_USER_SUCCESS: 'GET_USER_SUCCESS' = 'GET_USER_SUCCESS'; | ||
| export const GET_USER_FAILED: 'GET_USER_FAILED' = 'GET_USER_FAILED'; | ||
|
|
||
| export const EDIT_USER_SUCCESS: 'EDIT_USER_SUCCESS' = 'EDIT_USER_SUCCESS'; | ||
| export const EDIT_USER_FAILED: 'EDIT_USER_FAILED' = 'EDIT_USER_FAILED'; | ||
| export const RESET_EDIT_USER_FORM: 'RESET_EDIT_USER_FORM' = 'RESET_EDIT_USER_FORM'; | ||
|
|
||
| export const FORGOT_PASSWORD_SUCCESS: 'FORGOT_PASSWORD_SUCCESS' = 'FORGOT_PASSWORD_SUCCESS'; | ||
| export const FORGOT_PASSWORD_FAILED: 'FORGOT_PASSWORD_FAILED' = 'FORGOT_PASSWORD_FAILED'; | ||
|
|
||
| export const RESET_PASSWORD_SUCCESS: 'RESET_PASSWORD_SUCCESS' = 'RESET_PASSWORD_SUCCESS'; | ||
| export const RESET_PASSWORD_FAILED: 'RESET_PASSWORD_FAILED' = 'RESET_PASSWORD_FAILED'; | ||
|
|
||
| export const GET_USER_ORDERS: 'GET_USER_ORDERS' = 'GET_USER_ORDERS'; |
There was a problem hiding this comment.
Можно лучше:
Не стоит явно указывать тип у литеральных констант, ведь такие константы, по умолчанию имеют тип равный её значению.
ArslanMustafin
left a comment
There was a problem hiding this comment.
Code Review
Здравствуйте!
Отличная работа.
Вы молодец! Работа принята, удачи в дальнейшем обучении!
- Все замечания были исправлены;
Можно лучше:
- По идее https://disk.yandex.com/i/hlr47aYC3cOuhQ - этот файл тоже нужно типизировать, я что-то пропустил его в первое ревью, но думаю вы с ним справитесь.
No description provided.