From 8d2cfab6cb81205be10120fe482b19fc20e8a9ef Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Sun, 12 Feb 2017 19:34:05 +0100 Subject: [PATCH] add polling git for issue changes --- app-src/img/icon_128x128-with-pad.png | Bin 0 -> 7466 bytes app-src/img/icon_128x128.png | Bin 0 -> 10626 bytes app-src/scripts/_app.js | 22 ++++- app-src/scripts/constants.js | 1 + app-src/scripts/main/global-services/git-s.js | 87 ++++++++++++++++-- .../main/global-services/notifier-s.js | 9 ++ app-src/scripts/task-list/task-list-d.html | 2 +- 7 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 app-src/img/icon_128x128-with-pad.png create mode 100644 app-src/img/icon_128x128.png diff --git a/app-src/img/icon_128x128-with-pad.png b/app-src/img/icon_128x128-with-pad.png new file mode 100644 index 0000000000000000000000000000000000000000..e25a689b2cc3a421161baabbce3d4d3c0271f63a GIT binary patch literal 7466 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 literal 0 HcmV?d00001 diff --git a/app-src/scripts/_app.js b/app-src/scripts/_app.js index 32b6b24999..0eae9f6bc3 100644 --- a/app-src/scripts/_app.js +++ b/app-src/scripts/_app.js @@ -39,6 +39,7 @@ .config(fixUnhandledRejectionError) .run(initGlobalModels) .run(initPollJiraTaskUpdates) + .run(initPollGitTaskUpdates) .run(initPollForSimpleTimeTracking) .run(initMousewheelZoomForElectron) .run(initGlobalShortcuts) @@ -149,19 +150,32 @@ /* @ngInject */ function initPollJiraTaskUpdates($localStorage, Jira, IS_ELECTRON, $interval, JIRA_UPDATE_POLL_INTERVAL) { - // handle updates that need to be made locally if (IS_ELECTRON) { - // one initial - Jira.checkForUpdates($localStorage.tasks); + // one initial call + if (Jira.isSufficientJiraSettings()) { + Jira.checkForUpdates($localStorage.tasks); + } $interval(() => { - if ($localStorage.currentTask) { + if (Jira.isSufficientJiraSettings()) { Jira.checkForUpdates($localStorage.tasks); } }, JIRA_UPDATE_POLL_INTERVAL); } } + /* @ngInject */ + function initPollGitTaskUpdates($localStorage, Git, $interval, GIT_UPDATE_POLL_INTERVAL) { + // one initial + Git.checkAndUpdateTasks($localStorage.tasks); + + $interval(() => { + if ($localStorage.git.projectDir && $localStorage.git.repo) { + Git.checkAndUpdateTasks($localStorage.tasks); + } + }, GIT_UPDATE_POLL_INTERVAL); + } + /* @ngInject */ function showWelcomeDialog($localStorage, Dialogs) { if ($localStorage.isShowWelcomeDialog) { diff --git a/app-src/scripts/constants.js b/app-src/scripts/constants.js index d836a0dea2..a414aae7f4 100644 --- a/app-src/scripts/constants.js +++ b/app-src/scripts/constants.js @@ -125,6 +125,7 @@ .constant('REQUEST_TIMEOUT', 15000) .constant('WORKLOG_DATE_STR_FORMAT', 'YYYY-MM-DD') .constant('JIRA_UPDATE_POLL_INTERVAL', 60 * 1000 * 5) + .constant('GIT_UPDATE_POLL_INTERVAL', 60 * 1000 * 0.25) .constant('SIMPLE_TIME_TRACKING_INTERVAL', 1000 * 5) .constant('IS_ELECTRON', (typeof window.ipcRenderer !== 'undefined')) .constant('THEMES', [ diff --git a/app-src/scripts/main/global-services/git-s.js b/app-src/scripts/main/global-services/git-s.js index 1462dc6c18..f2458cbcb8 100644 --- a/app-src/scripts/main/global-services/git-s.js +++ b/app-src/scripts/main/global-services/git-s.js @@ -14,14 +14,20 @@ .service('Git', Git); /* @ngInject */ - function Git($http, $localStorage) { + function Git($http, $localStorage, TasksUtil, $injector, $q, Notifier, SimpleToast) { const TYPE = 'GITHUB'; const BASE_URL = 'https://api.github.com/'; const settings = $localStorage.git; - function mapIssue(issue) { + // PRIVATE HELPER FUNCTIONS + // ------------------------ + function transformIssue(issue) { let title; + if (typeof issue === 'string') { + issue = angular.fromJson(issue); + } + if (issue.pull_request) { title = `${settings.prPrefix} #${issue.number}: ${issue.title}`; } else { @@ -45,17 +51,11 @@ } const newIssues = []; issues.forEach((issue) => { - newIssues.push(mapIssue(issue)); + newIssues.push(transformIssue(issue)); }); return newIssues; } - this.getIssueList = () => { - return $http.get(BASE_URL + 'repos/' + settings.repo + '/issues', { - transformResponse: [transformIssueList] - }); - }; - function transformComments(comments) { if (typeof comments === 'string') { comments = angular.fromJson(comments); @@ -71,12 +71,81 @@ return newComments; } + function taskIsUpdatedHandler(updatedTask) { + if (updatedTask) { + Notifier({ + title: 'Git Update', + message: '"' + updatedTask.title + '" => has been updated as it was updated on Git.', + sound: true, + wait: true + }); + SimpleToast('"' + updatedTask.title + '" => has been updated as it was updated on Git.'); + } + } + + // HELPER METHODS + // -------------- + this.isGitTask = (task) => { + return task && task.originalId && task.originalType === TYPE; + }; + + // API METHODS + // ----------- + this.getIssueList = () => { + return $http.get(BASE_URL + 'repos/' + settings.repo + '/issues', { + transformResponse: [transformIssueList] + }); + }; + this.getCommentListForIssue = (issueNumber) => { return $http.get(BASE_URL + 'repos/' + settings.repo + '/issues/' + issueNumber + '/comments', { transformResponse: [transformComments] }); }; + this.getIssueById = (issueNumber) => { + return $http.get(BASE_URL + 'repos/' + settings.repo + '/issues/' + issueNumber, { + transformResponse: [transformIssue] + }); + }; + + // COMPLEXER WRAPPER METHODS + // ------------------------- + this.checkAndUpdateTasks = (tasks) => { + const TasksUtil = $injector.get('TasksUtil'); + const defer = $q.defer(); + + const tasksToPoll = TasksUtil.flattenTasks(tasks, this.isGitTask, this.isGitTask); + + // execute requests sequentially to have a little more time + const pollPromise = tasksToPoll.reduce((promise, task) => + promise.then(() => + this.getIssueById(task.originalId) + .then((res) => { + const issue = res.data; + const lastUpdate = moment(task.originalUpdated); + if (lastUpdate && moment(issue.originalUpdated).isAfter(lastUpdate)) { + // extend task with new values + angular.extend(task, issue); + taskIsUpdatedHandler(issue, task); + + // also update comment list in the next step + this.getCommentListForIssue(task.originalId) + .then((res) => { + task.originalComments = res.data; + }); + } + }, defer.reject) + ), Promise.resolve() + ); + + pollPromise + .then(() => { + defer.resolve(); + }); + + return defer.promise; + }; } })(); diff --git a/app-src/scripts/main/global-services/notifier-s.js b/app-src/scripts/main/global-services/notifier-s.js index db4d8b6f8b..47df351c4a 100644 --- a/app-src/scripts/main/global-services/notifier-s.js +++ b/app-src/scripts/main/global-services/notifier-s.js @@ -17,10 +17,19 @@ function Notifier(IS_ELECTRON) { const IPC_NOTIFIER_EV = 'NOTIFY'; + if (!IS_ELECTRON && Notification && Notification.permission !== 'granted') { + Notification.requestPermission(); + } + return function (notification) { if (IS_ELECTRON) { // send to electron window.ipcRenderer.send(IPC_NOTIFIER_EV, notification); + } else if (Notification && Notification.permission === 'granted') { + new Notification(notification.title, { + icon: notification.icon || 'img/icon_128x128-with-pad.png', + body: notification.message + }); } }; diff --git a/app-src/scripts/task-list/task-list-d.html b/app-src/scripts/task-list/task-list-d.html index ca8bd78904..da16717681 100644 --- a/app-src/scripts/task-list/task-list-d.html +++ b/app-src/scripts/task-list/task-list-d.html @@ -145,7 +145,7 @@
-
Notes
+
{{ task.originalId ? 'Description': 'Notes' }}