Implement three deletion modes for recurring events: - single: exclude specific occurrence via EXDATE mechanism - future: set RRULE UNTIL to stop future occurrences - all: delete entire event series Changes include: - Add exceptionDates field to CalendarEvent model - Add RecurringDeleteMode type and DeleteRecurringEventDTO - EventService.deleteRecurring() with mode-based logic using rrule library - EventController DELETE endpoint accepts mode/occurrenceDate query params - recurrenceExpander filters out exception dates during expansion - AI tools support deleteMode and occurrenceDate for proposed deletions - ChatService.confirmEvent() handles recurring delete modes - New DeleteEventModal component for unified delete confirmation UI - Calendar screen integrates modal for both recurring and non-recurring events
73 lines
2.4 KiB
TypeScript
73 lines
2.4 KiB
TypeScript
import { View, Text, TextInput, Pressable } from "react-native";
|
|
import { useLocalSearchParams } from "expo-router";
|
|
import BaseBackground from "../../components/BaseBackground";
|
|
import { useThemeStore } from "../../stores/ThemeStore";
|
|
|
|
const EventDetailScreen = () => {
|
|
const { id } = useLocalSearchParams<{ id: string }>();
|
|
const { theme } = useThemeStore();
|
|
|
|
// TODO: Fetch event by id using EventService.getById()
|
|
// TODO: Display event details (title, description, start/end time)
|
|
// TODO: Edit mode toggle
|
|
// TODO: Save changes -> EventService.update()
|
|
// TODO: Delete button -> EventService.delete()
|
|
// TODO: Link to NoteScreen for this event
|
|
// TODO: Loading and error states
|
|
throw new Error("Not implemented");
|
|
|
|
return (
|
|
<BaseBackground>
|
|
<View className="flex-1 p-4">
|
|
<Text className="text-2xl mb-4" style={{ color: theme.textPrimary }}>
|
|
Event Detail
|
|
</Text>
|
|
<Text className="mb-4" style={{ color: theme.textSecondary }}>
|
|
ID: {id}
|
|
</Text>
|
|
<TextInput
|
|
placeholder="Title"
|
|
placeholderTextColor={theme.textMuted}
|
|
className="w-full border rounded p-2 mb-4"
|
|
style={{
|
|
color: theme.textPrimary,
|
|
borderColor: theme.borderPrimary,
|
|
backgroundColor: theme.secondaryBg,
|
|
}}
|
|
/>
|
|
<TextInput
|
|
placeholder="Description"
|
|
placeholderTextColor={theme.textMuted}
|
|
multiline
|
|
className="w-full border rounded p-2 mb-4 h-24"
|
|
style={{
|
|
color: theme.textPrimary,
|
|
borderColor: theme.borderPrimary,
|
|
backgroundColor: theme.secondaryBg,
|
|
}}
|
|
/>
|
|
<View className="flex-row gap-2">
|
|
<Pressable
|
|
className="p-3 rounded flex-1"
|
|
style={{ backgroundColor: theme.confirmButton }}
|
|
>
|
|
<Text className="text-center" style={{ color: theme.buttonText }}>
|
|
Save
|
|
</Text>
|
|
</Pressable>
|
|
<Pressable
|
|
className="p-3 rounded flex-1"
|
|
style={{ backgroundColor: theme.rejectButton }}
|
|
>
|
|
<Text className="text-center" style={{ color: theme.buttonText }}>
|
|
Delete
|
|
</Text>
|
|
</Pressable>
|
|
</View>
|
|
</View>
|
|
</BaseBackground>
|
|
);
|
|
};
|
|
|
|
export default EventDetailScreen;
|