Files
marmarislocal/app/[locale]/admin/page.tsx
T
2026-07-12 20:18:55 +03:00

127 lines
5.8 KiB
TypeScript

import { auth } from '@/lib/auth'
import { mockDb } from '@/lib/mockDb'
import { Link } from '@/i18n/routing'
import { FileText, Inbox, ClipboardList, Map, Clock } from 'lucide-react'
export default async function AdminDashboardPage() {
const session = await auth()
// Load stats
const listings = await mockDb.getListings()
const submissions = await mockDb.getSubmissions()
const messages = await mockDb.getMessages()
const categories = await mockDb.getCategories()
const neighborhoods = await mockDb.getNeighborhoods()
const pendingSubmissions = submissions.filter(s => s.status === 'PENDING')
const unreadMessages = messages.filter(m => !m.isRead)
const stats = [
{ name: 'Toplam Mekan', stat: listings.length.toString(), icon: ClipboardList, color: 'text-pine bg-stone-deep border-pine/8' },
{ name: 'Bekleyen Başvuru', stat: pendingSubmissions.length.toString(), icon: FileText, color: 'text-gold bg-paper border-gold/15' },
{ name: 'Okunmamış Mesaj', stat: unreadMessages.length.toString(), icon: Inbox, color: 'text-turquoise bg-stone-deep border-turquoise/15' },
{ name: 'Kategori / Bölge', stat: `${categories.length} / ${neighborhoods.length}`, icon: Map, color: 'text-shutter bg-paper border-shutter/15' },
]
return (
<div className="space-y-8">
<div>
<h2 className="text-3xl font-heading font-extrabold text-pine lowercase">dashboard</h2>
<p className="text-ink/65 text-xs font-medium mt-1">
Hoş geldiniz, {session?.user?.name || session?.user?.email}. Marmaris Local için genel rehber durumu.
</p>
</div>
{/* Stats grid */}
<div className="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4">
{stats.map((item) => (
<div
key={item.name}
className="bg-paper rounded-2xl border border-pine/8 p-5 shadow-sm flex items-center gap-4 hover:border-turquoise/30 transition-all duration-300"
>
<div className={`p-3.5 rounded-xl border ${item.color}`}>
<item.icon className="h-5 w-5" />
</div>
<div>
<dt className="truncate text-[10px] font-mono uppercase tracking-wider text-shutter">{item.name}</dt>
<dd className="mt-1 text-2xl font-heading font-extrabold text-pine">
{item.stat}
</dd>
</div>
</div>
))}
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* Recent Submissions */}
<div className="bg-paper border border-pine/8 rounded-2xl shadow-sm p-6 sm:p-8 space-y-6">
<div className="flex items-center justify-between border-b border-dashed border-pine/8 pb-4">
<h3 className="text-lg font-heading font-bold text-pine lowercase flex items-center gap-2">
<Clock className="w-5 h-5 text-gold" />
onay bekleyen başvurular
</h3>
<Link href="/admin/submissions" className="text-xs font-mono font-bold text-turquoise hover:underline uppercase tracking-wide">
tümünü gör
</Link>
</div>
<div className="divide-y divide-dashed divide-pine/8">
{pendingSubmissions.length === 0 ? (
<div className="py-8 text-center text-xs text-shutter font-medium">
Onay bekleyen yeni işletme başvurusu bulunmuyor.
</div>
) : (
pendingSubmissions.slice(0, 5).map((sub) => (
<div key={sub.id} className="py-4 flex items-center justify-between first:pt-0 last:pb-0">
<div className="space-y-1">
<h4 className="font-heading font-bold text-sm text-pine lowercase">{sub.businessName}</h4>
<p className="text-xs text-ink/65 font-medium">{sub.contactName} ({sub.contactEmail})</p>
</div>
<span className="inline-flex items-center rounded-full bg-paper px-3 py-1 text-[10px] font-mono font-bold text-gold border border-gold/20 uppercase">
Bekliyor
</span>
</div>
))
)}
</div>
</div>
{/* Recent Messages */}
<div className="bg-paper border border-pine/8 rounded-2xl shadow-sm p-6 sm:p-8 space-y-6">
<div className="flex items-center justify-between border-b border-dashed border-pine/8 pb-4">
<h3 className="text-lg font-heading font-bold text-pine lowercase flex items-center gap-2">
<Inbox className="w-5 h-5 text-turquoise" />
okunmamış mesajlar
</h3>
<Link href="/admin/messages" className="text-xs font-mono font-bold text-turquoise hover:underline uppercase tracking-wide">
tümünü gör
</Link>
</div>
<div className="divide-y divide-dashed divide-pine/8">
{unreadMessages.length === 0 ? (
<div className="py-8 text-center text-xs text-shutter font-medium">
Okunmamış yeni mesaj bulunmuyor.
</div>
) : (
unreadMessages.slice(0, 5).map((msg) => (
<div key={msg.id} className="py-4 flex items-center justify-between first:pt-0 last:pb-0">
<div className="space-y-1 pr-4 flex-1">
<h4 className="font-heading font-bold text-sm text-pine lowercase">{msg.name}</h4>
<p className="text-xs text-ink/70 font-medium line-clamp-1">{msg.message}</p>
</div>
<span className="text-[10px] text-shutter font-mono shrink-0">
{new Date(msg.createdAt).toLocaleDateString('tr-TR')}
</span>
</div>
))
)}
</div>
</div>
</div>
</div>
)
}