"use client"; import Link from "next/link"; import { toast } from "sonner"; import { useState, useTransition } from "react"; import { Bell, FileText, Megaphone } from "lucide-react"; import { markAnnouncementRead } from "@/actions/announcements"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { MarkdownContent } from "@/components/markdown-content"; export type NewsTickerItemDto = { id: string; title: string; content: string; excerpt: string; createdAt: string; authorName: string; isUnread: boolean; attachments: { id: string; fileName: string; fileUrl: string; fileType: string; }[]; }; export function NewsTicker({ items, archive = false, }: { items: NewsTickerItemDto[]; archive?: boolean; }) { const [selected, setSelected] = useState(null); const [readIds, setReadIds] = useState>(new Set()); const [, startTransition] = useTransition(); function openAnnouncement(item: NewsTickerItemDto) { setSelected(item); if (!item.isUnread || readIds.has(item.id)) return; startTransition(async () => { try { const result = await markAnnouncementRead(item.id); if (result.error) { toast.error(result.error); return; } setReadIds((current) => new Set(current).add(item.id)); } catch { toast.error("Lesestatus konnte nicht gespeichert werden."); } }); } return ( <>
{archive ? "Mitteilungen" : "Neues aus der Kita"} {archive ? "Veröffentlichte Ankündigungen deiner Kita." : "Die neuesten offiziellen Ankündigungen deiner Kita."}
{archive ? ( {items.length} Meldungen ) : ( )}
{items.length === 0 ? (

Noch keine Mitteilungen für deine Empfängergruppe.

) : null} {items.map((item) => { const isUnread = item.isUnread && !readIds.has(item.id); return ( ); })}
!open && setSelected(null)} > {selected && ( <> {selected.title} {selected.createdAt} · {selected.authorName}
{selected.attachments.length > 0 && (

Anhänge

{selected.attachments.map((attachment) => ( ))}
)} )}
); }