Skip to content

Commit 89f8cb6

Browse files
authored
Merge pull request #12 from Tikud11/module12-task1
2 parents b985d5b + c7135f1 commit 89f8cb6

3 files changed

Lines changed: 76 additions & 0 deletions

File tree

js/filters.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { renderThumbnails } from './photos';
2+
import { debounce } from './utils';
3+
4+
const RENDER_DELAY = 500;
5+
6+
const imageFilters = document.querySelector('.img-filters');
7+
const imageFiltersForm = imageFilters.querySelector('.img-filters__form');
8+
let currentPictures = [];
9+
10+
export const initFilters = (pictures) => {
11+
currentPictures = pictures;
12+
13+
if (!imageFilters.classList.contains('img-filters--inactive')) {
14+
return;
15+
}
16+
17+
imageFilters.classList.remove('img-filters--inactive');
18+
};
19+
20+
const debouncedRenderThumbnails = debounce((pictures) => {
21+
document.querySelectorAll('.picture').forEach((element) => element.remove());
22+
renderThumbnails(pictures);
23+
}, RENDER_DELAY);
24+
25+
const getDefaultPictures = () => [...currentPictures];
26+
const getRandomPictures = () => [...currentPictures].sort(() => Math.random() - 0.5).slice(0, 10);
27+
const getDiscussedPictures = () => [...currentPictures].sort((photoA, photoB) => photoB.comments.length - photoA.comments.length);
28+
29+
imageFiltersForm.addEventListener('click', (evt) => {
30+
evt.preventDefault();
31+
32+
if (!evt.target.classList.contains('img-filters__button')) {
33+
return;
34+
}
35+
36+
if (evt.target.classList.contains('img-filters__button--active')) {
37+
return;
38+
}
39+
40+
const currentActiveButton = imageFiltersForm.querySelector('.img-filters__button--active');
41+
if (currentActiveButton) {
42+
currentActiveButton.classList.remove('img-filters__button--active');
43+
}
44+
45+
evt.target.classList.add('img-filters__button--active');
46+
47+
let filteredPictures = [];
48+
49+
switch (evt.target.id) {
50+
case 'filter-default':
51+
filteredPictures = getDefaultPictures();
52+
break;
53+
54+
case 'filter-random':
55+
filteredPictures = getRandomPictures();
56+
break;
57+
58+
case 'filter-discussed':
59+
filteredPictures = getDiscussedPictures();
60+
break;
61+
62+
}
63+
64+
debouncedRenderThumbnails(filteredPictures);
65+
});

js/main.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { getData } from './api';
22
import { showDataErrorMessage } from './alert-message';
33
import { renderThumbnails } from './photos';
44
import { renderBigPicture } from './big-picture';
5+
import { initFilters } from './filters';
6+
57
import './upload-form.js';
68
import './image-effects.js';
79

@@ -11,6 +13,7 @@ getData()
1113
.then((pictures) => {
1214
picturesList = pictures;
1315
renderThumbnails(pictures);
16+
initFilters(pictures);
1417
})
1518
.catch(() => {
1619
showDataErrorMessage();

js/utils.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,12 @@ export const getPluralWord = (count, [one, two, five]) => {
1919
return five;
2020
};
2121

22+
export const debounce = (callback, timeoutDelay) => {
23+
let timeoutId;
24+
return (...rest) => {
25+
clearTimeout(timeoutId);
26+
timeoutId = setTimeout(() => callback.apply(this, rest), timeoutDelay);
27+
};
28+
};
29+
2230
export const isEscapeKey = (evt) => evt.key === 'Escape';

0 commit comments

Comments
 (0)