-
Notifications
You must be signed in to change notification settings - Fork 0
Month10/step1 #8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
…хранилища даннях пользователя и ингридиентов
ArslanMustafin
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ну у 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Надо исправить:
здесь и далее.
Правильно, что 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно лучше:
Тут не обязательно указывать тип, т.к. ts сам подхватывает литеральные (простые типы) типы;
|
|
||
|
|
||
| function BurgerConstructor({ openOrderDetailsModal }) { | ||
| const BurgerConstructor: FC<{openOrderDetailsModal: () => void}> = ({ openOrderDetailsModal }) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно лучше:
лучше вынести описание пропсов, в отдельный тип.
| const targetElement = e.target.parentNode.parentNode; | ||
| // TODO | ||
| const handleDeleteIngredient = (e: MouseEvent<HTMLLIElement>) => { | ||
| console.log('e', e.target); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Надо исправить:
В приложении не должно быть консоль логов или дебаггеров. Вместо 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Надо исправить:
вы не должны тут сами задавать default значения полей, это всё должно быть в редьюсере.
|
|
||
| const TotalPrice: FC = () => { | ||
|
|
||
| const { addedIngredients: { bun, others } }: TMenuState = useSelector((state: TRootState) => state.menu); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Надо исправить:
вы типизировали useSelector, поэтому не стоит дополнительно указывать тип TMenuState.
| } else { | ||
| // Пробрасывать ошибку и обрабатывать все только в catch | ||
| dispatch(getIngredientsFailedAction()); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тут можно просто вызывать ошибку - 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно лучше:
Не стоит явно указывать тип у литеральных констант, ведь такие константы, по умолчанию имеют тип равный её значению.
ArslanMustafin
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
Здравствуйте!
Отличная работа.
Вы молодец! Работа принята, удачи в дальнейшем обучении!
- Все замечания были исправлены;
Можно лучше:
- По идее https://disk.yandex.com/i/hlr47aYC3cOuhQ - этот файл тоже нужно типизировать, я что-то пропустил его в первое ревью, но думаю вы с ним справитесь.
No description provided.