From ef51036bc759ed1cd612491b705a3fd2f018b450 Mon Sep 17 00:00:00 2001 From: mariomitte Date: Fri, 17 Jul 2026 17:21:46 +0200 Subject: [PATCH] fix: refresh notifikacija nakon PDF zahtjeva (cache hit i async polling) Dodan _refreshNotificationsAsync() koji odmah osvjezi notifikacijski feed nakon cache hit PDF downloada, te _schedulePdfNotificationPolling() koji pollingom na 5s/20s/60s hvata Celery completion kad Pusher nije dostupan ili worker kasni. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- frontend/src/stores/fleetDashboardStore.js | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/frontend/src/stores/fleetDashboardStore.js b/frontend/src/stores/fleetDashboardStore.js index 2786db5..5a8531e 100644 --- a/frontend/src/stores/fleetDashboardStore.js +++ b/frontend/src/stores/fleetDashboardStore.js @@ -737,6 +737,25 @@ export async function createWorkOrderInvoice(workOrderId, data = {}, signal = nu return response; } +async function _refreshNotificationsAsync() { + if (!isBrowser()) return; + try { + const { fetchNotifications } = await import('./notificationStore.js'); + await fetchNotifications(); + } catch (_) { + // silent — ne blokiramo PDF flow zbog notifikacija + } +} + +// Polling za async PDF generiranje: osveži notifikacije na 5s, 20s i 60s +// kako bi uhvatili Celery completion bez ovisnosti o Pusher konekciji. +function _schedulePdfNotificationPolling() { + if (!isBrowser()) return; + [5000, 20000, 60000].forEach((delay) => { + setTimeout(() => _refreshNotificationsAsync(), delay); + }); +} + export async function downloadWorkOrderPdf(workOrderId) { if (!workOrderId) { throw new Error('Work order ID je obavezan.'); @@ -746,9 +765,11 @@ export async function downloadWorkOrderPdf(workOrderId) { if (payload?.status === 'ready' && payload?.download_url) { await downloadGeneratedPdfByUrl(payload.download_url, payload.filename || `${workOrderId}.work-order.pdf`); showToast('PDF putnog naloga je preuzet iz cache-a.', 'success'); + _refreshNotificationsAsync(); return payload; } showToast('PDF putnog naloga se generira u pozadini. Preuzimanje je dostupno kroz notifikaciju.', 'info'); + _schedulePdfNotificationPolling(); return payload; } @@ -761,9 +782,11 @@ export async function downloadWorkOrderInvoicesPdf(workOrderId) { if (payload?.status === 'ready' && payload?.download_url) { await downloadGeneratedPdfByUrl(payload.download_url, payload.filename || `${workOrderId}.work-order-invoices.pdf`); showToast('PDF računa putnog naloga je preuzet iz cache-a.', 'success'); + _refreshNotificationsAsync(); return payload; } showToast('PDF računa se generira u pozadini. Preuzimanje je dostupno kroz notifikaciju.', 'info'); + _schedulePdfNotificationPolling(); return payload; } @@ -776,9 +799,11 @@ export async function downloadWorkOrderServiceRecordsPdf(workOrderId) { if (payload?.status === 'ready' && payload?.download_url) { await downloadGeneratedPdfByUrl(payload.download_url, payload.filename || `${workOrderId}.work-order-service-records.pdf`); showToast('PDF servisnih zapisa je preuzet iz cache-a.', 'success'); + _refreshNotificationsAsync(); return payload; } showToast('PDF servisnih zapisa se generira u pozadini. Preuzimanje je dostupno kroz notifikaciju.', 'info'); + _schedulePdfNotificationPolling(); return payload; }