import { useState } from 'react' import { Drawer, Box, Typography, IconButton, Divider, TextField, Button, } from '@mui/material' import { X, Calendar } from 'lucide-react' import { useReminderStore } from '../../stores/reminderStore' import { AiDisclaimer } from '../ui' import { useReminder, useCompleteReminder, useDismissReminder, useSnoozeReminder, } from '../../hooks/useReminders' import { usePropertyById } from '../../hooks/useProperties' import { ObjectDeepLink } from '../team' import { ReminderTypeBadge } from './ReminderTypeBadge' import { ReminderDaysIndicator } from './ReminderDaysIndicator' import { ReminderStatusBadge } from './ReminderStatusBadge' import { ReminderCalendarPlanner } from './ReminderCalendarPlanner' import { ReminderContractPanel } from './ReminderContractPanel' import { ReminderStatus, ReminderType } from '../../domain/reminder' import { SectionTitle, DateRow } from './reminderDetailHelpers' import { DS_BRAND, DS_SLATE, DS_TEXT } from '../../lib/ds' // ── Constants ──────────────────────────────────────────────────────────────── /** * Das zweite Datum je Termintyp. Bei den Vertragstypen aus Runde 8 (§4) ist das * bewusst das Vertragsende — als Einordnung, nicht als Fälligkeit. Die * Fälligkeit steht darüber und liegt früher; genau das ist der Punkt. */ const TYPE_SECOND_DATE: Partial> = { [ReminderType.LEASE_EXPIRY]: 'contractEndDate', [ReminderType.BREAK_OPTION]: 'breakOptionDate', [ReminderType.RENT_REVIEW]: 'eventDate', [ReminderType.SCHATTENMARKT_RELEASE]: 'eventDate', [ReminderType.NOTICE_PERIOD]: 'contractEndDate', [ReminderType.REAL_OPTION]: 'contractEndDate', [ReminderType.UNREAL_OPTION]: 'contractEndDate', [ReminderType.NEGOTIATION_WINDOW]: 'contractEndDate', [ReminderType.CONTRACT_TALK]: 'contractEndDate', } const TYPE_SECOND_LABEL: Partial> = { [ReminderType.LEASE_EXPIRY]: 'Vertragsende', [ReminderType.BREAK_OPTION]: 'Break-Option', [ReminderType.RENT_REVIEW]: 'Ereignisdatum', [ReminderType.SCHATTENMARKT_RELEASE]: 'Ereignisdatum', [ReminderType.NOTICE_PERIOD]: 'Vertragsende', [ReminderType.REAL_OPTION]: 'Vertragsende', [ReminderType.UNREAL_OPTION]: 'Vertragsende', [ReminderType.NEGOTIATION_WINDOW]: 'Vertragsende', [ReminderType.CONTRACT_TALK]: 'Vertragsende', } // ── Drawer ─────────────────────────────────────────────────────────────────── /** * Reminder-Detailansicht (Runde 4, §5.5 und §5.6). * * Entfallen sind: Priorität, das «Aktiv»-Etikett, die zusätzlichen Status- und * Typfarben, der Verlauf am Ende, der Vertrags- und Pre-Market-Hinweis unter * dem Objekt sowie der Notizbereich. Das Anlegen neuer Reminder ist mit dem * Knopf «Reminder erstellen» weggefallen — der Drawer zeigt nur noch Bestehendes. * * Neu an der Stelle des Notizbereichs: die Terminplanung im verbundenen Kalender. */ export function ReminderDetailDrawer() { const { selectedId, drawerOpen, setDrawerOpen, setSelectedId } = useReminderStore() const { data: reminder } = useReminder(selectedId ?? '') const { data: reminderProperty } = usePropertyById(reminder?.propertyId ?? '') const complete = useCompleteReminder() const dismiss = useDismissReminder() const snooze = useSnoozeReminder() const [snoozeDate, setSnoozeDate] = useState('') function handleClose() { setDrawerOpen(false) setSelectedId(null) } const secondDateKey = reminder ? TYPE_SECOND_DATE[reminder.type] : undefined const secondDateLabel = reminder ? TYPE_SECOND_LABEL[reminder.type] : undefined const secondDateValue = secondDateKey && reminder ? reminder[secondDateKey] : undefined const showSecondDate = secondDateValue && reminder && secondDateValue !== reminder.dueDate const isActionable = reminder && (reminder.status === ReminderStatus.ACTIVE || reminder.status === ReminderStatus.SNOOZED) return ( {/* ── Header ── */} {reminder && ( <> )} {/* ── Body ── */} {reminder && ( {/* 1. Objekt — Name führt nach «Meine Objekte» */} {reminder.propertyCity}{reminder.propertyDistrict ? ` · ${reminder.propertyDistrict}` : ''} · {reminder.tenantName} {/* 2. Fristen */} }>Fristen {showSecondDate && ( )} {reminder.snoozedUntil && ( )} {/* 2b. Vertrag — welcher Vertrag, welcher Zeitpunkt, weshalb, was tun (Runde 8, §4). Erscheint nur bei Vertragsterminen. */} {/* 3. Terminplanung — steht, wo bis Runde 3 der Notizbereich war */} {/* 4. Aktionen */} {isActionable && ( <> Aktionen setSnoozeDate(e.target.value)} sx={{ flex: 1, '& .MuiInputBase-root': { fontSize: '0.8125rem' } }} /> )} )} ) }