Skip to content

Commit fb783d5

Browse files
authored
Merge pull request #8 from AnastasiiaXX/module8-task2
2 parents a9ca30e + 98ae4ad commit fb783d5

4 files changed

Lines changed: 75 additions & 45 deletions

File tree

js/comments.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const COMMENTS_PER_PAGE = 5;
2+
export const renderComments = (commentsData, container) => {
3+
commentsData.forEach((commentData) => {
4+
const comment = document.createElement('li');
5+
const avatar = document.createElement('img');
6+
const commentText = document.createElement('p');
7+
8+
comment.classList.add('social__comment');
9+
avatar.classList.add('social__picture');
10+
avatar.alt = commentData.name;
11+
avatar.src = commentData.avatar;
12+
avatar.width = 35;
13+
avatar.height = 35;
14+
commentText.classList.add('social__text');
15+
commentText.textContent = commentData.message;
16+
17+
comment.append(avatar);
18+
comment.append(commentText);
19+
20+
container.append(comment);
21+
});
22+
};
23+
24+
export const paginateComments = (comments, container) => {
25+
const firstComments = comments.slice(0, COMMENTS_PER_PAGE);
26+
let currentIndex = COMMENTS_PER_PAGE;
27+
renderComments(firstComments, container);
28+
const loadMoreComments = () => {
29+
const nextCommentsChunk = comments.slice(currentIndex, currentIndex + COMMENTS_PER_PAGE);
30+
renderComments(nextCommentsChunk, container);
31+
currentIndex += COMMENTS_PER_PAGE;
32+
};
33+
return {
34+
loadMore: loadMoreComments,
35+
getShownCount: () => container.children.length
36+
};
37+
};

js/generate-data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ const createPhoto = (_, index) => ({
3131
comments: Array.from({length: getRandomInteger(0, MAX_COMMENTS_COUNT)}, createComment),
3232
});
3333

34-
export const createPhotos = () => Array.from({length: PHOTOS_COUNT}, createPhoto);
34+
export const photos = Array.from({length: PHOTOS_COUNT}, createPhoto);

js/show-full-photo.js

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,58 @@
1-
import { createPhotos } from './generate-data';
1+
import { photos } from './generate-data';
22
import { closeModal, openModal } from './modal.js';
3+
import { paginateComments } from './comments.js';
34

45
const fullPhotoModal = document.querySelector('.big-picture');
5-
const comments = document.querySelector('.social__comments');
66
const body = document.querySelector('body');
77
const closeModalButton = document.querySelector('.big-picture__cancel');
8-
9-
const renderComments = (mockedComments) => {
10-
mockedComments.forEach((commentData) => {
11-
const comment = document.createElement('li');
12-
const avatar = document.createElement('img');
13-
const commentText = document.createElement('p');
14-
15-
comment.classList.add('social__comment');
16-
avatar.classList.add('social__picture');
17-
avatar.alt = commentData.name;
18-
avatar.src = commentData.avatar;
19-
avatar.width = 35;
20-
avatar.height = 35;
21-
commentText.classList.add('social__text');
22-
commentText.textContent = commentData.message;
23-
24-
comment.append(avatar);
25-
comment.append(commentText);
26-
27-
comments.append(comment);
28-
});
29-
};
30-
8+
const comments = document.querySelector('.social__comments');
9+
const pictureContainer = document.querySelector('.pictures');
10+
let currentLoadMoreHandler = null;
3111
const fillPhotoData = (currentPhoto) => {
3212
const fullPhotoImage = document.querySelector('.big-picture__img img');
3313
const fullPhotoDescription = document.querySelector('.social__caption');
3414
const fullPhotoLikes = document.querySelector('.likes-count');
35-
const shownCommentsCount = document.querySelector('.social__comment-shown-count');
15+
const commentsCount = document.querySelector('.social__comment-total-count');
16+
3617
fullPhotoImage.src = currentPhoto.url;
3718
fullPhotoImage.alt = currentPhoto.description;
3819
fullPhotoLikes.textContent = currentPhoto.likes;
3920
fullPhotoDescription.textContent = currentPhoto.description;
40-
shownCommentsCount.textContent = currentPhoto.comments.length;
21+
commentsCount.textContent = currentPhoto.comments.length;
4122
comments.innerHTML = '';
42-
renderComments(currentPhoto.comments);
4323
};
4424

4525
export const showFullPhoto = () => {
46-
const photos = createPhotos();
47-
const thumbnails = document.querySelectorAll('.picture');
48-
const commentsCount = document.querySelector('.social__comment-count');
4926
const commentsLoaderBtn = document.querySelector('.comments-loader');
27+
const shownCommentsCount = document.querySelector('.social__comment-shown-count');
28+
pictureContainer.addEventListener('click', (evt) => {
29+
const thumbnail = evt.target.closest('.picture');
30+
if (!thumbnail) {
31+
return;
32+
}
33+
evt.preventDefault();
34+
openModal(fullPhotoModal, body);
35+
const photoId = Number(thumbnail.dataset.id);
36+
const currentPhoto = photos.find((photo) => photo.id === photoId);
37+
fillPhotoData(currentPhoto);
38+
39+
commentsLoaderBtn.classList.toggle('hidden', currentPhoto.comments.length <= 5);
40+
const pagination = paginateComments(currentPhoto.comments, comments);
41+
shownCommentsCount.textContent = pagination.getShownCount();
42+
const handleLoadMore = () => {
43+
pagination.loadMore();
44+
shownCommentsCount.textContent = pagination.getShownCount();
45+
commentsLoaderBtn.classList.toggle('hidden', pagination.getShownCount() >= currentPhoto.comments.length);
46+
};
47+
if (currentLoadMoreHandler) {
48+
commentsLoaderBtn.removeEventListener('click', currentLoadMoreHandler);
49+
currentLoadMoreHandler = null;
50+
}
51+
currentLoadMoreHandler = handleLoadMore;
52+
commentsLoaderBtn.addEventListener('click', handleLoadMore);
5053

51-
thumbnails.forEach((thumbnail) => {
52-
thumbnail.addEventListener('click', () => {
53-
openModal(fullPhotoModal, body);
54-
commentsCount.classList.add('hidden');
55-
commentsLoaderBtn.classList.add('hidden');
56-
const photoId = Number(thumbnail.dataset.id);
57-
const currentPhoto = photos.find((photo) => photo.id === photoId);
58-
fillPhotoData(currentPhoto);
59-
});
6054
});
61-
6255
closeModalButton.addEventListener('click', () => closeModal(fullPhotoModal, body));
6356
};
57+
58+

js/thumbnails.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import { createPhotos } from './generate-data';
1+
import { photos } from './generate-data';
22
export const renderThumbnails = () => {
3-
const photos = createPhotos();
4-
53
const photoTemplate = document.querySelector('#picture').content;
64
const photoContainer = document.querySelector('.pictures');
75

0 commit comments

Comments
 (0)