var pckry;
document.addEventListener('DOMContentLoaded', (event) => {
// 初始化函數
restoreState();
init();
});
function init() {
// 綁定事件
document.querySelector('.buttonAddImage').addEventListener('click', showAddImageForm);
document.querySelector('.buttonCancelAdd').addEventListener('click', hideAddImageForm);
document.querySelector('.buttonApproveAdd').addEventListener('click', addImage);
document.querySelector('.buttonApproveAddMore').addEventListener('click', addMoreImage);
document.querySelector('.buttonClearCards').addEventListener('click', clearAllCards);
document.querySelector('.buttonAddMeme').addEventListener('click', addMeme);
document.querySelector('.buttonSeedCards').addEventListener('click', seedCards);
var cardholder = document.querySelector('.cardholder');
pckry = new Packery(cardholder, {
// Packery 的選項
itemSelector: '.card',
// percentPosition: true, // 如果你想要使用百分比定位
gutter: 1
});
// makeAllCardsDraggable();
// 綁定卡片點擊事件
cardholder.addEventListener('click', function (event) {
const card = event.target.closest('.card');
if (!card) return; // 如果點擊的不是卡片或卡片內的元素,則不進行任何操作
// 如果點擊的是圖片或圖片的父元素(可能包括一些包裝圖片的容器)
if (event.target === card.querySelector('.mood-image') || event.target.parentNode === card.querySelector('.mood-image')) {
// 如果已經有選中的卡片,則取消選中
const selectedCard = document.querySelector('.card-selected');
if (selectedCard && selectedCard !== card) {
selectedCard.classList.remove('card-selected');
const buttons = selectedCard.querySelector('.card-buttons');
if (buttons) {
buttons.style.display = 'none'; // 隱藏按鈕
}
}
// 切換當前卡片的選中狀態
card.classList.toggle('card-selected');
const currentButtons = card.querySelector('.card-buttons');
if (currentButtons) {
currentButtons.style.display = card.classList.contains('card-selected') ? 'flex' : 'none'; // 顯示或隱藏按鈕
}
}
// 檢查是否點擊了彈出按鈕
if (event.target.closest('.pop-out, .pop-out *')) {
const card = event.target.closest('.card');
card.classList.toggle('popped-out');
if (card.classList.contains('popped-out')) {
// 設置彈出狀態的樣式
card.style.position = 'absolute';
card.style.zIndex = '3'; // 確保彈出卡片在其他卡片上方,但在添加圖片模態窗口下方
card.style.left = '50%'; // 可以調整位置以適應需求
card.style.top = '50%';
card.style.transform = 'translate(-50%, -50%)'; // 居中
} else {
// 復原到正常狀態的樣式
card.style.position = '';
card.style.zIndex = '';
card.style.left = '';
card.style.top = '';
card.style.transform = '';
card.classList.remove('popped-out');
const cardholder = document.querySelector('.cardholder');
cardholder.appendChild(card); // 將卡片移動到容器的最後
pckry.appended(card); // 通知 Packery 新增了卡片並重新佈局
pckry.layout();
}
}
// 根據點擊的是哪個按鈕,執行相應的操作
if (event.target.matches('.delete, .delete *')) { // 匹配刪除按鈕或其內部的元素
pckry.remove(card);
card.remove();
pckry.layout();
} else if (event.target.matches('.zoom-out, .zoom-out *')) { // 匹配縮小按鈕或其內部的元素
// ...縮小操作...
const currentSize = parseInt(card.classList[1].split('-')[2]);
const newSize = Math.max(currentSize - 1, 1); // 確保尺寸不會小於 1
// 更新卡片的尺寸類別
card.className = card.className.replace(`card-size-${currentSize}`, `card-size-${newSize}`);
pckry.layout(); // 通知 Packery 重新佈局
} else if (event.target.matches('.zoom-in, .zoom-in *')) { // 匹配放大按鈕或其內部的元素
// ...放大操作...
const currentSize = parseInt(card.classList[1].split('-')[2]);
const newSize = Math.min(currentSize + 1, 4); // 確保尺寸不會大於 4
// 更新卡片的尺寸類別
card.className = card.className.replace(`card-size-${currentSize}`, `card-size-${newSize}`);
pckry.layout(); // 通知 Packery 重新佈局
} else if (event.target.matches('.move-left, .move-left *')) { // 匹配向左移動按鈕或其內部的元素
// ...向左移動操作...
const previousCard = card.previousElementSibling;
if (previousCard) {
// 將卡片移動到前一個卡片之前
cardholder.insertBefore(card, previousCard);
pckry.reloadItems(); // 重新加載 Packery 的項目
pckry.layout(); // 重新佈局
}
} else if (event.target.matches('.move-right, .move-right *')) { // 匹配向右移動按鈕或其內部的元素
// ...向右移動操作...
const nextCard = card.nextElementSibling;
if (nextCard) {
// 將卡片移動到下一個卡片之後
cardholder.insertBefore(nextCard, card);
pckry.reloadItems(); // 重新加載 Packery 的項目
pckry.layout(); // 重新佈局
}
}
});
}
function showAddImageForm() {
var modal = document.getElementById('addImageModal');
modal.style.display = "block";
var closeButton = document.querySelector('.close');
closeButton.onclick = function () {
modal.style.display = "none";
}
// 當用戶點擊模態視窗以外的地方,關閉它
window.onclick = function (event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
}
function makeAllCardsDraggable() {
// 對現有的每個卡片使用 Draggabilly
var draggableElems = pckry.getItemElements();
for (var i = 0, len = draggableElems.length; i < len; i++) {
var draggableElem = draggableElems[i];
var draggie = new Draggabilly(draggableElem);
pckry.bindDraggabillyEvents(draggie);
}
}
function hideAddImageForm() {
var modal = document.getElementById('addImageModal');
modal.style.display = "none";
}
function addImage(event) {
handleAddImage(event, true);
}
function addMoreImage(event) {
handleAddImage(event, false);
}
function handleAddImage(event, closeModal) {
event.preventDefault();
let imageUrl = document.getElementById('newPicUrl').value.trim();
if (!imageUrl) {
console.log('URL is empty. No action taken.');
return;
}
if (!imageUrl.startsWith('http://') && !imageUrl.startsWith('https://')) {
imageUrl = 'https://' + imageUrl;
console.log('URL corrected to: ', imageUrl);
}
addImageWithUrl(imageUrl);
document.getElementById('newPicUrl').value = '';
if (closeModal) {
hideAddImageForm()
}
}
function clearAllCards() {
// 移除所有 .card 元素
var cards = document.querySelectorAll('.card');
cards.forEach(function (card) {
pckry.remove(card); // 通知 Packery 移除元素
card.remove(); // 從 DOM 中移除元素
});
// 通知 Packery 重新佈局剩下的元素
pckry.layout();
}
function addMeme() {
getRandomMemeGif(function (gifUrl) {
// 這裡我們直接調用 addImage 函數,將 Giphy 圖片 URL 作為參數
addImageWithUrl(gifUrl);
});
}
function seedCards() {
imageSeeds.forEach(seed => {
addImageWithUrl(seed.url);
});
}
// 撤銷/重做功能的實現可以根據你的需求設計
// 將 YOUR_API_KEY 替換成你的 Giphy API 密鑰
function getRandomMemeGif(callback) {
const apiKey = 'SHyO3XJY0R71LuTQlx2SlsRuvTrKBjxD';
const apiUrl = `https://api.giphy.com/v1/gifs/random?api_key=${apiKey}&tag=meme`;
fetch(apiUrl)
.then(response => response.json())
.then(data => {
const gifUrl = data.data.images.original.url;
if (callback) callback(gifUrl);
})
.catch(error => {
console.error('Error fetching random meme gif:', error);
});
}
function addImageWithUrl(imageUrl, sizeClass = null) {
const card = document.createElement('div');
card.className = 'card';
if (!sizeClass) {
sizeClass = 'card-size-' + (Math.floor(Math.random() * 4) + 1);
}
card.classList.add(sizeClass);
// 隨機選擇一個大小
// 創建按鈕容器
const buttonsContainer = document.createElement('div');
buttonsContainer.className = 'card-buttons';
// 創建按鈕組
const buttonGroupVertical = document.createElement('div');
buttonGroupVertical.className = 'button-group vertical';
const buttonGroupHorizontal = document.createElement('div');
buttonGroupHorizontal.className = 'button-group horizontal';
// 創建刪除按鈕
const deleteBtn = document.createElement('button');
deleteBtn.className = 'button delete';
deleteBtn.innerHTML = '';
// 創建放大按鈕
const zoomInBtn = document.createElement('button');
zoomInBtn.className = 'button zoom-in';
zoomInBtn.innerHTML = '';
// 創建縮小按鈕
const zoomOutBtn = document.createElement('button');
zoomOutBtn.className = 'button zoom-out';
zoomOutBtn.innerHTML = '';
// 向按鈕組中添加按鈕
buttonGroupVertical.appendChild(deleteBtn);
buttonGroupVertical.appendChild(zoomInBtn);
buttonGroupVertical.appendChild(zoomOutBtn);
// 創建向左移動按鈕
const moveLeftBtn = document.createElement('button');
moveLeftBtn.className = 'button move-left';
moveLeftBtn.innerHTML = '';
// 創建向右移動按鈕
const moveRightBtn = document.createElement('button');
moveRightBtn.className = 'button move-right';
moveRightBtn.innerHTML = '';
// 向按鈕組中添加按鈕
buttonGroupHorizontal.appendChild(moveLeftBtn);
buttonGroupHorizontal.appendChild(moveRightBtn);
// 向總按鈕容器添加按鈕組
buttonsContainer.appendChild(buttonGroupVertical);
buttonsContainer.appendChild(buttonGroupHorizontal);
// 設置按鈕組的位置
buttonsContainer.style.justifyContent = 'space-between';
buttonsContainer.style.position = 'absolute';
buttonsContainer.style.top = '0';
buttonsContainer.style.left = '0';
buttonsContainer.style.zIndex = '1';
// 創建彈出按鈕
const popOutBtn = document.createElement('button');
popOutBtn.className = 'button pop-out';
popOutBtn.innerHTML = ''; // 假設這是彈出圖示
buttonGroupVertical.appendChild(popOutBtn); // 添加到垂直按鈕組
// 創建圖片元素
const img = document.createElement('img');
img.src = imageUrl;
img.alt = 'Mood Image';
img.className = 'mood-image';
img.style.position = 'relative';
img.style.zIndex = '2';
// 當圖片加載完成後,將圖片和按鈕容器添加到卡片
img.onload = function () {
card.appendChild(img);
card.appendChild(buttonsContainer);
// 將卡片添加到卡片容器中
const cardholder = document.querySelector('.cardholder');
cardholder.appendChild(card);
// 通知 Packery 新增了卡片並重新布局
pckry.appended(card);
pckry.layout();
// 更新localStorage的狀態
saveState();
};
}
function saveState() {
const cards = document.querySelectorAll('.card');
const state = Array.from(cards).map(card => ({
url: card.querySelector('img').src,
sizeClass: card.classList[1] // 假設大小類別為第二個class
}));
localStorage.setItem('cardsState', JSON.stringify(state));
}
function restoreState() {
const state = JSON.parse(localStorage.getItem('cardsState'));
if (state) {
state.forEach(cardState => {
addImageWithUrl(cardState.url, cardState.sizeClass);
});
}
}