Differential D13219 Diff 32428 webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js
Changeset View
Changeset View
Standalone View
Standalone View
webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js
- This file was added.
/** | |||||
* @provides javelin-behavior-desktop-notifications-control | |||||
* @requires javelin-behavior | |||||
* javelin-stratcom | |||||
* javelin-dom | |||||
* javelin-uri | |||||
* phabricator-notification | |||||
*/ | |||||
JX.behavior('desktop-notifications-control', function(config, statics) { | |||||
function findEl(id) { | |||||
var el = null; | |||||
try { | |||||
el = JX.$(id); | |||||
} catch (e) { | |||||
// not found | |||||
} | |||||
return el; | |||||
} | |||||
function updateFormStatus(permission) { | |||||
var statusEl = findEl(config.statusID); | |||||
if (!statusEl) { | |||||
return; | |||||
} | |||||
switch (permission) { | |||||
case 'default': | |||||
JX.DOM.setContent(statusEl.firstChild, config.cancelAsk); | |||||
break; | |||||
case 'granted': | |||||
JX.DOM.setContent(statusEl.firstChild, config.grantedAsk); | |||||
break; | |||||
case 'denied': | |||||
JX.DOM.setContent(statusEl.firstChild, config.deniedAsk); | |||||
break; | |||||
} | |||||
JX.DOM.show(statusEl); | |||||
} | |||||
function updateBrowserStatus(permission) { | |||||
var browserStatusEl = findEl(config.browserStatusID); | |||||
if (!browserStatusEl) { | |||||
return; | |||||
} | |||||
switch (permission) { | |||||
case 'default': | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', true); | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false); | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false); | |||||
JX.DOM.setContent(browserStatusEl, JX.$H(config.defaultStatus)); | |||||
break; | |||||
case 'granted': | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', true); | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false); | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false); | |||||
JX.DOM.setContent(browserStatusEl, JX.$H(config.grantedStatus)); | |||||
break; | |||||
case 'denied': | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', true); | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false); | |||||
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false); | |||||
JX.DOM.setContent(browserStatusEl, JX.$H(config.deniedStatus)); | |||||
break; | |||||
} | |||||
JX.DOM.show(browserStatusEl); | |||||
} | |||||
function installSelectListener() { | |||||
var controlEl = findEl(config.controlID); | |||||
if (!controlEl) { | |||||
return; | |||||
} | |||||
var select = JX.DOM.find(controlEl, 'select'); | |||||
JX.DOM.listen( | |||||
select, | |||||
'change', | |||||
null, | |||||
function (e) { | |||||
if (!JX.Notification.supportsDesktopNotifications()) { | |||||
return; | |||||
} | |||||
var value = e.getTarget().value; | |||||
if (value == config.desktopMode) { | |||||
window.Notification.requestPermission( | |||||
function (permission) { | |||||
updateFormStatus(permission); | |||||
updateBrowserStatus(permission); | |||||
}); | |||||
} else { | |||||
var statusEl = JX.$(config.statusID); | |||||
JX.DOM.hide(statusEl); | |||||
} | |||||
}); | |||||
} | |||||
function install() { | |||||
JX.Stratcom.listen( | |||||
'click', | |||||
'desktop-notifications-permission-button', | |||||
function () { | |||||
window.Notification.requestPermission( | |||||
function (permission) { | |||||
updateFormStatus(permission); | |||||
updateBrowserStatus(permission); | |||||
}); | |||||
}); | |||||
return true; | |||||
} | |||||
statics.installed = statics.installed || install(); | |||||
if (!JX.Notification.supportsDesktopNotifications()) { | |||||
var statusEl = JX.$(config.statusID); | |||||
JX.DOM.setContent(statusEl.firstChild, config.noSupport); | |||||
JX.DOM.show(statusEl); | |||||
} else { | |||||
updateBrowserStatus(window.Notification.permission); | |||||
} | |||||
installSelectListener(); | |||||
}); |