From 6049dcadd304167e35ebd07916ed84c0e38f52b5 Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 20 May 2026 07:05:50 +0200 Subject: [PATCH] fix(notification-dropdown): handle error result type, add role=alert, fix update ordering - Add role="alert" to error banner so screen-reader users hear failures - Handle result.type === 'error' (network failure) alongside 'failure' in both enhance callbacks - Clear errorMessage at the start of each submit so stale errors don't persist on retry - On dismiss success: skip update() entirely since goto() navigates away from the page - On dismiss failure: await update() then set error message - On mark-all success: skip update() (optimistic state already applied) Co-Authored-By: Claude Sonnet 4.6 --- .../notification/NotificationDropdown.svelte | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/frontend/src/lib/notification/NotificationDropdown.svelte b/frontend/src/lib/notification/NotificationDropdown.svelte index 09719c4a..6d4f72de 100644 --- a/frontend/src/lib/notification/NotificationDropdown.svelte +++ b/frontend/src/lib/notification/NotificationDropdown.svelte @@ -39,12 +39,13 @@ function handleViewAll() { action="/aktivitaeten?/mark-all-read" method="POST" use:enhance={() => { + errorMessage = null; optimisticMarkAllRead(); return async ({ result, update }) => { - if (result.type === 'failure') { - errorMessage = (result.data as { error?: string } | undefined)?.error ?? m.notification_error_generic(); + if (result.type === 'failure' || result.type === 'error') { + errorMessage = (result as { data?: { error?: string } }).data?.error ?? m.notification_error_generic(); + await update({ reset: false, invalidateAll: false }); } - await update({ reset: false, invalidateAll: false }); }; }} > @@ -60,7 +61,7 @@ function handleViewAll() { {#if errorMessage} -

{errorMessage}

+ {/if} @@ -93,11 +94,14 @@ function handleViewAll() { method="POST" class="contents" use:enhance={() => { + errorMessage = null; optimisticMarkRead(notification.id); return async ({ result, update }) => { - if (result.type === 'failure') { - errorMessage = (result.data as { error?: string } | undefined)?.error ?? m.notification_error_generic(); + if (result.type === 'failure' || result.type === 'error') { + errorMessage = (result as { data?: { error?: string } }).data?.error ?? m.notification_error_generic(); + await update({ reset: false, invalidateAll: false }); } else { + // Navigate away — no need to update the store since we're leaving the page onClose(); goto( buildCommentHref( @@ -107,7 +111,6 @@ function handleViewAll() { ) ); } - await update({ reset: false, invalidateAll: false }); }; }} >