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