103 lines
4.5 KiB
TypeScript
103 lines
4.5 KiB
TypeScript
import { getAvailableOrders } from './actions'
|
|
import { OrderCard } from '@/components/OrderCard'
|
|
import { Sparkles, Plus, Store } from 'lucide-react'
|
|
import Link from 'next/link'
|
|
import { buttonVariants } from '@/components/ui/button'
|
|
import { cn } from '@/lib/utils'
|
|
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
export default async function Dashboard() {
|
|
const orders = await getAvailableOrders()
|
|
|
|
return (
|
|
<div className="space-y-8 animate-in fade-in duration-500">
|
|
{/* Banner / Hero Section */}
|
|
<div className="relative overflow-hidden rounded-3xl bg-gradient-to-r from-[#1B2CC1] via-[#2135E0] to-[#121E85] p-6 sm:p-8 text-white shadow-xl shadow-[#1B2CC1]/15">
|
|
<div className="absolute right-0 top-0 -mt-10 -mr-10 h-64 w-64 rounded-full bg-white/10 blur-3xl pointer-events-none" />
|
|
<div className="relative z-10 max-w-2xl space-y-3">
|
|
<div className="inline-flex items-center gap-2 rounded-full bg-white/15 px-3 py-1 text-xs font-bold text-blue-100 backdrop-blur-md border border-white/20">
|
|
<Sparkles className="h-3.5 w-3.5" />
|
|
<span>Sistem Titip & Jastip Cepat</span>
|
|
</div>
|
|
<h2 className="text-2xl sm:text-3xl font-black tracking-tight leading-tight">
|
|
Titip Makanan & Minuman Bareng Teman Kantor
|
|
</h2>
|
|
<p className="text-sm text-blue-100/90 leading-relaxed max-w-xl">
|
|
Pilih PO yang sedang buka hari ini, tentukan menu favoritmu, dan biarkan pembuat PO mengurus tagihan secara praktis.
|
|
</p>
|
|
<div className="pt-2 flex flex-wrap gap-3">
|
|
<Link
|
|
href="/my-orders"
|
|
className={cn(
|
|
buttonVariants(),
|
|
"rounded-xl bg-white text-[#1B2CC1] hover:bg-blue-50 font-bold shadow-md h-10 px-5 gap-2"
|
|
)}
|
|
>
|
|
<Plus className="w-4 h-4" />
|
|
Buka Jasa PO Baru
|
|
</Link>
|
|
<Link
|
|
href="/my-purchases"
|
|
className={cn(
|
|
buttonVariants({ variant: "outline" }),
|
|
"rounded-xl bg-white/10 hover:bg-white/20 text-white border-white/20 font-semibold h-10 px-4"
|
|
)}
|
|
>
|
|
Lihat Titipan Saya
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Main Grid Header */}
|
|
<div className="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4">
|
|
<div>
|
|
<div className="flex items-center gap-2">
|
|
<div className="w-2.5 h-2.5 rounded-full bg-[#1B2CC1] animate-pulse" />
|
|
<h2 className="text-xl font-black text-slate-900 dark:text-white tracking-tight">
|
|
Daftar PO Terbuka Hari Ini
|
|
</h2>
|
|
</div>
|
|
<p className="text-xs text-slate-500 dark:text-slate-400 mt-0.5">
|
|
Pesanan dengan status OPEN yang bisa Anda ikuti hari ini.
|
|
</p>
|
|
</div>
|
|
|
|
<span className="text-xs font-bold text-[#1B2CC1] bg-[#1B2CC1]/10 px-3 py-1.5 rounded-xl">
|
|
Total: {orders.length} PO Aktif
|
|
</span>
|
|
</div>
|
|
|
|
{orders.length === 0 ? (
|
|
<div className="flex flex-col items-center justify-center p-12 sm:p-16 text-center rounded-3xl border-2 border-dashed border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 shadow-sm">
|
|
<div className="w-16 h-16 bg-[#1B2CC1]/10 rounded-2xl flex items-center justify-center mb-4 text-[#1B2CC1]">
|
|
<Store className="w-8 h-8" />
|
|
</div>
|
|
<h3 className="text-lg font-bold text-slate-800 dark:text-slate-200 mb-1">Belum Ada PO yang Dibuka Hari Ini</h3>
|
|
<p className="text-xs text-slate-500 max-w-md mb-6 leading-relaxed">
|
|
Mau jajan atau beli sesuatu? Jadilah orang pertama yang membuka jasa titip pesanan untuk teman-teman Anda!
|
|
</p>
|
|
<Link
|
|
href="/my-orders"
|
|
className={cn(
|
|
buttonVariants(),
|
|
"bg-[#1B2CC1] hover:bg-[#15229E] text-white font-bold rounded-xl shadow-md shadow-[#1B2CC1]/25 h-10 px-5 gap-2"
|
|
)}
|
|
>
|
|
<Plus className="w-4 h-4" /> Buka PO Sekarang
|
|
</Link>
|
|
</div>
|
|
) : (
|
|
<div className="flex flex-col h-full space-y-4">
|
|
<div className="flex flex-col space-y-4 max-h-[calc(100vh-260px)] overflow-y-auto pr-2 scrollbar-thin">
|
|
{orders.map((order: any) => (
|
|
<OrderCard key={order.id} order={order} />
|
|
))}
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|