diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -8,7 +8,7 @@ return array( 'names' => array( 'core.pkg.css' => '60a6d241', - 'core.pkg.js' => '61af8961', + 'core.pkg.js' => '83fe48eb', 'darkconsole.pkg.js' => '8ab24e01', 'differential.pkg.css' => '8af45893', 'differential.pkg.js' => 'dad3622f', @@ -342,9 +342,9 @@ 'rsrc/image/texture/table_header.png' => '5c433037', 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', - 'rsrc/js/application/aphlict/Aphlict.js' => '464d333a', + 'rsrc/js/application/aphlict/Aphlict.js' => 'daa6ca29', 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'f6bc26f0', - 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '1162a152', + 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'b3c3c7cd', 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => '58f7803f', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de', @@ -535,10 +535,10 @@ 'herald-rule-editor' => '335fd41f', 'herald-test-css' => '778b008e', 'inline-comment-summary-css' => '8cfd34e8', - 'javelin-aphlict' => '464d333a', + 'javelin-aphlict' => 'daa6ca29', 'javelin-behavior' => '61cbc29a', 'javelin-behavior-aphlict-dropdown' => 'f6bc26f0', - 'javelin-behavior-aphlict-listen' => '1162a152', + 'javelin-behavior-aphlict-listen' => 'b3c3c7cd', 'javelin-behavior-aphlict-status' => '58f7803f', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', 'javelin-behavior-aphront-crop' => 'fa0f4fc2', @@ -908,18 +908,6 @@ 'javelin-uri', 'javelin-install', ), - '1162a152' => array( - 'javelin-behavior', - 'javelin-aphlict', - 'javelin-stratcom', - 'javelin-request', - 'javelin-uri', - 'javelin-dom', - 'javelin-json', - 'javelin-router', - 'javelin-util', - 'phabricator-notification', - ), '13c739ea' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1087,13 +1075,6 @@ 'javelin-behavior', 'javelin-dom', ), - '464d333a' => array( - 'javelin-install', - 'javelin-util', - 'javelin-websocket', - 'javelin-leader', - 'javelin-json', - ), '469c0d9e' => array( 'javelin-behavior', 'javelin-dom', @@ -1581,6 +1562,18 @@ 'javelin-behavior', 'phabricator-prefab', ), + 'b3c3c7cd' => array( + 'javelin-behavior', + 'javelin-aphlict', + 'javelin-stratcom', + 'javelin-request', + 'javelin-uri', + 'javelin-dom', + 'javelin-json', + 'javelin-router', + 'javelin-util', + 'phabricator-notification', + ), 'b3e7d692' => array( 'javelin-install', ), @@ -1741,6 +1734,13 @@ 'javelin-util', 'phabricator-shaped-request', ), + 'daa6ca29' => array( + 'javelin-install', + 'javelin-util', + 'javelin-websocket', + 'javelin-leader', + 'javelin-json', + ), 'dd7e8ef5' => array( 'javelin-behavior', 'javelin-dom', diff --git a/webroot/rsrc/js/application/aphlict/Aphlict.js b/webroot/rsrc/js/application/aphlict/Aphlict.js --- a/webroot/rsrc/js/application/aphlict/Aphlict.js +++ b/webroot/rsrc/js/application/aphlict/Aphlict.js @@ -119,6 +119,10 @@ var handler = this.getHandler(); handler && handler(message.data); break; + case 'notification.individual': + var renderer = this.getRenderer(); + renderer && renderer(message.data); + break; } }, @@ -134,7 +138,8 @@ }, properties: { - handler: null + handler: null, + renderer: null }, statics: { diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js @@ -23,35 +23,48 @@ return; } - var request = new JX.Request( - '/notification/individual/', - onnotification); - - var routable = request - .addData({key: message.key}) - .getRoutable(); - - routable - .setType('notification') - .setPriority(250); - - JX.Router.getInstance().queue(routable); + JX.Leader.callIfLeader(function() { + requestNotification(message); + }); }); // Respond to a notification from the Aphlict notification server. We send // a request to Phabricator to get notification details. - function onaphlictmessage(message) { + function onAphlictMessage(message) { JX.Stratcom.invoke('aphlict-receive-message', null, message); } + function requestNotification(message) { + var request = new JX.Request( + '/notification/individual/', + receiveNotification); - // Respond to a response from Phabricator about a specific notification. - function onnotification(response) { + var routable = request + .addData({key: message.key}) + .getRoutable(); + + routable + .setType('notification') + .setPriority(250); + + JX.Router.getInstance().queue(routable); + } + + function receiveNotification(response) { if (!response.pertinent) { return; } + JX.Leader.broadcast(null, { + type: 'notification.individual', + data: response + }); + } + + + // Respond to a response from Phabricator about a specific notification. + function onAphlictNotification(response) { JX.Stratcom.invoke('notification-panel-update', null, {}); // Show the notification itself. @@ -79,7 +92,8 @@ config.subscriptions); client - .setHandler(onaphlictmessage) + .setHandler(onAphlictMessage) + .setRenderer(onAphlictNotification) .start(); });