40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { listActiveAnnouncements, type PublicAnnouncement } from "@cms/db"
|
|
import Link from "next/link"
|
|
|
|
type PublicAnnouncementsProps = {
|
|
placement: "global_top" | "homepage"
|
|
}
|
|
|
|
function AnnouncementCard({ announcement }: { announcement: PublicAnnouncement }) {
|
|
return (
|
|
<article className="rounded-lg border border-blue-200 bg-blue-50 px-4 py-3 text-sm text-blue-900">
|
|
<p className="text-xs uppercase tracking-wide text-blue-700">{announcement.title}</p>
|
|
<p className="mt-1">{announcement.message}</p>
|
|
{announcement.ctaLabel && announcement.ctaHref ? (
|
|
<Link
|
|
href={announcement.ctaHref}
|
|
className="mt-2 inline-block font-medium underline underline-offset-2"
|
|
>
|
|
{announcement.ctaLabel}
|
|
</Link>
|
|
) : null}
|
|
</article>
|
|
)
|
|
}
|
|
|
|
export async function PublicAnnouncements({ placement }: PublicAnnouncementsProps) {
|
|
const announcements = await listActiveAnnouncements(placement)
|
|
|
|
if (announcements.length === 0) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<section className="mx-auto w-full max-w-6xl space-y-2 px-6 py-3">
|
|
{announcements.map((announcement) => (
|
|
<AnnouncementCard key={announcement.id} announcement={announcement} />
|
|
))}
|
|
</section>
|
|
)
|
|
}
|