import { For, createState, onCleanup } from "ags"; import { Astal, Gdk, Gtk } from "ags/gtk4"; import AstalNotifd from "gi://AstalNotifd"; import { Notification } from "./notification"; export const WINDOW_NAME = "notifications"; export const Notifications = (gdkmonitor: Gdk.Monitor) => { const notifd = AstalNotifd.get_default(); const { TOP, RIGHT } = Astal.WindowAnchor; const [notifications, setNotifications] = createState( new Array(), ); const notifiedHandler = notifd.connect("notified", (_, id, replaced) => { const notification = notifd.get_notification(id); if (replaced && notifications.get().some((n) => n.id === id)) { setNotifications((ns) => ns.map((n) => (n.id === id ? notification : n))); } else { setNotifications((ns) => [notification, ...ns]); } }); const resolvedHandler = notifd.connect("resolved", (_, id) => { setNotifications((ns) => ns.filter((n) => n.id !== id)); }); onCleanup(() => { notifd.disconnect(notifiedHandler); notifd.disconnect(resolvedHandler); }); return ( onCleanup(() => self.destroy())} name={WINDOW_NAME} cssClasses={["notifications"]} gdkmonitor={gdkmonitor} visible={notifications((ns) => ns.length > 0)} anchor={TOP | RIGHT} > {(n) => } ); };