fix(reminders): keine Dauermeldung ohne localStorage, Mail nach Zeitaenderung, null-Pruefung
- Merkliste zusaetzlich im Arbeitsspeicher (sonst alle 10 s dieselbe Meldung) - Aendern der Faelligkeit atomar gegen gleichzeitiges Faelligwerden, setzt Mail-Spur zurueck - UpdateReminderDto lehnt null ab (400 statt 500) - keine Mails an deaktivierte Benutzer - Spaeter erinnern beschriftet heute/morgen nach dem berechneten Zeitpunkt - Bearbeiten schickt dueAt nur bei geaenderter Zeit Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,10 +6,10 @@ import { createPortal } from 'react-dom';
|
||||
import { requestBrowserPermissionOnce } from '@/lib/reminder-notify';
|
||||
import { defaultNewReminderInputs, isoToLocalInputs, localInputsToIso } from '@/lib/reminder-time';
|
||||
import {
|
||||
createReminder,
|
||||
type Reminder,
|
||||
type ReminderEmailStatus,
|
||||
ReminderRequestError,
|
||||
createReminder,
|
||||
updateReminder,
|
||||
} from '@/lib/reminders-api';
|
||||
|
||||
@@ -85,9 +85,15 @@ export function ReminderFormModal({
|
||||
setError(t('reminder.titleRequired'));
|
||||
return;
|
||||
}
|
||||
const dueAt = localInputsToIso(date, time);
|
||||
// Beim Bearbeiten nur senden, wenn Datum oder Uhrzeit wirklich geaendert
|
||||
// wurden: das Formular kennt keine Sekunden, ein unveraendertes Feld wuerde
|
||||
// die Faelligkeit sonst um bis zu 59 s verschieben — und kurz vor der
|
||||
// Faelligkeit faelschlich „in der Vergangenheit“ melden. Ist sie inzwischen
|
||||
// faellig, antwortet der Server ohnehin mit 409 (`alreadyDue`).
|
||||
const dueChanged = !reminder || date !== initial.date || time !== initial.time;
|
||||
const dueAt = dueChanged ? localInputsToIso(date, time) : undefined;
|
||||
// Spiegel der Serverregel: die Faelligkeit muss in der Zukunft liegen.
|
||||
if (dueAt === null || new Date(dueAt).getTime() <= Date.now()) {
|
||||
if (dueChanged && (!dueAt || new Date(dueAt).getTime() <= Date.now())) {
|
||||
setError(t('reminder.pastError'));
|
||||
return;
|
||||
}
|
||||
@@ -98,16 +104,15 @@ export function ReminderFormModal({
|
||||
// ist: ein Server, der E-Mail nicht mehr anbietet, lehnt `true` mit 400
|
||||
// ab — eine unveraenderte Alt-Einstellung darf das Speichern nicht kippen.
|
||||
const emailChanged = reminder ? emailEnabled !== reminder.emailEnabled : emailEnabled;
|
||||
const input = {
|
||||
const common = {
|
||||
title: trimmedTitle,
|
||||
description: description.trim(),
|
||||
dueAt,
|
||||
...(emailChanged ? { emailEnabled } : {}),
|
||||
};
|
||||
if (reminder) {
|
||||
await updateReminder(reminder.id, input);
|
||||
} else {
|
||||
await createReminder(input);
|
||||
await updateReminder(reminder.id, { ...common, ...(dueAt ? { dueAt } : {}) });
|
||||
} else if (dueAt) {
|
||||
await createReminder({ ...common, dueAt });
|
||||
}
|
||||
onSaved();
|
||||
onClose();
|
||||
|
||||
Reference in New Issue
Block a user