"use client" import type React from "react" import { useState, useEffect } from "react" import { HelpCircle, Mail, MailOpen } from "lucide-react" import { Button } from "@/components/ui/button" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Badge } from "@/components/ui/badge" import { NewsItem } from "@/lib/types" import { newsData } from "@/lib/newsData" interface WhatsNewProps { newsItems?: NewsItem[] autoMarkAsRead?: boolean } const COOKIE_NAME = "whats-new-read-items" const getReadItems = (): string[] => { if (typeof document === "undefined") return [] const cookies = document.cookie.split(';').map(cookie => cookie.trim()) const targetCookie = cookies.find(cookie => cookie.startsWith(`${COOKIE_NAME}=`)) if (!targetCookie) return [] try { const cookieValue = targetCookie.substring(`${COOKIE_NAME}=`.length) return JSON.parse(decodeURIComponent(cookieValue)) } catch (error) { console.warn('Failed to parse whats-new cookie:', error) return [] } } const setReadItems = (readItems: string[]) => { if (typeof document === "undefined") return try { const expires = new Date() expires.setFullYear(expires.getFullYear() + 1) const cookieValue = encodeURIComponent(JSON.stringify(readItems)) document.cookie = `${COOKIE_NAME}=${cookieValue}; expires=${expires.toUTCString()}; path=/; SameSite=Lax` } catch (error) { console.warn('Failed to set whats-new cookie:', error) } } export default function WhatsNewIndicator({ newsItems = newsData, autoMarkAsRead = true }: WhatsNewProps) { const [isOpen, setIsOpen] = useState(false) const [readItems, setReadItemsState] = useState([]) const [isInitialized, setIsInitialized] = useState(false) useEffect(() => { const items = getReadItems() setReadItemsState(items) setIsInitialized(true) }, []) useEffect(() => { if (isInitialized) { setReadItems(readItems) } }, [readItems, isInitialized]) const newsItemsWithReadState = newsItems.map((item) => ({ ...item, read: readItems.includes(item.unique_id), })) const unreadCount = newsItemsWithReadState.filter((item) => !item.read).length const markAsRead = (itemId: string) => { setReadItemsState((prev) => { if (!prev.includes(itemId)) { return [...prev, itemId] } return prev }) } const markAllAsRead = () => { const allIds = newsItems.map((item) => item.unique_id) setReadItemsState(allIds) } const handleNewsItemClick = (item: NewsItem) => { window.open(item.url, "_blank", "noopener,noreferrer") if (autoMarkAsRead && !item.read) { markAsRead(item.unique_id) } } return (

{"What's New"}

{unreadCount > 0 ? `${unreadCount} unread update${unreadCount === 1 ? "" : "s"}` : "All caught up!"}

{unreadCount > 0 && ( )}
{newsItemsWithReadState.length === 0 ? (
No recent updates
) : (
{newsItemsWithReadState.map((item, index) => (
{!item.read &&
}
))}
)}
) }