import Link from "next/link"; import { redirect } from "next/navigation"; import { ShellPage } from "@/components/page-templates"; import { TablePlaceholder } from "@/components/placeholders"; import { SectionCard } from "@/components/ui"; import { getSession } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; function summarizeRules(value: string | null) { if (!value) { return "-"; } try { const parsed = JSON.parse(value); return parsed.description ? String(parsed.description) : JSON.stringify(parsed); } catch { return value; } } function formatDate(date: Date | null) { if (!date) { return "-"; } return new Intl.DateTimeFormat("id-ID", { day: "2-digit", month: "short", year: "numeric" }).format(date); } export default async function SegmentDetailPage({ params }: { params: Promise<{ segmentId: string }> }) { const { segmentId } = await params; const session = await getSession(); if (!session) { redirect("/login"); } const segment = await prisma.contactSegment.findFirst({ where: { id: segmentId, tenantId: session.tenantId }, include: { _count: { select: { members: true } }, members: { include: { contact: true }, orderBy: { createdAt: "desc" }, take: 20 }, campaigns: { select: { id: true, name: true, status: true, updatedAt: true }, orderBy: { updatedAt: "desc" } } } }); if (!segment) { redirect("/contacts/segments?error=segment_not_found"); } return ( Back to segments} >

Nama: {segment.name}

Rule: {summarizeRules(segment.description ?? segment.rulesJson)}

Members: {segment._count.members}

Updated: {formatDate(segment.updatedAt)}

{segment.campaigns.length === 0 ? (

Tidak ada campaign yang memakai segment ini.

) : (
    {segment.campaigns.map((campaign) => (
  • {campaign.name}

    Status: {campaign.status} • {formatDate(campaign.updatedAt)}

  • ))}
)}
{segment.members.length > 0 ? ( [ member.contact.fullName, member.contact.phoneNumber, formatDate(member.createdAt) ])} /> ) : null}
); }