fix(notification): address review suggestions
- ChronikFuerDichBox: move update() inside the failure branch so success path skips it, matching NotificationDropdown's pattern - NotificationDropdown test: add role=alert assertion for mark-all-read failure to match existing dismiss-failure coverage in ChronikFuerDichBox - +page.server.ts: use getErrorMessage(undefined) instead of null so the missing-notificationId 400 goes through the same i18n pipeline as other errors Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -81,8 +81,8 @@ function href(n: NotificationItem): string {
|
|||||||
return async ({ result, update }) => {
|
return async ({ result, update }) => {
|
||||||
if (result.type === 'failure' || result.type === 'error') {
|
if (result.type === 'failure' || result.type === 'error') {
|
||||||
errorMessage = m.notification_error_generic();
|
errorMessage = m.notification_error_generic();
|
||||||
|
await update({ reset: false, invalidateAll: false });
|
||||||
}
|
}
|
||||||
await update({ reset: false, invalidateAll: false });
|
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -129,8 +129,8 @@ function href(n: NotificationItem): string {
|
|||||||
return async ({ result, update }) => {
|
return async ({ result, update }) => {
|
||||||
if (result.type === 'failure' || result.type === 'error') {
|
if (result.type === 'failure' || result.type === 'error') {
|
||||||
errorMessage = m.notification_error_generic();
|
errorMessage = m.notification_error_generic();
|
||||||
|
await update({ reset: false, invalidateAll: false });
|
||||||
}
|
}
|
||||||
await update({ reset: false, invalidateAll: false });
|
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -234,6 +234,23 @@ describe('NotificationDropdown', () => {
|
|||||||
expect(optimisticMarkAllRead).toHaveBeenCalledOnce();
|
expect(optimisticMarkAllRead).toHaveBeenCalledOnce();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('shows a role=alert error banner when mark-all-read returns a failure', async () => {
|
||||||
|
mockFormResult.type = 'failure';
|
||||||
|
render(NotificationDropdown, {
|
||||||
|
props: {
|
||||||
|
notifications: [makeNotification()],
|
||||||
|
optimisticMarkRead: () => {},
|
||||||
|
optimisticMarkAllRead: () => {},
|
||||||
|
onClose: () => {}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: /alle gelesen/i }).click();
|
||||||
|
|
||||||
|
const alert = document.querySelector('[role="alert"]');
|
||||||
|
expect(alert).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
it('calls onClose when the view-all button is clicked', async () => {
|
it('calls onClose when the view-all button is clicked', async () => {
|
||||||
const onClose = vi.fn();
|
const onClose = vi.fn();
|
||||||
render(NotificationDropdown, {
|
render(NotificationDropdown, {
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export const actions = {
|
|||||||
const data = await request.formData();
|
const data = await request.formData();
|
||||||
const raw = data.get('notificationId');
|
const raw = data.get('notificationId');
|
||||||
const notificationId = typeof raw === 'string' ? raw : null;
|
const notificationId = typeof raw === 'string' ? raw : null;
|
||||||
if (!notificationId) return fail(400, { error: null });
|
if (!notificationId) return fail(400, { error: getErrorMessage(undefined) });
|
||||||
const api = createApiClient(fetch);
|
const api = createApiClient(fetch);
|
||||||
const result = await api.PATCH('/api/notifications/{id}/read', {
|
const result = await api.PATCH('/api/notifications/{id}/read', {
|
||||||
params: { path: { id: notificationId } }
|
params: { path: { id: notificationId } }
|
||||||
|
|||||||
Reference in New Issue
Block a user