import * as d3 from 'd3'; export interface Data { date: Date; km: number; } let data = [ { date: new Date('2023-01-01'), km: 5 }, { date: new Date('2023-02-01'), km: 24 }, { date: new Date('2023-08-30'), km: 4000 }, ]; if(sessionStorage.getItem('userStats')) { data = JSON.parse(sessionStorage.getItem('userStats') as Data[]); const margin = { top: 20, right: 20, bottom: 50, left: 50 }; const width: number = 960 - margin.left - margin.right; const height: number = 500 - margin.top - margin.bottom; data.forEach((d: Data) => { d.date = new Date(d.date) d.km = +d.km; }); const x = d3.scaleTime() .domain(<[Date, Date]>d3.extent(data, (d: Data) => d.date)) .range([0, width]); const y = d3.scaleLinear() .domain([0, Number(d3.max(data, (d: Data) => d.km))]) .range([height, 0]); const line = d3.line() .x((d: Data) => x(d.date)) .y((d: Data) => y(d.km)); const svg = d3.select('#container') .append('svg') .attr('width', width + margin.left + margin.right) .attr('height', height + margin.top + margin.bottom) .call(responsivefy) .append('g') .attr('transform', `translate(${margin.left},${margin.top})`); svg.append('path') .data([data]) .attr('class', 'line') .attr('d', line); svg.append('g') .attr('transform', `translate(0,${height})`) .call(d3.axisBottom(x)); svg.append('g') .call(d3.axisLeft(y)); } function responsivefy(svg: any) { const container = d3.select(svg.node().parentNode); const width = parseInt(svg.style('width'), 10); const height = parseInt(svg.style('height'), 10); const aspect = width / height; svg.attr('viewBox', `0 0 ${width} ${height}`) .attr('preserveAspectRatio', 'xMinYMid') .call(resize); d3.select(window).on( 'resize.' + container.attr('id'), resize ); function resize() { const w = parseInt(container.style('width')); svg.attr('width', w); svg.attr('height', Math.round(w / aspect)); } }