diff --git a/apps/client/src/app/(tabs)/calendar.tsx b/apps/client/src/app/(tabs)/calendar.tsx index 554c2d9..ce02dff 100644 --- a/apps/client/src/app/(tabs)/calendar.tsx +++ b/apps/client/src/app/(tabs)/calendar.tsx @@ -203,7 +203,7 @@ const Calendar = () => { const occurrenceDate = getDateKey(new Date(event.occurrenceStart)); try { - if (event.isRecurring) { + if (event.recurrenceRule) { // Recurring event: use mode and occurrenceDate await EventService.delete(event.id, mode, occurrenceDate); // Reload events to reflect changes @@ -260,7 +260,7 @@ const Calendar = () => { diff --git a/apps/client/src/components/EventCard.tsx b/apps/client/src/components/EventCard.tsx index 5d4b9da..b252f7b 100644 --- a/apps/client/src/components/EventCard.tsx +++ b/apps/client/src/components/EventCard.tsx @@ -19,7 +19,7 @@ export const EventCard = ({ event, onEdit, onDelete }: EventCardProps) => { startTime={event.occurrenceStart} endTime={event.occurrenceEnd} description={event.description} - isRecurring={event.isRecurring} + isRecurring={!!event.recurrenceRule} > {/* Action buttons - TouchableOpacity with delayPressIn allows ScrollView to detect scroll gestures */} diff --git a/apps/server/src/repositories/mongo/models/EventModel.ts b/apps/server/src/repositories/mongo/models/EventModel.ts index ca1908c..1596bc6 100644 --- a/apps/server/src/repositories/mongo/models/EventModel.ts +++ b/apps/server/src/repositories/mongo/models/EventModel.ts @@ -2,22 +2,18 @@ import mongoose, { Schema, Document, Model } from "mongoose"; import { CalendarEvent } from "@calchat/shared"; import { IdVirtual } from "./types"; -interface EventVirtuals extends IdVirtual { - isRecurring: boolean; -} - export interface EventDocument - extends Omit, + extends Omit, Document { toJSON(): CalendarEvent; } const EventSchema = new Schema< EventDocument, - Model, + Model, {}, {}, - EventVirtuals + IdVirtual >( { userId: { @@ -61,11 +57,6 @@ const EventSchema = new Schema< return this._id.toString(); }, }, - isRecurring: { - get() { - return !!this.recurrenceRule; - }, - }, }, toJSON: { virtuals: true, diff --git a/apps/server/src/services/EventService.ts b/apps/server/src/services/EventService.ts index 90c60ae..2ef31fc 100644 --- a/apps/server/src/services/EventService.ts +++ b/apps/server/src/services/EventService.ts @@ -37,8 +37,8 @@ export class EventService { const allEvents = await this.eventRepo.findByUserId(userId); // Separate recurring and non-recurring events - const recurringEvents = allEvents.filter((e) => e.isRecurring); - const nonRecurringEvents = allEvents.filter((e) => !e.isRecurring); + const recurringEvents = allEvents.filter((e) => e.recurrenceRule); + const nonRecurringEvents = allEvents.filter((e) => !e.recurrenceRule); // Expand all events (recurring get multiple instances, non-recurring stay as-is) const expanded = expandRecurringEvents( @@ -90,7 +90,7 @@ export class EventService { } // For non-recurring events, always delete completely - if (!event.isRecurring || !event.recurrenceRule) { + if (!event.recurrenceRule) { await this.eventRepo.delete(id); return null; } diff --git a/apps/server/src/utils/recurrenceExpander.ts b/apps/server/src/utils/recurrenceExpander.ts index 99d3745..023a0b0 100644 --- a/apps/server/src/utils/recurrenceExpander.ts +++ b/apps/server/src/utils/recurrenceExpander.ts @@ -48,7 +48,7 @@ export function expandRecurringEvents( // to find events that start before rangeStart but extend into the range const adjustedRangeStart = new Date(rangeStart.getTime() - duration); - if (!event.isRecurring || !event.recurrenceRule) { + if (!event.recurrenceRule) { // Non-recurring event: add if it overlaps with the range if (endTime >= rangeStart && startTime <= rangeEnd) { expanded.push({ diff --git a/packages/shared/src/models/CalendarEvent.ts b/packages/shared/src/models/CalendarEvent.ts index 5fcb701..849f22c 100644 --- a/packages/shared/src/models/CalendarEvent.ts +++ b/packages/shared/src/models/CalendarEvent.ts @@ -6,7 +6,6 @@ export interface CalendarEvent { startTime: Date; endTime: Date; note?: string; - isRecurring?: boolean; recurrenceRule?: string; exceptionDates?: string[]; // ISO date strings (YYYY-MM-DD) for excluded occurrences createdAt?: Date;