import { useState, useEffect, useRef, useCallback, type ReactNode } from 'react'; import { NavLink } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { useImport } from '../context/ImportContext'; function ImportProgressBar() { const { importState, clearImport } = useImport(); const [visible, setVisible] = useState(false); const hideTimerRef = useRef | undefined>(undefined); const isActive = importState.active; const isDone = importState.stage === 'done'; const isError = importState.stage === 'error'; const showBar = isActive || isDone || isError; useEffect(() => { if (showBar) { setVisible(true); if (hideTimerRef.current) clearTimeout(hideTimerRef.current); } if (isDone || isError) { hideTimerRef.current = setTimeout(() => { setVisible(false); clearImport(); }, 10_000); } return () => { if (hideTimerRef.current) clearTimeout(hideTimerRef.current); }; }, [showBar, isDone, isError, clearImport]); const handleClick = useCallback(() => { if (hideTimerRef.current) clearTimeout(hideTimerRef.current); setVisible(false); clearImport(); }, [clearImport]); if (!visible) return null; const barClass = isError ? 'import-progress-bar import-progress-bar--error' : isDone ? 'import-progress-bar import-progress-bar--done' : 'import-progress-bar'; const labelText = isError ? `Ошибка импорта: ${importState.message}` : isDone && importState.result ? `Импорт завершён — ${importState.result.imported} операций` : `${importState.message} ${importState.progress}%`; return (
); } export function Layout({ children }: { children: ReactNode }) { const { user, logout } = useAuth(); const [drawerOpen, setDrawerOpen] = useState(false); const closeDrawer = () => setDrawerOpen(false); return (
{drawerOpen && ( ); }