Skip to content

Conversation

@ulbee
Copy link
Owner

@ulbee ulbee commented Apr 2, 2023

No description provided.

Copy link

@ArslanMustafin ArslanMustafin left a 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

Подробно эти и более мелкие замечания, отмечены в коде.

После исправления всех замечаний, работа будет принята)

* @param {string} onFail - функция для обработки ошибок
*/

// TODO что делать с options и getRequest???

Choose a reason for hiding this comment

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

Ну у options есть специальный тип RequestInit, но не вижу типизировать. getRequest - Тут только дженериками (с extends) решать вопрос))

connectionError: ''
}

export const wsReducer = createReducer(initialWSState as TWSState, (builder: any) => {

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, он не должен состоять из нескольких.

Comment on lines 7 to 10
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';

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

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

Choose a reason for hiding this comment

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

Надо исправить:

В приложении не должно быть консоль логов или дебаггеров. Вместо console.log используйте console.error() для ошибок.

Comment on lines 18 to 20
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}
));

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

Choose a reason for hiding this comment

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

Надо исправить:

вы типизировали useSelector, поэтому не стоит дополнительно указывать тип TMenuState.

Comment on lines 30 to 33
} else {
// Пробрасывать ошибку и обрабатывать все только в catch
dispatch(getIngredientsFailedAction());
}

Choose a reason for hiding this comment

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

Тут можно просто вызывать ошибку - throw new Error("Message")

Comment on lines 15 to 80
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';

Choose a reason for hiding this comment

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

Можно лучше:

Не стоит явно указывать тип у литеральных констант, ведь такие константы, по умолчанию имеют тип равный её значению.

Copy link

@ArslanMustafin ArslanMustafin left a 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 - этот файл тоже нужно типизировать, я что-то пропустил его в первое ревью, но думаю вы с ним справитесь.

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.

3 participants