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;