From 32e0a123e3d454dd193bb4c2e31ccab8ebc82244 Mon Sep 17 00:00:00 2001 From: igor_nadein Date: Wed, 25 Feb 2026 02:13:21 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20useCalendar=20=D0=B2=D0=BD=D0=B5=20CalendarProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убран вызов useCalendar() из AppShell (вызывался до создания CalendarProvider) - Добавлен state currentSelectedCalendarId в AppShell - selectedCalendarId передается через props и синхронизируется через useEffect - onCalendarChange callback передается в Calendar -> CalendarCard - CalendarCard синхронизирует selectedCalendarId с родительским компонентом Проблема: useCalendar вызывался в AppShell до того, как CalendarProvider был создан. Решение: передача selectedCalendarId через props вместо прямого вызова хука. --- frontend/src/components/AppShell.tsx | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/AppShell.tsx b/frontend/src/components/AppShell.tsx index ea0124a9..6154016a 100644 --- a/frontend/src/components/AppShell.tsx +++ b/frontend/src/components/AppShell.tsx @@ -302,7 +302,8 @@ function CalendarCard({ onOpenParticipantsModal, eventsRefreshTrigger, setEventsRefreshTrigger, - setSidebarEvents + setSidebarEvents, + onCalendarChange }: { onOpenCalendarModal: (calendar?: { id?: number; name: string }) => void; onOpenEventModal: (event: any, date?: Date) => void; @@ -310,6 +311,7 @@ function CalendarCard({ eventsRefreshTrigger: number; setEventsRefreshTrigger: (value: number | ((prev: number) => number)) => void; setSidebarEvents: (events: any[]) => void; + onCalendarChange: (calendarId: number | null) => void; }) { const { calendars, selectedCalendarId, setSelectedCalendarId, loading: calendarsLoading, reloadCalendars } = useCalendar(); @@ -318,6 +320,11 @@ function CalendarCard({ return new Date(now.getFullYear(), now.getMonth(), 1); }); const [events, setEvents] = useState([]); + + // Синхронизация selectedCalendarId с родительским компонентом + useEffect(() => { + onCalendarChange(selectedCalendarId); + }, [selectedCalendarId, onCalendarChange]); const [loading, setLoading] = useState(false); const [showCalendarMenu, setShowCalendarMenu] = useState(false); const [error, setError] = useState(null); @@ -789,7 +796,8 @@ function Calendar({ onOpenParticipantsModal, eventsRefreshTrigger, setEventsRefreshTrigger, - setSidebarEvents + setSidebarEvents, + onCalendarChange }: { onOpenCalendarModal: (calendar?: { id?: number; name: string }) => void; onOpenEventModal: (event: any, date?: Date) => void; @@ -797,6 +805,7 @@ function Calendar({ eventsRefreshTrigger: number; setEventsRefreshTrigger: (value: number | ((prev: number) => number)) => void; setSidebarEvents: (events: any[]) => void; + onCalendarChange: (calendarId: number | null) => void; }) { return ( @@ -833,7 +843,6 @@ export function PageHeader({ title, subtitle, badge, eyebrow = "Раздел" }: export function AppShell({ children }: AppShellProps) { const { user, loading } = useUser(); - const { selectedCalendarId } = useCalendar(); const router = useRouter(); const pathname = usePathname(); const isMessageDialogPage = pathname.startsWith('/messages/') && pathname !== '/messages'; @@ -856,6 +865,7 @@ export function AppShell({ children }: AppShellProps) { const [showEventDetailsModal, setShowEventDetailsModal] = useState(false); const [viewingEvent, setViewingEvent] = useState(null); const [sidebarEvents, setSidebarEvents] = useState([]); // Для ViewDayEventsModal + const [currentSelectedCalendarId, setCurrentSelectedCalendarId] = useState(null); // Обработчики модалов const handleOpenCalendarModal = (calendar?: { id?: number; name: string }) => { @@ -883,7 +893,7 @@ export function AppShell({ children }: AppShellProps) { // Создание события из модала просмотра дня const handleCreateEventFromDay = useCallback(() => { - if (!selectedCalendarId) { + if (!currentSelectedCalendarId) { alert("Сначала выберите календарь"); return; } @@ -900,13 +910,13 @@ export function AppShell({ children }: AppShellProps) { description: "", start: startDate.toISOString(), end: endDate.toISOString(), - calendar: selectedCalendarId, + calendar: currentSelectedCalendarId, color_event: "#3498db", }); setShowDayEventsModal(false); setShowEventModal(true); - }, [selectedCalendarId, selectedDateForModal]); + }, [currentSelectedCalendarId, selectedDateForModal]); // Переход к редактированию из модала просмотра const handleEditFromDetails = useCallback(() => { @@ -1020,6 +1030,7 @@ export function AppShell({ children }: AppShellProps) { eventsRefreshTrigger={eventsRefreshTrigger} setEventsRefreshTrigger={setEventsRefreshTrigger} setSidebarEvents={setSidebarEvents} + onCalendarChange={setCurrentSelectedCalendarId} /> @@ -1078,6 +1089,7 @@ export function AppShell({ children }: AppShellProps) { eventsRefreshTrigger={eventsRefreshTrigger} setEventsRefreshTrigger={setEventsRefreshTrigger} setSidebarEvents={setSidebarEvents} + onCalendarChange={setCurrentSelectedCalendarId} />