mirror of
				https://github.com/zulip/zulip-desktop.git
				synced 2025-10-31 12:03:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| interface CompatElectronBridge extends ElectronBridge {
 | |
| 	readonly idle_on_system: boolean;
 | |
| 	readonly last_active_on_system: number;
 | |
| 	send_notification_reply_message_supported: boolean;
 | |
| }
 | |
| 
 | |
| (() => {
 | |
| 	const zulipWindow = window as typeof window & {
 | |
| 		electron_bridge: CompatElectronBridge;
 | |
| 		raw_electron_bridge: ElectronBridge;
 | |
| 	};
 | |
| 
 | |
| 	const electron_bridge: CompatElectronBridge = {
 | |
| 		...zulipWindow.raw_electron_bridge,
 | |
| 
 | |
| 		get idle_on_system(): boolean {
 | |
| 			return this.get_idle_on_system();
 | |
| 		},
 | |
| 
 | |
| 		get last_active_on_system(): number {
 | |
| 			return this.get_last_active_on_system();
 | |
| 		},
 | |
| 
 | |
| 		get send_notification_reply_message_supported(): boolean {
 | |
| 			return this.get_send_notification_reply_message_supported();
 | |
| 		},
 | |
| 
 | |
| 		set send_notification_reply_message_supported(value: boolean) {
 | |
| 			this.set_send_notification_reply_message_supported(value);
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	zulipWindow.electron_bridge = electron_bridge;
 | |
| 
 | |
| 	function attributeListener<T extends EventTarget>(type: string): PropertyDescriptor {
 | |
| 		const symbol = Symbol('on' + type);
 | |
| 
 | |
| 		function listener(this: T, ev: Event): void {
 | |
| 			if ((this as any)[symbol].call(this, ev) === false) {
 | |
| 				ev.preventDefault();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return {
 | |
| 			configurable: true,
 | |
| 			enumerable: true,
 | |
| 			get(this: T) {
 | |
| 				return (this as any)[symbol];
 | |
| 			},
 | |
| 			set(this: T, value: unknown) {
 | |
| 				if (typeof value === 'function') {
 | |
| 					if (!(symbol in this)) {
 | |
| 						this.addEventListener(type, listener);
 | |
| 					}
 | |
| 
 | |
| 					(this as any)[symbol] = value;
 | |
| 				} else if (symbol in this) {
 | |
| 					this.removeEventListener(type, listener);
 | |
| 					delete (this as any)[symbol];
 | |
| 				}
 | |
| 			}
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	const NativeNotification = Notification;
 | |
| 
 | |
| 	class InjectedNotification extends EventTarget {
 | |
| 		constructor(title: string, options?: NotificationOptions) {
 | |
| 			super();
 | |
| 			Object.assign(
 | |
| 				this,
 | |
| 				electron_bridge.new_notification(title, options, (type: string, eventInit: EventInit) =>
 | |
| 					this.dispatchEvent(new Event(type, eventInit))
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		static get maxActions(): number {
 | |
| 			return NativeNotification.maxActions;
 | |
| 		}
 | |
| 
 | |
| 		static get permission(): NotificationPermission {
 | |
| 			return NativeNotification.permission;
 | |
| 		}
 | |
| 
 | |
| 		static async requestPermission(callback?: NotificationPermissionCallback): Promise<NotificationPermission> {
 | |
| 			if (callback) {
 | |
| 				callback(await Promise.resolve(NativeNotification.permission));
 | |
| 			}
 | |
| 
 | |
| 			return NativeNotification.permission;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	Object.defineProperties(InjectedNotification.prototype, {
 | |
| 		onclick: attributeListener('click'),
 | |
| 		onclose: attributeListener('close'),
 | |
| 		onerror: attributeListener('error'),
 | |
| 		onshow: attributeListener('show')
 | |
| 	});
 | |
| 
 | |
| 	window.Notification = InjectedNotification as any;
 | |
| })();
 |