let tweets = []; function updateStats() { document.getElementById('active-disasters').textContent = tweets.filter(t => t.isDisaster).length; document.getElementById('urgent-cases').textContent = tweets.filter(t => t.sentiment === 'Urgent').length; document.getElementById('total-tweets').textContent = tweets.length; } function getSentimentClass(sentiment) { switch(sentiment) { case 'Urgent': return 'sentiment-urgent'; case 'Neutral': return 'sentiment-neutral'; case 'Not Urgent': return 'sentiment-not-urgent'; default: return ''; } } function formatTimestamp(timestamp) { return new Date(timestamp).toLocaleTimeString(); } function renderTweets() { const feed = document.getElementById('tweet-feed'); if (tweets.length === 0) { feed.innerHTML = '

No new tweets available. This may be due to rate limiting or no recent disaster-related tweets.

'; } else { feed.innerHTML = tweets.map(tweet => `
${tweet.isDisaster ? 'Disaster Alert' : 'Tweet'} ${tweet.sentiment.toUpperCase()}
${tweet.text}
`).join(''); } } function fetchTweets() { fetch('/api/predict') .then(response => response.json()) .then(data => { if (data.error) { console.error('Error:', data.error); return; } const newTweets = JSON.parse(data.data); tweets = [...newTweets, ...tweets].slice(0, 100); // Keep only the latest 100 tweets updateStats(); renderTweets(); }) .catch(error => console.error('Error:', error)); } // Fetch tweets every 5 minutes (300000 ms) setInterval(fetchTweets, 300000); // Initial fetch fetchTweets();