Стек: HTML, SCSS, TS, Webpack
Структура проекта:
- src/ — исходные файлы проекта
- src/components/ — папка с JS компонентами
- src/components/base/ — папка с базовым кодом
- src/components/common/ — папка с компонентами
Важные файлы:
- src/pages/index.html — HTML-файл главной страницы
- src/types/index.ts — файл с типами
- src/index.ts — точка входа приложения
- src/scss/styles.scss — корневой файл стилей
- src/utils/constants.ts — файл с константами
- src/utils/utils.ts — файл с утилитами
Для установки и запуска проекта необходимо выполнить команды
npm install
npm run start
или
yarn
yarn start
npm run build
или
yarn build
Код приложения разделен на слои согласно парадигме MVP:
- слой представления, отвечает за отображение данных на странице
- слой данных, отвечает за хранение и изменение данных
- презентер, отвечает за связь представления и данных.
Содержит в себе базоваую логику отправки запросов. В конструктор передается базовый адрес сервера и опциональный объект с заголовком запроса
Методы:
get
- выполняетGET
запрос на переданный в параметрах ендпоинт и возвращает промис с объектом, которым ответил серверpost
- принимает объект с данными, которые будут переданы в JSON в теле запроса, и отправляет эти данные на ендпоинт переданный как параметр прни вызове метода. По умолчанию выполняетсяPOST
запрос, но метод запроса может быть переопределен заданием третьего параметра вызова
Брокер событий позволяет отправлять события и подписываться на события, происходящие в системе. Класс используется в презентере для орбаботки и в слоях приложения для генерации событий.
Методы, реализуемые классом описаны интерфейсом 'IEvents':
on
- подписка на событияemit
- инициализация событияtrigger
- возвращает функцию, при вызове которой инициализуется требуемое в параметрах событие
Дополнительно реализованы методы onAll
и offAll
— для подписки на все события и сброса всех подписчиков.
Абстрактный класс для создания переиспользуемых UI компонентов и предоставляет инструментарий для работы с DOM в дочерних компонентах. Является слоем представления. Методы:
toggleClass
- переключает CSS-класс. Принимает HTML-элемент, название класса и опционально логическое значение принудительного добавления/удаления классаsetText
- устанавливает текстовое содержимое. Принимает HTML-элемент и текстовое содержимоеsetDisabled
- устанавливает состояние блокировки. Принимает HTML-элемент и логическое значение, указывающее необходимость установки блокировкиsetHidden
- скрывает указанный HTML-элемент, устанавливая его свойство display в 'none'setVisible
- показывает указанный HTML-элемент, удаляя его свойство displaysetImage
- устанавливает источник изображения и альтернативный текст. Принимает HTML-элемент, ссылку на изображение и оционально альтернативное названиеrender
- изображает компонент с опциональными данными и возвращает корневой контейнер.
Абстрактный класс представляет собой базовый механизм, предназначенный для работы с данными и управлениями изменениями. Его конструктор создает новый экземпляр модели с указанными данными и событиями, которые реализует IEvents
. Является слоем данных.
Методы:
emitChanges
- позволяет отправлять события с данными о изменениях необходимым компонентам или модулям.
Класс расширяет Model
, который принимает интерфейс IAppState
, и отвечает за хранение и логику работы с данными. В полях содержит свойства для хранения карточек каталога, предметов корзины, идентификатора открытого элемента, информации о заказе и ошибки формы.
Методы:
setCatalog
- для получения каталога товаровsetPreview
- для предпросмотра товараgetButtonStatus
- для установки правильного текстового содержимого кнопкиtoggleBasketCard
- для изменения статуса товара "в корзине" или "не в корзине". Использует внутренние методыaddCardToBasket
иdeleteCardFromBasket
getBasketTotal
- для установки суммы корзиныgetCardIndex
- для отображения нумерации товара в корзинеclearBasket
- очищает корзину от товаров. Отправляет событие об измененииclearOrder
- очищает данные о заказеsetBasketToOrder
- добавляет массив товаров и сумму из корзины в заказsetOrderPayment
- для самостоятельной установки способа заказаsetOrderAddress
- для самостоятельной установки адреса заказаsetOrderPhone
- для самостоятельной установки теелфона заказаsetOrderEmail
- для самостоятельной установки почты заказаsetOrderField
- для заполнения всех полей заказаvalidateOrder
- проверка формы заказа о правильном заполнении полей форм. Отправляет событие об изменении
Все классы представления отвечают за отображение внутри контейнера передаваемых в них данных. Главным родительским классом всех далее указанных классов является базовый компонент Component<T>
, где <T>
представляет используемый элементом интерфейс или тип. Все дочерние классы принимают в конструкторе container в качестве HTML-элемента и events для управления событиями.
Класс на основе интерфейса IModalData
, который представляет собой универсальный инструмент реализации модального окна, в котором меняется основной контент через шаблоны (карточка, корзина, формы).
Инициализирует элементы корзины, такие как кнопка закрытия и контент.
Устанавливает обработчики событий для уже найденной кнопки закрытия, клика за пределами окна и предотвращение закрытия при клике внутри контента.
Свойства:
content
- устанавливает содержимое модального окна, заменяя текущее содержимое новым
Методы:
open
- открывает модальное окноclose
- закрывает модальное окноrender
- сначала вызывает родительский методrender
, которому передается содержание окна, затем открывается модальное окно и выводится его содержимое пользователю
Класс на основе интерфейса IPage
является компонентом страницы и предоставляет методы для управления элементами страницы.
Имеет следующеие защищенные поля HTML-элементов: обертка страницы, отображение каталога с карточками, отображения корзины и количества товаров в нем. Добавляет слушатель при нажатии на иконку корзины.
Свойства:
counter
- устанавливает значение счетчикаcatalog
- заменяет содержимое каталога новыми элементами.locked
- управляет видимостью и доступностью элементов страницы, позволяя или запрещая пользовательские действия.
Класс на основе интерфейса IForm
представляет собой компонент формы, который управляет визуальным представлением и состоянием форм.
Инициализирует кнопку подтверждения и поле ошибок у контейнера, а также добавляет слушатель событий у полей инпута форм, чтобы позволять валидировать поля.
Свойства:
valid
- устанавливает состояние кнопки в зависимости от валидности формыerrors
- устанавливает текст сообщения об ошибке в область для вывода ошибок формы.
Методы:
clearValue
- очищает поля формыonInputChange
- защищенный метод, обрабатывает событие ввода данных в поля формы. Отправляет событие об измененииrender
- отрисовывает компонент на странице, устанавливает состояние формы, включая валидацию и список ошибок
Класс расширяет Form
на основе типа TOrderPayment
. В конструкторе инициализирует кнопки выбора способа оплаты для дальнейшнего использования в методе, а также поле адреса. Также устанавливается, что при активации кнопок оплаты ставится обработчик события и передаются выбранные данные.
Свойства:
address
- устанавливает адрес
Методы:
clearPayment
- убирает с кнопки класс активнойtogglePayment
- очищает статус кнопок и устанавливает новую активную кнопку
Класс расширяет Form
на основе типа TOrderContacts
. Инициализирует поля формы с почтой и телефоном.
Свойства:
email
- устанавливает почтуphone
- устанавливает номер телефона
Расширяет Component
на освнове интерфейса ISuccess
, появляется при успешном выполнении операций классов OrderPayment
и OrderContact
и отображает сообщение об успешном завершении заказа, а вторым параметром принимает обработчик события при закрытии окна.
Инициализирует поле текста для операции, кнопку и устанавливает ее слушатель событий.
Свойства:
total
- устанавливает сумму заказа
Класс представляет собой компонент корзины, который на основе интерфейса IBasket
.
Инициализирует элементы списка элементов корзины, их заполненность, общую стоимость и устанавливает обработчик на кнопку для возможность перехода к оформлению заказа.
Свойства:
items
- устанаваливает разметку элементов корзиныsum
- устанавливает сумму всех товаров
Класс представляет собой компонент краточки на основе интерфейса ICard
, который содержит информацию о товаре. Конструктор принимает контейнер и объект actions типа ICardActions
, который содержит действия, доступные для выполнения при взаимодействии с карточкой товара. Инициализирует элементы карточки.
Свойства:
id
- устанавливается id для карточкиtitle
- устанавливает название карточкиdescription
- устанавливается описание карточкиprice
- устанавливает цену карточки, при этом идет проверка - если с сервера ценаnull
, то по ТЗ добавить в корзину ее нельзя и ее текст заменяется на Бесценно . Также приводит цену к стандарту при помощи методаformatNumber
image
- устанавливает картинку для карточкиcategory
- устанавливает категорию карточки и добавляет класс в соответствии с текстовым содержимымbutton
- меняет текст на кнопке
Расширяет Card
, который представляет собой другой вид карточки для корзины. В полях указываются номер карточки, название и новая кнопка удаления карточки из корзины.
Свойства:
index
- устанавливает номер карточки по ее индеку
Веб-ларек является небольшим приложением и слоем представлением фактически будет тот код, который находится в корневом src\index.ts
, где все соединяется через колбэки или события компоненты и API. Возможна полноценная реализация по мере разработки приложения.
Данные и типы данных, используемые в приложении, находятся в src\types\index.ts
Событие | Триггер | Реакция |
---|---|---|
cards:changed |
Инициализация товаров, добавление товаров в галерею товаров | Обновляет счетчик корзины, устанавливает разметку товаров |
card:selected |
Выбор карточки кликом в галерее | Устанавливает id карточки в превью модели и вызывает событие preview:changed |
preview:changed |
Выбор карточки кликом в галерее | Выводит или обновляет разметку выбранной карточки в открытом модальном окне, добавляет события на кнпоку карточки (card:basket , preview:changed ) |
modal:open |
Клик по избранным элементам разметки (корзина, карточка, формы заказа, конец операции) | Запрещает пользовательские действия вне модального окна, открывает модальное окно |
modal:closed |
Нажатие на иконку закрытия у модального окна, клик вне модального окна | Разблокируем пользовательские действия, закрывает модальное окно |
basket:open |
Нажатие на иконку корзины | Выводит разметку корзины |
basket:changed |
Изменения в корзине (очистка корзины, добавление и удаление товаров) | Изменение счетки товаров в корзине на главной страницы, изменение суммы корзины, изменение разметки карточек в корзине |
order:open |
Нажатие по оформления в корзине | Открытие модального окна с разметкой первой части формы заказа с заблокированной кнопкой |
order:changed |
Изменение выбора способа заказа | Устанавливает данные о способе оплаты в модель и валидирует поля |
/^order\..*:changed/ |
Слежение за каждым изменением инпутов поля форм | Устанавливает данные о заказе в модель и валидирует поля |
order:submit |
Нажатие по кнопке подтверждения в первой части заказа | Открытие второй части заказа |
contacts:submit |
Нажатие по кнопке подтверждения во второй части заказа | Отправляет товары с корзины в заказ, отправляет данные на сервер, при успешном выполнении операции открывается разметка соответствующего окна, при нажатии кнопки которой происходит очистка данных коризны (basket:change ) и заказа |
formErrors:change |
Незаполенные поля форм | Вызывает текстовую ошибку и блокирует кнопку |