"use client"; import { useState, useEffect } from "react"; import { X, Check, Bell, BellOff, Eye, EyeOff, Loader2 } from "lucide-react"; import { apiClient } from "@/lib/api"; interface Calendar { id: number; name: string; title?: string; color: string; is_subscribed?: boolean; subscriber_count?: number; visibility?: string; owner_user?: { id: number; username: string; full_name: string } | null; owner_department?: { id: number; name: string } | null; } interface Subscription { id: number; calendar: number; calendar_title: string; calendar_color: string; is_visible: boolean; color_override: string | null; notify_on_new_event: boolean; notify_on_event_change: boolean; can_edit: boolean; can_manage: boolean; } interface Props { isOpen: boolean; onClose: () => void; onUpdate?: () => void; } export function CalendarSubscriptionsModal({ isOpen, onClose, onUpdate }: Props) { const [availableCalendars, setAvailableCalendars] = useState([]); const [subscriptions, setSubscriptions] = useState([]); const [loading, setLoading] = useState(false); const [activeTab, setActiveTab] = useState<"available" | "subscribed">("available"); useEffect(() => { if (isOpen) { loadData(); } }, [isOpen]); const loadData = async () => { setLoading(true); try { const [calendarsData, subsData] = await Promise.all([ apiClient.getCalendars(), apiClient.getCalendarSubscriptions(), ]); const calendarsList = Array.isArray(calendarsData) ? calendarsData : calendarsData?.results || []; const subsList = Array.isArray(subsData) ? subsData : subsData?.results || []; setAvailableCalendars(calendarsList); setSubscriptions(subsList); } catch (err) { console.error("Ошибка загрузки данных:", err); } finally { setLoading(false); } }; const handleSubscribe = async (calendarId: number) => { try { await apiClient.subscribeToCalendar(calendarId); await loadData(); onUpdate?.(); } catch (err) { console.error("Ошибка подписки:", err); alert("Не удалось подписаться на календарь"); } }; const handleUnsubscribe = async (calendarId: number) => { if (!confirm("Отписаться от календаря?")) return; try { await apiClient.unsubscribeFromCalendar(calendarId); await loadData(); onUpdate?.(); } catch (err) { console.error("Ошибка отписки:", err); alert("Не удалось отписаться от календаря"); } }; const toggleVisibility = async (sub: Subscription) => { try { await apiClient.updateSubscription(sub.id, { is_visible: !sub.is_visible, }); await loadData(); onUpdate?.(); } catch (err) { console.error("Ошибка обновления:", err); } }; const toggleNotifications = async (sub: Subscription) => { try { await apiClient.updateSubscription(sub.id, { notify_on_new_event: !sub.notify_on_new_event, notify_on_event_change: !sub.notify_on_event_change, }); await loadData(); } catch (err) { console.error("Ошибка обновления:", err); } }; const getCalendarOwner = (calendar: Calendar) => { if (calendar.owner_user) { return calendar.owner_user.full_name || calendar.owner_user.username; } if (calendar.owner_department) { return calendar.owner_department.name; } return "Общий"; }; const subscribedCalendarIds = new Set(subscriptions.map(s => s.calendar)); const unsubscribedCalendars = availableCalendars.filter( cal => !subscribedCalendarIds.has(cal.id) ); if (!isOpen) return null; return (
{/* Header */}

Подписки на календари

{/* Tabs */}
{/* Content */}
{loading ? (
) : activeTab === "available" ? (
{unsubscribedCalendars.length === 0 ? (

Нет доступных календарей для подписки

) : ( unsubscribedCalendars.map((cal) => (

{cal.name || cal.title}

{getCalendarOwner(cal)}

)) )}
) : (
{subscriptions.length === 0 ? (

У вас нет подписок на календари

) : ( subscriptions.map((sub) => (

{sub.calendar_title}

{sub.can_edit && ( Редактирование )} {sub.can_manage && ( Управление )}
)) )}
)}
{/* Footer */}
); }