From 07a874ec997878b374942dfc247f5308f7173e14 Mon Sep 17 00:00:00 2001 From: Kibi Kelburton Date: Tue, 11 Aug 2026 17:59:24 +0200 Subject: [PATCH] uga aga --- public/s/js/upload.js | 26 ++++++++++++++++++++++++++ src/inc/routes/apiv2/upload.mjs | 8 +++++--- src/inc/routes/notifications.mjs | 9 ++++++--- src/upload_handler.mjs | 8 +++++--- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/public/s/js/upload.js b/public/s/js/upload.js index 03cb7c4..782d961 100644 --- a/public/s/js/upload.js +++ b/public/s/js/upload.js @@ -168,6 +168,32 @@ window.escapeHtmlUpload = window.escapeHtmlUpload || ((unsafe) => { const row = _$('uut-active-list')?.querySelector(`[data-jid="${CSS.escape(jobId)}"]`); if (row) { row.classList.add('uut-job--fading'); setTimeout(() => row.remove(), 300); } setTimeout(() => { _active.delete(jobId); _sync(); }, 350); + + const itemId = notif.item_id; + if (itemId && window.NotificationSystemInstance && typeof window.NotificationSystemInstance.handleNewItem === 'function') { + const grid = document.querySelector('.posts'); + if (grid && !grid.querySelector(`a[href$="/${itemId}"]`)) { + fetch(`/api/v2/item/${itemId}`) + .then(r => r.json()) + .then(res => { + if (res && res.success && res.rows) { + const item = res.rows; + window.NotificationSystemInstance.handleNewItem({ + id: item.id, + dest: item.dest, + mime: item.mime, + username: item.username, + display_name: item.display_name || null, + tag_id: item.rating_tag_id || item.tag_id || 0, + is_oc: !!item.is_oc, + slug: item.slug, + visibility: item.visibility || 0 + }); + } + }) + .catch(err => console.error('[UrlTracker] Failed to fetch item for live injection:', err)); + } + } } else { // Failure: update the row to show the error, keep until user closes const row = _$('uut-active-list')?.querySelector(`[data-jid="${CSS.escape(jobId)}"]`); diff --git a/src/inc/routes/apiv2/upload.mjs b/src/inc/routes/apiv2/upload.mjs index 6ea9d58..b5c5e8d 100644 --- a/src/inc/routes/apiv2/upload.mjs +++ b/src/inc/routes/apiv2/upload.mjs @@ -807,8 +807,8 @@ export default router => { } } - // Broadcast new_item event for live grid updates (only if auto-approved and public) - if (!isApprovalRequired && targetVisibility === 0) { + // Broadcast new_item event for live grid updates (only if auto-approved) + if (!isApprovalRequired) { try { await db`SELECT pg_notify('new_item', ${JSON.stringify({ id: itemid, @@ -817,7 +817,9 @@ export default router => { username: session.user, display_name: session.display_name || null, tag_id: effectiveRating ? (effectiveRating === 'sfw' ? 1 : (effectiveRating === 'nsfw' ? 2 : (cfg.nsfl_tag_id || 3))) : 0, - is_oc: !!is_oc + is_oc: !!is_oc, + slug: itemSlug, + visibility: targetVisibility })})`; } catch (err) { console.error('[UPLOAD-URL] new_item notify failed:', err); diff --git a/src/inc/routes/notifications.mjs b/src/inc/routes/notifications.mjs index b2b3c34..4d47a98 100644 --- a/src/inc/routes/notifications.mjs +++ b/src/inc/routes/notifications.mjs @@ -213,10 +213,13 @@ db.listen('motd', (payload) => { db.listen('new_item', (payload) => { try { const data = JSON.parse(payload); - if (data.visibility && data.visibility !== 0) return; - console.log(`[SSE] Broadcasting new_item (id: ${data.id}) to ${clients.size} clients`); + const itemVis = data.visibility || 0; + console.log(`[SSE] Broadcasting new_item (id: ${data.id}, visibility: ${itemVis}) to connected clients`); for (const client of clients) { - client.send({ type: 'new_item', data }); + const isOwner = client.username && data.username && client.username.toLowerCase() === data.username.toLowerCase(); + if (itemVis === 0 || isOwner) { + client.send({ type: 'new_item', data }); + } } } catch (e) { console.error('New item broadcast error:', e); diff --git a/src/upload_handler.mjs b/src/upload_handler.mjs index 417bdf9..912a26c 100644 --- a/src/upload_handler.mjs +++ b/src/upload_handler.mjs @@ -754,8 +754,8 @@ export const handleUpload = async (req, res, self) => { } } - // Broadcast new_item event for live grid updates (only if auto-approved and public) - if (!manualApproval && targetVisibility === 0) { + // Broadcast new_item event for live grid updates (only if auto-approved) + if (!manualApproval) { try { await db`SELECT pg_notify('new_item', ${JSON.stringify({ id: itemid, @@ -764,7 +764,9 @@ export const handleUpload = async (req, res, self) => { username: req.session.user, display_name: req.session.display_name || null, tag_id: effectiveRating ? (effectiveRating === 'sfw' ? 1 : (effectiveRating === 'nsfw' ? 2 : (cfg.nsfl_tag_id || 3))) : 0, - is_oc: !!is_oc + is_oc: !!is_oc, + slug: itemSlug, + visibility: targetVisibility })})`; } catch (err) { console.error('[UPLOAD] new_item notify failed:', err);