Path: blob/master/webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js
12242 views
/**1* @provides javelin-behavior-desktop-notifications-control2* @requires javelin-behavior3* javelin-stratcom4* javelin-dom5* javelin-uri6* phabricator-notification7*/89JX.behavior('desktop-notifications-control', function(config, statics) {1011function findEl(id) {12var el = null;13try {14el = JX.$(id);15} catch (e) {16// not found17}18return el;19}20function updateFormStatus(permission) {21var status_node = findEl(config.statusID);22if (!status_node) {23return;24}2526var message_node = JX.$(config.messageID);2728switch (permission) {29case 'default':30JX.DOM.setContent(message_node, config.cancelAsk);31break;32case 'granted':33JX.DOM.setContent(message_node, config.grantedAsk);34break;35case 'denied':36JX.DOM.setContent(message_node, config.deniedAsk);37break;38}3940JX.DOM.show(status_node);41}4243function updateBrowserStatus(permission) {44var browserStatusEl = findEl(config.browserStatusID);45if (!browserStatusEl) {46return;47}48switch (permission) {49case 'default':50JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', true);51JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false);52JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false);53JX.DOM.setContent(browserStatusEl, JX.$H(config.defaultStatus));54break;55case 'granted':56JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', true);57JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false);58JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false);59JX.DOM.setContent(browserStatusEl, JX.$H(config.grantedStatus));60break;61case 'denied':62JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', true);63JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false);64JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false);65JX.DOM.setContent(browserStatusEl, JX.$H(config.deniedStatus));66break;67}68JX.DOM.show(browserStatusEl);69}7071function installSelectListener() {72var controlEl = findEl(config.controlID);73if (!controlEl) {74return;75}76var select = JX.DOM.find(controlEl, 'select');77JX.DOM.listen(78select,79'change',80null,81function (e) {82if (!JX.Notification.supportsDesktopNotifications()) {83return;84}85var value = e.getTarget().value;86if ((value == config.desktop) || (value == config.desktopOnly)) {87window.Notification.requestPermission(88function (permission) {89updateFormStatus(permission);90updateBrowserStatus(permission);91});92} else {93var statusEl = JX.$(config.statusID);94JX.DOM.hide(statusEl);95}96});97}9899function install() {100JX.Stratcom.listen(101'click',102'desktop-notifications-permission-button',103function () {104window.Notification.requestPermission(105function (permission) {106updateFormStatus(permission);107updateBrowserStatus(permission);108});109});110111return true;112}113114statics.installed = statics.installed || install();115if (!JX.Notification.supportsDesktopNotifications()) {116var statusEl = JX.$(config.statusID);117JX.DOM.setContent(statusEl.firstChild, config.noSupport);118JX.DOM.show(statusEl);119} else {120updateBrowserStatus(window.Notification.permission);121}122installSelectListener();123});124125126