"use client" import * as React from "react" import { Label, Pie, PieChart, Sector } from "recharts" import type { PieSectorDataItem, PieSectorShapeProps, } from "recharts/types/polar/Pie" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/registry/new-york-v4/ui/card" import { ChartContainer, ChartStyle, ChartTooltip, ChartTooltipContent, type ChartConfig, } from "@/registry/new-york-v4/ui/chart" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/registry/new-york-v4/ui/select" export const description = "An interactive pie chart" const desktopData = [ { month: "january", desktop: 186, fill: "var(--color-january)" }, { month: "february", desktop: 305, fill: "var(--color-february)" }, { month: "march", desktop: 237, fill: "var(--color-march)" }, { month: "april", desktop: 173, fill: "var(--color-april)" }, { month: "may", desktop: 209, fill: "var(--color-may)" }, ] const chartConfig = { visitors: { label: "Visitors", }, desktop: { label: "Desktop", }, mobile: { label: "Mobile", }, january: { label: "January", color: "var(--chart-1)", }, february: { label: "February", color: "var(--chart-2)", }, march: { label: "March", color: "var(--chart-3)", }, april: { label: "April", color: "var(--chart-4)", }, may: { label: "May", color: "var(--chart-5)", }, } satisfies ChartConfig export function ChartPieInteractive() { const id = "pie-interactive" const [activeMonth, setActiveMonth] = React.useState(desktopData[0].month) const activeIndex = React.useMemo( () => desktopData.findIndex((item) => item.month === activeMonth), [activeMonth] ) const months = React.useMemo(() => desktopData.map((item) => item.month), []) const renderPieShape = React.useCallback( ({ index, outerRadius = 0, ...props }: PieSectorShapeProps) => { if (index === activeIndex) { return ( ) } return }, [activeIndex] ) return ( Pie Chart - Interactive January - June 2024 {months.map((key) => { const config = chartConfig[key as keyof typeof chartConfig] if (!config) { return null } return ( {config?.label} ) })} } /> { if (viewBox && "cx" in viewBox && "cy" in viewBox) { return ( {desktopData[activeIndex].desktop.toLocaleString()} Visitors ) } }} /> ) }