diff --git a/ghost/admin/app/controllers/dashboard.js b/ghost/admin/app/controllers/dashboard.js index 048be6bb68..ee91f54b4f 100644 --- a/ghost/admin/app/controllers/dashboard.js +++ b/ghost/admin/app/controllers/dashboard.js @@ -7,6 +7,7 @@ import {tracked} from '@glimmer/tracking'; export default class DashboardController extends Controller { @service feature; @service session; + @service membersActivity; @service membersStats; @service store; @service settings; @@ -162,7 +163,7 @@ export default class DashboardController extends Controller { loadEvents() { this.eventsLoading = true; - this.membersStats.fetchTimeline({limit: 5}).then(({events}) => { + this.membersActivity.fetchTimeline({limit: 5}).then(({events}) => { this.eventsData = events; this.eventsLoading = false; }, (error) => { diff --git a/ghost/admin/app/services/members-activity.js b/ghost/admin/app/services/members-activity.js index 8f644cfc6b..bb5e1cd98b 100644 --- a/ghost/admin/app/services/members-activity.js +++ b/ghost/admin/app/services/members-activity.js @@ -1,5 +1,38 @@ import Service from '@ember/service'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency-decorators'; + +const ONE_MINUTE = 1 * 60 * 1000; export default class MembersActivityService extends Service { + @service ajax; + @service ghostPaths; + _lastFetchedTimeline = null; + _lastFetchedTimelineLimit = null; + + async fetchTimeline(options = {}) { + let staleData = this._lastFetchedTimeline && (new Date() - this._lastFetchedTimeline) > ONE_MINUTE; + let differentLimit = this._lastFetchedTimelineLimit && this._lastFetchedTimelineLimit !== options.limit; + + if (this._fetchTimelineTask.isRunning) { + return this._fetchTimelineTask.last; + } + + if (this.events && !staleData && !differentLimit) { + return this.events; + } + + return this._fetchTimelineTask.perform(options.limit); + } + + @task + *_fetchTimelineTask(limit) { + this._lastFetchedTimeline = new Date(); + this._lastFetchedTimelineLimit = limit; + let eventsUrl = this.ghostPaths.url.api('members/events'); + let events = yield this.ajax.request(eventsUrl, {data: {limit}}); + this.events = events; + return events; + } } diff --git a/ghost/admin/app/services/members-stats.js b/ghost/admin/app/services/members-stats.js index 570ac57ee9..a7832eb609 100644 --- a/ghost/admin/app/services/members-stats.js +++ b/ghost/admin/app/services/members-stats.js @@ -35,21 +35,6 @@ export default class MembersStatsService extends Service { return this._fetchTask.perform(); } - fetchTimeline(options = {}) { - let staleData = this._lastFetchedTimeline && (new Date() - this._lastFetchedTimeline) > ONE_MINUTE; - let differentLimit = this._lastFetchedTimelineLimit && this._lastFetchedTimelineLimit !== options.limit; - - if (this._fetchTimelineTask.isRunning) { - return this._fetchTask.last; - } - - if (this.events && !this._forceRefresh && !staleData && !differentLimit) { - return Promise.resolve(this.events); - } - - return this._fetchTimelineTask.perform(options.limit); - } - fetchCounts() { let staleData = this._lastFetchedCounts && (new Date() - this._lastFetchedCounts) > ONE_MINUTE; @@ -235,14 +220,4 @@ export default class MembersStatsService extends Service { this.stats = stats; return stats; } - - @task - *_fetchTimelineTask(limit) { - this._lastFetchedTimeline = new Date(); - this._lastFetchedTimelineLimit = limit; - let eventsUrl = this.ghostPaths.url.api('members/events'); - let events = yield this.ajax.request(eventsUrl, {data: {limit}}); - this.events = events; - return events; - } }