diff --git a/src/components/pop-up-message.ts b/src/components/pop-up-message.ts new file mode 100644 index 0000000..ffb40fc --- /dev/null +++ b/src/components/pop-up-message.ts @@ -0,0 +1,17 @@ +export default { + + html: ` + + `, + + showMessage(messageText: string) { + const messageElement = document.getElementById('pop-up-message') as HTMLElement; + messageElement.textContent = messageText; + messageElement.classList.remove('hidden'); + setTimeout(() => messageElement.classList.remove('hidden-animation'), 100); + setTimeout(() => { + messageElement.classList.add('hidden-animation'); + setTimeout (()=> messageElement.classList.add('hidden'), 300); + }, 2000); + }, +}; diff --git a/src/components/search/search.ts b/src/components/search/search.ts index 24adeb5..5362199 100644 --- a/src/components/search/search.ts +++ b/src/components/search/search.ts @@ -11,7 +11,7 @@ import debounce from '../debounce'; export default { html: ` - + ${footer.html} @@ -111,24 +115,31 @@ export default { switch (Search.categoryId) { case 1: categoryOneButton.classList.add('active'); + Search.categoryActiveElement = categoryOneButton; break; case 2: categoryTwoButton.classList.add('active'); + Search.categoryActiveElement = categoryTwoButton; break; case 3: categoryThreeButton.classList.add('active'); + Search.categoryActiveElement = categoryThreeButton; break; case 4: categoryFourButton.classList.add('active'); + Search.categoryActiveElement = categoryFourButton; break; case 5: categoryFiveButton.classList.add('active'); + Search.categoryActiveElement = categoryFiveButton; break; case 6: categorySixButton.classList.add('active'); + Search.categoryActiveElement = categorySixButton; break; case 7: categorySevenButton.classList.add('active'); + Search.categoryActiveElement = categorySevenButton; break; } diff --git a/src/pages/placePage/place.ts b/src/pages/placePage/place.ts index 243392d..6fc219d 100644 --- a/src/pages/placePage/place.ts +++ b/src/pages/placePage/place.ts @@ -10,10 +10,12 @@ import reviewsLoad from './reviews-load'; import User from '../../utils/user'; import galleryCategoriesTemplate from './categories.hbs'; import Search from '../../utils/search-memory'; +import popUpMessage from '../../components/pop-up-message'; export default { html: `${header.html} + ${popUpMessage.html}
@@ -140,15 +142,16 @@ export default { reviewFormButton.addEventListener('click', async () => { if (!reviewFormText.value) { + popUpMessage.showMessage('Пустой отзыв - не круто. Напишите о своих впечатлениях!'); return; } if (Number(formRatingInput.value) < 1 || Number(formRatingInput.value) > 5) { - alert('Некорректный рейтинг'); + popUpMessage.showMessage('Введите оценку от 1 до 5'); return; } const res = await Api.postReview(Number(User.id), itemId, reviewFormText.value, Number(formRatingInput.value)); if (!res.ok) { - console.log('Ошибка отправки отзыва'); + popUpMessage.showMessage('Вы уже оставили отзыв!'); } await reviewsLoad(itemId, router); }); diff --git a/src/pages/profilePage/profile.ts b/src/pages/profilePage/profile.ts index d93289c..dffd6d5 100644 --- a/src/pages/profilePage/profile.ts +++ b/src/pages/profilePage/profile.ts @@ -11,7 +11,7 @@ import {emailRegex} from '../../components/validation'; import footer from '../../components/footer'; import backButton from '../../static/back button white.svg'; import userMount from '../../components/user-mount'; -import closeButton from '../../static/close icon.svg'; +import popUpMessage from '../../components/pop-up-message'; export default { /** @@ -22,9 +22,7 @@ export default { */ html: ` Логотип - + ${popUpMessage.html}
@@ -114,14 +112,6 @@ export default { avatar.src = resProfile.data.avatarPath ? `/avatars/${resProfile.data.avatarPath}` : defaultAvatar; - const errorWindowMessage = document.getElementById('error-window-message') as HTMLElement; - const errorCloseButton = document.getElementById('error-close-button') as HTMLButtonElement; - - errorCloseButton.addEventListener('click', () => { - errorWindowMessage.classList.add('hidden-animation'); - setTimeout(() => errorWindowMessage.classList.add('hidden'), 300); - }); - avatar.addEventListener('click', () => { const avatarInputElement = document.createElement('input') as HTMLInputElement; avatarInputElement.type = 'file'; @@ -135,14 +125,16 @@ export default { reader.addEventListener('load', async () => { const basedAvatar = String(reader.result ? reader.result : ''); if (!basedAvatar) { - errorWindowMessage.classList.remove('hidden'); - setTimeout(() => errorWindowMessage.classList.remove('hidden-animation'), 100); + popUpMessage.showMessage('Ошибка загрузки аватарки'); return; } const res = await Api.putAvatar(User.id, basedAvatar); + if (res.status === 413) { + popUpMessage.showMessage('Слишком большое фото'); + return; + } if (!res.ok) { - errorWindowMessage.classList.remove('hidden'); - setTimeout(() => errorWindowMessage.classList.remove('hidden-animation'), 100); + popUpMessage.showMessage('Ошибка загрузки аватарки'); return; } await this.mount(router); diff --git a/src/pages/profilePage/profileAchievements.hbs b/src/pages/profilePage/profileAchievements.hbs index 764571e..1b406b3 100644 --- a/src/pages/profilePage/profileAchievements.hbs +++ b/src/pages/profilePage/profileAchievements.hbs @@ -1,7 +1,7 @@ {{#each achievements}} - {{/each}} diff --git a/src/pages/profilePage/profileMenu.ts b/src/pages/profilePage/profileMenu.ts index f4c09e2..462532f 100644 --- a/src/pages/profilePage/profileMenu.ts +++ b/src/pages/profilePage/profileMenu.ts @@ -33,11 +33,13 @@ export default async function updateMenu(activeMenuButton: HTMLElement) { galleryProfileElement.innerHTML = `
-
Достижения в разработке
+
У вас пока нет достижений
`; - // const achievementsResponse = await Api.getAchievements(); - // const achievements = achievementsResponse.data; - // galleryProfileElement.innerHTML = galleryTemplateAchievements({ achievements, defaultAchievementIcon }); + const achievementsResponse = await Api.getAchievements(User.id); + if (achievementsResponse.ok) { + const achievements = achievementsResponse.data; + galleryProfileElement.innerHTML = galleryTemplateAchievements({ achievements }); + } } diff --git a/src/pages/tripPage/authors.hbs b/src/pages/tripPage/authors.hbs new file mode 100644 index 0000000..159ab88 --- /dev/null +++ b/src/pages/tripPage/authors.hbs @@ -0,0 +1,6 @@ +{{#each authors}} +
+ Аватарка +
{{username}}
+
+{{/each}} \ No newline at end of file diff --git a/src/pages/tripPage/mount-delete-photo-buttons.ts b/src/pages/tripPage/mount-delete-photo-buttons.ts deleted file mode 100644 index ae1a9d3..0000000 --- a/src/pages/tripPage/mount-delete-photo-buttons.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Api from '../../utils/Api'; -import mountPhotos from './mountPhotos'; - -export default function deletePhotoButtonsMount(galleryItem: Element, itemId: number) { - let deleteButtons = galleryItem.querySelectorAll('.photo-delete-button'); - deleteButtons.forEach(deleteButton => { - const deleteButtonElement = deleteButton as HTMLButtonElement; - deleteButtonElement.addEventListener('click', async () => { - const photoPath = deleteButtonElement.id; - const resDeletePhoto = await Api.deletePhoto(String(itemId), String(photoPath)); - if (!resDeletePhoto.ok) { - console.log('Ошибка удаления фото'); - } - await mountPhotos(galleryItem, itemId); - }); - }); -}; diff --git a/src/pages/tripPage/mountPhotos.ts b/src/pages/tripPage/mountPhotos.ts index 9d9ebba..06f1f92 100644 --- a/src/pages/tripPage/mountPhotos.ts +++ b/src/pages/tripPage/mountPhotos.ts @@ -1,14 +1,8 @@ import Api from '../../utils/Api'; -import galleryPhotosTemplate from '../tripsPage/trips-photos.hbs'; -import deleteIcon from '../../static/delete.png'; -import deletePhotoButtonsMount from './mount-delete-photo-buttons'; +import galleryPhotosTemplate from './trip-photos.hbs'; -export default async function mountPhotos(galleryItem: Element, itemId: number) { - const resTrip = await Api.getTrip(itemId); - if (resTrip) { - const newTripPhotos = resTrip.data.photos; - galleryItem.innerHTML = galleryPhotosTemplate({newTripPhotos, deleteIcon}); - // Монтирование кнопок удаления фото - deletePhotoButtonsMount(galleryItem, itemId); +export default async function mountPhotos(galleryItem: Element, photos: { photoPath: string }[]) { + if (photos.length !== 0) { + galleryItem.innerHTML = galleryPhotosTemplate({photos}); } }; diff --git a/src/pages/tripPage/trip-page.ts b/src/pages/tripPage/trip-page.ts index 3c59d92..f8fa064 100644 --- a/src/pages/tripPage/trip-page.ts +++ b/src/pages/tripPage/trip-page.ts @@ -1,36 +1,34 @@ import Api from '../../utils/Api'; +import User from '../../utils/user'; import Router from '../../utils/Router'; import header from '../../components/header'; import footer from '../../components/footer'; import backButtonIcon from '../../static/back button.svg'; -import editIcon from '../../static/edit white.svg'; import shareIcon from '../../static/share.svg'; import mountPhotos from './mountPhotos'; -import copyIcon from '../../static/copy.svg'; +import galleryAuthorsTemplate from './authors.hbs'; +import palmsImgB from '../../static/please black.svg'; +import popUpMessage from '../../components/pop-up-message'; export default { html:` ${header.html}
- - - + ${popUpMessage.html} назад
Поездка
- редактировать поделиться
01.12.2024 - 08.12.2024
Описание
+
@@ -51,111 +49,38 @@ export default { const tripTitle = document.getElementById('trip-title') as HTMLElement; const tripDate = document.getElementById('trip-date') as HTMLElement; const tripDescription = document.getElementById('trip-description') as HTMLElement; - - try { - const tripResponse = await Api.getTrip(itemId); - tripTitle.textContent = tripResponse.data.name; - tripDate.textContent = `${tripResponse.data.startDate} - ${tripResponse.data.endDate}`; - tripDescription.textContent = tripResponse.data.description; - } catch (e) { - console.log('Ошибка получения поездки'); + const tripAuthorsGallery = document.getElementById('trip-authors-gallery') as HTMLElement; + + const tripResponse = await Api.getTrip(itemId, User.id); + tripTitle.textContent = tripResponse.data.trip.name; + tripDate.textContent = `${tripResponse.data.trip.startDate} - ${tripResponse.data.trip.endDate}`; + tripDescription.textContent = tripResponse.data.trip.description; + const authors = tripResponse.data.users; + if (authors.length !== 0) { + tripAuthorsGallery.innerHTML = galleryAuthorsTemplate({ authors }); } - + + const photos = tripResponse.data.trip.photos; const galleryPhoto = document.getElementById('trip-photos') as HTMLElement; if (!galleryPhoto) { console.log('Блок фото не найден'); return; } + await mountPhotos(galleryPhoto, photos); - await mountPhotos(galleryPhoto, itemId); - - const addPhotoButton = document.getElementById('add-photo-button') as HTMLButtonElement; - addPhotoButton.addEventListener('click', async () => { - const tripPhotoInputElement = document.createElement('input') as HTMLInputElement; - tripPhotoInputElement.type = 'file'; - tripPhotoInputElement.accept = 'image/*'; // Ограничиваем тип файлов на изображения - tripPhotoInputElement.multiple = true; // Разрешаем выбирать несколько фото - tripPhotoInputElement.style.display = 'none'; - - tripPhotoInputElement.addEventListener('change', async () => { - if (tripPhotoInputElement.files) { - const files = tripPhotoInputElement.files; - const base64Photos: string[] = []; - - for (let i = 0; i < files.length; i++) { - const file = files[i]; - const reader = new FileReader(); - - // Используем промисы для ожидания конвертации - const base64 = await new Promise((resolve, reject) => { - reader.onload = () => resolve(String(reader.result)); - reader.onerror = () => reject('Ошибка чтения файла'); - reader.readAsDataURL(file); - }); - - base64Photos.push(base64); - } - - const res = await Api.putPhotos(String(itemId), base64Photos); - if (!res.ok) { - alert('Ошибка загрузки фото'); - return; - } - - // Получаем список фотографий - await mountPhotos(galleryPhoto, itemId); - } - }); + if (tripResponse.data.userAdded) { + popUpMessage.showMessage('Поездка добавлена'); + } - tripPhotoInputElement.click(); - }); + if (window.location.pathname !== `trips/${itemId}` && User.id === '') { + popUpMessage.showMessage('Авторизуйтесь для добавления поездки'); + } const shareButton = document.getElementById('trip-share-button') as HTMLButtonElement; - const shareBlock = document.getElementById('share-block') as HTMLElement; - const blurElement = document.getElementById('blur-element') as HTMLElement; - shareButton.addEventListener('click', () => { - shareBlock.classList.remove('hidden'); - shareBlock.classList.remove('hidden-animation'); - blurElement.classList.remove('hidden'); - blurElement.classList.remove('hidden-animation'); - }); - blurElement.addEventListener('click', () => { - shareBlock.classList.add('hidden-animation'); - shareBlock.classList.add('hidden'); - blurElement.classList.add('hidden-animation'); - blurElement.classList.add('hidden'); - }); - - const editTripButton = document.getElementById('trip-edit-button') as HTMLButtonElement; - editTripButton.addEventListener('click', async () => { - await router.goto(`/edittrip/${itemId}`); - }); - - const copyLinkButton = document.getElementById('copy-link-button') as HTMLButtonElement; - const shareLinkElement = document.getElementById('share-link') as HTMLElement; - const copyMessage = document.getElementById('copy-message') as HTMLElement; - copyLinkButton.addEventListener('click', () => { - if (shareLinkElement.textContent) { - navigator.clipboard.writeText(shareLinkElement.textContent); - copyMessage.classList.remove('hidden'); - setTimeout(() => copyMessage.classList.remove('hidden-animation'), 100); - setTimeout(() => { - copyMessage.classList.add('hidden-animation'); - setTimeout (()=> copyMessage.classList.add('hidden'), 300); - }, 2000); - } - }); - const readModeButton = document.getElementById('read-mode-button') as HTMLButtonElement; - readModeButton.addEventListener('click', async () => { - const resReadMode = await Api.postTripLink(itemId, 'reading'); - shareLinkElement.textContent = resReadMode.data.link; - }); - - const editModeButton = document.getElementById('edit-mode-button') as HTMLButtonElement; - editModeButton.addEventListener('click', async () => { - const resEditMode = await Api.postTripLink(itemId, 'editing'); - shareLinkElement.textContent = resEditMode.data.link; + shareButton.addEventListener('click', () => { + navigator.clipboard.writeText(`https://therewillbetrip.ru/trips/${itemId}`); + popUpMessage.showMessage('Ссылка скопирована'); }); }, diff --git a/src/pages/tripPage/trip-photos.hbs b/src/pages/tripPage/trip-photos.hbs new file mode 100644 index 0000000..bd958a0 --- /dev/null +++ b/src/pages/tripPage/trip-photos.hbs @@ -0,0 +1,5 @@ +{{#each photos}} +
+ Фото поездки +
+{{/each}} \ No newline at end of file diff --git a/src/pages/tripsPage/trips.hbs b/src/pages/tripsPage/trips.hbs index 78a227d..6d00323 100644 --- a/src/pages/tripsPage/trips.hbs +++ b/src/pages/tripsPage/trips.hbs @@ -6,6 +6,8 @@ Картинка поездки + Иконка ссылки + Иконка редактирования Иконка удаления