"use client"; import { addDays, differenceInDays, format as formatDate, startOfDay, subDays, } from "date-fns"; import { faIR } from "date-fns/locale"; import { CalendarIcon } from "lucide-react"; import { useMemo, useState } from "react"; import type { DateRange } from "react-day-picker"; import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; interface ChartGroup11Props { className?: string; } const seededRandom = (seed: number) => { const x = Math.sin(seed) * 10000; return x - Math.floor(x); }; const currencyFormatter = new Intl.NumberFormat("fa-IR", { style: "currency", currency: "IRR", minimumFractionDigits: 0, maximumFractionDigits: 0, }); const compactCurrencyFormatter = new Intl.NumberFormat("fa-IR", { style: "currency", currency: "IRR", notation: "compact", minimumFractionDigits: 0, maximumFractionDigits: 1, }); const numberFormatter = new Intl.NumberFormat("fa-IR", { maximumFractionDigits: 0, }); const generateDataForRange = (from: Date, to: Date) => { const data = []; const days = differenceInDays(to, from) + 1; for (let i = 0; i < days; i++) { const date = addDays(startOfDay(from), i); const seed = date.getTime() / 86400000; data.push({ date: date, dateStr: formatDate(date, "d MMM", { locale: faIR }), revenue: Math.floor(seededRandom(seed) * 5000) + 2000, orders: Math.floor(seededRandom(seed + 1000) * 50) + 20, }); } return data; }; const chartConfig = { revenue: { label: "درآمد", color: "var(--chart-1)" }, } satisfies ChartConfig; const ChartGroup11 = ({ className }: ChartGroup11Props) => { const [dateRange, setDateRange] = useState({ from: subDays(new Date(), 30), to: new Date(), }); const filteredData = useMemo(() => { const from = dateRange?.from ?? subDays(new Date(), 30); const to = dateRange?.to ?? new Date(); return generateDataForRange(from, to); }, [dateRange]); const totalRevenue = filteredData.reduce( (sum, item) => sum + item.revenue, 0, ); const totalOrders = filteredData.reduce((sum, item) => sum + item.orders, 0); const avgOrderValue = totalOrders > 0 ? Math.round(totalRevenue / totalOrders) : 0; return (
تحلیل درآمد پیگیری عملکرد درآمد در طول زمان

مجموع درآمد

{currencyFormatter.format(totalRevenue)}

مجموع سفارش‌ها

{numberFormatter.format(totalOrders)}

میانگین ارزش سفارش

{currencyFormatter.format(avgOrderValue)}

compactCurrencyFormatter.format(Number(v)) } /> currencyFormatter.format(Number(value)) } /> } cursor={{ stroke: "var(--border)", strokeDasharray: "4 4" }} />
); }; export { ChartGroup11 };