import React from 'react'; import { BarChart3, TrendingUp, ArrowUpRight, ArrowDownRight, Globe, Monitor, Smartphone, Calendar } from 'lucide-react'; import { db } from '@/lib/db'; import { format, subDays } from 'date-fns'; import { tr } from 'date-fns/locale'; import AnalyticsBarChart from '@/components/admin/AnalyticsBarChart'; import QueryRangeSelector from '@/components/admin/QueryRangeSelector'; async function getAnalyticsData(rangeDays: number = 12) { const result = await db.query('SELECT * FROM transactions ORDER BY created_at ASC'); const transactions = result.rows; if (!transactions) return null; const successfulTransactions = transactions.filter(t => t.status === 'succeeded'); const totalRevenue = successfulTransactions.reduce((acc, t) => acc + Number(t.amount), 0); const avgOrderValue = successfulTransactions.length > 0 ? totalRevenue / successfulTransactions.length : 0; // Monthly data for chart (grouped by month or last N periods) const lastPeriods = Array.from({ length: rangeDays }, (_, i) => { const d = subDays(new Date(), (rangeDays - 1) - i); return { date: d.toISOString().split('T')[0], label: format(d, 'd MMM', { locale: tr }), amount: 0 }; }); successfulTransactions.forEach(t => { const dateStr = new Date(t.created_at).toISOString().split('T')[0]; const periodMatch = lastPeriods.find(p => p.date === dateStr); if (periodMatch) { periodMatch.amount += Number(t.amount); } }); return { totalRevenue, avgOrderValue, chartData: lastPeriods, totalCount: transactions.length, successCount: successfulTransactions.length, }; } export default async function AnalyticsPage(props: { searchParams: Promise<{ range?: string }>; }) { const searchParams = await props.searchParams; const range = searchParams.range ? parseInt(searchParams.range) : 12; const data = await getAnalyticsData(range); if (!data) return
Veriler hazırlanıyor...
; const metrics = [ { label: 'Dönüşüm Oranı', value: '3.24%', trend: '+0.8%', positive: true }, // Mocked for now { label: 'Ort. Sipariş Tutarı', value: `${data.avgOrderValue.toLocaleString('tr-TR', { maximumFractionDigits: 2 })} ₺`, trend: '+12%', positive: true }, { label: 'Başarılı İşlem', value: data.successCount.toString(), trend: '+24%', positive: true }, { label: 'İşlem Başarısı', value: `${((data.successCount / (data.totalCount || 1)) * 100).toFixed(1)}%`, trend: '-0.2%', positive: false }, ]; const maxChartAmount = Math.max(...data.chartData.map(d => d.amount), 100); return (
{/* Header */}

Analizler

Sistem performans verileri

{/* Main Metrics */}
{metrics.map((item, i) => (

{item.label}

{item.value}

{item.positive ? : } {item.trend}
))}
{/* Charts Grid */}
{/* Performance Chart */}

Ciro Trendi (12 Gün)

Gerçekleşen
{/* Breakdown Grid */}

Cihaz Dağılımı

{[ { label: 'Mobil', value: '64%', icon: Smartphone, color: 'bg-blue-600', width: '64%' }, { label: 'Masaüstü', value: '28%', icon: Monitor, color: 'bg-indigo-400', width: '28%' }, { label: 'Tablet', value: '8%', icon: Globe, color: 'bg-indigo-100', width: '8%' }, ].map((item, i) => (
{item.label}
{item.value}
))}

Analizleriniz hazır!
Bu ay başarılı bir grafik çiziyorsunuz.

); }