Задание 6: вариант решения

Продолжительность: 10 мин

Итак, это было последнее практическое управжнение курса. Давайте я поделюсь своим вариантом решения.

Вы можете увидеть изменения в коде открыв пулл-реквест на Гитхабе.

На первом этапе я добавил функцию fetchRestaurantReviews в файле lib/api.ts:

export async function fetchRestaurantReviews(
  restaurantId: string,
): Promise<ReviewResponse[]> {
  const response = await fetch(
    `http://localhost:3002/restaurants/${restaurantId}/reviews`,
  );
  return response.json();
}
typescript

Затем я создал тип Ratings для описания нашей абстракции и создал функцию getRestaurantRatings, которая как и в случае с ресторанами, получает данные из разных источников и формирует ответ с интересующей нас структурой.

export async function getRestaurantRatings(id: string): Promise<Ratings> {
  const restaurant = await fetchRestaurant(id);
  const reviews = await fetchRestaurantReviews(id);
  const { attributes } = restaurant;

  const initialReviews = restaurant.relationships.reviews;
  return {
    rating: attributes.rating,
    numRatings: attributes.numRatings,
    reviews: [...initialReviews, ...reviews].map((review) => ({
      id: review.id,
      rating: review.rating,
      comment: review.comment,
      date: review.date,
      userName: review.user.name,
    })),
  };
}
typescript

Далее добавил использование этой функции в компоненты RatingAndReviewsSummary и Reviews, которые мы создавали на первом этапе.

Обратите внимание что здесь совсем не важна визуальная составляющая. Я хочу чтобы вы сфокусировались на самой идее добавления нового слоя абстракции над обращением к API.

После того как мы сделали это наш код стал более чистым, увеличилась его надежность и возможность менять что-то при развитии проекта.

Это платный урок

Купите полный доступ к курсу чтобы просматривать данный контент

Основы архитектуры фронтенда

Изучите основы проектирования современных, высоконагруженных фронтенд-приложений.

3990 Скидка 75%
990

Безопасные платежи обрабатываются сервисом Юкасса

Комментарии

Войдите, чтобы оставить комментарий