import React from 'react'; import { BarChart3, TrendingUp, ArrowUpRight, ArrowDownRight, Globe, Monitor, Smartphone, Calendar } from 'lucide-react'; import { supabaseAdmin } from '@/lib/supabase'; import { format, subDays } from 'date-fns'; import { tr } from 'date-fns/locale'; async function getAnalyticsData() { const { data: transactions, error } = await supabaseAdmin .from('transactions') .select('*') .order('created_at', { ascending: true }); if (error || !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 12 periods) // To keep it simple and meaningful, let's show last 12 days for "Gelir Trendi" const last12Periods = Array.from({ length: 12 }, (_, i) => { const d = subDays(new Date(), 11 - 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 = last12Periods.find(p => p.date === dateStr); if (periodMatch) { periodMatch.amount += Number(t.amount); } }); return { totalRevenue, avgOrderValue, chartData: last12Periods, totalCount: transactions.length, successCount: successfulTransactions.length, }; } export default async function AnalyticsPage() { const data = await getAnalyticsData(); 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
{data.chartData.map((d, i) => { const h = (d.amount / maxChartAmount) * 90 + 5; // 5% to 95% return (
{d.amount.toLocaleString('tr-TR')} ₺
{d.label}
); })}
{/* 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.

); }