import app from "ags/gtk4/app"; import { Astal, Gtk } from "ags/gtk4"; import AstalNotifd from "gi://AstalNotifd"; import Notification from "./Notification"; import { createBinding, For, createState, onCleanup } from "ags"; export default function NotificationPopups() { const monitors = createBinding(app, "monitors"); const notifd = AstalNotifd.get_default(); 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)); }); // technically, we don't need to cleanup because in this example this is a root component // and this cleanup function is only called when the program exits, but exiting will cleanup either way // but it's here to remind you that you should not forget to cleanup signal connections onCleanup(() => { notifd.disconnect(notifiedHandler); notifd.disconnect(resolvedHandler); }); return ( (win as Gtk.Window).destroy()}> {(monitor) => ( ns.length > 0)} anchor={Astal.WindowAnchor.TOP | Astal.WindowAnchor.RIGHT} > {(notification) => ( setNotifications((ns) => ns.filter((n) => n.id !== notification.id), ) } /> )} )} ); }