From 0ff61b0c9976a9dc8df7d8b1b1ecec4543f3224c Mon Sep 17 00:00:00 2001 From: brunosimon Date: Tue, 15 Aug 2017 18:13:14 +0200 Subject: [PATCH] :sparkles: Add alert --- .../images/notification-icon-200x200.png | Bin 0 -> 9401 bytes lib/chat.js | 21 +++++++++++++-- lib/site.js | 2 -- package-lock.json | 24 +++++++++++++++++- package.json | 1 + site/src/components/alert/index.vue | 3 +++ site/src/components/alert/script.js | 12 +++++++++ site/src/components/alert/style.styl | 4 +++ site/src/components/alert/template.html | 3 +++ site/src/components/chat/style.styl | 2 +- site/src/components/connexion/script.js | 16 +++++++++++- site/src/components/project/script.js | 4 ++- site/src/components/project/template.html | 1 + site/src/store/modules/chat.js | 9 ++++++- 14 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 lib/assets/images/notification-icon-200x200.png create mode 100644 site/src/components/alert/index.vue create mode 100644 site/src/components/alert/script.js create mode 100644 site/src/components/alert/style.styl create mode 100644 site/src/components/alert/template.html diff --git a/lib/assets/images/notification-icon-200x200.png b/lib/assets/images/notification-icon-200x200.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a12938501a26c0a8fa1de21ff01f01343b40e5 GIT binary patch literal 9401 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

^TK zY{7}#cYfe~EkC`DSjaK%XtSq%z>cczBl?=9m{AIUtUXAhb6yL$5>AA9L7gn{)=>qT z8x?(VGfk0)G9&5a#-q+urs@ry&#}tHk9c2IRmJ0pn^+Ay2qZK0*((h zOPYzlxI(N>KFx0i?2eUqm;$7kzl@iVs1k|}+@VROce>fC!dW4PhU%?meY0uIV*D_B zMpHA$;WCf%9hr_&zg>WPxOZA{=nzofXXQO@N?0y*Lh7WlsCqI{d<}Gra=$-w3b=U5 z58&|bO?qk+_yV~_S5{J4W|p24Q~+j@{{Dfp53v;O92-3}gip2=P5nZmM)~>uas_GE zKabR$qE#(3*q&d|RI{*OP2E#L9TAOzDVG71KRvRalzalyV?U<`zaEF5Guu-+=V}GLYIMEdB9=5O>5+% zKGZ)v0;1Bj2^?qz*bn8PFEaQaJJS;Tyf;mAPNcVA)0<>~ZX2C`r{8SfeeI|h#&URg zwMG(e$3_@&XFO}r(6+7yz$leN zbbhOPlR;8zC}{6YaWuPG0`M<_D0)NGVRQ6*y;@Lr>SH?|_VkWH?%OOrQIkep`&Y*JJ@c4rAtzk(vp@QqanARO5$zkqsfUhF#kf>Q9b^4z2MzTz` z9^sx$J>}mStU^q`VeOdrtgv+ISd-H)K!)v0mkt(xnXz;cX3gYu2^V+;`ZX?0_J{YN z_Xu%v8oNG8szShrOVgxHBtT2a!5@E1sA1xfml^}Us~nbwtaMXVlpUoE?|qI-MW+C%X}yOBQDaic5{C4BUw{{Bp)rLM15r(z%Ve*oe--9rEX literal 0 HcmV?d00001 diff --git a/lib/chat.js b/lib/chat.js index 9e8846e..05ad273 100644 --- a/lib/chat.js +++ b/lib/chat.js @@ -1,7 +1,7 @@ -'use strict' - const ids = require('./ids.js') const robotNames = require('./robot-names.json') +const nodeNotifier = require('node-notifier') +const path = require('path') class Chat { @@ -94,6 +94,23 @@ class Chat } }) + // On alert + socket.on('alert', () => + { + nodeNotifier.notify({ + title: 'Keppler', + message: 'Alert!', + icon: path.join(__dirname, 'assets/images/notification-icon-200x200.png'), + wait: true + }) + + // Debug + if(this.config.debug >= 1) + { + console.log('chat > socket'.green.bold + ' - ' + 'alert'.cyan + ' - ' + user.name.cyan) + } + }) + // On disconnect socket.on('disconnect', () => { diff --git a/lib/site.js b/lib/site.js index 70a0fcc..31cf65f 100644 --- a/lib/site.js +++ b/lib/site.js @@ -1,5 +1,3 @@ -'use strict' - // Dependencies const express = require('express') const helmet = require('helmet') diff --git a/package-lock.json b/package-lock.json index b6926a5..6e95e47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3828,6 +3828,11 @@ "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, "gzip-size": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", @@ -3994,7 +3999,8 @@ "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true }, "html-minifier": { "version": "3.5.3", @@ -5075,6 +5081,17 @@ } } }, + "node-notifier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "requires": { + "growly": "1.3.0", + "semver": "5.3.0", + "shellwords": "0.1.0", + "which": "1.2.14" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -6689,6 +6706,11 @@ "rechoir": "0.6.2" } }, + "shellwords": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", + "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=" + }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", diff --git a/package.json b/package.json index df822a2..dc726ab 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "ip": "^1.1.5", "mime": "^1.3.6", "minimatch": "^3.0.4", + "node-notifier": "^5.1.2", "opener": "^1.4.3", "slug": "^0.9.1", "socket.io": "^2.0.3", diff --git a/site/src/components/alert/index.vue b/site/src/components/alert/index.vue new file mode 100644 index 0000000..246515d --- /dev/null +++ b/site/src/components/alert/index.vue @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/site/src/components/alert/script.js b/site/src/components/alert/script.js new file mode 100644 index 0000000..f2bab88 --- /dev/null +++ b/site/src/components/alert/script.js @@ -0,0 +1,12 @@ +export default +{ + name: 'alert', + + methods: + { + onAlertClick() + { + this.$store.commit('setPendingAlert') + } + } +} \ No newline at end of file diff --git a/site/src/components/alert/style.styl b/site/src/components/alert/style.styl new file mode 100644 index 0000000..2ee7405 --- /dev/null +++ b/site/src/components/alert/style.styl @@ -0,0 +1,4 @@ +.alert + position fixed + bottom 0 + right 30px diff --git a/site/src/components/alert/template.html b/site/src/components/alert/template.html new file mode 100644 index 0000000..e6e6181 --- /dev/null +++ b/site/src/components/alert/template.html @@ -0,0 +1,3 @@ + + /!\ + \ No newline at end of file diff --git a/site/src/components/chat/style.styl b/site/src/components/chat/style.styl index b38c843..0013653 100644 --- a/site/src/components/chat/style.styl +++ b/site/src/components/chat/style.styl @@ -1,7 +1,7 @@ .chat position fixed bottom 0 - right 20px + right 90px .header cursor pointer diff --git a/site/src/components/connexion/script.js b/site/src/components/connexion/script.js index 03baea8..f68fd28 100644 --- a/site/src/components/connexion/script.js +++ b/site/src/components/connexion/script.js @@ -19,6 +19,11 @@ export default pendingMessage() { return this.$store.state.chat.pendingMessage + }, + + pendingAlert() + { + return this.$store.state.chat.pendingAlert } }, @@ -26,7 +31,8 @@ export default { project: 'onProjectChange', pendingUser: 'onPendingUser', - pendingMessage: 'onPendingMessage' + pendingMessage: 'onPendingMessage', + pendingAlert: 'onPendingAlert' }, created() @@ -119,6 +125,14 @@ export default { this.chatSocket.emit('message', value) } + }, + + onPendingAlert(value) + { + if(value) + { + this.chatSocket.emit('alert') + } } } } \ No newline at end of file diff --git a/site/src/components/project/script.js b/site/src/components/project/script.js index fd08fea..5d05603 100644 --- a/site/src/components/project/script.js +++ b/site/src/components/project/script.js @@ -1,6 +1,7 @@ import FilesTree from '@/components/files-tree' import File from '@/components/file' import Chat from '@/components/chat' +import Alert from '@/components/alert' export default { @@ -10,7 +11,8 @@ export default { FilesTree, File, - Chat + Chat, + Alert }, computed: diff --git a/site/src/components/project/template.html b/site/src/components/project/template.html index 3771b45..68e09e3 100644 --- a/site/src/components/project/template.html +++ b/site/src/components/project/template.html @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/site/src/store/modules/chat.js b/site/src/store/modules/chat.js index 1df5e8e..05c92a6 100644 --- a/site/src/store/modules/chat.js +++ b/site/src/store/modules/chat.js @@ -4,7 +4,8 @@ export default { user: null, pendingUser: null, messages: [], - pendingMessage: null + pendingMessage: null, + pendingAlert: null }, mutations: @@ -32,6 +33,12 @@ export default { setPendingMessage(state, data) { state.pendingMessage = data + }, + + setPendingAlert(state) + { + const date = new Date() + state.pendingAlert = { date } } } } \ No newline at end of file