import { faker } from "@faker-js/faker" import { Meta, StoryObj } from "@storybook/react" import { addHours } from "date-fns" import { list } from "radash" import React from "react" import { useDateTimeFormatter } from "../../../hooks" import { Text } from "../../Text" import { ChartPanel } from "../ChartPanel" import { RenderTooltipFn } from "../ChartTooltip" import { Scatterplot, ScatterplotProps } from "./Scatterplot" faker.seed(123456789) const SECONDS_IN_WEEK = 604800 const getRandomScatterplotData = (count = 1000) => { const date = faker.date.anytime({ refDate: new Date(2024, 1, 1) }) return list(count - 1).flatMap(x => ({ x: addHours(date, x + faker.number.float()).getTime(), y: faker.number.float() ** 3 * 50 + 20, })) } type Story = StoryObj> const RenderTooltip: RenderTooltipFn = ({ item: d, point }) => { const formatDate = useDateTimeFormatter() return (
{formatDate(new Date(d.x))} {point.series.name} {d.y.toFixed(2)}
) } const meta: Meta> = { title: "Design System/Scatterplot", component: Scatterplot, args: { className: "h-[600px]", series: [ { data: getRandomScatterplotData(), getX: (d: DataPoint) => d.x, getY: (d: DataPoint) => d.y, name: "Blue", }, ], renderTooltip: RenderTooltip, overrides: { xAxis: { tickInterval: SECONDS_IN_WEEK * 1000, }, }, }, } export default meta type DataPoint = { x: number y: number } export const RandomPoints: Story = { args: { series: [ { data: getRandomScatterplotData(), getX: (d: DataPoint) => d.x, getY: (d: DataPoint) => d.y, name: "Blue", }, ], renderTooltip: RenderTooltip, overrides: { xAxis: { tickInterval: SECONDS_IN_WEEK * 1000, }, }, }, } export const TwoSeries: Story = { args: { series: [ { data: getRandomScatterplotData(), getX: (d: DataPoint) => d.x, getY: (d: DataPoint) => d.y, name: "Blue", }, { data: getRandomScatterplotData(), getX: (d: DataPoint) => d.x, getY: (d: DataPoint) => d.y, name: "Yellow", }, ], renderTooltip: RenderTooltip, overrides: { xAxis: { tickInterval: SECONDS_IN_WEEK * 1000, }, }, }, } export const Interactive: Story = { args: { interactive: true, }, } export const OneHundredThousandPoints: Story = { args: { series: [ { data: getRandomScatterplotData(100_000), getX: (d: DataPoint) => d.x, getY: (d: DataPoint) => d.y, name: "Blue", marker: { radius: 1, }, }, ], interactive: true, }, } const PanelTemplate = (args: ScatterplotProps) => { return ( Scatterplot ) } export const WithPanel: Story = { render: PanelTemplate, args: { interactive: true }, } export const WithAxisTitles: Story = { render: PanelTemplate, args: { interactive: true, xAxisTitle: "Time", yAxisTitle: "Price (ETH)", }, } export const Skeleton: Story = { render: function Render() { return ( Scatterplot ) }, } export const EmptyState: Story = { render: function Render() { return ( Scatterplot ) }, }