Skip to content

Commit f88cf2d

Browse files
authored
Merge pull request #15 from ksenya3112/module12-task1
2 parents 99acba7 + ab9a6e5 commit f88cf2d

4 files changed

Lines changed: 76 additions & 7 deletions

File tree

js/filter.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
const RANDOM_PHOTOS_COUNT = 10;
2+
3+
const Filter = {
4+
DEFAULT: 'filter-default',
5+
RANDOM: 'filter-random',
6+
DISCUSSED: 'filter-discussed',
7+
};
8+
9+
const filterElement = document.querySelector('.img-filters');
10+
const filterForm = filterElement.querySelector('.img-filters__form');
11+
12+
// Вспомогательные функции для сортировки
13+
const sortRandomly = () => Math.random() - 0.5;
14+
const sortByComments = (photoA, photoB) => photoB.comments.length - photoA.comments.length;
15+
16+
// Главная функция фильтрации
17+
const getFilteredPhotos = (photos, filterId) => {
18+
switch (filterId) {
19+
case Filter.RANDOM:
20+
return [...photos].sort(sortRandomly).slice(0, RANDOM_PHOTOS_COUNT);
21+
case Filter.DISCUSSED:
22+
return [...photos].sort(sortByComments);
23+
default:
24+
return [...photos];
25+
}
26+
};
27+
28+
// Функция инициализации модуля
29+
const initFilters = (photos, callback) => {
30+
filterElement.classList.remove('img-filters--inactive');
31+
32+
filterForm.addEventListener('click', (evt) => {
33+
if (!evt.target.classList.contains('img-filters__button') ||
34+
evt.target.classList.contains('img-filters__button--active')) {
35+
return;
36+
}
37+
38+
filterForm.querySelector('.img-filters__button--active').classList.remove('img-filters__button--active');
39+
evt.target.classList.add('img-filters__button--active');
40+
41+
const filteredPhotos = getFilteredPhotos(photos, evt.target.id);
42+
callback(filteredPhotos); // Вызываем колбэк (отрисовку) с задержкой
43+
});
44+
};
45+
46+
export { initFilters };
47+

js/main.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,22 @@ import './form.js';
55

66
import { renderThumbnails } from './thumbnails.js';
77
import { getData } from './api.js';
8-
import { showAlert } from './util.js';
8+
import { showAlert, debounce } from './util.js';
99
import { setUserFormSubmit, closeUploadModal } from './form.js';
10+
import { initFilters } from './filter.js';
11+
12+
const RENDER_DELAY = 500;
13+
14+
const debouncedRenderThumbnails = debounce(renderThumbnails, RENDER_DELAY);
1015

1116
getData()
1217
.then((photos) => {
1318
renderThumbnails(photos);
19+
initFilters(photos, (filteredPhotos) => {
20+
debouncedRenderThumbnails(filteredPhotos);
21+
setUserFormSubmit(closeUploadModal);
22+
});
1423
})
1524
.catch(() => {
16-
showAlert();
25+
showAlert('Не удалось загрузить данные. Попробуйте обновить страницу.');
1726
});
18-
19-
setUserFormSubmit(closeUploadModal);

js/thumbnails.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ import { openFullSizePicture } from './full-size-picture.js';
33
const thumbnailsContainer = document.querySelector('.pictures');
44
const thumbnailTemplate = document.querySelector('#picture').content.querySelector('.picture');
55

6+
// Функция для удаления старых фотографий
7+
const clearThumbnails = () => {
8+
const pictures = thumbnailsContainer.querySelectorAll('.picture');
9+
pictures.forEach((picture) => picture.remove());
10+
};
11+
612
const renderThumbnail = (thumbnailData) => {
713
const thumbnail = thumbnailTemplate.cloneNode(true);
814
const image = thumbnail.querySelector('.picture__img');
@@ -14,14 +20,14 @@ const renderThumbnail = (thumbnailData) => {
1420

1521
thumbnail.addEventListener('click', (evt) => {
1622
evt.preventDefault();
17-
1823
openFullSizePicture(thumbnailData);
1924
});
2025

2126
return thumbnail;
2227
};
2328

2429
const renderThumbnails = (photos) => {
30+
clearThumbnails();
2531
const thumbnailFragment = document.createDocumentFragment();
2632

2733
photos.forEach((photo) => {

js/util.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ const showAlert = () => {
1515
}, ALERT_SHOW_TIME);
1616
};
1717

18-
export { getRandomInt, isEsc };
18+
function debounce(callback, timeoutDelay = 500) {
19+
let timeoutId;
20+
21+
return (...rest) => {
22+
clearTimeout(timeoutId);
23+
timeoutId = setTimeout(() => callback.apply(this, rest), timeoutDelay);
24+
};
25+
}
26+
27+
export { getRandomInt, isEsc, showAlert, debounce };
28+
1929

20-
export { showAlert };

0 commit comments

Comments
 (0)