Skip to content
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

sprint-2/step-2 #4

Merged
merged 2 commits into from Dec 8, 2021
Merged

sprint-2/step-2 #4

merged 2 commits into from Dec 8, 2021

Conversation

massimoteplovsky
Copy link
Owner

No description provided.

Copy link

@andrepolischuk andrepolischuk left a comment

Choose a reason for hiding this comment

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

добрый день, отличная работа

  • все работает как ожидается
  • круто что используется redux toolkit и методология ducks для описания хранилища
  • реализовано переключение навигации ингредиентов

но нужно немного исправить

  • все необходимые поля должны быть помечены isRequired, тут же должно быть обязательно либо null либо ингредиент
  • если при запросе к апи произошла ошибка, необходимо сбрасывать хранилище к начальному состоянию, то есть orderNumber должен стать null а ingredientsList должен стать пустым массивом
  • хуки должны использовать только на верхнем уровне компонента и не могут быть обернуты в другие функции или условия

и можно сделать еще лучше

  • имеет смысл отказаться от этого hoc withModal, потому что
    • для открытия модалки используется несколько флагов в сторе: modalType и order.orderNumber для модалки заказа
    • при добавлении каждой новой модалки ее контент придется добавлять в этот hoc
  • лучше переложить request в utils потому что запросы не относятся к редаксу и хранению состояния
  • лучше назвать duck ingredient и селектор - current-ingredient и getCurrentIngredient соответственно. чтобы по названию было более понятно для чего они используются

работа может быть принята только после исправления всех критических замечаний помеченных нужно исправить

удачи

@@ -0,0 +1,18 @@
export const ENDPOINT = 'https://norma.nomoreparties.space/api';

const request = async (url, options = null) => {

Choose a reason for hiding this comment

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

круто что запросы к апи вынесены в отдельный модуль, но лучше переложить это в utils потому что запросы не относятся к редаксу и хранению состояния

// Selectors
export const getAppState = ({ app }) => app;

export default appReducer;

Choose a reason for hiding this comment

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

круто что используется методология ducks для описания стора redux 👍

})
.addCase(openModal, (state, { payload }) => {
state.isModalOpen = true;
state.modalType = payload;

Choose a reason for hiding this comment

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

можно сделать лучше: лучше не хранить состояние модальных окон отдельно, потому что в приложении уже есть флаги по которым можно показывать их. для модалки заказа это orderNumber в редьюсере order. для модалки ингредиента это ingredient в редьюсере ingredient. в текущей реализации получается что для открытия каждой модалки имеются три разных флага в хранилище

ingredient: pt.oneOfType([
PropValidator.INGREDIENT.isRequired,
pt.oneOf([null]).isRequired,
]),

Choose a reason for hiding this comment

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

нужно исправить: все необходимые поля должны быть помечены isRequired, тут же должно быть обязательно либо null либо ингредиент

Copy link
Owner Author

Choose a reason for hiding this comment

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

Если везде поставить isRequired или только после oneOfType, то это не работает. Проблема вроде как распространенная и вообще это вроде баг. Если придет null в компонент, то будет ошибка "Warning: Failed prop type: The prop ingredient is marked as required in BunIngredient, but its value is null." , хотя стоит проверка на null. В моем же варианте при передаче любого другого типа будет ошибка "Warning: Failed prop type: Invalid prop ingredient supplied to BunIngredient."
facebook/prop-types#90 (comment)

Choose a reason for hiding this comment

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

да, посмотрел, действительно так. пусть остается как есть

Copy link
Owner Author

Choose a reason for hiding this comment

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

Ок

export const getBurgerIngredients = ({ burgerIngredients }) =>
burgerIngredients.burgerData;

export const getTotalPrice = createSelector(

Choose a reason for hiding this comment

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

отлично что подсчет стоимости бургера вынесен в селекторы 👍 а не находится в редьюсере к примеру

});

// Selectors
export const getIngredient = ({ ingredient }) => ingredient;

Choose a reason for hiding this comment

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

можно сделать лучше: лучше назвать этот duck и селектор current-ingredient и getCurrentIngredient соответственно. чтобы по названию было более понятно для чего они используются

state.isLoading = false;
})
.addCase(sendOrder.rejected, (state) => {
state.isLoading = false;

Choose a reason for hiding this comment

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

нужно исправить: если при запросе к апи произошла ошибка, необходимо сбрасывать хранилище к начальному состоянию, то есть orderNumber должен стать null

state.isLoading = false;
})
.addCase(fetchAllIngredients.rejected, (state) => {
state.isLoading = false;

Choose a reason for hiding this comment

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

нужно исправить: если при запросе к апи произошла ошибка, необходимо сбрасывать хранилище к начальному состоянию, то есть ingredientsList должен стать пустым массивом

const containerRef = useRef();
const ingredientsTitleRef = useMemo(() => {
return TAB_ITEMS.reduce((acc, { type }) => {
acc[type] = createRef(null);

Choose a reason for hiding this comment

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

нужно исправить: хуки должны использовать только на верхнем уровне компонента и не могут быть обернуты в другие функции или условия

Copy link
Owner Author

Choose a reason for hiding this comment

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

CreateRef не хук. У меня стоит плагин валидации правил хуков в IDE и ошибок нет.

Copy link
Owner Author

Choose a reason for hiding this comment

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

Здесь вообще можно получить ответ???

Choose a reason for hiding this comment

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

сорри за долгий ответ. я перепутал createRef и useRef. обычно правда createRef ипользуется в классах, а useRef в функциях. но поскольку в данной реализации есть мемоизация и createRef дергается единожды при mount, пусть остается как есть с createRef

Copy link
Owner Author

Choose a reason for hiding this comment

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

Ок


const getComponent = () => {
switch (modalType) {
case ModalType.ORDER:
return <OrderDetails orderNumber={orderNumber} />;
return <OrderDetails />;

Choose a reason for hiding this comment

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

можно сделать лучше: имеет смысл отказаться от этого hoc, потому что

  • для открытия модалки используется несколько флагов в сторе: modalType и order.orderNumber для модалки заказа
  • при добавлении каждой новой модалки ее контент придется добавлять в этот hoc

лучше использовать компонент Modal по месту, к примеру

  const orderNumber = useSelector(getOrderNumber);
  const dispatch = useDispatch();
  ...
  return (
      ...
      {orderNumber && (
          <Modal closeModal={() => dispatch(resetOrder)}>
              <OrderDetails number={orderNumber} />
          </Modal>
      )}
      ...
  )

Copy link

@andrepolischuk andrepolischuk left a comment

Choose a reason for hiding this comment

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

все круто, все недочеты исправлены, ваша работа принята 🥳

успехов в дальнейшем обучении

@massimoteplovsky massimoteplovsky merged commit d21b6ad into main Dec 8, 2021
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.

None yet

2 participants