js1234715's picture
set up the site such that it can fetch data and other things from yahoo finance on python. then it can pipe that into the site
3a5e5e0 verified
Raw
History Blame Contribute Delete
4.67 kB
document.addEventListener('DOMContentLoaded', function() {
// DOM Elements
const tickerInput = document.getElementById('tickerInput');
const searchBtn = document.getElementById('searchBtn');
const stockTitle = document.getElementById('stockTitle');
const currentPriceEl = document.getElementById('currentPrice');
const dailyChangeEl = document.getElementById('dailyChange');
const marketCapEl = document.getElementById('marketCap');
const loadingIndicator = document.getElementById('loadingIndicator');
const timeButtons = document.querySelectorAll('.time-btn');
// Chart setup
const ctx = document.getElementById('stockChart').getContext('2d');
let stockChart = new Chart(ctx, {
type: 'line',
data: {
labels: [],
datasets: [{
label: 'Price',
data: [],
borderColor: '#6366F1',
backgroundColor: 'rgba(99, 102, 241, 0.1)',
borderWidth: 2,
tension: 0.1,
fill: true
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false
}
},
scales: {
y: {
beginAtZero: false,
grid: {
color: 'rgba(0, 0, 0, 0.05)'
}
},
x: {
grid: {
display: false
}
}
}
}
});
// Event Listeners
searchBtn.addEventListener('click', fetchStockData);
tickerInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') fetchStockData();
});
// Time frame buttons
timeButtons.forEach(btn => {
btn.addEventListener('click', function() {
timeButtons.forEach(b => b.classList.remove('bg-primary', 'text-white'));
this.classList.add('bg-primary', 'text-white');
fetchStockData(this.dataset.time);
});
});
// Default to 1 month view
timeButtons[2].click();
// Fetch stock data
async function fetchStockData(timeFrame = '1m') {
const ticker = tickerInput.value.trim().toUpperCase();
if (!ticker) {
alert('Please enter a stock symbol');
return;
}
loadingIndicator.classList.remove('hidden');
try {
const response = await fetch(`http://localhost:5000/api/stock?ticker=${ticker}&time_frame=${timeFrame}`);
const data = await response.json();
if (data.error) {
throw new Error(data.error);
}
// Process data
const dates = data.history.dates;
const prices = data.history.prices;
// Update chart
stockChart.data.labels = dates;
stockChart.data.datasets[0].data = prices;
stockChart.update();
// Update stock info
const lastPrice = data.current_price;
const change = data.change_percent;
const marketCap = data.market_cap;
const currency = data.currency;
stockTitle.textContent = `${ticker} Stock`;
currentPriceEl.textContent = `${currency}${lastPrice.toFixed(2)}`;
dailyChangeEl.textContent = `${change.toFixed(2)}%`;
if (change >= 0) {
dailyChangeEl.classList.add('price-up');
dailyChangeEl.classList.remove('price-down');
} else {
dailyChangeEl.classList.add('price-down');
dailyChangeEl.classList.remove('price-up');
}
// Format market cap
let marketCapStr;
if (marketCap >= 1e12) {
marketCapStr = `${(marketCap / 1e12).toFixed(2)}T`;
} else if (marketCap >= 1e9) {
marketCapStr = `${(marketCap / 1e9).toFixed(2)}B`;
} else if (marketCap >= 1e6) {
marketCapStr = `${(marketCap / 1e6).toFixed(2)}M`;
} else {
marketCapStr = `${marketCap.toFixed(2)}`;
}
marketCapEl.textContent = `${currency}${marketCapStr}`;
} catch (error) {
console.error('Error fetching stock data:', error);
alert('Error fetching stock data. Please try again.');
} finally {
loadingIndicator.classList.add('hidden');
}
}
});