Post-Vaccine Symptom & Immune Response Tracker

Post-Vaccine Symptom

& Immune Response Tracker

Start a New Log

Enter the details of your vaccination to begin tracking your immune response.

Log Daily Symptoms

Symptoms

Your Timeline

Analytics

Symptoms: ${event.symptoms.join(', ') || 'None'}

`; } timelineEvents.appendChild(item); }); }; const renderSymptomChart = () => { const ctx = document.getElementById('symptomChart').getContext('2d'); const symptomCounts = SYMPTOMS.reduce((acc, s) => ({ ...acc, [s]: 0 }), {}); if (trackingData) { trackingData.logs.forEach(log => { log.symptoms.forEach(s => symptomCounts[s]++); }); } if (symptomChart) symptomChart.destroy(); symptomChart = new Chart(ctx, { type: 'doughnut', data: { labels: SYMPTOMS, datasets: [{ label: 'Symptom Frequency', data: Object.values(symptomCounts), backgroundColor: ['#ef4444', '#f97316', '#eab308', '#84cc16', '#22c55e', '#14b8a6'] }] }, options: { responsive: true, maintainAspectRatio: true } }); }; // --- EVENT HANDLERS --- const handleSetup = (e) => { e.preventDefault(); trackingData = { vaccineName: document.getElementById('vaccine-name').value, vaccineDate: document.getElementById('vaccine-date').value, logs: [] }; saveData(); showTracker(); updateAllUI(); }; const handleLogSubmit = (e) => { e.preventDefault(); const date = logDateInput.value; const existingLogIndex = trackingData.logs.findIndex(log => log.date === date); const newLog = { date, severity: document.getElementById('symptom-severity').value, symptoms: SYMPTOMS.filter(s => document.getElementById(`symptom-${s}`).checked) }; if (existingLogIndex > -1) { trackingData.logs[existingLogIndex] = newLog; } else { trackingData.logs.push(newLog); } saveData(); updateAllUI(); logForm.reset(); logDateInput.valueAsDate = new Date(); alert('Log saved!'); }; const handlePdfDownload = () => { if (!trackingData) return; const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFont('helvetica', 'bold').setFontSize(20); doc.text('Post-Vaccine Symptom Report', 105, 20, { align: 'center' }); doc.setFont('helvetica', 'normal').setFontSize(12); doc.text(`Vaccine: ${trackingData.vaccineName}`, 14, 35); doc.text(`Date Administered: ${new Date(trackingData.vaccineDate).toLocaleDateString('en-US')}`, 14, 42); const tableData = trackingData.logs.slice().sort((a,b) => new Date(a.date) - new Date(b.date)).map(log => { const dayAfter = Math.round((new Date(log.date) - new Date(trackingData.vaccineDate)) / (1000 * 60 * 60 * 24)); return [ `Day ${dayAfter}`, new Date(log.date).toLocaleDateString('en-US'), `${log.severity}/5`, log.symptoms.join(', ') || 'None' ]; }); doc.autoTable({ startY: 50, head: [['Day', 'Date', 'Overall Feeling', 'Symptoms']], body: tableData, theme: 'grid', headStyles: { fillColor: '#0ea5e9' } }); doc.save(`${trackingData.vaccineName}_Symptom_Report.pdf`); }; const addEventListeners = () => { setupForm.addEventListener('submit', handleSetup); logForm.addEventListener('submit', handleLogSubmit); downloadPdfBtn.addEventListener('click', handlePdfDownload); }; init(); logDateInput.valueAsDate = new Date(); });
Scroll to Top