Corp/frontend/src/hooks/useCalendarModals.ts

232 lines
7.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client";
import { useState, useCallback } from "react";
import { apiClient } from "@/lib/api";
import { DEFAULT_EVENT_COLOR } from "@/lib/calendar-event-colors";
import type { CalendarEvent } from "@/services/calendarService";
export interface CalendarModalsState {
showCalendarModal: boolean;
showEventModal: boolean;
showParticipantsModal: boolean;
showDayEventsModal: boolean;
showEventDetailsModal: boolean;
editingCalendar: { id?: number; name: string } | null;
editingEvent: CalendarEvent | null;
participantsCalendar: {
id: number;
name: string;
user_role?: string;
can_manage_participants?: boolean;
type?: string | null;
context_type?: string | null;
} | null;
selectedDateForModal: Date | null;
viewingEvent: CalendarEvent | null;
sidebarEvents: CalendarEvent[];
currentSelectedCalendarId: number | null;
eventsRefreshTrigger: number;
}
export function useCalendarModals() {
const [showCalendarModal, setShowCalendarModal] = useState(false);
const [showEventModal, setShowEventModal] = useState(false);
const [showParticipantsModal, setShowParticipantsModal] = useState(false);
const [showDayEventsModal, setShowDayEventsModal] = useState(false);
const [showEventDetailsModal, setShowEventDetailsModal] = useState(false);
const [editingCalendar, setEditingCalendar] = useState<{ id?: number; name: string } | null>(null);
const [editingEvent, setEditingEvent] = useState<CalendarEvent | null>(null);
const [participantsCalendar, setParticipantsCalendar] = useState<{
id: number;
name: string;
user_role?: string;
can_manage_participants?: boolean;
type?: string | null;
context_type?: string | null;
} | null>(null);
const [selectedDateForModal, setSelectedDateForModal] = useState<Date | null>(null);
const [viewingEvent, setViewingEvent] = useState<CalendarEvent | null>(null);
const [sidebarEvents, setSidebarEvents] = useState<CalendarEvent[]>([]);
const [currentSelectedCalendarId, setCurrentSelectedCalendarId] = useState<number | null>(null);
const [eventsRefreshTrigger, setEventsRefreshTrigger] = useState(0);
const handleSetSidebarEvents = useCallback((events: CalendarEvent[]) => {
setSidebarEvents(events);
}, []);
const handleCalendarChange = useCallback((calendarId: number | null) => {
setCurrentSelectedCalendarId(calendarId);
}, []);
const handleSetEventsRefreshTrigger = useCallback((value: number | ((prev: number) => number)) => {
setEventsRefreshTrigger(value);
}, []);
const handleOpenCalendarModal = useCallback((calendar?: { id?: number; name: string }) => {
setEditingCalendar(calendar || { name: "" });
setShowCalendarModal(true);
}, []);
const handleOpenEventModal = useCallback((event: Partial<CalendarEvent> & { id?: number }, date?: Date) => {
if (date && !event.id) {
setSelectedDateForModal(date);
setShowDayEventsModal(true);
} else if (event.id) {
setViewingEvent(event as CalendarEvent);
setShowEventDetailsModal(true);
} else {
setEditingEvent(event as CalendarEvent);
setShowEventModal(true);
}
}, []);
const handleCreateEventFromDay = useCallback(() => {
if (!currentSelectedCalendarId) {
alert("Сначала выберите календарь");
return;
}
if (!selectedDateForModal) return;
const startDate = new Date(selectedDateForModal);
startDate.setHours(10, 0, 0, 0);
const endDate = new Date(selectedDateForModal);
endDate.setHours(11, 0, 0, 0);
setEditingEvent({
title: "",
description: "",
start: startDate.toISOString(),
end: endDate.toISOString(),
calendar: currentSelectedCalendarId,
color_event: DEFAULT_EVENT_COLOR,
} as CalendarEvent);
setShowDayEventsModal(false);
setShowEventModal(true);
}, [currentSelectedCalendarId, selectedDateForModal]);
const handleEditFromDetails = useCallback(() => {
setEditingEvent(viewingEvent);
setShowEventDetailsModal(false);
setShowEventModal(true);
}, [viewingEvent]);
const handleEventClickFromDay = useCallback(async (event: CalendarEvent & { is_recurring?: boolean; event_id?: number }) => {
setShowDayEventsModal(false);
if (event.is_recurring && event.event_id) {
try {
const fullEvent = await apiClient.getEvent(event.event_id);
setViewingEvent({
...fullEvent,
start: event.start,
end: event.end,
});
setShowEventDetailsModal(true);
} catch (err) {
console.error("Ошибка загрузки события:", err);
}
} else {
setViewingEvent(event);
setShowEventDetailsModal(true);
}
}, []);
const handleEventSaved = useCallback(() => {
setEventsRefreshTrigger(prev => prev + 1);
}, []);
const handleOpenParticipantsModal = useCallback((calendar: {
id: number;
name: string;
user_role?: string;
can_manage_participants?: boolean;
type?: string | null;
context_type?: string | null;
}) => {
setParticipantsCalendar(calendar);
setShowParticipantsModal(true);
}, []);
const handleDeleteEvent = useCallback(async () => {
if (!viewingEvent?.id) return;
if (!confirm("Удалить это событие?")) return;
try {
await apiClient.deleteEvent(viewingEvent.id);
setShowEventDetailsModal(false);
setViewingEvent(null);
setEventsRefreshTrigger(prev => prev + 1);
} catch (err) {
console.error("Ошибка удаления события:", err);
alert("Не удалось удалить событие");
}
}, [viewingEvent]);
const closeCalendarModal = useCallback(() => {
setShowCalendarModal(false);
setEditingCalendar(null);
}, []);
const closeParticipantsModal = useCallback(() => {
setShowParticipantsModal(false);
setParticipantsCalendar(null);
}, []);
const closeEventModal = useCallback(() => {
setShowEventModal(false);
setEditingEvent(null);
}, []);
const closeDayEventsModal = useCallback(() => {
setShowDayEventsModal(false);
setSelectedDateForModal(null);
}, []);
const closeEventDetailsModal = useCallback(() => {
setShowEventDetailsModal(false);
setViewingEvent(null);
}, []);
return {
// State for CalendarSidebar/CalendarCard props
eventsRefreshTrigger,
handleSetEventsRefreshTrigger,
handleSetSidebarEvents,
handleCalendarChange,
// Handlers for opening modals
handleOpenCalendarModal,
handleOpenEventModal,
handleOpenParticipantsModal,
// Modal state and close handlers
showCalendarModal,
editingCalendar,
closeCalendarModal,
showParticipantsModal,
participantsCalendar,
closeParticipantsModal,
showEventModal,
editingEvent,
closeEventModal,
handleEventSaved,
showDayEventsModal,
selectedDateForModal,
closeDayEventsModal,
sidebarEvents,
handleEventClickFromDay,
handleCreateEventFromDay,
showEventDetailsModal,
viewingEvent,
closeEventDetailsModal,
handleEditFromDetails,
handleDeleteEvent,
};
}