feat: add EditEventScreen with calendar and chat mode support
Add a unified event editor that works in two modes: - Calendar mode: Create/edit events directly via EventService API - Chat mode: Edit AI-proposed events before confirming them The chat mode allows users to modify proposed events (title, time, recurrence) and persists changes both locally and to the server. New components: DateTimePicker, ScrollableDropdown, useDropdownPosition New API: PUT /api/chat/messages/:messageId/proposal
This commit is contained in:
@@ -3,6 +3,12 @@ import { Feather } from "@expo/vector-icons";
|
||||
import { ReactNode } from "react";
|
||||
import { useThemeStore } from "../stores/ThemeStore";
|
||||
import { CardBase } from "./CardBase";
|
||||
import {
|
||||
isMultiDayEvent,
|
||||
formatDateWithWeekday,
|
||||
formatDateWithWeekdayShort,
|
||||
formatTime,
|
||||
} from "@calchat/shared";
|
||||
|
||||
type EventCardBaseProps = {
|
||||
className?: string;
|
||||
@@ -14,24 +20,6 @@ type EventCardBaseProps = {
|
||||
children?: ReactNode;
|
||||
};
|
||||
|
||||
function formatDate(date: Date): string {
|
||||
const d = new Date(date);
|
||||
return d.toLocaleDateString("de-DE", {
|
||||
weekday: "short",
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
});
|
||||
}
|
||||
|
||||
function formatTime(date: Date): string {
|
||||
const d = new Date(date);
|
||||
return d.toLocaleTimeString("de-DE", {
|
||||
hour: "2-digit",
|
||||
minute: "2-digit",
|
||||
});
|
||||
}
|
||||
|
||||
function formatDuration(start: Date, end: Date): string {
|
||||
const startDate = new Date(start);
|
||||
const endDate = new Date(end);
|
||||
@@ -62,6 +50,7 @@ export const EventCardBase = ({
|
||||
children,
|
||||
}: EventCardBaseProps) => {
|
||||
const { theme } = useThemeStore();
|
||||
const multiDay = isMultiDayEvent(startTime, endTime);
|
||||
|
||||
return (
|
||||
<CardBase title={title} className={className} borderWidth={2}>
|
||||
@@ -73,9 +62,16 @@ export const EventCardBase = ({
|
||||
color={theme.textPrimary}
|
||||
style={{ marginRight: 8 }}
|
||||
/>
|
||||
<Text style={{ color: theme.textPrimary }}>
|
||||
{formatDate(startTime)}
|
||||
</Text>
|
||||
{multiDay ? (
|
||||
<Text style={{ color: theme.textPrimary }}>
|
||||
{formatDateWithWeekdayShort(startTime)} →{" "}
|
||||
{formatDateWithWeekday(endTime)}
|
||||
</Text>
|
||||
) : (
|
||||
<Text style={{ color: theme.textPrimary }}>
|
||||
{formatDateWithWeekday(startTime)}
|
||||
</Text>
|
||||
)}
|
||||
</View>
|
||||
|
||||
{/* Time with duration */}
|
||||
@@ -86,10 +82,16 @@ export const EventCardBase = ({
|
||||
color={theme.textPrimary}
|
||||
style={{ marginRight: 8 }}
|
||||
/>
|
||||
<Text style={{ color: theme.textPrimary }}>
|
||||
{formatTime(startTime)} - {formatTime(endTime)} (
|
||||
{formatDuration(startTime, endTime)})
|
||||
</Text>
|
||||
{multiDay ? (
|
||||
<Text style={{ color: theme.textPrimary }}>
|
||||
{formatTime(startTime)} → {formatTime(endTime)}
|
||||
</Text>
|
||||
) : (
|
||||
<Text style={{ color: theme.textPrimary }}>
|
||||
{formatTime(startTime)} - {formatTime(endTime)} (
|
||||
{formatDuration(startTime, endTime)})
|
||||
</Text>
|
||||
)}
|
||||
</View>
|
||||
|
||||
{/* Recurring indicator */}
|
||||
|
||||
Reference in New Issue
Block a user