import { Button } from "@/components/ui/button" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Announcement } from "@/types/announcement" import { IconExternalLink, IconSpeakerphone } from "@tabler/icons-react" import { FC, useEffect, useState } from "react" import { SIDEBAR_ICON_SIZE } from "../sidebar/sidebar-switcher" import { useTranslation } from 'react-i18next' interface AnnouncementsProps {} export const Announcements: FC = () => { const { t } = useTranslation() const [announcements, setAnnouncements] = useState([]) useEffect(() => { // Load announcements from local storage const storedAnnouncements = localStorage.getItem("announcements") let parsedAnnouncements: Announcement[] = [] if (storedAnnouncements) { parsedAnnouncements = JSON.parse(storedAnnouncements) } // Filter out announcements that are no longer in state const validAnnouncements = announcements.filter((a: Announcement) => parsedAnnouncements.find(storedA => storedA.id === a.id) ) // Add new announcements to the list const newAnnouncements = announcements.filter( (a: Announcement) => !parsedAnnouncements.find(storedA => storedA.id === a.id) ) // Combine valid and new announcements const combinedAnnouncements = [...validAnnouncements, ...newAnnouncements] // Mark announcements as read if they are marked as read in local storage const updatedAnnouncements = combinedAnnouncements.map( (a: Announcement) => { const storedAnnouncement = parsedAnnouncements.find( (storedA: Announcement) => storedA.id === a.id ) return storedAnnouncement?.read ? { ...a, read: true } : a } ) // Update state and local storage setAnnouncements(updatedAnnouncements) localStorage.setItem("announcements", JSON.stringify(updatedAnnouncements)) }, []) const unreadCount = announcements.filter(a => !a.read).length const markAsRead = (id: string) => { // Mark announcement as read in local storage and state const updatedAnnouncements = announcements.map(a => a.id === id ? { ...a, read: true } : a ) setAnnouncements(updatedAnnouncements) localStorage.setItem("announcements", JSON.stringify(updatedAnnouncements)) } const markAllAsRead = () => { // Mark all announcements as read in local storage and state const updatedAnnouncements = announcements.map(a => ({ ...a, read: true })) setAnnouncements(updatedAnnouncements) localStorage.setItem("announcements", JSON.stringify(updatedAnnouncements)) } const markAllAsUnread = () => { // Mark all announcements as unread in local storage and state const updatedAnnouncements = announcements.map(a => ({ ...a, read: false })) setAnnouncements(updatedAnnouncements) localStorage.setItem("announcements", JSON.stringify(updatedAnnouncements)) } return (
{unreadCount > 0 && (
{unreadCount}
)}
{t("help.updates")}
{announcements .filter(a => !a.read) .map((a: Announcement) => (
{a.title}
{a.date}
{a.content}
{a.link && ( )}
))}
{unreadCount > 0 ? ( ) : (
{t("help.youAreAllCaughtUp")} {announcements.length > 0 && (
markAllAsUnread()} > {t("help.showRecentUpdates")}
)}
)}
) }