/ frontend / src / pages / AnalyticsPage.tsx
AnalyticsPage.tsx
 1  import { useState } from 'react'
 2  import type { Chain } from '../types/vote'
 3  import type { TimeRange } from '../types/analytics'
 4  import AnalyticsDashboard from '../components/analytics/AnalyticsDashboard'
 5  
 6  const TIME_RANGES: { value: TimeRange; label: string }[] = [
 7    { value: '24h', label: '24 Hours' },
 8    { value: '7d', label: '7 Days' },
 9    { value: '30d', label: '30 Days' },
10    { value: '90d', label: '90 Days' },
11  ]
12  
13  export default function AnalyticsPage() {
14    const [selectedChain, setSelectedChain] = useState<Chain | 'all'>('all')
15    const [timeRange, setTimeRange] = useState<TimeRange>('30d')
16  
17    return (
18      <div>
19        {/* Header */}
20        <div className="flex items-center justify-between mb-6">
21          <div>
22            <h1 className="text-2xl font-bold">Analytics</h1>
23            <p className="text-gray-600 text-sm mt-1">
24              Monitor governance activity, votes, and system health
25            </p>
26          </div>
27  
28          <div className="flex items-center gap-4">
29            {/* Time Range Selector */}
30            <div className="flex bg-gray-100 rounded-lg p-1">
31              {TIME_RANGES.map(({ value, label }) => (
32                <button
33                  key={value}
34                  onClick={() => setTimeRange(value)}
35                  className={`px-3 py-1.5 rounded-md text-sm ${
36                    timeRange === value
37                      ? 'bg-white shadow text-gray-900 font-medium'
38                      : 'text-gray-600 hover:text-gray-900'
39                  }`}
40                >
41                  {label}
42                </button>
43              ))}
44            </div>
45  
46            {/* Chain Selector */}
47            <select
48              value={selectedChain}
49              onChange={(e) => setSelectedChain(e.target.value as Chain | 'all')}
50              className="px-3 py-2 border rounded-lg text-sm"
51            >
52              <option value="all">Both Chains</option>
53              <option value="alpha">Alpha Chain</option>
54              <option value="delta">Delta Chain</option>
55            </select>
56          </div>
57        </div>
58  
59        {/* Dashboard */}
60        {selectedChain === 'all' ? (
61          <div className="space-y-8">
62            <div>
63              <h2 className="text-lg font-semibold mb-4 flex items-center gap-2">
64                <div className="w-3 h-3 rounded-full bg-purple-500" />
65                Alpha Chain
66              </h2>
67              <AnalyticsDashboard chain="alpha" timeRange={timeRange} />
68            </div>
69  
70            <div className="border-t pt-8">
71              <h2 className="text-lg font-semibold mb-4 flex items-center gap-2">
72                <div className="w-3 h-3 rounded-full bg-green-500" />
73                Delta Chain
74              </h2>
75              <AnalyticsDashboard chain="delta" timeRange={timeRange} />
76            </div>
77          </div>
78        ) : (
79          <AnalyticsDashboard chain={selectedChain} timeRange={timeRange} />
80        )}
81  
82        {/* Export Options */}
83        <div className="mt-8 flex items-center justify-between border-t pt-6">
84          <p className="text-sm text-gray-500">
85            Data is aggregated from on-chain events and cached for performance.
86          </p>
87          <div className="flex items-center gap-2">
88            <button className="px-3 py-1.5 border rounded text-sm hover:bg-gray-50">
89              Export CSV
90            </button>
91            <button className="px-3 py-1.5 border rounded text-sm hover:bg-gray-50">
92              Export JSON
93            </button>
94          </div>
95        </div>
96      </div>
97    )
98  }