feat(content): add announcements and public news flows
This commit is contained in:
39
apps/web/src/components/public-announcements.tsx
Normal file
39
apps/web/src/components/public-announcements.tsx
Normal file
@@ -0,0 +1,39 @@
|
||||
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>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user