'use client' import {Tabs, TabsList, TabsTrigger, TabsContent} from '@/components/ui/tabs' import Image from 'next/image' import soon from '../_assets/coming-soon.svg' import DatePicker from '@/components/date-picker' import {Card, CardContent} from '@/components/ui/card' import {Form, FormField} from '@/components/ui/form' import {Input} from '@/components/ui/input' import {zodResolver} from '@hookform/resolvers/zod' import {useForm} from 'react-hook-form' import zod from 'zod' import {merge} from '@/lib/utils' import {Button} from '@/components/ui/button' import {useState} from 'react' import {statisticsResourceUsage} from '@/actions/dashboard' import {ExtraResp} from '@/lib/api' import {toast} from 'sonner' import {addDays, compareAsc, format, subDays} from 'date-fns' import {Label} from '@/components/ui/label' import {ChartConfig, ChartContainer} from '@/components/ui/chart' import {CartesianGrid, XAxis, YAxis, Tooltip, Area, AreaChart, Legend} from 'recharts' type ChartsProps = { initialData?: ExtraResp } export default function Charts({initialData}: ChartsProps) { // const [submittedData, setSubmittedData] = useState>() const [submittedData, setSubmittedData] = useState>(initialData || []) const formSchema = zod.object({ resource_no: zod.string().optional(), create_after: zod.date().optional(), create_before: zod.date().optional(), }) type FormValues = zod.infer const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { }, }) const handler = form.handleSubmit( async (value) => { const today = new Date() const sevenDaysAgo = subDays(today, 7) const res = { resource_no: value.resource_no ?? '', create_after: value.create_after ?? sevenDaysAgo, create_before: value.create_before ?? today, } const resp = await statisticsResourceUsage(res) if (!resp.success) { toast.error('接口请求失败:' + resp.message) return } if (!resp.data || resp.data.length === 0) { toast.info('没有查询到相关数据') setSubmittedData([]) return } const formattedData = resp.data.map(item => ({ ...item, date: item.date, count: item.count, })) formattedData.sort((a, b) => compareAsc(a.date, b.date)) setSubmittedData(formattedData) }, ) return ( 短效动态 长效动态 className={merge(`flex items-end gap-4 flex-wrap`)} handler={handler} form={form} > 套餐编号}> {({field}) => ( )}
{({field}) => ( )} - {({field}) => ( )}
{submittedData && } coming soon

敬请期待

) } const config = { count: { label: `套餐使用量`, color: `var(--color-primary)`, }, } satisfies ChartConfig type DashboardChartProps = { data: ExtraResp } function DashboardChart(props: DashboardChartProps) { const sortedData = [...props.data].sort((a, b) => { return new Date(a.date).getTime() - new Date(b.date).getTime() }) const chartData = sortedData.map((item) => { const date = new Date(item.date.split('T')[0]) return { ...item, formattedTime: format(date, 'MM-dd'), fullDate: format(date, 'yyyy-MM-dd'), } }) return ( `日期: ${chartData.find(item => item.formattedTime === value)?.fullDate || value}`} formatter={value => [`${value}`, '套餐使用量']} /> ) }