import $ from 'jquery';
import { config } from 'grav-config';
import request from '../utils/request';
const canFetchNotifications = () => config.notifications;
class Notifications {
showNotificationInFeed(notification, index) {
let notifications = $('#notifications').removeClass('hidden');
let loader = notifications.find('.widget-loader').hide();
let content = notifications.find('.widget-content > ul').show();
loader.find('div').remove();
loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');
if (!notification.type) {
notification.type = 'note';
}
switch (notification.type) {
case 'note':
notification.intro_text = 'Note';
break;
case 'info':
notification.intro_text = 'Info';
break;
case 'warning':
notification.intro_text = 'Warning';
break;
}
let hidden = '';
if (index > 9) {
hidden = ' hidden ';
}
if (notification.link) {
const title = document.createElement('div');
title.innerHTML = notification.message;
content.append(`
${notification.intro_text}
${notification.message}
`);
} else {
let clean_text = $('' + notification.message + '
').text();
content.append(`
${notification.intro_text}
${notification.message}
`);
}
}
addShowAllInFeed() {
$('#notifications ul').append(`
Show all
`);
}
showNotificationInTop(notification) {
let element;
if (notification.link) {
element = $(``);
} else {
element = $(`
${notification.message}
${notification.closeButton}
`);
}
element.hide();
$('.top-notifications-container').removeClass('hidden').addClass('default-box-shadow').append(element);
element.slideDown(150);
}
showNotificationInDashboard(notification) {
let element;
if (notification.link) {
element = $(``);
} else {
element = $(`
${notification.message}
${notification.closeButton}
`);
}
element.hide();
$('.dashboard-notifications-container').removeClass('hidden').append(element);
element.slideDown(150);
}
showNotificationInPlugins(notification) {
let element;
if (notification.link) {
element = $(``);
} else {
element = $(`
${notification.message} ${notification.closeButton}
`);
}
element.hide();
$('.plugins-notifications-container').removeClass('hidden').append(element);
element.slideDown(150);
}
showNotificationInThemes(notification) {
let element;
if (notification.link) {
element = $(``);
} else {
element = $(`
${notification.message}
${notification.closeButton}
`);
}
element.hide();
$('.themes-notifications-container').removeClass('hidden').append(element);
element.slideDown(150);
}
processLocation(location, notification, index = 0) {
switch (location) {
case 'feed':
this.showNotificationInFeed(notification, index);
break;
case 'top':
if (!notification.read) {
this.showNotificationInTop(notification);
}
break;
case 'dashboard':
if (!notification.read) {
this.showNotificationInDashboard(notification);
}
break;
case 'plugins':
if (!notification.read) {
this.showNotificationInPlugins(notification);
}
break;
case 'themes':
if (!notification.read) {
this.showNotificationInThemes(notification);
}
break;
}
}
// Grav.default.Notifications.fetch()
fetch({ locations = [], refresh = false } = {}) {
if (!canFetchNotifications()) {
return false;
}
let that = this;
let feed = $('#notifications');
let loader = feed.find('.widget-loader');
let content = feed.find('.widget-content > ul');
loader.find('div').remove();
loader.find('.fa-warning').removeClass('fa-warning').addClass('fa-refresh fa-spin');
loader.show();
content.hide();
let processNotifications = function processNotifications(response) {
let notifications = response.notifications;
$('#notifications').find('.widget-content > ul').empty();
if (notifications) {
let index = 0;
notifications.forEach(function(notification, i) {
notification.closeButton = ``;
if (notification.options && notification.options.indexOf('sticky') !== -1) {
notification.closeButton = '';
}
if (Array.isArray(notification.location)) {
notification.location.forEach(function(location) {
if (locations.length && locations.indexOf(location) === -1) {
return;
}
if (location === 'feed') {
that.processLocation(location, notification, index);
index++;
} else {
that.processLocation(location, notification);
}
});
} else {
if (locations.length && locations.indexOf(notification.location) === -1) {
return;
}
that.processLocation(notification.location, notification);
}
});
if (index > 10) {
that.addShowAllInFeed();
}
}
};
request(`${config.base_url_relative}/notifications.json/task${config.param_sep}getNotifications`, {
method: 'post'
}, (response) => {
if (response.need_update === true || refresh) {
$.get((config.local_notifications ? 'http://localhost' : 'https://getgrav.org') + '/notifications.json?' + Date.now()).then(function(response) {
request(`${config.base_url_relative}/notifications.json/task${config.param_sep}processNotifications`, {
method: 'post',
body: { 'notifications': JSON.stringify(response) }
}, (response) => {
if (response.show_immediately === true) {
processNotifications(response);
}
});
}).fail(function() {
let widget = $('#notifications .widget-content');
widget
.find('.widget-loader')
.find('div').remove();
widget
.find('.widget-loader')
.append('Failed to retrieve notifications
')
.find('.fa-spin')
.removeClass('fa-spin fa-refresh').addClass('fa-warning');
});
}
processNotifications(response);
});
}
}
let notifications = new Notifications();
export default notifications;
if (canFetchNotifications()) {
notifications.fetch();
$(document).on('click', '[data-notification-action="hide-notification"]', (event) => {
let notification_id = $(event.target).parents('.hide-notification').data('notification-id');
let url = `${config.base_url_relative}/notifications.json/task${config.param_sep}hideNotification/notification_id${config.param_sep}${notification_id}`;
request(url, { method: 'post' }, () => {});
$(event.target).parents('.single-notification').hide();
});
$(document).on('click', '[data-notification-action="show-all-notifications"]', (event) => {
$('#notifications .show-all').hide();
$('#notifications .hidden').removeClass('hidden');
});
$(document).on('click', '[data-refresh="notifications"]', (event) => {
event.preventDefault();
notifications.fetch({ locations: ['feed'], refresh: true });
});
}