docbrown/app/assets/javascripts/initializers/initNotifications.js
Angel Barros bb8b32bdf2
Zappat0n/add rate limit model everywhere 11500 (#14609)
* Create showModalAfterError function

* Show modal when comments rate limit is reached

* Show modal when article reaction rate limit is reached

* Show modal when follow user rate limit is reached

* Show form error when listing creation rate limit is reached

* Show form error when feedback messages rate limit is reached

* Rename functions for listings rate limit checks

* Show modal when notifications reaction rate limit is reached

* Show modal when picture upload rate limit reached

* Show modal for reactable objects when rate limit reached

* Add and modify tests

* empty commit

* Match modal messages to tests

* Fix error updating Modals

Co-authored-by: Dan Uber <dan@forem.com>
2021-09-23 10:49:19 +01:00

205 lines
6.1 KiB
JavaScript

/* global checkUserLoggedIn, instantClick, InstantClick, sendHapticMessage, showModalAfterError */
function initNotifications() {
fetchNotificationsCount();
markNotificationsAsRead();
initReactions();
listenForNotificationsBellClick();
initFilter();
initPagination();
initLoadMoreButton();
}
function markNotificationsAsRead() {
setTimeout(function () {
if (document.getElementById('notifications-container')) {
var xmlhttp;
var locationAsArray = window.location.pathname.split('/');
// Use regex to ensure only numbers in the original string are converted to integers
var parsedLastParam = parseInt(
locationAsArray[locationAsArray.length - 1].replace(/[^0-9]/g, ''),
10,
);
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}
xmlhttp.onreadystatechange = function () {};
var csrfToken = document.querySelector("meta[name='csrf-token']").content;
if (Number.isInteger(parsedLastParam)) {
xmlhttp.open(
'Post',
'/notifications/reads?org_id=' + parsedLastParam,
true,
);
} else {
xmlhttp.open('Post', '/notifications/reads', true);
}
xmlhttp.setRequestHeader('X-CSRF-Token', csrfToken);
xmlhttp.send();
}
}, 450);
}
function fetchNotificationsCount() {
if (
document.getElementById('notifications-container') == null &&
checkUserLoggedIn()
) {
// Prefetch notifications page
if (instantClick) {
InstantClick.removeExpiredKeys('force');
setTimeout(function () {
InstantClick.preload(
document.getElementById('notifications-link').href,
'force',
);
}, 30);
}
}
}
function initReactions() {
setTimeout(function () {
if (document.getElementById('notifications-container')) {
var butts = document.getElementsByClassName('reaction-button');
for (var i = 0; i < butts.length; i++) {
var butt = butts[i];
butt.onclick = function (event) {
event.preventDefault();
sendHapticMessage('medium');
var thisButt = this;
thisButt.classList.add('reacted');
function successCb(response) {
if (response.result === 'create') {
thisButt.classList.add('reacted');
} else {
thisButt.classList.remove('reacted');
}
}
var formData = new FormData();
formData.append('reactable_type', thisButt.dataset.reactableType);
formData.append('category', thisButt.dataset.category);
formData.append('reactable_id', thisButt.dataset.reactableId);
getCsrfToken()
.then(sendFetch('reaction-creation', formData))
.then(function (response) {
if (response.status === 200) {
response.json().then(successCb);
} else {
showModalAfterError({
response,
element: 'reaction',
action_ing: 'updating',
action_past: 'updated',
});
}
});
};
}
butts = document.getElementsByClassName('toggle-reply-form');
for (let i = 0; i < butts.length; i++) {
const butt = butts[i];
butt.onclick = function (event) {
event.preventDefault();
var thisButt = this;
document
.getElementById('comment-form-for-' + thisButt.dataset.reactableId)
.classList.remove('hidden');
thisButt.classList.add('hidden');
thisButt.classList.remove('inline-flex');
setTimeout(function () {
document
.getElementById(
'comment-textarea-for-' + thisButt.dataset.reactableId,
)
.focus();
}, 30);
};
}
}
}, 180);
}
function listenForNotificationsBellClick() {
var notificationsLink = document.getElementById('notifications-link');
if (notificationsLink) {
setTimeout(function () {
notificationsLink.onclick = function () {
document.getElementById('notifications-number').classList.add('hidden');
};
}, 180);
}
}
function initFilter() {
const notificationsFilterSelect = document.getElementById(
'notifications-filter__select',
);
const changeNotifications = (event) => {
window.location.href = event.target.value;
};
if (notificationsFilterSelect) {
notificationsFilterSelect.addEventListener('change', changeNotifications);
}
}
function initPagination() {
// paginators appear after each block of HTML notifications sent by the server
const paginators = document.getElementsByClassName('notifications-paginator');
if (paginators && paginators.length > 0) {
const paginator = paginators[paginators.length - 1];
if (paginator) {
window
.fetch(paginator.dataset.paginationPath, {
method: 'GET',
credentials: 'same-origin',
})
.then(function (response) {
if (response.status === 200) {
response.text().then(function (html) {
const markup = html.trim();
if (markup) {
const container = document.getElementById('articles-list');
const newNotifications = document.createElement('div');
newNotifications.innerHTML = markup;
paginator.remove();
container.append(newNotifications);
initReactions();
} else {
// no more notifications to load, we hide the load more wrapper
const button = document.getElementById('load-more-button');
if (button) {
button.style.display = 'none';
}
paginator.remove();
}
});
}
});
}
}
}
function initLoadMoreButton() {
const button = document.getElementById('load-more-button');
if (button) {
button.addEventListener('click', initPagination);
}
}