import React, { useState, useEffect, useMemo, useCallback } from 'react'; import { DomaApplication } from '../types'; import { backendApi } from '../services/apiClient'; import { readCache, saveCache } from '../hooks/useCachedFetch'; import { REFRESH_EVENTS } from '../constants/refreshEvents'; import { LayoutDashboard, Inbox, ShieldAlert, Sparkles, Plus, RotateCw, AlertTriangle, Printer, Zap } from 'lucide-react'; // Modular Imports import { AppSummary } from './applications/AppSummary'; import { ApplicationsRegistry } from './applications/ApplicationsRegistry'; import { DispatcherControl } from './applications/DispatcherControl'; import { QualityControl } from './applications/QualityControl'; import { CreateApplicationCard } from './applications/CreateApplicationCard'; import { OutagesJournal } from './applications/OutagesJournal'; import { allowedSubsForSection } from '../constants/permissions'; type Tab = 'summary' | 'registry' | 'control' | 'quality' | 'mappings' | 'outages'; const REQUESTS_TABS: Tab[] = ['summary', 'registry', 'control', 'quality', 'mappings', 'outages']; const SUBTAB_KEY = 'mkd_subTab_requests'; interface ApplicationsModuleProps { integrationEnabled?: boolean; allowedPermissions?: string[] | null; } export const ApplicationsModule: React.FC = ({ integrationEnabled = true, allowedPermissions }) => { const visibleTabs = useMemo(() => { const allowed = allowedSubsForSection(allowedPermissions ?? [], 'requests'); if (allowed === 'all') return REQUESTS_TABS; return REQUESTS_TABS.filter((t) => allowed.includes(t)); }, [allowedPermissions]); const CACHE_KEY = 'mkd_applications_cache'; const cached = readCache(CACHE_KEY, []); const [createCardOpen, setCreateCardOpen] = useState(false); const [activeTab, setActiveTab] = useState(() => { const s = localStorage.getItem(SUBTAB_KEY); return (s && REQUESTS_TABS.includes(s as Tab)) ? s as Tab : 'summary'; }); const [applications, setApplications] = useState(cached); const [loading, setLoading] = useState(cached.length === 0); const [error, setError] = useState(null); useEffect(() => { if (visibleTabs.length > 0 && !visibleTabs.includes(activeTab)) { setActiveTab(visibleTabs[0]); } }, [visibleTabs, activeTab]); const fetchApplications = useCallback(async (showSpinner = true) => { if (showSpinner) setLoading(true); setError(null); try { const data = await backendApi.getApplications(); setApplications(data); saveCache(CACHE_KEY, data); } catch (err) { console.error('[ApplicationsModule] Ошибка загрузки заявок:', err); setError('Ошибка загрузки данных заявок с сервера. Проверьте подключение или логи синхронизации Doma AI.'); } finally { setLoading(false); } }, []); useEffect(() => { fetchApplications(cached.length === 0); }, []); useEffect(() => { const onRefresh = () => fetchApplications(false); window.addEventListener(REFRESH_EVENTS.applications, onRefresh); return () => window.removeEventListener(REFRESH_EVENTS.applications, onRefresh); }, [fetchApplications]); // Фоновый опрос: чтобы другой пользователь видел новые заявки без перезагрузки useEffect(() => { const interval = setInterval(() => fetchApplications(false), 10 * 1000); return () => clearInterval(interval); }, [fetchApplications]); useEffect(() => { localStorage.setItem(SUBTAB_KEY, activeTab); }, [activeTab]); if (loading) { return (

{integrationEnabled ? 'Синхронизация с doma.ai...' : 'Загрузка заявок...'}

); } if (error) { return (

Ошибка системы

{error}

); } return (

Диспетчерская 24/7

Центр управления инцидентами

{/* Sheet Selector */}
{[ { id: 'summary', label: 'Сводка', icon: LayoutDashboard }, { id: 'registry', label: 'Реестр', icon: Inbox }, { id: 'control', label: 'Контроль', icon: ShieldAlert }, { id: 'quality', label: 'Качество', icon: Sparkles }, { id: 'outages', label: 'Журнал отключений', icon: Zap }, ].filter((tab) => visibleTabs.includes(tab.id)).map((tab) => ( ))}
{/* Dynamic Sheet Content */}
{activeTab === 'summary' && } {activeTab === 'registry' && } {activeTab === 'control' && } {activeTab === 'quality' && } {activeTab === 'outages' && (
)}
{createCardOpen && ( setCreateCardOpen(false)} onSuccess={fetchApplications} /> )}
); };