"use client"; import { Edit2, Trash2, Clock, Calendar, FileText, Users } from "lucide-react"; import { Modal } from "@/components/ui"; import { resolveEventColor } from "@/lib/calendar-event-colors"; import { format } from "date-fns"; import { ru } from "date-fns/locale"; import { useState, useEffect } from "react"; import { apiClient } from "@/lib/api"; interface ViewEventDetailsModalProps { isOpen: boolean; onClose: () => void; event: any | null; onEdit: () => void; onDelete: () => void; showParticipants?: boolean; } // Маппинг частот на русский const FREQUENCY_LABELS: Record = { YEARLY: "Каждый год", MONTHLY: "Каждый месяц", WEEKLY: "Каждую неделю", DAILY: "Каждый день", HOURLY: "Каждый час", MINUTELY: "Каждую минуту", SECONDLY: "Каждую секунду", }; // Маппинг дней недели (0 = Monday в dateutil.rrule) const WEEKDAY_LABELS: Record = { 0: "ПН", 1: "ВТ", 2: "СР", 3: "ЧТ", 4: "ПТ", 5: "СБ", 6: "ВС", }; // Нормализация byweekday в массив чисел function normalizeByweekday(byweekday: any): number[] { if (!byweekday) return []; if (Array.isArray(byweekday)) return byweekday; if (typeof byweekday === 'string') { return byweekday.split(',').map(d => parseInt(d.trim(), 10)).filter(n => !isNaN(n)); } if (typeof byweekday === 'number') return [byweekday]; return []; } export function ViewEventDetailsModal({ isOpen, onClose, event, onEdit, onDelete, showParticipants = false, }: ViewEventDetailsModalProps) { const [participants, setParticipants] = useState([]); const [loadingParticipants, setLoadingParticipants] = useState(false); useEffect(() => { if (isOpen && event?.id && showParticipants) { loadParticipants(); } else { setParticipants([]); } }, [isOpen, event?.id, showParticipants]); const loadParticipants = async () => { if (!event?.id) return; try { setLoadingParticipants(true); const result = await apiClient.getEventParticipants(event.id); const participantsList = Array.isArray(result) ? result : (result?.results || []); setParticipants(participantsList); } catch (error) { console.error("Failed to load participants:", error); } finally { setLoadingParticipants(false); } }; if (!isOpen || !event) return null; const formatDateTime = (dateStr: string) => { const date = new Date(dateStr); return format(date, "d MMMM yyyy, HH:mm", { locale: ru }); }; const formatDate = (dateStr: string) => { const date = new Date(dateStr); return format(date, "d MMMM yyyy", { locale: ru }); }; const capitalizedStart = formatDateTime(event.start).charAt(0).toUpperCase() + formatDateTime(event.start).slice(1); const capitalizedEnd = formatDateTime(event.end).charAt(0).toUpperCase() + formatDateTime(event.end).slice(1); const canEdit = event.can_edit !== false; const canDelete = event.can_delete !== false; return ( {canEdit ? ( ) : null} {canDelete ? ( ) : null} ) : undefined} >
{/* Event meta */}
{event.rule && ( ⟲ )}
Календарь #{event.calendar}
{/* Time */}

Время

Начало: {capitalizedStart}

Конец: {capitalizedEnd}

{/* Recurring Info */} {event.rule && event.rule_data && (
Повторяющееся событие
Частота: {FREQUENCY_LABELS[event.rule_data.frequency] || event.rule_data.frequency}
{event.rule_data.params?.byweekday && (
Дни недели: {normalizeByweekday(event.rule_data.params.byweekday).map((day: number) => WEEKDAY_LABELS[day]).join(", ")}
)} {event.rule_data.params?.count && (
Повторений: {event.rule_data.params.count}
)} {event.end_recurring_period && (
До: {formatDate(event.end_recurring_period)}
)}
)} {/* Description */} {event.description && (

Описание

{event.description}

)} {/* Participants */} {showParticipants && (

Участники {participants.length > 0 && `(${participants.length})`}

{loadingParticipants ? (

Загрузка...

) : participants.length > 0 ? (
{participants.map((participant: any) => (
{participant.user_name?.[0] || "?"}
{participant.user_name}
{participant.distinction || "attendee"}
))}
) : (

Нет участников

)}
)}
); }