From 4e53e02519ae68e238a6654e67b6dbdb1ff1c891 Mon Sep 17 00:00:00 2001 From: lrnselfreliance <33263708+lrnselfreliance@users.noreply.github.com> Date: Mon, 12 Oct 2026 08:37:13 -0600 Subject: [PATCH] Notifications without a URL are not links (#823) Transcode, job, and Kiwix notifications send no URL, but every user notify toast said "Click here to view the shared page" and opened /null on click. Only a notification carrying a URL is followable now. Co-authored-by: Claude Opus 5.5 --- app/src/Events.js | 20 ++++++++++++-------- app/src/Events.test.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 app/src/Events.test.js diff --git a/app/src/Events.js b/app/src/Events.js index 3d21622b..a9959b44 100644 --- a/app/src/Events.js +++ b/app/src/Events.js @@ -9,7 +9,7 @@ function eventToast(title, description, type = 'info', time = 5000, onClick = nu toast({type: type, title: title, description: description, time: time, onClick: onClick}); } -function handleEvents(events) { +export function handleEvents(events) { const newestEvents = {}; events.forEach(e => { @@ -63,13 +63,17 @@ function handleEvents(events) { } if (event === 'user_notify_message') { - console.log(message, url); - eventToast( - message, - 'Click here to view the shared page', - 'info', - 10_000, - () => window.open(url, '_self')); + // Only a shared page carries a URL; other notifications (jobs, transcodes) are text. + if (url) { + eventToast( + message, + 'Click here to view the shared page', + 'info', + 10_000, + () => window.open(url, '_self')); + } else { + eventToast(message, null, 'info', 10_000); + } } if (event === 'deleted') { diff --git a/app/src/Events.test.js b/app/src/Events.test.js new file mode 100644 index 00000000..d6644fb4 --- /dev/null +++ b/app/src/Events.test.js @@ -0,0 +1,33 @@ +import {handleEvents} from './Events'; +import {toast} from './components/ui'; + +jest.mock('./components/ui', () => ({toast: jest.fn()})); + +const notify = (url) => ({event: 'user_notify_message', message: 'Transcoding video.mp4', dt: '2026-10-12', url}); + +afterEach(() => { + toast.mockClear(); +}); + +describe('user_notify_message', () => { + it('a notification without a URL is plain text, not a link', () => { + handleEvents([notify(null)]); + + expect(toast).toHaveBeenCalledTimes(1); + const options = toast.mock.calls[0][0]; + expect(options.title).toBe('Transcoding video.mp4'); + expect(options.description).toBeFalsy(); + expect(options.onClick).toBeFalsy(); + }); + + it('a shared page opens its URL when clicked', () => { + const open = jest.spyOn(window, 'open').mockImplementation(() => null); + handleEvents([notify('/archive/1')]); + + const options = toast.mock.calls[0][0]; + expect(options.description).toBe('Click here to view the shared page'); + options.onClick(); + expect(open).toHaveBeenCalledWith('/archive/1', '_self'); + open.mockRestore(); + }); +});