Spaces:
Running
Running
// arquivo: script.js - Para integrar com o frontend existente | |
// Configuração da API | |
const API_URL = 'https://seu-backend-goalmaster-ai.hf.space'; // Substitua pelo URL real quando implantar | |
// Selecionar elementos importantes do DOM | |
document.addEventListener('DOMContentLoaded', () => { | |
const generatePlanBtn = document.getElementById('generate-plan'); | |
const aiLoadingSection = document.getElementById('ai-loading'); | |
const aiPlanSection = document.getElementById('ai-plan-section'); | |
const goalTitleInput = document.getElementById('goal-title'); | |
const goalCategorySelect = document.getElementById('goal-category'); | |
const goalDescriptionInput = document.getElementById('goal-description'); | |
const goalTimelineSelect = document.getElementById('goal-timeline'); | |
// Capturar opções da IA | |
const stepByStepOption = document.querySelector('input[type="checkbox"][checked]:nth-of-type(1)'); | |
const metricsOption = document.querySelector('input[type="checkbox"][checked]:nth-of-type(2)'); | |
const remindersOption = document.querySelector('input[type="checkbox"][checked]:nth-of-type(3)'); | |
const benchmarksOption = document.querySelector('input[type="checkbox"]:not([checked])'); | |
// Substituir o evento de clique simulado por uma chamada real à API | |
if (generatePlanBtn) { | |
generatePlanBtn.addEventListener('click', async function() { | |
if (!goalTitleInput.value.trim()) { | |
alert('Por favor, informe um título para sua meta.'); | |
return; | |
} | |
// Mostrar estado de carregamento | |
aiLoadingSection.classList.remove('hidden'); | |
generatePlanBtn.disabled = true; | |
try { | |
// Preparar dados para enviar à API | |
const planData = { | |
title: goalTitleInput.value, | |
category: goalCategorySelect.value, | |
description: goalDescriptionInput.value, | |
timeframe: goalTimelineSelect.value, | |
options: { | |
step_by_step: stepByStepOption.checked, | |
metrics: metricsOption.checked, | |
reminders: remindersOption.checked, | |
benchmarks: benchmarksOption.checked | |
} | |
}; | |
// Fazer chamada à API | |
const response = await fetch(`${API_URL}/generate-plan`, { | |
method: 'POST', | |
headers: { | |
'Content-Type': 'application/json', | |
}, | |
body: JSON.stringify(planData) | |
}); | |
const result = await response.json(); | |
if (result.success) { | |
// Atualizar a UI com o plano gerado | |
updatePlanUI(result.plan, planData.title, planData.category); | |
} else { | |
throw new Error(result.error || 'Erro ao gerar o plano'); | |
} | |
} catch (error) { | |
console.error('Erro:', error); | |
// Em caso de erro, exibir um plano genérico | |
displayFallbackPlan(goalTitleInput.value, goalCategorySelect.value); | |
} finally { | |
// Ocultar carregamento e mostrar seção do plano | |
aiLoadingSection.classList.add('hidden'); | |
aiPlanSection.classList.remove('hidden'); | |
generatePlanBtn.disabled = false; | |
// Rolar até a seção do plano | |
aiPlanSection.scrollIntoView({ behavior: 'smooth' }); | |
} | |
}); | |
} | |
}); | |
// Função para atualizar a UI com o plano gerado pela IA | |
function updatePlanUI(plan, goalTitle, category) { | |
// Selecionar elementos que precisam ser atualizados | |
const planSummaryContainer = document.querySelector('.bg-gray-50.p-4.rounded-lg.mb-6 ul'); | |
const planStepsContainer = document.querySelector('.mb-6 .space-y-4'); | |
const resourcesContainer = document.querySelector('.bg-blue-50.p-4.rounded-lg ul'); | |
const checkpointsContainer = document.querySelector('.bg-green-50.p-4.rounded-lg ul'); | |
// Atualizar resumo | |
if (planSummaryContainer) { | |
planSummaryContainer.innerHTML = ` | |
<li>Duração: ${plan.summary.duration}</li> | |
<li>Métricas-chave: ${plan.summary.key_metrics.join(', ')}</li> | |
<li>Nível estimado ao final: ${plan.summary.final_level}</li> | |
<li>Dificuldade: ${plan.summary.difficulty}</li> | |
`; | |
} | |
// Atualizar etapas | |
if (planStepsContainer) { | |
planStepsContainer.innerHTML = ''; | |
plan.steps.forEach((step, index) => { | |
const stepElement = document.createElement('div'); | |
stepElement.className = 'p-4 border border-gray-200 rounded-lg'; | |
const tasks = step.tasks.map(task => `• ${task}`).join('<br>'); | |
stepElement.innerHTML = ` | |
<div class="flex items-start"> | |
<div class="flex-shrink-0 h-10 w-10 rounded-full bg-purple-100 flex items-center justify-center text-purple-600 mr-3"> | |
<span class="font-bold">${index + 1}</span> | |
</div> | |
<div> | |
<h4 class="font-medium text-gray-900">${step.period}: ${step.title}</h4> | |
<p class="text-gray-600 mt-1">${tasks}</p> | |
</div> | |
</div> | |
`; | |
planStepsContainer.appendChild(stepElement); | |
}); | |
} | |
// Atualizar recursos recomendados | |
if (resourcesContainer) { | |
resourcesContainer.innerHTML = ''; | |
plan.resources.forEach(resource => { | |
const li = document.createElement('li'); | |
li.innerHTML = `<a href="#" class="underline">${resource}</a>`; | |
resourcesContainer.appendChild(li); | |
}); | |
} | |
// Atualizar checkpoints | |
if (checkpointsContainer) { | |
checkpointsContainer.innerHTML = ''; | |
plan.checkpoints.forEach(checkpoint => { | |
const li = document.createElement('li'); | |
li.textContent = checkpoint; | |
checkpointsContainer.appendChild(li); | |
}); | |
} | |
// Atualizar título e citação da IA | |
const planTitle = document.querySelector('#ai-plan-section h2'); | |
if (planTitle) { | |
planTitle.textContent = `Plano para: ${goalTitle}`; | |
} | |
const planQuote = document.querySelector('.border-l-4.border-purple-500.pl-4.mb-6 p'); | |
if (planQuote) { | |
planQuote.textContent = `"Com base no seu objetivo de ${goalTitle} na categoria ${category}, criei um plano personalizado para você alcançar seu objetivo com sucesso. Aqui está o que recomendo:"`; | |
} | |
} | |
// Função para exibir um plano de contingência em caso de falha | |
function displayFallbackPlan(goalTitle, category) { | |
// Plano genérico baseado no título e categoria | |
const fallbackPlan = { | |
summary: { | |
duration: "3 meses", | |
key_metrics: ["Progresso semanal", "Tarefas concluídas"], | |
final_level: "Objetivo alcançado com sucesso", | |
difficulty: "Moderada" | |
}, | |
steps: [ | |
{ | |
period: "Mês 1", | |
title: "Preparação e Planejamento", | |
tasks: ["Pesquisar sobre o tema", "Definir metas específicas", "Reunir recursos necessários"] | |
}, | |
{ | |
period: "Mês 2", | |
title: "Implementação", | |
tasks: ["Executar tarefas planejadas", "Monitorar progresso", "Ajustar estratégias"] | |
}, | |
{ | |
period: "Mês 3", | |
title: "Refinamento e Conclusão", | |
tasks: ["Aprimorar habilidades", "Superar obstáculos finais", "Avaliar resultados"] | |
} | |
], | |
resources: ["Cursos online sobre o tema", "Comunidades especializadas", "Ferramentas digitais de acompanhamento"], | |
checkpoints: ["Relatório semanal de progresso", "Avaliação mensal de resultados", "Revisão de estratégias a cada 2 semanas"] | |
}; | |
// Atualizar UI com o plano de contingência | |
updatePlanUI(fallbackPlan, goalTitle, category); | |
} |