Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.7 KiB
150 lines
3.7 KiB
const {AppSubUrl, csrf, NotificationSettings} = window.config; |
|
|
|
export function initNotificationsTable() { |
|
$('#notification_table .button').on('click', async function () { |
|
const data = await updateNotification( |
|
$(this).data('url'), |
|
$(this).data('status'), |
|
$(this).data('page'), |
|
$(this).data('q'), |
|
$(this).data('notification-id'), |
|
); |
|
|
|
$('#notification_div').replaceWith(data); |
|
initNotificationsTable(); |
|
await updateNotificationCount(); |
|
|
|
return false; |
|
}); |
|
} |
|
|
|
export function initNotificationCount() { |
|
const notificationCount = $('.notification_count'); |
|
|
|
if (!notificationCount.length) { |
|
return; |
|
} |
|
|
|
if (NotificationSettings.EventSourceUpdateTime > 0 && !!window.EventSource) { |
|
// Try to connect to the event source first |
|
const source = new EventSource(`${AppSubUrl}/user/events`); |
|
source.addEventListener('notification-count', async (e) => { |
|
try { |
|
const data = JSON.parse(e.data); |
|
|
|
const notificationCount = $('.notification_count'); |
|
if (data.Count === 0) { |
|
notificationCount.addClass('hidden'); |
|
} else { |
|
notificationCount.removeClass('hidden'); |
|
} |
|
|
|
notificationCount.text(`${data.Count}`); |
|
await updateNotificationTable(); |
|
} catch (error) { |
|
console.error(error); |
|
} |
|
}); |
|
source.addEventListener('logout', async (e) => { |
|
if (e.data !== 'here') { |
|
return; |
|
} |
|
source.close(); |
|
window.location.href = AppSubUrl; |
|
}); |
|
window.addEventListener('beforeunload', () => { |
|
source.close(); |
|
}); |
|
return; |
|
} |
|
|
|
if (NotificationSettings.MinTimeout <= 0) { |
|
return; |
|
} |
|
|
|
const fn = (timeout, lastCount) => { |
|
setTimeout(async () => { |
|
await updateNotificationCountWithCallback(fn, timeout, lastCount); |
|
}, timeout); |
|
}; |
|
|
|
fn(NotificationSettings.MinTimeout, notificationCount.text()); |
|
} |
|
|
|
async function updateNotificationCountWithCallback(callback, timeout, lastCount) { |
|
const currentCount = $('.notification_count').text(); |
|
if (lastCount !== currentCount) { |
|
callback(NotificationSettings.MinTimeout, currentCount); |
|
return; |
|
} |
|
|
|
const newCount = await updateNotificationCount(); |
|
let needsUpdate = false; |
|
|
|
if (lastCount !== newCount) { |
|
needsUpdate = true; |
|
timeout = NotificationSettings.MinTimeout; |
|
} else if (timeout < NotificationSettings.MaxTimeout) { |
|
timeout += NotificationSettings.TimeoutStep; |
|
} |
|
|
|
callback(timeout, newCount); |
|
if (needsUpdate) { |
|
await updateNotificationTable(); |
|
} |
|
} |
|
|
|
async function updateNotificationTable() { |
|
const notificationDiv = $('#notification_div'); |
|
if (notificationDiv.length > 0) { |
|
const data = await $.ajax({ |
|
type: 'GET', |
|
url: `${AppSubUrl}/notifications?${notificationDiv.data('params')}`, |
|
data: { |
|
'div-only': true, |
|
} |
|
}); |
|
notificationDiv.replaceWith(data); |
|
initNotificationsTable(); |
|
} |
|
} |
|
|
|
async function updateNotificationCount() { |
|
const data = await $.ajax({ |
|
type: 'GET', |
|
url: `${AppSubUrl}/api/v1/notifications/new`, |
|
headers: { |
|
'X-Csrf-Token': csrf, |
|
}, |
|
}); |
|
|
|
const notificationCount = $('.notification_count'); |
|
if (data.new === 0) { |
|
notificationCount.addClass('hidden'); |
|
} else { |
|
notificationCount.removeClass('hidden'); |
|
} |
|
|
|
notificationCount.text(`${data.new}`); |
|
|
|
return `${data.new}`; |
|
} |
|
|
|
async function updateNotification(url, status, page, q, notificationID) { |
|
if (status !== 'pinned') { |
|
$(`#notification_${notificationID}`).remove(); |
|
} |
|
|
|
return $.ajax({ |
|
type: 'POST', |
|
url, |
|
data: { |
|
_csrf: csrf, |
|
notification_id: notificationID, |
|
status, |
|
page, |
|
q, |
|
noredirect: true, |
|
}, |
|
}); |
|
}
|
|
|