|
import emojiToText from './emojiMapping.js'; |
|
|
|
function mapEmojisToText(emojiString) { |
|
return [...emojiString].map(emoji => emojiToText[emoji] || emoji).join(' '); |
|
} |
|
|
|
function handleEmojiClick(thumbnail, index) { |
|
thumbnail.addEventListener('click', () => handleEmojiSelection(index)); |
|
thumbnail.addEventListener('keypress', event => { |
|
if (event.key === 'Enter' || event.key === ' ') { |
|
handleEmojiSelection(index); |
|
} |
|
}); |
|
} |
|
|
|
function handleEmojiSelection(index) { |
|
showCategory(index); |
|
} |
|
|
|
function hideAllCategories() { |
|
document.querySelectorAll('.emoji-category').forEach(cat => cat.classList.add('hidden')); |
|
} |
|
|
|
function showCategory(index) { |
|
const category = document.getElementById(`emoji-category-${index + 1}`); |
|
category.classList.remove('hidden'); |
|
} |
|
|
|
function handleCategoryClick(category) { |
|
category.addEventListener('click', event => { |
|
if (isEmojiClicked(event)) { |
|
addEmojiToInput(event.target); |
|
} |
|
event.stopPropagation(); |
|
}); |
|
} |
|
|
|
function isEmojiClicked(event) { |
|
return event.target !== event.currentTarget && event.target.classList.contains('emoji'); |
|
} |
|
|
|
function addEmojiToInput(emojiElement) { |
|
const selectedEmojisInput = document.getElementById('selected-emojis'); |
|
selectedEmojisInput.value += emojiElement.textContent.trim(); |
|
|
|
|
|
emojiElement.classList.add('emoji-clicked'); |
|
|
|
|
|
setTimeout(() => { |
|
emojiElement.classList.remove('emoji-clicked'); |
|
}, 100); |
|
} |
|
|
|
function adjustEmojiGrid() { |
|
const grids = document.querySelectorAll('.emoji-category div'); |
|
grids.forEach(grid => { |
|
grid.className = window.innerWidth < 768 ? 'grid grid-cols-3 gap-4' : 'grid grid-cols-6 gap-4'; |
|
}); |
|
} |
|
|
|
async function query(data) { |
|
console.log("Sending request to worker with data:", data); |
|
const requestData = { |
|
prompt: data.inputs, |
|
negative_prompt: "bad art, ugly, watermark, deformed", |
|
sync_mode: 1 |
|
}; |
|
|
|
const response = await fetch( |
|
"https://requesteracessibili.joaovitorkas13.workers.dev", |
|
{ |
|
method: "POST", |
|
headers: { |
|
'Content-Type': 'application/json' |
|
}, |
|
body: JSON.stringify(requestData) |
|
} |
|
); |
|
console.log("Received response from worker"); |
|
if (!response.ok) { |
|
throw new Error(`Worker call failed: ${response.status}`); |
|
} |
|
const result = await response.json(); |
|
console.log("Received JSON from worker"); |
|
return result; |
|
} |
|
|
|
|
|
function toggleButtonState(button, isLoading) { |
|
button.style.backgroundColor = isLoading ? '#FFA500' : '#007BFF'; |
|
button.disabled = isLoading; |
|
button.ariaBusy = isLoading; |
|
document.querySelector('.loading-container').classList.toggle('hidden', !isLoading); |
|
const imageElement = document.querySelector('.generated-image'); |
|
if (imageElement) { |
|
imageElement.style.display = isLoading ? 'none' : 'block'; |
|
} |
|
} |
|
|
|
document.addEventListener('DOMContentLoaded', function () { |
|
document.querySelectorAll('.emoji-thumbnail').forEach((thumbnail, index) => { |
|
thumbnail.addEventListener('click', () => { |
|
const currentCategory = document.getElementById(`emoji-category-${index + 1}`); |
|
|
|
|
|
if (currentCategory.style.display === 'none' || currentCategory.style.display === '') { |
|
|
|
document.querySelectorAll('.emoji-category').forEach(cat => { |
|
cat.style.display = 'none'; |
|
}); |
|
|
|
currentCategory.style.display = 'block'; |
|
} else { |
|
|
|
currentCategory.style.display = 'none'; |
|
} |
|
}); |
|
}); |
|
}); |
|
|
|
function handleGenerateClick() { |
|
const button = document.getElementById('generate-btn'); |
|
button.addEventListener('click', async function() { |
|
toggleButtonState(this, true); |
|
|
|
|
|
const selectedEmojis = document.getElementById('selected-emojis').value; |
|
|
|
|
|
const mappedText = mapEmojisToText(selectedEmojis); |
|
|
|
if (!mappedText.trim()) { |
|
alert("Please select some emojis first!"); |
|
toggleButtonState(this, false); |
|
return; |
|
} |
|
|
|
try { |
|
|
|
const response = await query({ "inputs": ` ${mappedText}` }); |
|
displayGeneratedImage(response); |
|
} catch (error) { |
|
console.error("Error calling the API: ", error); |
|
alert("Failed to generate image. Please try again."); |
|
} finally { |
|
toggleButtonState(this, false); |
|
} |
|
}); |
|
} |
|
|
|
|
|
function displayGeneratedImage(responseData) { |
|
if (responseData.images && responseData.images.length > 0) { |
|
const imageUrl = responseData.images[0].url; |
|
const imageElement = document.querySelector('.generated-image'); |
|
if (imageElement) { |
|
imageElement.src = imageUrl; |
|
imageElement.style.display = 'block'; |
|
} else { |
|
console.error('Elemento de imagem não encontrado.'); |
|
} |
|
} else { |
|
console.error('Nenhuma imagem encontrada na resposta.'); |
|
} |
|
} |
|
|
|
|
|
function setupSpeechRecognition() { |
|
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; |
|
|
|
if (SpeechRecognition) { |
|
const recognition = new SpeechRecognition(); |
|
recognition.lang = navigator.language || 'en-US'; |
|
recognition.interimResults = false; |
|
|
|
const startSpeechBtn = document.getElementById('start-speech-recognition'); |
|
const selectedEmojisInput = document.getElementById('selected-emojis'); |
|
|
|
startSpeechBtn.addEventListener('click', () => { |
|
if (startSpeechBtn.classList.contains('listening')) { |
|
recognition.stop(); |
|
startSpeechBtn.classList.remove('listening'); |
|
} else { |
|
recognition.start(); |
|
startSpeechBtn.classList.add('listening'); |
|
} |
|
}); |
|
|
|
recognition.addEventListener('result', (event) => { |
|
const transcript = event.results[0][0].transcript; |
|
selectedEmojisInput.value = transcript; |
|
}); |
|
|
|
recognition.addEventListener('end', () => { |
|
startSpeechBtn.classList.remove('listening'); |
|
}); |
|
} else { |
|
console.error("Your browser does not support speech recognition."); |
|
} |
|
} |
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function () { |
|
|
|
const imageElement = document.querySelector('.generated-image'); |
|
if (imageElement) { |
|
imageElement.style.display = 'none'; |
|
} |
|
|
|
document.querySelectorAll('.emoji-thumbnail').forEach(handleEmojiClick); |
|
document.querySelectorAll('.emoji-category').forEach(handleCategoryClick); |
|
window.addEventListener('load', adjustEmojiGrid); |
|
window.addEventListener('resize', adjustEmojiGrid); |
|
handleGenerateClick(); |
|
setupSpeechRecognition(); |
|
}); |