/* * This file is part of Xpra. * Copyright (C) 2016 Antoine Martin * Copyright (c) 2016 Spikes, Inc. * Licensed under MPL 2.0, see: * http://www.mozilla.org/MPL/2.0/ * */ $(function() { window.notification_timers = {}; const NOTIFICATION_SELECTOR = ".notifications"; window.doNotification = function( type, nid, title, message, timeout, icon, actions, hints, onAction, onClose ) { // console.debug( // "doNotification", // type, // nid, // title, // message, // timeout, // icon, // actions, // hints, // onAction, // onClose // ); const nID = `notification${nid}`; const a = $( `
` + `` + `${title}` + `${message}` + `
×
` + `
` ); const notifications_elements = $(NOTIFICATION_SELECTOR); notifications_elements.prepend(a); if (actions) { const notification_buttons = $( '
' ); a.append(notification_buttons); for (let index = 0; index < actions.length; index += 2) { const action_id = actions[index]; const action_label = actions[index + 1]; const notification_button = window._notification_button( nid, action_id, action_label, onAction, onClose ); notification_buttons.append(notification_button); } } notifications_elements.prepend(a); if (icon) { const encoding = icon[0]; const img_data = icon[3]; if (encoding == "png") { const source = `data:image/${encoding};base64,${Utilities.ArrayBufferToBase64( img_data )}`; $(`#notification_icon${nID}`).attr("src", source); } } a.on("click", ".dismiss", function() { window.cancelNotificationTimer(nid); a.removeClass("visible").addClass("hidden"); a.on( "transitionend webkitTransitionEnd", $.debounce(250, function() { a.trigger("dismissed"); a.remove(); }) ); if (onClose) { onClose(nid, 3, "user clicked dismiss"); } }); setTimeout(function() { a.addClass("visible"); }, 1); if (timeout) { a.data("timeLeft", timeout); window.notification_timers[nid] = setInterval(function() { const tleft = a.data("timeLeft") - 1; if (a.data("timeLeft") === 0) { a.find(".dismiss").trigger("click"); if (onClose) { onClose(nid, 1, "timeout"); } } else { a.find("sec").text(tleft); a.data("timeLeft", tleft); } }, 1000); } return a; }; window._notification_button = function( nid, action_id, action_label, onAction, onClose ) { const notification_button = $( `
${action_label}
` ); notification_button.on("click", function() { window.closeNotification(nid); if (onAction) { onAction(nid, action_id); } if (onClose) { onClose(nid, 3, "user clicked action"); } }); return notification_button; }; window.cancelNotificationTimer = function(nid) { const timer = window.notification_timers[nid]; if (timer) { window.clearInterval(timer); delete window.notification_timers[nid]; } }; window.cancelNotificationTimers = function() { for (const nid in window.notification_timers) { window.cancelNotificationTimer(nid); } }; window.closeNotification = function(nid) { window.cancelNotificationTimer(nid); const nID = `notification${nid}`; $(NOTIFICATION_SELECTOR).find(`#${nID}`).find(".dismiss").trigger("click"); }; window.clearNotifications = function() { window.cancelNotificationTimers(); $(NOTIFICATION_SELECTOR).find(".dismiss").trigger("click"); }; window.removeNotifications = function() { window.cancelNotificationTimers(); $(NOTIFICATION_SELECTOR).empty(); }; });