Skip to content

Commit 711226d

Browse files
authored
Merge pull request #13 from Alexandra0107/module8-task2
2 parents 3488e92 + e5cc76b commit 711226d

5 files changed

Lines changed: 183 additions & 81 deletions

File tree

js/full-screen-vewer.js

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
import { isEscapeKey } from './util.js';
2+
3+
const COMMENTS_PER_PAGE = 5;
4+
let currentCommentsShown = 0;
5+
let escapeHandler = null;
6+
7+
// Закрытие модального окна
8+
const closeFullScreen = (bigPicture, body, closeButton) => {
9+
if (bigPicture) {
10+
bigPicture.classList.add('hidden');
11+
}
12+
if (body) {
13+
body.classList.remove('modal-open');
14+
}
15+
if (closeButton) {
16+
closeButton.removeEventListener('click', closeFullScreen);
17+
}
18+
if (escapeHandler) {
19+
document.removeEventListener('keydown', escapeHandler);
20+
escapeHandler = null;
21+
}
22+
currentCommentsShown = 0;
23+
};
24+
25+
// Настройка обработчиков закрытия
26+
const setupCloseHandlers = (bigPicture, body) => {
27+
const closeButton = bigPicture?.querySelector('.big-picture__cancel');
28+
if (!closeButton) {
29+
return;
30+
}
31+
32+
escapeHandler = (evt) => {
33+
if (isEscapeKey(evt)) {
34+
closeFullScreen(bigPicture, body, closeButton);
35+
}
36+
};
37+
38+
closeButton.addEventListener('click', () => closeFullScreen(bigPicture, body, closeButton));
39+
document.addEventListener('keydown', escapeHandler);
40+
};
41+
42+
// Обновление счётчика комментариев
43+
const updateCommentCount = (shown, total, bigPicture) => {
44+
const el = bigPicture?.querySelector('.social__comment-count');
45+
if (el) {
46+
el.textContent = `${shown} из ${total} комментариев`;
47+
}
48+
};
49+
50+
// Создаём элемент комментария
51+
const createCommentElement = (comment) => {
52+
const commentEl = document.createElement('li');
53+
commentEl.className = 'social__comment';
54+
55+
const img = document.createElement('img');
56+
img.className = 'social__picture';
57+
img.src = comment.avatar;
58+
img.alt = comment.name;
59+
60+
const textEl = document.createElement('p');
61+
textEl.className = 'social__text';
62+
textEl.textContent = comment.message;
63+
64+
commentEl.appendChild(img);
65+
commentEl.appendChild(textEl);
66+
67+
return commentEl;
68+
};
69+
70+
const renderComments = (comments, bigPicture) => {
71+
const commentsContainer = bigPicture.querySelector('.social__comments');
72+
const totalComments = comments.length;
73+
74+
// Определяем диапазон комментариев для текущей порции
75+
const endIndex = Math.min(currentCommentsShown + COMMENTS_PER_PAGE, totalComments);
76+
const commentsToShow = comments.slice(currentCommentsShown, endIndex);
77+
78+
// Отрисовываем новые комментарии
79+
commentsToShow.forEach((comment) => {
80+
const commentElement = createCommentElement(comment);
81+
commentsContainer.appendChild(commentElement);
82+
});
83+
84+
// Обновляем счётчик
85+
currentCommentsShown = endIndex;
86+
updateCommentCount(currentCommentsShown, totalComments, bigPicture);
87+
88+
// Скрываем кнопку, если все комментарии загружены
89+
const commentsLoaderEl = bigPicture.querySelector('.comments-loader');
90+
if (currentCommentsShown >= totalComments && commentsLoaderEl) {
91+
commentsLoaderEl.classList.add('hidden');
92+
}
93+
};
94+
95+
const openFullScreen = (photoData) => {
96+
const bigPicture = document.querySelector('.big-picture');
97+
const body = document.body;
98+
99+
// Проверка существования bigPicture-без проверки выдавало ошибку в консоли
100+
if (!bigPicture) {
101+
throw new Error('Элемент .big-picture не найден в DOM');
102+
}
103+
104+
//заполнение данных
105+
const setTextContent = (selector, value) => {
106+
const el = bigPicture.querySelector(selector);
107+
if (el) {
108+
el.textContent = value;
109+
}
110+
};
111+
const setAttribute = (selector, attr, value) => {
112+
const el = bigPicture.querySelector(selector);
113+
if (el) {
114+
el[attr] = value;
115+
}
116+
};
117+
118+
// Заполняем данные
119+
setAttribute('.big-picture__img img', 'src', photoData.url);
120+
setTextContent('.likes-count', photoData.likes);
121+
setTextContent('.social__comment-total-count', photoData.comments.length);
122+
setTextContent('.social__caption', photoData.descriptions || '');
123+
124+
// Показываем элементы интерфейса
125+
const commentCountEl = bigPicture.querySelector('.social__comment-count');
126+
const commentsLoaderEl = bigPicture.querySelector('.comments-loader');
127+
128+
if (commentCountEl) {
129+
commentCountEl.classList.remove('hidden');
130+
}
131+
if (commentsLoaderEl) {
132+
commentsLoaderEl.classList.remove('hidden');
133+
}
134+
135+
// Очищаем комментарии и сбрасываем счётчик
136+
const commentsContainer = bigPicture.querySelector('.social__comments');
137+
if (commentsContainer) {
138+
commentsContainer.innerHTML = '';
139+
}
140+
currentCommentsShown = 0;
141+
142+
// Отрисовываем первые комментарии
143+
renderComments(photoData.comments, bigPicture);
144+
145+
// Настраиваем обработчик кнопки «Загрузить ещё» с удалением старого
146+
if (commentsLoaderEl) {
147+
// Удаляем старый обработчик, если есть
148+
commentsLoaderEl.replaceWith(commentsLoaderEl.cloneNode(true));
149+
// Добавляем новый
150+
const newLoader = bigPicture.querySelector('.comments-loader');
151+
newLoader.addEventListener('click', () => {
152+
renderComments(photoData.comments, bigPicture);
153+
});
154+
}
155+
156+
// Добавляем классы
157+
bigPicture.classList.remove('hidden');
158+
body.classList.add('modal-open');
159+
160+
// Навешиваем обработчики закрытия
161+
setupCloseHandlers(bigPicture, body);
162+
};
163+
164+
export { openFullScreen };

js/fullScreenViewer.js

Lines changed: 0 additions & 70 deletions
This file was deleted.

js/main.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
import { getThumbs } from './thumbs.js';
2-
import { renderThumbs } from './renderer.js';
3-
import { openFullScreen } from './fullScreenViewer.js';
2+
import { renderThumbs } from './render.js';
3+
import { openFullScreen } from './full-screen-vewer.js';
44

55
// Получаем данные
66
const thumbsList = getThumbs();
77

8-
// Находим шаблон и контейнер
9-
const templateFragment = document.querySelector('#picture').content;
10-
const template = templateFragment.querySelector('a');
11-
const picturesContainer = document.querySelector('.pictures');
12-
13-
// Вызываем функцию для отрисовки
14-
renderThumbs(thumbsList, template, picturesContainer);
8+
// получаем контейнер после отрисвки в render и вызываем функцию
9+
const picturesContainer = renderThumbs(thumbsList);
1510
// Добавляем обработчики клика на миниатюры
1611
picturesContainer.addEventListener('click', (evt) => {
1712
const thumbnail = evt.target.closest('.picture');

js/renderer.js renamed to js/render.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1-
const renderThumbs = (thumbsList, template, picturesContainer) => {
1+
const renderThumbs = (thumbsList) => {
2+
// Находим шаблон
3+
const templateFragment = document.querySelector('#picture').content;
4+
const template = templateFragment.querySelector('a');
5+
6+
// Находим контейнер
7+
const picturesContainer = document.querySelector('.pictures');
8+
9+
// Создаём фрагмент для эффективной отрисовки
210
const fragment = document.createDocumentFragment();
311

412
thumbsList.forEach((data, index) => {
513
// Клонируем шаблон
614
const element = template.cloneNode(true);
15+
716
// Находим нужные элементы внутри клона
817
const img = element.querySelector('.picture__img');
918
const likes = element.querySelector('.picture__likes');
@@ -16,12 +25,13 @@ const renderThumbs = (thumbsList, template, picturesContainer) => {
1625
comments.textContent = data.comments.length;
1726
element.dataset.id = index;
1827

19-
// Добавляем элемент во fragment
28+
// Добавляем элемент во фрагмент
2029
fragment.appendChild(element);
2130
});
2231

2332
// Добавляем фрагмент в контейнер
2433
picturesContainer.appendChild(fragment);
34+
return picturesContainer;
2535
};
2636

2737
export { renderThumbs };

js/util.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ const getRandomInt = (min, max)=> Math.floor(Math.random() * (max - min + 1)) +
44
// Функция: рандомный выбор случайного индекса из массива
55
const getRandomArrayName = (array) => array[getRandomInt(0, array.length - 1)];
66

7+
//проверка нажатия esc
8+
export const isEscapeKey = (evt) => evt.key === 'Escape';
9+
710
export {getRandomInt,getRandomArrayName};

0 commit comments

Comments
 (0)