Skip to content

mosoveru/web-larek-frontend

Repository files navigation

Проектная работа "Веб-ларек"

Стек: HTML, SCSS, TS, Webpack

Структура проекта:

  • src/ — исходные файлы проекта
  • src/components/ — папка с JS компонентами
  • src/components/base/ — папка с базовым кодом

Важные файлы:

  • src/pages/index.html — HTML-файл главной страницы
  • src/types/index.ts — файл с типами
  • src/index.ts — точка входа приложения
  • src/styles/styles.scss — корневой файл стилей
  • src/utils/constants.ts — файл с константами
  • src/utils/utils.ts — файл с утилитами

Установка и запуск

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

npm install
npm run start

или

yarn
yarn start

Сборка

npm run build

или

yarn build

Базовый код

Все цепочки действий в проекте подчиняются принципу построения приложения MVP.
В терминах MVP каждую цепочку действий в проекте можно описать следующей цепочкой:
V --> P --> M --> P --> V
То есть, цепочка начинается, когда происходит событие, привязанное к какому-то визуальному элементу на экране.

1. Класс Api

Базовый класс для работы с API проекта WEB-ларёк. Конструктор класса принимает такие аргументы:

  1. Базовый URL baseUrl: string.
  2. Объект настроек типа RequestInit.
    Класс имеет такие методы:
  • get и post для работы с получением и отправкой запроса соответственно.
  • handleResponse для обработки пришедшего ответа и обработки ошибок запроса.

2. Класс EventEmitter

Реализует паттерн «Наблюдатель» и позволяет подписываться на события и уведомлять подписчиков о наступлении события.
Класс имеет методы onoffemit — для подписки на событие, отписки от события и уведомления подписчиков о наступлении события соответственно.
Дополнительно реализованы методы onAll и offAll — для подписки на все события и сброса всех подписчиков.
Интересным дополнением является метод trigger , генерирующий заданное событие с заданными аргументами. Это позволяет передавать его в качестве обработчика события в другие классы. Эти классы будут генерировать события, не будучи при этом напрямую зависимыми от класса EventEmitter.

3. Класс Component

Абстрактный класс Component содержит в себе базовое поле и метод для работы с компонентами отображения. Конструктор класса принимает в качестве аргумента контейнер типа HTMLElement и сохраняет его в поле container. Метод render() возвращает контейнер, сохраненный в поле container.

Компоненты модели данных (бизнес-логика)

1. Класс Product

Класс Product хранит данные товара карточки. Реализует интерфейс IProduct, который содержит в себе основные поля с информацией, приходящие с Api. Экземпляры класса хранят в себе информацию о каждом товаре.
Конструктор класса принимает в качестве аргумента объект, реализующий интерфейс IProduct, и объект брокера событий IEvent. Конструктор реализует соответствующие поля класса.
Геттер productInfo() возвращает объект, реализующий интерфейс IProduct, который содержит в себе информацию о карточке товара.

2. Класс ProductList

Экземпляр класса выступает хранилищем экземпляров объектов Product, реализует интерфейс IList.
Конструктор класса принимает в качестве аргумента массив объектов интерфейса IProduct, которые приходят с API, экземпляр объекта брокера событий интерфейса IEvent, а также класс Product. Поле list содержит в себе массив экземпляров объектов класса Product.
Сеттер product() принимает в качестве аргумента экземпляр класса Product, и сохраняет в массив list.
Геттер listItems() возвращает массив экземпляров Product[].

3. Класс Basket

Класс представляет собой хранилище товаров, добавленных в корзину пользователем. Реализует интерфейс IBasketData. Содержит в себе поля basket, который хранит массив объектов интерфейса IProduct. Поле total хранит в себе сумму всех товаров, лежащих в поле basket.
Конструктор принимает в качестве аргумента экземпляр брокера событий IEvent.
Сеттер basketItem() добавляет объект товара в корзину, меняет итоговую сумму и инициирует событие basket:changed.
Геттер basketInfo() возвращает объект интерфейса IBasketData.
Метод removeItem() принимает аргументом индекс элемента массива basket, который нужно удалить, после удаления элемента инициируется событие basket:changed.
Метод removeAll() очищает все поля, инициирует событие basket:changed.

4. Класс Person

Класс является хранилищем информации заказчика, реализует интерфейс IPerson.
Конструктор класса принимает аргументом экземпляр брокера событий IEvent.
Поля email, phone, address, payment хранят в себе строки с информацией о электронном адресе, телефоне, адресе доставки и способе оплаты заказчика соответственно. Поле fieldsErrors типа FormError хранит в себе объект с ошибками валидации полей с информацией заказчика, если ошибок валидации нет, то объект пустой.
Метод validateAddressFields() проверяет валидацию полей address и payment, инициирует событие form-error:changed.
Метод validateContactsFields() проверяет валидацию полей email и phone, инициирует событие form-error:changed.
Метод clearAllFields() очищает все поля объекта Person.
Сеттеры emailAddress, telephoneNumber, addressDelivery, billing сохраняют в соответствующие поля информацию о заказчике.
Геттер buyerInfo() возвращает объект интерфейса IPerson с информацией о пользователе.

Компоненты представления

Классы Page, Card, BasketModal, BasketList, Form, Success, Order и Modal наследуют абстрактный класс Component.

1. Класс Page

Является классом для работы страницы во время открытого модального окна и заполнением счётчика товаров.
Конструктор принимает на вход элемент DOM контейнера страницы, а также элемент DOM с счётчиком товаров в корзине.
Поле класса catalog хранит в себе массив DOM-элементов с карточками товара.
Сеттер contentData сохраняет карточку товара в массив.
Сеттер installLock устанавливает и удаляет блокировку прокрутки при открытом модальном окне.
Сеттер itemsCount устанавливает счётчик товаров в корзине на то число, которое ему передали.
Геттер catalogData() возвращает массив DOM-элементов с карточками товаров из поля класса.

2. Класс Card

Является класом отображения карточки товара на главной странице.
Конструктор принимает на вход шаблон карточки container, экземпляр брокера событий IEvents, и метод интерфейса IActions, который выполняется при клике на карточку.
Поля category, title, image, price хранят в себе DOM-элементы карточки с категорией, заголовком, картинкой и ценой.
Метод fillCardFields() принимает объект интерфейса IProduct и за счёт его данных заполняет поля карточки, кроме категории.
Метод setCategory() заполняет элемент с категорией и устанавливает конкретный класс элементу в зависимости от его категории.

3. Класс Preview

Наследует класс Card, является компонентом отображения превью при клике на карточку.
Конструктор принимает на вход элемент container с превью модального окна и экземпляр брокера событий IEvent. Устанавливает слушатель события при клике на кнопку "В корзину", которое инициирует событие preview:add-to-cart.
Поле description хранит элемент с описанием карточки. Поле cardButton хранит в себе элемент с кнопкой со слушателем.
Метод fillDescription заполняет элемент description текстовыми данными.
Метод fillPreview заполняет все элементы превью информацией о товаре.

4. Класс BasketModal

Является компонентом отображения корзины товаров.
Конструктор принимает на вход шаблон корзины container, экхемпляр брокера событий IEvents. Устанавливает слушатель на кнопку "Оформить", которое инициирует событие order:make.
Поле content хранит в себе список элементов с товарами. Поле basketButton хранит в себе элемент с кнопкой оформления заказа. поле basketPrice хранит в себе элемент, отображающий стоимость товаров.
Сеттер totalPrice устанавливает сумму заказа в элементе.
Сеттер contentList устанавливает список товаров в поле content.
Методы setActiveBasketButton() и setDisabledBasketButton() делают активной и неактивной кнопку оформления заказа соответственно.

5. Класс BasketList

Является компонентом отображения конкретных товаров, добавленных в корзину.
Конструктор принимает на вход элемент контейнера container, где находится список товаров, добавленных в корзину, шаблон template строчки товара в корзине, экземпляр брокера событий IEvents.
Метод makeList() формирует список товаров и сохраняет в контейнере. Принимает на вход массив IProduct[] данных с товарами в корзине.

6. Класс Form

Является компонентом отображения ошибок при оформлении заказа.
Конструктор принимает на вход элемент с формой оформления способа оплаты и адреса, и элемент с формой электронной почты и телефона container и contacts соответственно.
Поле addressErrors хранит элемент для отображения ошибок в элементе с формой способа оплаты и адреса. Поле contactsErrors хранит элемент для отображения ошибок в элементе с формой заполнения телефона и электронного адреса.
Сеттер textErrorAddress устанавливает текст ошибки в addressErrors.
Сеттер textErrorContacts устанавливает текст ошибки в contactsErrors.
Метод clearErrors() очищает поля данного класса.

7. Класс Success

Является компонентом отображения успешного выполнения заказа.
Конструктор принимает на вход container - шаблон успешного оформления заказа.
Поле totalSpentDescription содержит в себе элемент с текстом суммы успешно оформленного заказа.
Сеттер spentTotal устанавливает текст в элементе totalSpentDescription с суммой потраченной валюты.

8. Класс Modal

Является компонентом отображения всех модальных окон: корзины, превью, оформления заказа и успешного оформления заказа. Реализуется это за счёт отображения того, что содержится в поле content.
Конструктор принимает контейнер с модальным окном container и экземпляр брокера событий IEvents. Устанавливает слушатели событий клика на кнопку с крестиком и на поле вокруг модального окна, которые закрывают само модальное окно.
Поле content является ключевым для всех окон: оно содержит в себе элементы, которые будут отображаться, если модальное окно открыто. Оно может хранить и отображать элементы корзины, оформления заказа, успешного оформления заказа и превью.
Поле closeButton хранит элемент кнопки закрытия модального окна.
Сеттер contentData устанавливает текущий контент, который нужно отобразить в модальном окне и сохраняет этот контент в поле content.
Метод open() и close() открывают и закрывают модальное окно. Последний метод инициирует событие modal:close.

9. Класс Order

Является компонентом отображения формы оформления заказа.
Конструктор принимает на вход элемент с формой выбора способа оплаты и полем ввода адреса container, элемент с формой ввода телефона и Email-адреса contacts, экземпляр брокера событий IEvents. Конструктор инициализирует поля и устанавливает слушатели событий на кнопки и поля ввода, кнопки выбора способа оплаты инициируют событие order-button:choose-method, поле ввода адреса инициируют событие address-input:changed, поля с вводом телефона и Email-адреса инициируют событие contacts-input:changed. Кнопка "Далее" инициирует событие order-button:next, которое открывает следующий шаг оформления заказа. Кнопка "Оформить" инициирует событие complete:order.
Поля cardButton и cashButton содержат в себе элементы кнопки с выбором способа оплаты.
Поля addressInput, emailInput и telephoneInput содержат в себе элементы ввода для адреса, почты и телефона.
Поля buttonNext и submitOrderButton содержат в себе элементы кнопки "Далее" и "Оформить" соответственно.
Сеттер activePaymentButton устанавливает нажатую кнопку со способом оплаты активной.
Методы setActiveNextButton, setDisableNextButton, setActiveSubmitOrderButton и setDisableSubmitOrderButton делают активной и неактивной кнопки "Далее" и "Оформить" соответственно.
Геттеры renderOrder и renderContacts возвращают элементы с формой заполнения способа оплаты и ввода адреса и элементы с формой ввода телефона и почты соответственно.

About

Фронтенд проекта "Веб Ларёк"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published