Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js
12242 views
1
/**
2
* @provides javelin-behavior-desktop-notifications-control
3
* @requires javelin-behavior
4
* javelin-stratcom
5
* javelin-dom
6
* javelin-uri
7
* phabricator-notification
8
*/
9
10
JX.behavior('desktop-notifications-control', function(config, statics) {
11
12
function findEl(id) {
13
var el = null;
14
try {
15
el = JX.$(id);
16
} catch (e) {
17
// not found
18
}
19
return el;
20
}
21
function updateFormStatus(permission) {
22
var status_node = findEl(config.statusID);
23
if (!status_node) {
24
return;
25
}
26
27
var message_node = JX.$(config.messageID);
28
29
switch (permission) {
30
case 'default':
31
JX.DOM.setContent(message_node, config.cancelAsk);
32
break;
33
case 'granted':
34
JX.DOM.setContent(message_node, config.grantedAsk);
35
break;
36
case 'denied':
37
JX.DOM.setContent(message_node, config.deniedAsk);
38
break;
39
}
40
41
JX.DOM.show(status_node);
42
}
43
44
function updateBrowserStatus(permission) {
45
var browserStatusEl = findEl(config.browserStatusID);
46
if (!browserStatusEl) {
47
return;
48
}
49
switch (permission) {
50
case 'default':
51
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', true);
52
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false);
53
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false);
54
JX.DOM.setContent(browserStatusEl, JX.$H(config.defaultStatus));
55
break;
56
case 'granted':
57
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', true);
58
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false);
59
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false);
60
JX.DOM.setContent(browserStatusEl, JX.$H(config.grantedStatus));
61
break;
62
case 'denied':
63
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', true);
64
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false);
65
JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false);
66
JX.DOM.setContent(browserStatusEl, JX.$H(config.deniedStatus));
67
break;
68
}
69
JX.DOM.show(browserStatusEl);
70
}
71
72
function installSelectListener() {
73
var controlEl = findEl(config.controlID);
74
if (!controlEl) {
75
return;
76
}
77
var select = JX.DOM.find(controlEl, 'select');
78
JX.DOM.listen(
79
select,
80
'change',
81
null,
82
function (e) {
83
if (!JX.Notification.supportsDesktopNotifications()) {
84
return;
85
}
86
var value = e.getTarget().value;
87
if ((value == config.desktop) || (value == config.desktopOnly)) {
88
window.Notification.requestPermission(
89
function (permission) {
90
updateFormStatus(permission);
91
updateBrowserStatus(permission);
92
});
93
} else {
94
var statusEl = JX.$(config.statusID);
95
JX.DOM.hide(statusEl);
96
}
97
});
98
}
99
100
function install() {
101
JX.Stratcom.listen(
102
'click',
103
'desktop-notifications-permission-button',
104
function () {
105
window.Notification.requestPermission(
106
function (permission) {
107
updateFormStatus(permission);
108
updateBrowserStatus(permission);
109
});
110
});
111
112
return true;
113
}
114
115
statics.installed = statics.installed || install();
116
if (!JX.Notification.supportsDesktopNotifications()) {
117
var statusEl = JX.$(config.statusID);
118
JX.DOM.setContent(statusEl.firstChild, config.noSupport);
119
JX.DOM.show(statusEl);
120
} else {
121
updateBrowserStatus(window.Notification.permission);
122
}
123
installSelectListener();
124
});
125
126