Skip to content

Commit fbac3a9

Browse files
authored
Merge pull request #13 from Julyova/module12-task1
2 parents c79ce7d + a136872 commit fbac3a9

4 files changed

Lines changed: 102 additions & 24 deletions

File tree

js/debounce.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const DEBOUNCE_DELAY = 500;
2+
3+
const debounce = (callback, timeoutDelay = DEBOUNCE_DELAY) => {
4+
let timeoutId;
5+
6+
return (...rest) => {
7+
clearTimeout(timeoutId);
8+
timeoutId = setTimeout(() => callback.apply(this, rest), timeoutDelay);
9+
};
10+
};
11+
12+
export { debounce };

js/filters.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { renderPictures } from './pictures.js';
2+
import { debounce } from './debounce.js';
3+
4+
const RANDOM_PICTURES_COUNT = 10;
5+
6+
const filtersElement = document.querySelector('.img-filters');
7+
const filtersForm = document.querySelector('.img-filters__form');
8+
9+
const FilterType = {
10+
DEFAULT: 'filter-default',
11+
RANDOM: 'filter-random',
12+
DISCUSSED: 'filter-discussed',
13+
};
14+
15+
let currentFilter = FilterType.DEFAULT;
16+
let pictures = [];
17+
18+
const getRandomPictures = (data) => {
19+
const shuffled = [...data].sort(() => Math.random() - 0.5);
20+
return shuffled.slice(0, RANDOM_PICTURES_COUNT);
21+
};
22+
23+
const getDiscussedPictures = (data) =>
24+
[...data].sort((a, b) => b.comments.length - a.comments.length);
25+
26+
const filterPictures = () => {
27+
switch (currentFilter) {
28+
case FilterType.RANDOM:
29+
return getRandomPictures(pictures);
30+
case FilterType.DISCUSSED:
31+
return getDiscussedPictures(pictures);
32+
default:
33+
return [...pictures];
34+
}
35+
};
36+
37+
const onFilterChange = debounce(() => {
38+
renderPictures(filterPictures());
39+
});
40+
41+
const onFiltersFormClick = (evt) => {
42+
const target = evt.target;
43+
44+
if (!target.classList.contains('img-filters__button')) {
45+
return;
46+
}
47+
48+
if (target.id === currentFilter) {
49+
return;
50+
}
51+
52+
filtersForm.querySelector('.img-filters__button--active').classList.remove('img-filters__button--active');
53+
target.classList.add('img-filters__button--active');
54+
currentFilter = target.id;
55+
onFilterChange();
56+
};
57+
58+
const initFilters = (data) => {
59+
pictures = data;
60+
filtersElement.classList.remove('img-filters--inactive');
61+
filtersForm.addEventListener('click', onFiltersFormClick);
62+
};
63+
64+
export { initFilters };

js/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import { initBigPictureHandlers } from './big-picture.js';
55
import { initFormUpload } from './form-upload.js';
66
import { getData } from './api.js';
77
import { showDataError } from './messages.js';
8+
import { initFilters } from './filters.js';
89

910
getData()
1011
.then((pictures) => {
1112
renderPictures(pictures);
13+
initFilters(pictures);
1214
})
1315
.catch(() => {
1416
showDataError();

js/messages.js

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,28 @@ const showSuccessMessage = () => {
44
const successTemplate = document.querySelector('#success').content.querySelector('.success');
55
const successElement = successTemplate.cloneNode(true);
66

7-
const onSuccessButtonClick = () => {
7+
const closeSuccessMessage = () => {
88
successElement.remove();
9-
document.removeEventListener('keydown', onDocumentKeydown);
10-
document.removeEventListener('click', onDocumentClick);
9+
document.removeEventListener('keydown', onSuccessKeydown);
10+
document.removeEventListener('click', onSuccessClick);
1111
};
1212

13-
const onDocumentKeydown = (evt) => {
13+
function onSuccessKeydown(evt) {
1414
if (evt.key === 'Escape') {
1515
evt.preventDefault();
16-
onSuccessButtonClick();
16+
closeSuccessMessage();
1717
}
18-
};
18+
}
1919

20-
const onDocumentClick = (evt) => {
20+
function onSuccessClick(evt) {
2121
if (!evt.target.closest('.success__inner')) {
22-
onSuccessButtonClick();
22+
closeSuccessMessage();
2323
}
24-
};
24+
}
2525

26-
successElement.querySelector('.success__button').addEventListener('click', onSuccessButtonClick);
27-
document.addEventListener('keydown', onDocumentKeydown);
28-
document.addEventListener('click', onDocumentClick);
26+
successElement.querySelector('.success__button').addEventListener('click', closeSuccessMessage);
27+
document.addEventListener('keydown', onSuccessKeydown);
28+
document.addEventListener('click', onSuccessClick);
2929

3030
document.body.appendChild(successElement);
3131
};
@@ -34,29 +34,29 @@ const showErrorMessage = () => {
3434
const errorTemplate = document.querySelector('#error').content.querySelector('.error');
3535
const errorElement = errorTemplate.cloneNode(true);
3636

37-
const onErrorButtonClick = () => {
37+
const closeErrorMessage = () => {
3838
errorElement.remove();
39-
document.removeEventListener('keydown', onDocumentKeydown);
40-
document.removeEventListener('click', onDocumentClick);
39+
document.removeEventListener('keydown', onErrorKeydown);
40+
document.removeEventListener('click', onErrorClick);
4141
};
4242

43-
const onDocumentKeydown = (evt) => {
43+
function onErrorKeydown(evt) {
4444
if (evt.key === 'Escape') {
4545
evt.preventDefault();
4646
evt.stopPropagation();
47-
onErrorButtonClick();
47+
closeErrorMessage();
4848
}
49-
};
49+
}
5050

51-
const onDocumentClick = (evt) => {
51+
function onErrorClick(evt) {
5252
if (!evt.target.closest('.error__inner')) {
53-
onErrorButtonClick();
53+
closeErrorMessage();
5454
}
55-
};
55+
}
5656

57-
errorElement.querySelector('.error__button').addEventListener('click', onErrorButtonClick);
58-
document.addEventListener('keydown', onDocumentKeydown);
59-
document.addEventListener('click', onDocumentClick);
57+
errorElement.querySelector('.error__button').addEventListener('click', closeErrorMessage);
58+
document.addEventListener('keydown', onErrorKeydown);
59+
document.addEventListener('click', onErrorClick);
6060

6161
document.body.appendChild(errorElement);
6262
};

0 commit comments

Comments
 (0)