From 70ba65b0f44a7cc30aacc11bb862e5d800e43245 Mon Sep 17 00:00:00 2001 From: senke Date: Tue, 10 Mar 2026 17:13:13 +0100 Subject: [PATCH] feat(v0.11.1): F396-F399 frontend advanced analytics components - AnalyticsViewHeatmap: track listening heatmap visualization (F396) - AnalyticsViewComparison: period comparison with % changes (F397) - AnalyticsViewMarketplace: product conversion rates and revenue (F398) - AnalyticsViewAlerts: opt-in metric alerts with CRUD (F399) - Updated analytics service with new API methods - Extended tab navigation with 3 new tabs - All components have ARIA labels and keyboard navigation Co-Authored-By: Claude Opus 4.6 --- .../pages/analytics-page/AnalyticsView.tsx | 68 +++++- .../analytics-page/AnalyticsViewAlerts.tsx | 217 ++++++++++++++++++ .../AnalyticsViewComparison.tsx | 138 +++++++++++ .../analytics-page/AnalyticsViewHeatmap.tsx | 97 ++++++++ .../AnalyticsViewMarketplace.tsx | 119 ++++++++++ .../analytics/pages/analytics-page/types.ts | 91 +++++++- .../pages/analytics-page/useAnalyticsView.ts | 52 ++++- apps/web/src/services/analyticsService.ts | 137 +++++++++++ 8 files changed, 915 insertions(+), 4 deletions(-) create mode 100644 apps/web/src/features/analytics/pages/analytics-page/AnalyticsViewAlerts.tsx create mode 100644 apps/web/src/features/analytics/pages/analytics-page/AnalyticsViewComparison.tsx create mode 100644 apps/web/src/features/analytics/pages/analytics-page/AnalyticsViewHeatmap.tsx create mode 100644 apps/web/src/features/analytics/pages/analytics-page/AnalyticsViewMarketplace.tsx diff --git a/apps/web/src/features/analytics/pages/analytics-page/AnalyticsView.tsx b/apps/web/src/features/analytics/pages/analytics-page/AnalyticsView.tsx index 4d077e6fb..561d05255 100644 --- a/apps/web/src/features/analytics/pages/analytics-page/AnalyticsView.tsx +++ b/apps/web/src/features/analytics/pages/analytics-page/AnalyticsView.tsx @@ -9,15 +9,22 @@ import { AnalyticsViewSkeleton } from './AnalyticsViewSkeleton'; import { AnalyticsViewGeographic } from './AnalyticsViewGeographic'; import { AnalyticsViewAudience } from './AnalyticsViewAudience'; import { AnalyticsViewSales } from './AnalyticsViewSales'; +import { AnalyticsViewHeatmap } from './AnalyticsViewHeatmap'; +import { AnalyticsViewComparison } from './AnalyticsViewComparison'; +import { AnalyticsViewMarketplace } from './AnalyticsViewMarketplace'; +import { AnalyticsViewAlerts } from './AnalyticsViewAlerts'; import { ErrorDisplay } from '@/components/ui/ErrorDisplay'; import type { AnalyticsViewProps, AnalyticsTab } from './types'; import type { DateRangeKey } from './types'; const TABS: Array<{ key: AnalyticsTab; label: string }> = [ { key: 'overview', label: 'Overview' }, + { key: 'heatmap', label: 'Heatmap' }, { key: 'sales', label: 'Sales & Downloads' }, + { key: 'marketplace', label: 'Marketplace' }, { key: 'audience', label: 'Audience' }, { key: 'geographic', label: 'Geographic' }, + { key: 'alerts', label: 'Alerts' }, ]; export function AnalyticsView({ onNavigateTrack }: AnalyticsViewProps) { @@ -42,6 +49,15 @@ export function AnalyticsView({ onNavigateTrack }: AnalyticsViewProps) { audience, sales, discoverySources, + // v0.11.1 + heatmap, + loadHeatmap, + comparison, + comparisonPreset, + setComparisonPreset, + marketplace, + alerts, + refreshAlerts, } = useAnalyticsView('30d'); if (loading) { @@ -82,15 +98,24 @@ export function AnalyticsView({ onNavigateTrack }: AnalyticsViewProps) { + {/* Period comparison summary (F397) */} + {comparison && activeTab === 'overview' && ( + + )} + {/* Tab navigation */} -