diff --git a/README.md b/README.md index 34719e139..9a8e4426e 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ -# Instapro +# Проект InstaPro 📸 -MVP социальной сети для обмена фотографиями +Учебный проект — аналог популярной социальной сети для обмена фотографиями. В ходе работы приложение было полностью переведено на динамическое взаимодействие с API, защищено от сбоев данных и оптимизировано для работы в различных режимах авторизации. -## Первоначальная оценка +## Реализованная функциональность -ХХХХ часов +- **Динамическая лента постов:** Реализован рендер всех публикаций пользователей, загружаемых с удаленного сервера. +- **Система лайков:** Добавлена возможность ставить и убирать лайки с мгновенным обновлением интерфейса (без перезагрузки всей страницы). +- **Относительные даты:** Время создания каждого поста переведено в удобный человекочитаемый формат (например, «19 минут назад», «3 часа назад»). +- **Защита от XSS-атак:** Внедрено экранирование HTML-тегов, блокирующее ввод вредоносного кода в описании постов. +- **Информирование об ошибках:** Добавлено корректное отображение ошибок («Неверный логин или пароль») прямо в интерфейсе формы авторизации при вводе некорректных данных. -## Фактически затраченное время +## Дополнительные фичи (Доп. задания) -YYYY часов +- **Гостевой режим для общей ленты:** Реализована возможность для неавторизованных пользователей просматривать главную страницу со всеми постами. +- **Гостевой режим для профилей:** Неавторизованные пользователи могут открывать и просматривать персональные ленты конкретных авторов. +- **Защита от несанкционированных действий:** Для гостей заблокирована отправка лайков — при клике на сердечко выводится предупреждающее уведомление без отправки некорректных запросов к API. +- **Защита от битых ссылок (Устойчивость бэкенда):** Внедрена строгая валидация URL-адресов картинок, которая перехватывает сломанные серверные ссылки (такие как фейковый домен `image.png`), предотвращая падение скриптов и забивание консоли ошибками `ERR_NAME_NOT_RESOLVED`. +- **Локальный модуль относительного времени:** Логика форматирования дат была написана вручную без утяжеления репозитория сторонними библиотеками, что исключило проблемы с блокировками CORS и внешних CDN. + +## Временные затраты + +- **Первоначальная оценка:** 12 часов. +- **Фактически затраченное время:** 29 часов (дополнительное время ушло на отладку сетевых ошибок, исправление некорректных данных с сервера и настройку локальной обработки дат). diff --git a/api.js b/api.js index 123a9e3b6..8934daa2f 100644 --- a/api.js +++ b/api.js @@ -1,6 +1,6 @@ // Замени на свой, чтобы получить независимый от других набор данных. // "боевая" версия инстапро лежит в ключе prod -const personalKey = "prod"; +const personalKey = "Tyryshkin2"; const baseHost = "https://webdev-hw-api.vercel.app"; const postsHost = `${baseHost}/api/v1/${personalKey}/instapro`; diff --git a/components/.gitignore b/components/.gitignore new file mode 100644 index 000000000..6e03962af --- /dev/null +++ b/components/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.DS_Store +dist/ \ No newline at end of file diff --git a/components/add-post-page-component.js b/components/add-post-page-component.js index 8277f093b..99ed240af 100644 --- a/components/add-post-page-component.js +++ b/components/add-post-page-component.js @@ -1,20 +1,69 @@ +import { renderUploadImageComponent } from "./upload-image-component.js"; export function renderAddPostPageComponent({ appEl, onAddPostClick }) { const render = () => { + // Переменная для динамического сохранения ссылки на загруженное фото + let imageUrl = ""; + // @TODO: Реализовать страницу добавления поста const appHtml = `
Опишите фотографию:
+ +
- Иван Иваныч
-
- - Нравится: 2 -
-- Иван Иваныч - Ромашка, ромашка... -
-- 19 минут назад -
-
- Варварва Н.
-
- - Нравится: 35 -
-- Варварва Н. - Нарисовала картину, посмотрите какая красивая -
-- 3 часа назад -
-
- Варварва Н.
-- Нравится: 0 -
-- Варварва Н. - Голова -
-- 8 дней назад -
-${post.user.name}
++ Нравится: ${post.likes.length} +
++ ${post.user.name} + ${post.description} +
++ ${formattedDate} +
+