| 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(); |
| }); |