114 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // From astal examples
 | |
| 
 | |
| import { bind, GLib } from "astal";
 | |
| import { Gtk } from "astal/gtk4";
 | |
| import Notifd from "gi://AstalNotifd";
 | |
| import { NotificationIcon } from "./icon";
 | |
| // import Pango from "gi://Pango?version=1.0"
 | |
| 
 | |
| const fileExists = (path: string) => GLib.file_test(path, GLib.FileTest.EXISTS);
 | |
| 
 | |
| const time = (time: number, format = "%H:%M") =>
 | |
|     GLib.DateTime.new_from_unix_local(time).format(format)!;
 | |
| 
 | |
| const urgency = (n: Notifd.Notification) => {
 | |
|     const { LOW, NORMAL, CRITICAL } = Notifd.Urgency;
 | |
|     // match operator when?
 | |
|     switch (n.urgency) {
 | |
|         case LOW:
 | |
|             return "low";
 | |
|         case CRITICAL:
 | |
|             return "critical";
 | |
|         case NORMAL:
 | |
|         default:
 | |
|             return "normal";
 | |
|     }
 | |
| };
 | |
| 
 | |
| type Props = {
 | |
|     delete: (id: number) => void;
 | |
|     notification: Notifd.Notification;
 | |
|     id: number;
 | |
| };
 | |
| 
 | |
| export default function Notification(props: Props) {
 | |
|     const { notification: n, id: id, delete: del } = props;
 | |
|     const { START, CENTER, END } = Gtk.Align;
 | |
| 
 | |
|     return (
 | |
|         <box vertical cssClasses={["notification", `${urgency(n)}`]}>
 | |
|             <box cssClasses={["header"]}>
 | |
|                 {n.appIcon || n.desktopEntry ? (
 | |
|                     <Gtk.Image
 | |
|                         cssClasses={["app-icon"]}
 | |
|                         visible={Boolean(n.appIcon || n.desktopEntry)}
 | |
|                         iconName={n.appIcon || n.desktopEntry}
 | |
|                     />
 | |
|                 ) : (
 | |
|                     <image iconName={"window-close-symbolic"}></image>
 | |
|                 )}
 | |
|                 <label
 | |
|                     cssClasses={["app-name"]}
 | |
|                     halign={START}
 | |
|                     // ellipsize={Pango.EllipsizeMode.END}
 | |
|                     label={n.appName || "Unknown"}
 | |
|                 />
 | |
|                 <label
 | |
|                     cssClasses={["time"]}
 | |
|                     hexpand
 | |
|                     halign={END}
 | |
|                     label={time(n.time)}
 | |
|                 />
 | |
|                 <button
 | |
|                     onClicked={() => {
 | |
|                         del(id);
 | |
|                     }}
 | |
|                     child={<image iconName="window-close-symbolic" />}
 | |
|                 ></button>
 | |
|             </box>
 | |
|             <Gtk.Separator visible />
 | |
|             <box cssClasses={["content"]}>
 | |
|                 <box
 | |
|                     cssClasses={["image"]}
 | |
|                     visible={Boolean(NotificationIcon(n))}
 | |
|                     halign={CENTER}
 | |
|                     valign={CENTER}
 | |
|                     vexpand={true}
 | |
|                 >
 | |
|                     {NotificationIcon(n)}
 | |
|                 </box>
 | |
|                 <box vertical>
 | |
|                     <label
 | |
|                         cssClasses={["summary"]}
 | |
|                         halign={START}
 | |
|                         xalign={0}
 | |
|                         useMarkup
 | |
|                         label={bind(n, "summary")}
 | |
|                         // ellipsize={Pango.EllipsizeMode.END}
 | |
|                     />
 | |
|                     {n.body && (
 | |
|                         <label
 | |
|                             cssClasses={["body"]}
 | |
|                             valign={CENTER}
 | |
|                             wrap={true}
 | |
|                             maxWidthChars={50}
 | |
|                             label={bind(n, "body")}
 | |
|                         />
 | |
|                     )}
 | |
|                 </box>
 | |
|             </box>
 | |
|             {n.get_actions().length > 0 ? (
 | |
|                 <box cssClasses={["actions"]}>
 | |
|                     {n.get_actions().map(({ label, id }) => (
 | |
|                         <button hexpand onClicked={() => n.invoke(id)}>
 | |
|                             <label label={label} halign={CENTER} hexpand />
 | |
|                         </button>
 | |
|                     ))}
 | |
|                 </box>
 | |
|             ) : (
 | |
|                 <box></box>
 | |
|             )}
 | |
|         </box>
 | |
|     );
 | |
| }
 |