class InteractiveChart extends HTMLElement {
connectedCallback() {
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
`;
this.initializeChart();
}
initializeChart() {
const chartData = [
{ date: "2024-04-01", desktop: 222, mobile: 150 },
{ date: "2024-04-02", desktop: 97, mobile: 180 },
// ... (rest of the data from the React component)
{ date: "2024-06-30", desktop: 446, mobile: 400 }
];
const timeRangeSelect = this.shadowRoot.getElementById('timeRange');
timeRangeSelect.addEventListener('change', () => {
this.updateChart(chartData, timeRangeSelect.value);
});
this.updateChart(chartData, '90d');
}
updateChart(data, timeRange) {
const filteredData = data.filter((item) => {
const date = new Date(item.date);
const referenceDate = new Date("2024-06-30");
let daysToSubtract = 90;
if (timeRange === "30d") {
daysToSubtract = 30;
} else if (timeRange === "7d") {
daysToSubtract = 7;
}
const startDate = new Date(referenceDate);
startDate.setDate(startDate.getDate() - daysToSubtract);
return date >= startDate;
});
const chartContainer = this.shadowRoot.getElementById('chart');
chartContainer.innerHTML = '';
const chart = new Recharts.AreaChart({
width: chartContainer.clientWidth,
height: 300,
data: filteredData,
margin: { top: 10, right: 30, left: 0, bottom: 0 },
});
chart.append(new Recharts.CartesianGrid({ strokeDasharray: '3 3', vertical: false }));
chart.append(new Recharts.XAxis({
dataKey: 'date',
tickFormatter: (value) => {
const date = new Date(value);
return date.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric'
});
}
}));
chart.append(new Recharts.YAxis());
chart.append(new Recharts.Tooltip());
// Desktop area
chart.append(new Recharts.Area({
dataKey: 'desktop',
type: 'natural',
stroke: '#3b82f6',
fill: '#93c5fd',
strokeWidth: 2
}));
// Mobile area
chart.append(new Recharts.Area({
dataKey: 'mobile',
type: 'natural',
stroke: '#10b981',
fill: '#6ee7b7',
strokeWidth: 2
}));
chartContainer.appendChild(chart);
}
}
customElements.define('interactive-chart', InteractiveChart);