mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-30 11:54:33 +03:00
81c4b46977
fixes https://github.com/TryGhost/Team/issues/2625 - Adds an unique option to the mentions API. Enabling this will only return the latest mention from each source. - The frontend can fetch the related sources for each page by doing an extra request to the mentions API.
130 lines
3.3 KiB
JavaScript
130 lines
3.3 KiB
JavaScript
import Controller from '@ember/controller';
|
|
import {action} from '@ember/object';
|
|
import {inject as service} from '@ember/service';
|
|
import {task} from 'ember-concurrency';
|
|
import {tracked} from '@glimmer/tracking';
|
|
|
|
// Options 30 and 90 need an extra day to be able to distribute ticks/gridlines evenly
|
|
const DAYS_OPTIONS = [{
|
|
name: '7 Days',
|
|
value: 7
|
|
}, {
|
|
name: '30 Days',
|
|
value: 30 + 1
|
|
}, {
|
|
name: '90 Days',
|
|
value: 90 + 1
|
|
}];
|
|
|
|
export default class DashboardController extends Controller {
|
|
@service dashboardStats;
|
|
@service membersUtils;
|
|
@service store;
|
|
@service mentionUtils;
|
|
@service feature;
|
|
|
|
@tracked mentions = [];
|
|
@tracked hasNewMentions = false;
|
|
|
|
daysOptions = DAYS_OPTIONS;
|
|
|
|
@action
|
|
async loadMentions() {
|
|
if (!this.feature.get('webmentions')) {
|
|
return;
|
|
}
|
|
this.mentions = await this.store.query('mention', {unique: true, limit: 5, order: 'created_at desc'});
|
|
this.hasNewMentions = this.checkHasNewMentions();
|
|
|
|
// Load grouped mentions
|
|
await this.mentionUtils.loadGroupedMentions(this.mentions);
|
|
}
|
|
|
|
checkHasNewMentions() {
|
|
if (!this.mentions) {
|
|
return false;
|
|
}
|
|
const firstMention = this.mentions.firstObject;
|
|
if (!firstMention) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
const lastId = localStorage.getItem('lastMentionRead');
|
|
return firstMention.id !== lastId;
|
|
} catch (e) {
|
|
// localstorage disabled or not supported
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@action
|
|
markMentionsRead() {
|
|
try {
|
|
if (this.mentions) {
|
|
const firstMention = this.mentions.firstObject;
|
|
if (firstMention) {
|
|
localStorage.setItem('lastMentionRead', firstMention.id);
|
|
}
|
|
}
|
|
} catch (e) {
|
|
// localstorage disabled or not supported
|
|
}
|
|
|
|
// The opening of the popup breaks if we change hasNewMentions inside the handling (propably due to a rerender, so we need to delay it)
|
|
if (this.hasNewMentions) {
|
|
setTimeout(() => {
|
|
this.hasNewMentions = false;
|
|
}, 20);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@task
|
|
*loadSiteStatusTask() {
|
|
yield this.dashboardStats.loadSiteStatus();
|
|
return {};
|
|
}
|
|
|
|
@action
|
|
onDaysChange(selected) {
|
|
this.days = selected.value;
|
|
}
|
|
|
|
get days() {
|
|
return this.dashboardStats.chartDays;
|
|
}
|
|
|
|
set days(days) {
|
|
this.dashboardStats.chartDays = days;
|
|
}
|
|
|
|
get selectedDaysOption() {
|
|
return this.daysOptions.find(d => d.value === this.days);
|
|
}
|
|
|
|
get isLoading() {
|
|
return this.dashboardStats.siteStatus === null;
|
|
}
|
|
|
|
get totalMembers() {
|
|
return this.dashboardStats.memberCounts?.total ?? 0;
|
|
}
|
|
|
|
get isTotalMembersZero() {
|
|
return this.dashboardStats.memberCounts && this.totalMembers === 0;
|
|
}
|
|
|
|
get hasPaidTiers() {
|
|
return this.dashboardStats.siteStatus?.hasPaidTiers;
|
|
}
|
|
|
|
get areNewslettersEnabled() {
|
|
return this.dashboardStats.siteStatus?.newslettersEnabled;
|
|
}
|
|
|
|
get areMembersEnabled() {
|
|
return this.dashboardStats.siteStatus?.membersEnabled;
|
|
}
|
|
}
|