// modules/admin/pages/advertisements/ViewAdvertisement.jsx import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { House, Edit, ArrowLeft, Megaphone, MousePointerClick, ExternalLink } from "lucide-react"; import { useAdvertisements } from "@/contexts/AdminAdvertisementContext"; import AppBreadcrumb from "@/components/generic/Breadcrumb/AppBreadcrumb"; import { useDateFormat } from "@/hooks/useDateFormat"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Spinner } from "@/components/ui/spinner"; import { ADVERTISEMENT_TYPE_MAP, ADVERTISEMENT_STATUS_MAP } from "@/data/advertisement.data"; // ─── Helpers ──────────────────────────────────────────────────────────────── function SectionCard({ title, description, children }) { return (
{(title || description) && (
{title &&

{title}

} {description &&

{description}

}
)} {children}
); } function Field({ label, children }) { return (

{label}

{children}
); } // ─── Page ─────────────────────────────────────────────────────────────────── export default function ViewAdvertisement() { const navigate = useNavigate(); const { advertisementId } = useParams(); const { fetchAdvertisement, loading } = useAdvertisements(); const { fmtDateTime } = useDateFormat(); const [advertisement, setAdvertisement] = useState(null); useEffect(() => { (async () => { const res = await fetchAdvertisement(advertisementId); setAdvertisement(res?.data?.data ?? null); })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [advertisementId]); const breadcrumbItems = [ { label: "Home", icon: , to: "/admin" }, { label: "Advertisements", to: "/admin/advertisements" }, { label: "View" }, ]; if (loading && !advertisement) { return (
); } if (!advertisement) { return (

Advertisement not found.

); } const typeMeta = ADVERTISEMENT_TYPE_MAP[advertisement.type] ?? {}; const statusMeta = ADVERTISEMENT_STATUS_MAP[advertisement.status] ?? {}; const TypeIcon = typeMeta.icon ?? Megaphone; const previewSrc = advertisement.image?.thumbnail_url || advertisement.image?.file_url || advertisement.image_url || null; const ctas = Array.isArray(advertisement.ctas) ? advertisement.ctas : []; return (
{/* ── Header ─────────────────────────────────────────────────── */}

{advertisement.headline || advertisement.badge_label || "Untitled advertisement"}

{typeMeta.label ?? advertisement.type} {statusMeta.label ?? advertisement.status}
{/* ── Preview ────────────────────────────────────────────────── */}
{previewSrc ? ( {advertisement.headline ) : ( )}
{/* ── Content ────────────────────────────────────────────────── */} {advertisement.badge_label || "—"} {advertisement.headline || "—"} {advertisement.description || "—"} {/* ── Calls to action ────────────────────────────────────────── */} {ctas.length > 0 && (
{ctas.map((cta, i) => (
{cta.label} {cta.link}
))}
)} {/* ── Scheduling & display ──────────────────────────────────── */}
{fmtDateTime(advertisement.start_date)} {fmtDateTime(advertisement.end_date)} {advertisement.order ?? 0} {advertisement.is_active ? "Yes" : "No"}
{/* ── Metrics ────────────────────────────────────────────────── */}
{advertisement.click_count ?? 0} clicks
{/* ── Audit ──────────────────────────────────────────────────── */}
{advertisement.creator?.full_name || "—"} {fmtDateTime(advertisement.createdAt)} {advertisement.updater?.full_name || "—"} {fmtDateTime(advertisement.updatedAt)}
); }