"use client"; import { useRouter, usePathname, useSearchParams } from "next/navigation"; import { PendingLink } from "@/components/ui/pending-link"; import { Badge, Card, CardContent } from "poyraz-ui/atoms"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "poyraz-ui/molecules"; import { Bar, BarChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis, Line, LineChart } from "recharts"; import { CheckCircle2, Wallet, FolderKanban, Activity, Users } from "lucide-react"; export type DashboardData = { metrics: { netProfit: number; activeProjectsCount: number; completedTasksCount: number; avgMood: string; financeTrend: { date: string; income: number; expense: number }[]; moodTrend: { date: string; mood: number; energy: number }[]; }; projects: { id: string; status: string; name: string; created_at: string }[]; clients: { id: string; name: string; company_name: string; created_at: string }[]; range: string; }; type DashboardClientProps = { data: DashboardData; }; export function DashboardClient({ data }: DashboardClientProps) { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); const handleRangeChange = (newRange: string) => { const params = new URLSearchParams(searchParams.toString()); params.set("range", newRange); router.push(`${pathname}?${params.toString()}`); }; const { netProfit, activeProjectsCount, completedTasksCount, avgMood, financeTrend, moodTrend } = data.metrics; // Format dates for Recharts using local timezone const incomeTrendData = (financeTrend || []).map(f => ({ name: new Date(f.date).toLocaleDateString("tr-TR", { month: "short", day: "numeric" }), income: f.income, expense: f.expense })); const moodTrendData = (moodTrend || []).map(l => ({ date: new Date(l.date).toLocaleDateString("tr-TR", { month: "short", day: "numeric" }), mood: l.mood, energy: l.energy, })); // Format currency const formatCurrency = (val: number) => { return new Intl.NumberFormat("tr-TR", { style: "currency", currency: "USD", maximumFractionDigits: 0, }).format(val); }; return (
{/* Header */}

Dashboard

İş performansını, gelirlerini ve günlük durumunu takip et.

{/* KPI Cards */}
{/* Charts */}

Gelir / Gider Özeti

{incomeTrendData.length > 0 ? ( { if (active && payload && payload.length) { return (

{label}

{payload.map((entry: any, index: number) => (
{entry.name === 'income' ? 'Gelir' : 'Gider'}
{formatCurrency(entry.value)}
))}
); } return null; }} /> ) : (
Bu tarih aralığında finansal veri yok.
)}

Mood & Enerji Trendi

{moodTrendData.length > 0 ? ( ) : (
Bu tarih aralığında günlük verisi yok.
)}
{/* Recent Items */}
{/* Recent Projects */}

Son Eklenen Projeler

{(data.projects || []).slice(0, 5).map((project) => (

{project.name}

{new Date(project.created_at).toLocaleDateString("tr-TR", { month: "short", day: "numeric" })}

{project.status === 'completed' ? 'Tamamlandı' : project.status === 'active' ? 'Aktif' : 'Beklemede'}
))} {data.projects.length === 0 && (
Henüz proje yok.
)}
{/* Recent Clients */}

Son Eklenen Müşteriler

{(data.clients || []).length > 0 ? (data.clients || []).map((client) => (
{client.name.charAt(0).toUpperCase()}

{client.name}

{client.company_name || "Bireysel"}

{new Date(client.created_at).toLocaleDateString("tr-TR", { month: "short", day: "numeric" })}
)) : (
Henüz müşteri yok.
)}
); } function StatCard({ label, value, icon: Icon, tone, }: { label: string; value: string; icon: typeof FolderKanban; tone: "green" | "blue" | "amber" | "red"; }) { const toneClass = { green: "bg-emerald-50 text-emerald-700", blue: "bg-blue-50 text-blue-700", amber: "bg-amber-50 text-amber-700", red: "bg-primary/10 text-primary", }[tone]; return (

{label}

{value}

); }