'use client' /** * Campaign Card Admin (chat compact variant). * * PURE PRESENTATION. Receives a pre-composed `` prop bundle and * renders a 3-row compact card. The hub still owns the full-size admin * card (with delete + manage buttons) — only the compact chat variant * lives here in lib. */ import React from 'react' import { Megaphone } from 'lucide-react' import { formatDateShort } from '../../../utils/date-formatters' import { COMPACT_CARD_ICON_SLOT, COMPACT_CARD_META_ROW_BOX, COMPACT_CARD_OUTER, COMPACT_CARD_OUTER_STATIC, COMPACT_CARD_ROW_FILLER, COMPACT_CARD_SKELETON_IMAGE_SLOT, COMPACT_CARD_SKELETON_OUTER, COMPACT_CARD_SUBTITLE, COMPACT_CARD_SUMMARY, COMPACT_CARD_TEXT_COL, COMPACT_CARD_TITLE, COMPACT_CARD_TITLE_ROW, } from '../utils/compact-card-classes' /** Minimal campaign shape needed by the chat-inline compact card. */ export interface CampaignCardItem { id: string name: string description?: string | null start_date?: string | null goals?: Array | null } export interface CampaignCardAdminAnchorProps { href: string target?: '_blank' rel?: 'noopener noreferrer' onClick?: (e: React.MouseEvent) => void } export interface CampaignCardAdminProps { campaign: CampaignCardItem className?: string anchorProps?: CampaignCardAdminAnchorProps } export function CampaignCardAdmin({ campaign, className, anchorProps }: CampaignCardAdminProps) { const goalsCount = campaign.goals?.length || 0 const innerChildren = ( <> {campaign.name} {[ campaign.start_date ? formatDateShort(campaign.start_date) : null, goalsCount > 0 ? `${goalsCount} goal${goalsCount !== 1 ? 's' : ''}` : null, 'Marketing campaign', ].filter(Boolean).join(' · ')} {campaign.description || COMPACT_CARD_ROW_FILLER} ) if (anchorProps) { return ( {innerChildren} ) } return ( {innerChildren} ) } export function CampaignCardAdminSkeleton({ className }: { className?: string }) { return ( ) }