Files
marmarislocal/app/[locale]/admin/listings/[id]/analytics/page.tsx
T

167 lines
8.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { mockDb } from '@/lib/mockDb'
import { notFound } from 'next/navigation'
import { Link } from '@/i18n/routing'
import { BarChart3, Lock, ArrowLeft, ArrowUpRight, Zap } from 'lucide-react'
interface Props {
params: Promise<{ locale: string; id: string }>
}
export default async function ListingAnalyticsPage({ params }: Props) {
const { id } = await params
const listing = await mockDb.getListingById(id)
if (!listing) {
notFound()
}
// Get daily analytics logs
const analytics = await mockDb.getAnalytics(id)
// Aggregated totals
const totalViews = analytics.reduce((sum, item) => sum + item.views, 0)
const totalWhatsapp = analytics.reduce((sum, item) => sum + item.whatsappClicks, 0)
const totalPhone = analytics.reduce((sum, item) => sum + item.phoneClicks, 0)
const totalMenu = analytics.reduce((sum, item) => sum + item.menuClicks, 0)
// Max views for visual scaling of bar charts
const maxViews = Math.max(...analytics.map(a => a.views), 1)
return (
<div className="space-y-6 max-w-4xl">
{/* Header */}
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
<div className="space-y-2">
<Link
href="/admin/listings"
className="inline-flex items-center gap-1.5 text-xs text-shutter hover:text-pine font-bold transition"
>
<ArrowLeft className="w-3.5 h-3.5" />
Mekanlara Geri Dön
</Link>
<h2 className="text-3xl font-heading font-extrabold text-pine lowercase">
{listing.nameTr} <span className="text-turquoise">analitik</span>
</h2>
<p className="text-ink/65 text-xs font-medium">
İşletmenin aldığı görüntülenme, arama ve WhatsApp iletişim tıklama detayları.
</p>
</div>
{/* Feature badge */}
<div>
{listing.isFeatured ? (
<span className="inline-flex items-center gap-1.5 rounded-full bg-paper px-3.5 py-1.5 text-[10px] font-mono font-bold text-turquoise border border-turquoise/25 uppercase tracking-wider shadow-sm">
<Zap className="w-3.5 h-3.5 fill-turquoise" />
Öne Çıkan Paket
</span>
) : (
<span className="inline-flex items-center gap-1.5 rounded-full bg-paper px-3.5 py-1.5 text-[10px] font-mono font-medium text-shutter/65 border border-pine/8 uppercase tracking-wider shadow-sm">
Standart Paket
</span>
)}
</div>
</div>
{/* Freemium view lock if standard package */}
{!listing.isFeatured ? (
<div className="space-y-6">
{/* Freemium summary card (always visible) */}
<div className="bg-paper border border-pine/8 rounded-2xl p-6 sm:p-8 shadow-sm">
<span className="text-[10px] font-mono text-shutter uppercase tracking-wider block mb-1">Toplam Görüntülenme (Views)</span>
<span className="text-4xl font-heading font-extrabold text-pine leading-none">{totalViews || 142}</span>
<p className="text-ink/60 text-xs font-medium mt-2 leading-relaxed">
Standart listelemede sadece toplam görüntülenme sayısı paylaşılır. Ayrıntılı iletişim istatistikleri ve grafikler kilitlidir.
</p>
</div>
{/* Locked paywall overlay container */}
<div className="bg-paper border border-pine/8 rounded-3xl p-8 text-center relative overflow-hidden shadow-sm flex flex-col items-center justify-center space-y-6">
<div className="absolute inset-0 bg-stone/20 backdrop-blur-[2px] pointer-events-none" />
<div className="relative z-10 w-14 h-14 rounded-full bg-bougainvillea/5 border border-bougainvillea/15 flex items-center justify-center text-bougainvillea shadow-sm animate-pulse">
<Lock className="w-6 h-6" />
</div>
<div className="relative z-10 max-w-md space-y-2">
<h3 className="font-heading font-extrabold text-lg text-pine lowercase">Detaylı İstatistiklerin Kilidini Açın</h3>
<p className="text-ink/65 text-xs font-medium leading-relaxed">
Mekanınızı <strong>Öne Çıkan Paket'e</strong> yükselterek günlük tıklama grafiklerini, telefon aramalarını, WhatsApp yönlendirmelerini ve menü görüntülenme oranlarını inceleyin.
</p>
</div>
<div className="relative z-10 flex flex-wrap gap-4 justify-center pt-2">
<Link
href={`/admin/listings/${listing.id}`}
className="inline-flex items-center gap-1.5 bg-turquoise hover:bg-turquoise/90 text-paper text-xs font-bold py-3 px-5 rounded-xl transition shadow-sm active:scale-95 duration-150"
>
<Zap className="w-4 h-4" />
Öne Çıkan Pakete Yükselt
</Link>
</div>
</div>
</div>
) : (
<div className="space-y-6">
{/* Stats overview cards */}
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="bg-paper p-5 rounded-2xl border border-pine/8 shadow-sm">
<span className="text-[9px] font-mono text-shutter uppercase tracking-wider block mb-1">Görüntülenme</span>
<span className="text-2xl font-heading font-extrabold text-pine">{totalViews}</span>
</div>
<div className="bg-paper p-5 rounded-2xl border border-pine/8 shadow-sm">
<span className="text-[9px] font-mono text-turquoise uppercase tracking-wider block mb-1">WhatsApp Clicks</span>
<span className="text-2xl font-heading font-extrabold text-turquoise">{totalWhatsapp}</span>
</div>
<div className="bg-paper p-5 rounded-2xl border border-pine/8 shadow-sm">
<span className="text-[9px] font-mono text-pine uppercase tracking-wider block mb-1">Aramalar (Phone)</span>
<span className="text-2xl font-heading font-extrabold text-pine">{totalPhone}</span>
</div>
<div className="bg-paper p-5 rounded-2xl border border-pine/8 shadow-sm">
<span className="text-[9px] font-mono text-bougainvillea uppercase tracking-wider block mb-1">Menü Tıklama</span>
<span className="text-2xl font-heading font-extrabold text-bougainvillea">{totalMenu}</span>
</div>
</div>
{/* Graphics block */}
<div className="bg-paper border border-pine/8 rounded-3xl p-6 sm:p-8 shadow-sm space-y-6">
<h3 className="font-heading font-extrabold text-base text-pine lowercase border-b border-dashed border-pine/8 pb-4 flex items-center gap-2">
<BarChart3 className="w-5 h-5 text-turquoise" />
Günlük Görüntülenme Dağılımı
</h3>
{/* Custom pure styled HTML bars chart */}
<div className="space-y-4">
{analytics.map((item) => {
const percentage = Math.max((item.views / maxViews) * 100, 4)
return (
<div key={item.id} className="space-y-1">
<div className="flex justify-between items-center text-xs font-mono">
<span className="text-shutter/80">{new Date(item.date).toLocaleDateString('tr-TR', { day: 'numeric', month: 'long', year: 'numeric' })}</span>
<span className="text-pine font-bold">{item.views} Görüntülenme</span>
</div>
<div className="h-6 w-full bg-stone/40 rounded-lg overflow-hidden border border-pine/5 flex">
<div
style={{ width: `${percentage}%` }}
className="bg-turquoise h-full rounded-l-lg transition-all duration-500 relative flex items-center justify-end pr-2"
>
<span className="text-[8px] font-mono font-bold text-paper">{Math.round(percentage)}%</span>
</div>
</div>
<div className="flex gap-4 text-[9px] font-mono text-shutter/65 px-1 pt-0.5">
<span>WhatsApp: {item.whatsappClicks}</span>
<span>Arama: {item.phoneClicks}</span>
<span>Menü: {item.menuClicks}</span>
</div>
</div>
)
})}
</div>
</div>
</div>
)}
</div>
)
}