Skip to content

Commit 328535b

Browse files
authored
Merge pull request #16 from YouAreNotReady/master
2 parents f893821 + 430721b commit 328535b

7 files changed

+130
-100
lines changed

js/comments-loader.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ const SHOW_COMMENTS_STEP = 5;
22

33
const commentsList = document.querySelector('.social__comments');
44
const commentTemplate = commentsList.querySelector('li');
5-
const pictureShownComments = document.querySelector('.social__comment-shown-count');
6-
const pictureTotalComments = document.querySelector('.social__comment-total-count');
5+
const imageShownComments = document.querySelector('.social__comment-shown-count');
6+
const imageTotalComments = document.querySelector('.social__comment-total-count');
77
const commentsShowMoreButton = document.querySelector('.comments-loader');
88
let currentComments = [];
99
let currentCommentsCount = 0;
@@ -32,15 +32,15 @@ const showNextComments = () => {
3232
commentsShowMoreButton.classList.add('hidden');
3333
}
3434

35-
pictureShownComments.textContent = renderedCommentsCount;
35+
imageShownComments.textContent = renderedCommentsCount;
3636
currentCommentsCount += SHOW_COMMENTS_STEP;
3737
};
3838

3939
const showComments = (comments) => {
4040
commentsList.innerHTML = '';
4141
currentComments = comments;
42-
pictureShownComments.textContent = currentCommentsCount + SHOW_COMMENTS_STEP;
43-
pictureTotalComments.textContent = comments.length;
42+
imageShownComments.textContent = currentCommentsCount + SHOW_COMMENTS_STEP;
43+
imageTotalComments.textContent = comments.length;
4444
showNextComments();
4545
commentsShowMoreButton.addEventListener('click', showNextComments);
4646
};

js/image-filtration.js

+47-29
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,58 @@
1-
import { renderPictures } from './pictures-preview-loader.js';
2-
import { getRandomInteger } from './util.js';
1+
import { renderImages } from './images-preview-loader.js';
2+
import { getRandomInteger, debounce } from './util.js';
33

4-
const RANDOM_PHOTOS_COUNT = 10;
4+
const RANDOM_IMAGES_COUNT = 10;
55
const RERENDER_DELAY = 500;
66

7-
const picturesFilter = document.querySelector('.img-filters');
7+
const imagesFilter = document.querySelector('.img-filters');
88
const FilterButtons = {
9-
default: picturesFilter.querySelector('#filter-default'),
10-
random: picturesFilter.querySelector('#filter-random'),
11-
discussed: picturesFilter.querySelector('#filter-discussed'),
9+
default: imagesFilter.querySelector('#filter-default'),
10+
random: imagesFilter.querySelector('#filter-random'),
11+
discussed: imagesFilter.querySelector('#filter-discussed'),
1212
};
1313

14-
const compareCommentsCount = (photoA, photoB) => {
15-
const commentsA = photoA.comments.length;
16-
const commentsB = photoB.comments.length;
14+
const compareCommentsCount = (imageA, imageB) => {
15+
const commentsA = imageA.comments.length;
16+
const commentsB = imageB.comments.length;
1717

1818
return commentsB - commentsA;
1919
};
2020

21-
const showFilter = () => picturesFilter.classList.remove('img-filters--inactive');
21+
const showFilter = () => imagesFilter.classList.remove('img-filters--inactive');
2222

23-
const renderRandomPhotos = (photos) => {
24-
const randomPhotos = photos.slice().sort(() => getRandomInteger(-1, 1)).splice(0, RANDOM_PHOTOS_COUNT);
25-
renderPictures(randomPhotos);
23+
const renderRandomImages = (images) => {
24+
const randomImages = images
25+
.slice()
26+
.sort(() => getRandomInteger(-1, 1))
27+
.splice(0, RANDOM_IMAGES_COUNT);
28+
renderImages(randomImages);
2629
};
27-
const renderMostDiscussedPhotos = (photos) => {
28-
const sortedPhotos = photos.slice().sort(compareCommentsCount);
29-
renderPictures(sortedPhotos);
30+
const renderMostDiscussedImages = (images) => {
31+
const sortedImages = images
32+
.slice()
33+
.sort(compareCommentsCount);
34+
renderImages(sortedImages);
3035
};
3136

32-
const debounceRender = (renderFunction) => {
33-
clearTimeout(debounceRender.lastDebouncedCall);
34-
debounceRender.lastDebouncedCall = setTimeout(() => {
35-
renderFunction();
36-
}, RERENDER_DELAY);
37-
};
37+
const setFilterClickHandler = (images) => {
38+
39+
const applyFilter = (selectedFilter) => {
40+
switch (selectedFilter) {
41+
case 'defaultFilter':
42+
renderImages(images);
43+
break;
44+
case 'random':
45+
renderRandomImages(images);
46+
break;
47+
case 'discussed':
48+
renderMostDiscussedImages(images);
49+
break;
50+
}
51+
};
52+
53+
const debouncedApplyFilter = debounce(applyFilter, RERENDER_DELAY);
3854

39-
const setFilterClickHandler = (photos) => {
40-
picturesFilter.addEventListener('click', (evt) => {
55+
imagesFilter.addEventListener('click', (evt) => {
4156
const activeFilter = document.querySelector('.img-filters__button--active');
4257

4358
if (evt.target === activeFilter && evt.target !== FilterButtons.random) {
@@ -49,21 +64,24 @@ const setFilterClickHandler = (photos) => {
4964
evt.target.classList.add('img-filters__button--active');
5065
}
5166

67+
let selectedFilter;
68+
5269
switch (evt.target) {
5370
case FilterButtons.default:
54-
debounceRender(() => renderPictures(photos));
71+
selectedFilter = 'defaultFilter';
5572
break;
5673

5774
case FilterButtons.random:
58-
debounceRender(() => renderRandomPhotos(photos));
75+
selectedFilter = 'random';
5976
break;
6077

6178
case FilterButtons.discussed:
62-
debounceRender(() => renderMostDiscussedPhotos(photos));
79+
selectedFilter = 'discussed';
6380
break;
6481
}
82+
83+
debouncedApplyFilter(selectedFilter);
6584
});
6685
};
6786

68-
6987
export { showFilter, setFilterClickHandler };

js/images-preview-loader.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { openImagePopup } from './show-image-fullscreen.js';
2+
3+
const imagesFragment = document.createDocumentFragment();
4+
const imagesContainer = document.querySelector('.pictures');
5+
const imageTemplate = document.querySelector('#picture').content.querySelector('.picture');
6+
7+
/**
8+
* Отображает превью изображений на странице.
9+
* @param {Array} usersImages - Массив объектов с данными изображений.
10+
*/
11+
12+
const renderImages = (usersImages) => {
13+
const existingImages = imagesContainer.querySelectorAll('.picture');
14+
existingImages.forEach((picture) => picture.remove());
15+
16+
usersImages.forEach(({ id, url, description, likes, comments }) => {
17+
const imageElement = imageTemplate.cloneNode(true);
18+
19+
imageElement.dataset.id = id;
20+
imageElement.querySelector('.picture__img').src = url;
21+
imageElement.querySelector('.picture__img').alt = description;
22+
imageElement.querySelector('.picture__likes').textContent = likes;
23+
imageElement.querySelector('.picture__comments').textContent = comments.length;
24+
25+
imagesFragment.appendChild(imageElement);
26+
});
27+
28+
imagesContainer.appendChild(imagesFragment);
29+
};
30+
31+
const setImagesContainerClickHandler = (images) => {
32+
imagesContainer.addEventListener('click', (evt) => {
33+
const currentImageNode = evt.target.closest('.picture');
34+
if (currentImageNode){
35+
const currentImageNodeId = currentImageNode.dataset.id;
36+
37+
const currentImageObject = images.find((image) => image.id === Number(currentImageNodeId));
38+
39+
if (currentImageObject) {
40+
openImagePopup(currentImageObject);
41+
}
42+
}
43+
});
44+
};
45+
46+
export { imagesContainer, renderImages, setImagesContainerClickHandler };

js/main.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { renderPictures, setPicturesContainerClickHandler } from './pictures-preview-loader.js';
1+
import { renderImages, setImagesContainerClickHandler } from './images-preview-loader.js';
22
import { loadData, showError } from './api.js';
33
import { initForm } from './image-upload.js';
44
import { showFilter, setFilterClickHandler } from './image-filtration.js';
@@ -12,11 +12,11 @@ import './image-filtration.js';
1212

1313
const init = async () => {
1414
try {
15-
const picturesData = await loadData();
16-
renderPictures(picturesData);
17-
setPicturesContainerClickHandler(picturesData);
15+
const imagesData = await loadData();
16+
renderImages(imagesData);
17+
setImagesContainerClickHandler(imagesData);
1818
showFilter();
19-
setFilterClickHandler(picturesData);
19+
setFilterClickHandler(imagesData);
2020
} catch {
2121
showError();
2222
}

js/pictures-preview-loader.js

-44
This file was deleted.

js/show-image-fullscreen.js

+16-16
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,46 @@
11
import { isEscapeKey } from './util.js';
22
import { showComments, clearComments } from './comments-loader.js';
33

4-
const picture = document.querySelector('.big-picture');
5-
const pictureLikesCount = document.querySelector('.likes-count');
6-
const pictureCloseButton = document.querySelector('#picture-cancel');
7-
const pictureDescription = document.querySelector('.social__caption');
4+
const image = document.querySelector('.big-picture');
5+
const imageLikesCount = document.querySelector('.likes-count');
6+
const imageCloseButton = document.querySelector('#picture-cancel');
7+
const imageDescription = document.querySelector('.social__caption');
88

99
const documentKeydownHandler = (evt) => {
1010
if (isEscapeKey(evt)) {
1111
evt.preventDefault();
12-
closePicturePopup();
12+
closeImagePopup();
1313
document.removeEventListener('keydown', documentKeydownHandler);
1414

1515
clearComments();
1616
}
1717
};
1818

19-
function closePicturePopup() {
19+
function closeImagePopup() {
2020
document.body.classList.remove('modal-open');
2121

22-
picture.classList.add('hidden');
22+
image.classList.add('hidden');
2323

2424
clearComments();
2525

26-
pictureCloseButton.removeEventListener('click', closePicturePopup);
26+
imageCloseButton.removeEventListener('click', closeImagePopup);
2727
document.removeEventListener('keydown', documentKeydownHandler);
2828
}
2929

30-
const openPicturePopup = (pictureData) => {
30+
const openImagePopup = (imageData) => {
3131
document.body.classList.add('modal-open');
3232

33-
picture.classList.remove('hidden');
33+
image.classList.remove('hidden');
3434

35-
picture.querySelector('img').src = pictureData.url;
36-
pictureLikesCount.textContent = pictureData.likes;
37-
pictureDescription.textContent = pictureData.description;
38-
pictureCloseButton.addEventListener('click', closePicturePopup);
35+
image.querySelector('img').src = imageData.url;
36+
imageLikesCount.textContent = imageData.likes;
37+
imageDescription.textContent = imageData.description;
38+
imageCloseButton.addEventListener('click', closeImagePopup);
3939

40-
showComments(pictureData.comments);
40+
showComments(imageData.comments);
4141

4242
document.addEventListener('keydown', documentKeydownHandler);
4343
};
4444

4545

46-
export { openPicturePopup };
46+
export { openImagePopup };

js/util.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,14 @@ const getRandomInteger = function(min, max) {
55

66
const isEscapeKey = (evt) => evt.key === 'Escape';
77

8-
export { getRandomInteger, isEscapeKey };
8+
const debounce = (callback, delayMS = 500) => {
9+
let timeoutId;
10+
11+
return (...rest) => {
12+
clearTimeout(timeoutId);
13+
14+
timeoutId = setTimeout(() => callback.apply(this, rest), delayMS);
15+
};
16+
};
17+
18+
export { getRandomInteger, isEscapeKey, debounce };

0 commit comments

Comments
 (0)