2023-09-11 13:59:51 -04:00
|
|
|
import Notification from './base.js';
|
|
|
|
const { Notifications } = ags.Service;
|
|
|
|
const { Box, Revealer, Window } = ags.Widget;
|
2023-09-14 16:42:39 -04:00
|
|
|
const { timeout, interval } = ags.Utils;
|
|
|
|
const { source_remove } = imports.gi.GLib;
|
2023-09-11 13:59:51 -04:00
|
|
|
|
|
|
|
const Popups = () => Box({
|
2023-09-11 14:18:22 -04:00
|
|
|
vertical: true,
|
|
|
|
properties: [
|
|
|
|
['map', new Map()],
|
|
|
|
['dismiss', (box, id, force = false) => {
|
|
|
|
if (!id || !box._map.has(id))
|
|
|
|
return;
|
2023-09-11 13:59:51 -04:00
|
|
|
|
2023-09-11 14:18:22 -04:00
|
|
|
if (box._map.get(id)._hovered && !force)
|
|
|
|
return;
|
2023-09-11 13:59:51 -04:00
|
|
|
|
2023-09-11 14:18:22 -04:00
|
|
|
if (box._map.size - 1 === 0)
|
|
|
|
box.get_parent().reveal_child = false;
|
2023-09-11 13:59:51 -04:00
|
|
|
|
2023-09-11 14:18:22 -04:00
|
|
|
timeout(200, () => {
|
2023-09-14 17:24:02 -04:00
|
|
|
if (box._map.get(id).interval) {
|
|
|
|
source_remove(box._map.get(id).interval);
|
2023-09-14 17:24:40 -04:00
|
|
|
box._map.get(id).interval = undefined;
|
2023-09-14 17:24:02 -04:00
|
|
|
}
|
2023-09-11 14:18:22 -04:00
|
|
|
box._map.get(id)?.destroy();
|
|
|
|
box._map.delete(id);
|
|
|
|
});
|
|
|
|
}],
|
|
|
|
['notify', (box, id) => {
|
|
|
|
if (!id || Notifications.dnd)
|
|
|
|
return;
|
2023-09-11 13:59:51 -04:00
|
|
|
|
2023-09-19 10:22:08 -04:00
|
|
|
if (! Notifications.getNotification(id))
|
|
|
|
return;
|
|
|
|
|
2023-09-11 14:18:22 -04:00
|
|
|
box._map.delete(id);
|
2023-09-14 17:24:02 -04:00
|
|
|
|
|
|
|
box._map.set(id, Notification({
|
|
|
|
...Notifications.getNotification(id),
|
|
|
|
command: i => Notifications.dismiss(i),
|
|
|
|
}));
|
|
|
|
|
2023-09-11 14:18:22 -04:00
|
|
|
box.children = Array.from(box._map.values()).reverse();
|
|
|
|
timeout(10, () => {
|
|
|
|
box.get_parent().revealChild = true;
|
|
|
|
});
|
2023-09-14 16:42:39 -04:00
|
|
|
box._map.get(id).interval = interval(4500, () => {
|
|
|
|
if (!box._map.get(id)._hovered) {
|
|
|
|
box._map.get(id).child.setStyle(box._map.get(id).child._leftAnim);
|
|
|
|
|
2023-09-14 17:24:02 -04:00
|
|
|
if (box._map.get(id).interval) {
|
|
|
|
source_remove(box._map.get(id).interval);
|
2023-09-14 17:24:40 -04:00
|
|
|
box._map.get(id).interval = undefined;
|
2023-09-14 16:42:39 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2023-09-11 14:18:22 -04:00
|
|
|
}],
|
|
|
|
],
|
|
|
|
connections: [
|
|
|
|
[Notifications, (box, id) => box._notify(box, id), 'notified'],
|
|
|
|
[Notifications, (box, id) => box._dismiss(box, id), 'dismissed'],
|
|
|
|
[Notifications, (box, id) => box._dismiss(box, id, true), 'closed'],
|
|
|
|
],
|
2023-09-11 13:59:51 -04:00
|
|
|
});
|
|
|
|
|
2023-09-14 16:42:39 -04:00
|
|
|
const PopupList = ({ transition = 'none' } = {}) => Box({
|
2023-09-11 14:18:22 -04:00
|
|
|
className: 'notifications-popup-list',
|
|
|
|
style: 'padding: 1px',
|
|
|
|
children: [
|
|
|
|
Revealer({
|
|
|
|
transition,
|
|
|
|
child: Popups(),
|
|
|
|
}),
|
|
|
|
],
|
2023-09-11 13:59:51 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
export const NotificationsPopupList = Window({
|
2023-09-11 14:18:22 -04:00
|
|
|
name: `notifications`,
|
|
|
|
anchor: 'top left',
|
|
|
|
child: PopupList(),
|
2023-09-11 13:59:51 -04:00
|
|
|
});
|