Skip to content

htmlacademy-javascript/314909-kekstagram-2

Repository files navigation

Личный проект «Кекстаграм»


Не удаляйте и не изменяйте самовольно файлы и папки: .editorconfig, .eslintrc, .gitattributes, .gitignore, package-lock.json, package.json., .github


Как работать с Git на проекте | Как работать над проектом

задание 7.15. Отрисуй меня полностью

Модуль отрисовки миниатюр создан и подключён:

Структура thumbnails.js:

createPictureElement(photo) — создаёт DOM-элемент миниатюры renderPictures() — отрисовывает все миниатюры в .pictures через DocumentFragment Что делает:

Берёт данные из массива photos Для каждой фотографии создаёт клон шаблона #picture Заполняет: src ← photo.url alt ← photo.description .picture__comments ← photo.comments.length .picture__likes ← photo.likes Вставляет все элементы через DocumentFragment


8.14. Открывается и закрывается

Реализован сценарий просмотра фотографий в полноразмерном режиме:

Созданные модули:

big-picture-view.js — отрисовка полноразмерного изображения:

openPicture(photo) — открывает окно с данными фотографии closePicture() — закрывает окно initPictureModal(onClose) — инициализирует обработчики закрытия (Esc, клик по иконке, клик по фону) renderComments(comments) — отрисовывает список комментариев gallery.js — связующий модуль:

initGallery(photos) — инициализирует галерею, обрабатывает клики на миниатюры Функционал:

✅ Открытие по клику на миниатюру ✅ Заполнение данными: url, likes, comments, description ✅ Отрисовка комментариев с аватарами ✅ Скрытие .social__comment-count и .comments-loader ✅ Добавление modal-open к при открытии ✅ Закрытие по Esc и клику на иконку закрытия


8.15. Загрузи ещё

Реализована постраничная загрузка комментариев:

Изменения в big-picture-view.js:

  • Добавлена константа COMMENTS_PER_PAGE = 5
  • Добавлены переменные состояния: currentComments, displayedCommentsCount
  • Функция renderComments() доработана для отрисовки порции комментариев (параметры start, end)
  • Добавлена функция updateCommentCount() — обновляет счётчик показанных комментариев
  • Добавлена функция loadMoreComments() — загружает следующую порцию из 5 комментариев
  • Функция openPicture() теперь:
    • Показывает блоки .social__comment-count и .comments-loader (убирает класс hidden)
    • Инициализирует состояние комментариев
    • Загружает первую порцию из 5 комментариев
  • Функция closePicture() сбрасывает состояние комментариев
  • В initPictureModal() добавлен обработчик клика на кнопку «Загрузить ещё»

Функционал:

✅ При открытии фотографии показываются только первые 5 комментариев ✅ Блок .social__comment-count отображает «5 из N комментариев» ✅ Кнопка «Загрузить ещё» видна и активна ✅ При клике на кнопку добавляются следующие 5 комментариев ✅ Счётчик обновляется после каждой порции ✅ Кнопка скрывается, когда показаны все комментарии ✅ Состояние сбрасывается при закрытии окна


9.6. Валидируй, проверяй, отправляй

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

Созданные модули:

upload-form.js — модуль работы с формой загрузки:

  • initUploadForm() — инициализация всех обработчиков формы
  • openForm() — открытие формы с выбранным файлом
  • closeForm() — закрытие формы со сбросом состояния
  • initSlider() — инициализация noUiSlider для эффектов
  • initValidation() — настройка валидации Pristine
  • showSuccessMessage() / showErrorMessage() — показ сообщений

Изменения в index.html:

  • Добавлены атрибуты формы: method="post", enctype="multipart/form-data", action="https://31.javascript.htmlacademy.pro/kekstagram"
  • Подключены стили noUiSlider и скрипты библиотек (nouislider.js, pristine.min.js)

Функционал:

Открытие/закрытие формы: ✅ Открытие при выборе файла через .img-upload__input ✅ Добавление modal-open к <body> при открытии ✅ Закрытие по кнопке .img-upload__cancel или Esc ✅ Сброс всех полей и значения input file при закрытии

Масштаб изображения: ✅ Кнопки «Уменьшить»/«Увеличить» изменяют масштаб на 25% ✅ Диапазон масштаба: 25%–100% ✅ Применение transform: scale() к изображению

Эффекты и слайдер: ✅ 5 эффектов: Хром, Сепия, Марвин, Фобос, Зной + Оригинал ✅ noUiSlider для регулировки интенсивности эффекта ✅ Применение CSS filter к изображению и превью эффектов ✅ Скрытие слайдера для эффекта «Оригинал»

Валидация хэштегов (Pristine): ✅ Хэштег начинается с #, содержит только буквы и цифры ✅ Длина хэштега ≤ 20 символов ✅ Не более 5 хэштегов ✅ Хэштеги не повторяются (регистронезависимо) ✅ Разные сообщения об ошибках для каждого случая

Валидация комментария: ✅ Максимальная длина — 140 символов ✅ Сообщение об ошибке при превышении

Отправка формы: ✅ Отправка через FormData с помощью fetch (POST, multipart/form-data) ✅ Блокировка кнопки «Опубликовать» на время отправки ✅ Показ сообщения об успехе после успешной отправки ✅ Показ сообщения об ошибке при неудаче ✅ Закрытие формы и сброс полей после успешной отправки

Сообщения: ✅ Сообщение об успехе (#success) — закрывается по кнопке, Esc, клику вне области ✅ Сообщение об ошибке (#error) — закрывается по кнопке, Esc, клику вне области

Особенности: ✅ Блокировка Esc при фокусе на полях хэштегов и комментария (stopPropagation) ✅ Отображение ошибок в .img-upload__field-wrapper--error


9.15. Помощь друга

Результат:

Масштаб — уже был реализован: значение записывается в name="scale" (readonly-поле) и применяется визуально через transform: scale().

2. noUiSlider для эффектов — вынес применение фильтра в отдельную функцию applyEffect(), чтобы избежать проблем с замыканием. Теперь:

3 При инициализации слайдера значение эффекта сразу записывается в effectLevelValue и применяется визуально При переключении фильтра слайдер пересоздаётся с начальным значением (effect.start), и эффект сразу сбрасывается При перемещении ползунка значение обновляется и в поле формы, и визуально


12.13. Фото на память

Итог полной проверки проекта по ТЗ

Раздел 1 — Загрузка нового изображения ✅ Все пункты 1.1–1.3 реализованы корректно: выбор файла, открытие/закрытие формы, подстановка изображения в preview и превью эффектов.

Раздел 2 — Редактирование изображения ✅ Исправлено: Селектор preview изменён с .img-upload__preview img на .img-upload__preview. Теперь transform: scale() применяется к контейнеру, а filter — к вложенному , что соответствует ТЗ.

Раздел 2.3–2.4 — Хэштеги и комментарий ✅ Валидация, сообщения об ошибках, поведение Esc — всё корректно.

Раздел 3 — Отправка данных на сервер ✅ POST, FormData, блокировка кнопки, сообщения об успехе/ошибке — всё соответствует.

Раздел 4 — Просмотр загруженных изображений ✅ Загрузка данных, миниатюры, полноэкранный просмотр, комментарии порциями по 5, кнопка «Загрузить ещё» — всё реализовано.

Раздел 5 — Фильтрация ✅ Исправлено:

debounce теперь корректно работает с this (обычные функции вместо стрелочных) Фильтрация и перерисовка выполняются вместе внутри debounced-функции с задержкой 500мс Блок .img-filters--inactive скрывается через opacity: 0 в CSS и показывается после загрузки данных


12.15. Подготовиться к защите проекта

Установка автотеста Cypress и его прохождение


Внесённые изменения в модуль upload-form.js

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

Обработка события сброса формы

Удалён обработчик события reset, который ранее вызывал функцию закрытия формы. В предыдущей реализации это приводило к повторному вызову form.reset() внутри closeForm(), что могло вызывать некорректное поведение.

Сброс формы теперь выполняется централизованно внутри функции закрытия формы.

Результат:

  • устранён риск рекурсивных вызовов;
  • обеспечено корректное закрытие формы;
  • поведение формы соответствует ожидаемому сценарию.

Проверка типа загружаемого файла

Добавлена проверка формата файла перед открытием формы редактирования.

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

jpg; jpeg; png; gif

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

Результат:

  • предотвращено открытие формы с некорректными данными;
  • обеспечена стабильность работы блока предпросмотра изображения.

Приведение поведения формы к требованиям технического задания

После внесённых изменений реализовано корректное поведение формы:

  • форма открывается после выбора корректного изображения;
  • форма закрывается:
    • по нажатию на кнопку закрытия;
    • по нажатию клавиши Esc, если фокус не находится в полях ввода;
  • при фокусе в полях ввода (хэштеги, комментарий) нажатие Esc не закрывает форму;
  • при закрытии формы выполняется полный сброс состояния:
    • масштаб изображения возвращается к 100%;
    • выбранный эффект сбрасывается на «Оригинал»;
    • значения полей ввода очищаются;
    • поле выбора файла сбрасывается.

Указанное поведение соответствует требованиям технического задания проекта.


Рефакторинг модуля upload-form.js

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

Основные изменения

  • Упрощена логика обработки событий формы: сложные обработчики разбиты на небольшие функции с единственной ответственностью.
  • Снижена когнитивная сложность функций (createFormHandlers, createOnEscapePress, валидация хэштегов) за счёт выноса условий в отдельные предикаты и helper-функции.
  • Устранено дублирование кода при формировании результатов валидации (createValidResult, createInvalidResult).
  • Логика закрытия формы по клавише Escape приведена к более декларативному виду через единый предикат shouldSkipEscapeClose.
  • Упрощена валидация хэштегов: проверки разбиты на независимые функции, улучшена читаемость и поддерживаемость.
  • Централизован сброс состояния формы и эффектов, что уменьшило дублирование и повысило предсказуемость поведения.

Результат

  • Улучшена читаемость и поддерживаемость кода.
  • Снижена сложность ключевых функций без изменения поведения.
  • Сохранено соответствие техническому заданию.
  • Поведение формы стабильно при повторных открытиях и отправке данных.

HTML Academy

Репозиторий создан для обучения на интенсивном онлайн‑курсе «JavaScript. Профессиональная разработка веб-интерфейсов» от HTML Academy.

About

Ирина Трубчик

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors