"use client"; import { useMemo } from "react"; import { Avatar, Card, Flex, Group, ScrollArea, Stack, Text } from "@mantine/core"; import { IconClock } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; import { useRequiredBoard } from "@homarr/boards/context"; import { useTimeAgo } from "@homarr/common"; import { useScopedI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; export default function NotificationsWidget({ options, integrationIds }: WidgetComponentProps<"notifications">) { const { data: notificationIntegrations = [] } = clientApi.widget.notifications.getNotifications.useQuery({ ...options, integrationIds, }); const t = useScopedI18n("widget.notifications"); const board = useRequiredBoard(); const sortedNotifications = useMemo( () => notificationIntegrations .flatMap((integration) => integration.data) .sort((entryA, entryB) => entryB.time.getTime() - entryA.time.getTime()), [notificationIntegrations], ); return ( {sortedNotifications.length > 0 ? ( sortedNotifications.map((notification) => ( {!options.hideLogos && notification.source?.iconUrl && ( )} {notification.title && ( {notification.title} )} {notification.body} )) ) : ( {t("noItems")} )} ); } const InfoDisplay = ({ date }: { date: Date }) => { const timeAgo = useTimeAgo(date, 30000); // update every 30sec return ( {timeAgo} ); };