196 lines
7.4 KiB
JavaScript
196 lines
7.4 KiB
JavaScript
// Sentence Converter Widget JavaScript
|
|
window.SentenceConverterWidget = (function () {
|
|
|
|
function initializeWidget(containerId) {
|
|
console.log('🚀 Inicializando SentenceConverterWidget em:', containerId);
|
|
|
|
const container = document.getElementById(containerId);
|
|
if (!container) {
|
|
console.error('❌ Container não encontrado:', containerId);
|
|
return false;
|
|
}
|
|
|
|
const widget = container.querySelector('[data-converter-id="sentence-converter"]');
|
|
if (!widget) {
|
|
console.error('❌ Widget não encontrado no container');
|
|
return false;
|
|
}
|
|
|
|
// Buscar configuração
|
|
const configScript = widget.querySelector('#widget-config');
|
|
let config = {};
|
|
|
|
if (configScript) {
|
|
try {
|
|
config = JSON.parse(configScript.textContent);
|
|
console.log('✅ Configuração carregada:', config);
|
|
} catch (e) {
|
|
console.warn('⚠️ Erro ao parsear configuração, usando fallback');
|
|
config = getFallbackConfig();
|
|
}
|
|
} else {
|
|
console.warn('⚠️ Configuração não encontrada, usando fallback');
|
|
config = getFallbackConfig();
|
|
}
|
|
|
|
// Elementos do widget
|
|
const elements = {
|
|
inputText: widget.querySelector('#inputText'),
|
|
outputText: widget.querySelector('#outputText'),
|
|
convertBtn: widget.querySelector('#convertBtn'),
|
|
copyBtn: widget.querySelector('#copyBtn'),
|
|
clearBtn: widget.querySelector('#clearBtn'),
|
|
charCount: widget.querySelector('#charCount'),
|
|
status: widget.querySelector('#conversionStatus')
|
|
};
|
|
|
|
// Verificar se todos os elementos existem
|
|
const missingElements = Object.entries(elements)
|
|
.filter(([key, element]) => !element)
|
|
.map(([key]) => key);
|
|
|
|
if (missingElements.length > 0) {
|
|
console.error('❌ Elementos não encontrados:', missingElements);
|
|
return false;
|
|
}
|
|
|
|
console.log('✅ Todos os elementos encontrados');
|
|
|
|
// Event Listeners
|
|
setupEventListeners(elements, config);
|
|
|
|
console.log('✅ SentenceConverterWidget inicializado com sucesso!');
|
|
return true;
|
|
}
|
|
|
|
function setupEventListeners(elements, config) {
|
|
const { inputText, outputText, convertBtn, copyBtn, clearBtn, charCount, status } = elements;
|
|
|
|
// Contador de caracteres
|
|
inputText.addEventListener('input', function () {
|
|
charCount.textContent = this.value.length;
|
|
console.log('📝 Caracteres digitados:', this.value.length);
|
|
});
|
|
|
|
// Converter texto
|
|
convertBtn.addEventListener('click', async function () {
|
|
console.log('🔄 Iniciando conversão...');
|
|
|
|
const text = inputText.value.trim();
|
|
if (!text) {
|
|
showStatus(status, config.messages.enterText || 'Por favor, digite algum texto.', 'warning');
|
|
return;
|
|
}
|
|
|
|
// UI Loading state
|
|
convertBtn.disabled = true;
|
|
const originalText = convertBtn.innerHTML;
|
|
convertBtn.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i>' + (config.messages.converting || 'Convertendo...');
|
|
|
|
try {
|
|
const formData = new FormData();
|
|
formData.append('TextInput', text);
|
|
formData.append('Language', config.language || 'pt');
|
|
|
|
console.log('📤 Enviando requisição para /api/converter/convert');
|
|
|
|
const response = await fetch('/api/converter/convert', {
|
|
method: 'POST',
|
|
body: formData
|
|
});
|
|
|
|
const result = await response.json();
|
|
console.log('📥 Resposta recebida:', result);
|
|
|
|
if (result.success) {
|
|
outputText.value = result.outputText;
|
|
copyBtn.disabled = false;
|
|
showStatus(status, config.messages.success || 'Conversão realizada com sucesso!', 'success');
|
|
console.log('✅ Conversão bem-sucedida');
|
|
} else {
|
|
showStatus(status, 'Erro: ' + result.message, 'danger');
|
|
console.error('❌ Erro na conversão:', result.message);
|
|
}
|
|
} catch (error) {
|
|
showStatus(status, config.messages.connectionError || 'Erro de conexão. Tente novamente.', 'danger');
|
|
console.error('❌ Erro de conexão:', error);
|
|
} finally {
|
|
convertBtn.disabled = false;
|
|
convertBtn.innerHTML = originalText;
|
|
}
|
|
});
|
|
|
|
// Copiar resultado
|
|
copyBtn.addEventListener('click', async function () {
|
|
try {
|
|
await navigator.clipboard.writeText(outputText.value);
|
|
showStatus(status, config.messages.copied || 'Texto copiado para a área de transferência!', 'success');
|
|
console.log('📋 Texto copiado com sucesso');
|
|
} catch (error) {
|
|
showStatus(status, config.messages.copyError || 'Erro ao copiar texto.', 'danger');
|
|
console.error('❌ Erro ao copiar:', error);
|
|
}
|
|
});
|
|
|
|
// Limpar campos
|
|
clearBtn.addEventListener('click', function () {
|
|
inputText.value = '';
|
|
outputText.value = '';
|
|
copyBtn.disabled = true;
|
|
charCount.textContent = '0';
|
|
status.innerHTML = '';
|
|
console.log('🧹 Campos limpos');
|
|
});
|
|
|
|
console.log('🎯 Event listeners configurados');
|
|
}
|
|
|
|
function showStatus(statusElement, message, type) {
|
|
statusElement.innerHTML = `
|
|
<div class="alert alert-${type} alert-dismissible fade show" role="alert">
|
|
${message}
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
|
</div>`;
|
|
|
|
setTimeout(() => {
|
|
statusElement.innerHTML = '';
|
|
}, 5000);
|
|
}
|
|
|
|
function getFallbackConfig() {
|
|
return {
|
|
language: 'pt',
|
|
convertButtonText: 'Converter Texto',
|
|
messages: {
|
|
enterText: 'Por favor, digite algum texto.',
|
|
converting: 'Convertendo...',
|
|
success: 'Conversão realizada com sucesso!',
|
|
copied: 'Texto copiado para a área de transferência!',
|
|
connectionError: 'Erro de conexão. Tente novamente.',
|
|
copyError: 'Erro ao copiar texto.'
|
|
}
|
|
};
|
|
}
|
|
|
|
// API pública
|
|
return {
|
|
init: initializeWidget,
|
|
version: '1.0.0'
|
|
};
|
|
})();
|
|
|
|
// Auto-inicializar se encontrar widgets na página
|
|
// Auto-inicializar se encontrar widgets na página (para uso standalone)
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
// Só auto-inicializar se não estivermos em um sistema de módulos
|
|
if (!window.ModuleLoader && !window.ModuleSystem) {
|
|
const widgets = document.querySelectorAll('[data-converter-id="sentence-converter"]');
|
|
widgets.forEach((widget, index) => {
|
|
const containerId = widget.closest('[id]')?.id || `widget-container-${index}`;
|
|
if (!widget.closest('[id]')) {
|
|
widget.parentElement.id = containerId;
|
|
}
|
|
window.SentenceConverterWidget.init(containerId);
|
|
});
|
|
}
|
|
}); |