Тестовое задание на Angular. Создание State для бронирования варианта.

Aleksandr Serenko
F.A.F.N.U.R
Published in
2 min readJul 5, 2021

В данной статье рассмотрим создание “гибридного” state’а, который формально собирается из двух других state’ов.

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

Для этого сначала создадим интерфейс в booking/common:

Как видно из примера, сущность для бронирования (BookingVariant) это немного измененный отель:

export interface BookingVariant extends Building {
firstRoom: RoomEntity | null;
}

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

Создадим новый Ngrx state, который будет хранить в себе выбранный вариант.

Внимательный читатель, взглянув на state, заметит, что в state’е нет механизма получения доступных вариантов. State хранит только выбранный вариант.

Вопрос в том, как получить доступные варианты?

Для этого, мы создадим сервис, который подключит в себе RoomFacade и BuildingFacade и и их помощью, позволит получить актуальный список вариантов.

Создадим BookingService в booking/service:

Сначала рассмотрим bookingVariants$. Свойство bookingVariants$ представляет собой все доступные варианты. Для его формирования используется:

bookingVariants$: Observable<BookingVariant[]> = combineLatest([
this.buildingFacade.buildings$.pipe(filter<any>(Boolean)),
this.roomFacade.rooms$.pipe(filter<any>(Boolean)),
]).pipe(
map(([buildings, rooms]: [Building[], Room[]]) =>
buildings
.filter((building) => building.rooms.length)
.map((building) => ({ ...building, firstRoom: getFirstRoomOnBuilding(building, rooms) }))
)
);

Другими словами получаем все номера и отели, потом для каждого отеля, из всего списка номеров, находим первый номер и создаем новую сущность, которая является BookingVariant.

Далее идет bookingVariant$. В данном случае bookingVariant$ — это выбранный вариант из списка доступных вариантов. Поэтому просто передается значение из BookingFacade.

В предыдущей статье, уже говорилось о наследовании и использовании данных state. И в данном случае, bookingVariant$ как и методы setBookingVariant(), setBookingDetails(), clearBookingVariant() и clearBookingDetails() являются плохой практикой и при возможности старайтесь избегать этого.

Ссылки

Вернуться к оглавлению — Введение.

Следующая статья — Создание UI kit для приложения.

Предыдущая статья — Добавление google maps.

Все исходники на github/fafnur/barinb.

Группа в Medium: https://medium.com/fafnur
Группа в Vkontakte: https://vk.com/fafnur
Группа в Facebook: https://www.facebook.com/groups/fafnur/
Telegram канал: https://t.me/f_a_f_n_u_r
Twitter: https://twitter.com/Fafnur1
LinkedIn: https://www.linkedin.com/in/fafnur

--

--

Aleksandr Serenko
F.A.F.N.U.R

Senior Front-end Developer, Angular evangelist, Nx apologist, NodeJS warlock