feat(journal): live updates on new entry via SSE (/api/events) — admin journal auto-refreshes when a student submits
This commit is contained in:
@@ -219,6 +219,29 @@ function goPage(p) {
|
||||
loadEntries();
|
||||
}
|
||||
|
||||
let liveSource = null;
|
||||
let liveReconnectTimer = null;
|
||||
function connectLiveUpdates() {
|
||||
if (liveSource) { liveSource.close(); liveSource = null; }
|
||||
const connect = () => {
|
||||
const t = sessionStorage.getItem('authToken');
|
||||
if (!t) return;
|
||||
liveSource = new EventSource(`${API}/api/events?token=${encodeURIComponent(t)}`);
|
||||
liveSource.addEventListener('entries_changed', () => {
|
||||
showToast('Поступила новая запись — список обновлён');
|
||||
page = 1;
|
||||
loadEntries();
|
||||
});
|
||||
liveSource.onerror = () => {
|
||||
if (liveSource) { liveSource.close(); liveSource = null; }
|
||||
if (liveReconnectTimer) clearTimeout(liveReconnectTimer);
|
||||
liveReconnectTimer = setTimeout(connect, 5000);
|
||||
};
|
||||
};
|
||||
connect();
|
||||
window.addEventListener('beforeunload', () => { if (liveSource) liveSource.close(); });
|
||||
}
|
||||
|
||||
async function openEdit(id) {
|
||||
const e = currentEntries.find(x => x.id === id);
|
||||
if (!e) return;
|
||||
@@ -670,5 +693,6 @@ document.getElementById('linkCopyBtn').addEventListener('click', copyLink);
|
||||
loadGroupOptions();
|
||||
loadStudentOptions();
|
||||
loadEntries();
|
||||
connectLiveUpdates();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user