'use client'; /** * Composers / Writers Dashboard — Income distribution and trends. * * Displays: * - KPI card: total Composers * - Horizontal bar chart: top 10 Composers by income * - Line chart: Composer count trends over time * - Bar chart: Composers by associated Works count * - Multi-line chart: income per top 5 Composers over time * - DateRangeFilter at the top * * Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7 */ import { useComposersData } from '@/lib/api/queries'; import { useTranslation } from '@/lib/hooks/useTranslation'; import { formatNumber } from '@/lib/utils/format'; import { useCurrencyAxisFormatter } from '@/lib/hooks/useCurrencyFormatter'; import { chartColors, chartColorArray } from '@/lib/constants/theme'; import DateRangeFilter from '@/components/dashboard/DateRangeFilter'; import KpiGrid from '@/components/dashboard/KpiGrid'; import KpiCard from '@/components/dashboard/KpiCard'; import ChartGrid from '@/components/dashboard/ChartGrid'; import ChartCard from '@/components/charts/ChartCard'; import LineChartWidget from '@/components/charts/LineChartWidget'; import BarChartWidget from '@/components/charts/BarChartWidget'; /** * Transform the incomePerTop5OverTime data from per-composer arrays into a * flat array suitable for a multi-line Recharts chart. * * Input shape: * [{ name: "Composer A", data: [{ month: "2024-01", value: 100 }, ...] }, ...] * * Output shape: * [{ month: "2024-01", "Composer A": 100, "Composer B": 200, ... }, ...] */ function transformMultiLineData( series: Array<{ name: string; data: Array<{ month: string; value: number }> }>, ): Array> { const monthMap = new Map>(); for (const composer of series) { for (const point of composer.data) { if (!monthMap.has(point.month)) { monthMap.set(point.month, { month: point.month }); } const row = monthMap.get(point.month)!; row[composer.name] = point.value; } } return Array.from(monthMap.values()).sort((a, b) => (a.month as string).localeCompare(b.month as string), ); } export default function ComposersPage() { const { data, isLoading } = useComposersData(); const t = useTranslation(); const fmtAxis = useCurrencyAxisFormatter(); if (isLoading || !data) { return (

{t.dashboard.loading}

); } const { kpis, topByIncome, countTrends, byWorksCount, incomePerTop5OverTime } = data; // Transform multi-line data for the LineChartWidget const multiLineData = transformMultiLineData(incomePerTop5OverTime); const multiLineConfigs = incomePerTop5OverTime.map((composer, index) => ({ dataKey: composer.name, color: chartColorArray[index % chartColorArray.length], name: composer.name, })); return (
{/* Date Range Filter */} {/* KPI Cards */} {/* Charts */} {/* Horizontal bar chart: top 10 Composers by income */} {/* Line chart: Composer count trends */} {/* Bar chart: by associated Works count */} {/* Multi-line chart: income per top 5 Composers over time */}
); }