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
38 lines
848 B
TypeScript
38 lines
848 B
TypeScript
import { View, ViewStyle } from "react-native";
|
|
import { useThemeStore } from "../stores/ThemeStore";
|
|
|
|
type BubbleSide = "left" | "right";
|
|
|
|
type ChatBubbleProps = {
|
|
side: BubbleSide;
|
|
children: React.ReactNode;
|
|
className?: string;
|
|
style?: ViewStyle;
|
|
};
|
|
|
|
export function ChatBubble({
|
|
side,
|
|
children,
|
|
className = "",
|
|
style,
|
|
}: ChatBubbleProps) {
|
|
const { theme } = useThemeStore();
|
|
const borderColor = side === "left" ? theme.chatBot : theme.primeFg;
|
|
const sideClass =
|
|
side === "left"
|
|
? "self-start ml-2 rounded-bl-sm"
|
|
: "self-end mr-2 rounded-br-sm";
|
|
|
|
return (
|
|
<View
|
|
className={`border-2 border-solid rounded-xl my-2 ${sideClass} ${className}`}
|
|
style={[
|
|
{ borderColor, elevation: 8, backgroundColor: theme.secondaryBg },
|
|
style,
|
|
]}
|
|
>
|
|
{children}
|
|
</View>
|
|
);
|
|
}
|