diff --git a/apps/pwa/src/api/client.ts b/apps/pwa/src/api/client.ts index 145816e..3776144 100644 --- a/apps/pwa/src/api/client.ts +++ b/apps/pwa/src/api/client.ts @@ -131,6 +131,14 @@ export interface CalendarOccurrence { * stay in sync with the server type (Pitfall 4 — atomic mirror, Plan 06-05). */ hasRrule: boolean; + /** + * Per-event reminder lead in minutes. NULL = no reminder. 0 = same-day all-day + * (fire 9 AM on event date). Positive integer = N minutes before event start. + * D-06: NULL and 0 are semantically distinct. + * Mirrors CalendarOccurrence.reminderLeadMinutes in apps/api/src/broker/expand.ts + * (atomic mirror, Plan 11-03). + */ + reminderLeadMinutes: number | null; } export interface OccurrencesResponse { @@ -194,6 +202,14 @@ export interface CreateEventPayload { recurrenceCount?: number; location?: string; description?: string; + /** + * Per-event reminder lead in minutes. + * absent/undefined = no-change (edit omits field so server preserves existing VALARM, D-08) + * null = explicit "None" (clear any VALARM) + * 0 = same-day all-day (fire 9 AM on event date, D-05) + * positive integer = N minutes before event start + */ + reminderLeadMinutes?: number | null; calendarUrl?: string; // omit to use the member's default writable calendar (D-01) } diff --git a/apps/pwa/src/components/EventDetailPopover.test.tsx b/apps/pwa/src/components/EventDetailPopover.test.tsx index a5ac191..65dc7ac 100644 --- a/apps/pwa/src/components/EventDetailPopover.test.tsx +++ b/apps/pwa/src/components/EventDetailPopover.test.tsx @@ -59,6 +59,7 @@ const TIMED_OCCURRENCE: CalendarOccurrence = { location: 'Conference Room B', description: 'Daily team sync meeting', hasRrule: false, + reminderLeadMinutes: null, }; const OCCURRENCE_WITH_HTML: CalendarOccurrence = { @@ -86,6 +87,7 @@ const ALLDAY_OCCURRENCE: CalendarOccurrence = { location: null, description: null, hasRrule: false, + reminderLeadMinutes: null, }; // ── Import component (after mocks are declared) ─────────────────────────────── diff --git a/apps/pwa/src/components/EventForm.test.tsx b/apps/pwa/src/components/EventForm.test.tsx index dae8039..b65033d 100644 --- a/apps/pwa/src/components/EventForm.test.tsx +++ b/apps/pwa/src/components/EventForm.test.tsx @@ -124,6 +124,7 @@ const EDIT_OCCURRENCE: CalendarOccurrence = { location: 'Office', description: 'Weekly sync', hasRrule: false, + reminderLeadMinutes: null, }; // ── Import component (after mocks) ──────────────────────────────────────────── @@ -506,6 +507,7 @@ const RECURRING_OCCURRENCE: CalendarOccurrence = { location: null, description: null, hasRrule: true, + reminderLeadMinutes: null, // @ts-expect-error — recurrence is not on CalendarOccurrence type yet; the reset // effect reads it if present and defaults to 'none' when absent (WR-03, v1 comment) recurrence: 'weekly', @@ -532,6 +534,7 @@ const LATE_OCCURRENCE: CalendarOccurrence = { location: null, description: null, hasRrule: false, + reminderLeadMinutes: null, }; describe('EventForm — Plan 03-12 gap closures', () => { @@ -779,6 +782,7 @@ const ALL_DAY_OCCURRENCE: CalendarOccurrence = { location: null, description: null, hasRrule: false, + reminderLeadMinutes: null, }; describe('EventForm — Plan 06-06 end-tracking + recurrence-bound', () => {