Portal/rsconcept/frontend/src/app/Navigation/Navigation.tsx

72 lines
2.6 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
import clsx from 'clsx';
import { IconLibrary2, IconManuals, IconNewItem2 } from '@/components/Icons';
2025-02-19 23:29:45 +03:00
import { useWindowSize } from '@/hooks/useWindowSize';
import { useAppLayoutStore } from '@/stores/appLayout';
2024-12-11 23:37:23 +03:00
import { PARAMETER } from '@/utils/constants';
2024-06-07 20:17:03 +03:00
import { urls } from '../urls';
2025-02-12 21:36:03 +03:00
2025-02-19 23:29:45 +03:00
import { Logo } from './Logo';
import { NavigationButton } from './NavigationButton';
import { useConceptNavigation } from './NavigationContext';
2025-02-19 23:29:45 +03:00
import { ToggleNavigation } from './ToggleNavigation';
import { UserMenu } from './UserMenu';
2024-06-07 20:17:03 +03:00
export function Navigation() {
2024-06-07 20:17:03 +03:00
const router = useConceptNavigation();
2024-12-11 23:37:23 +03:00
const size = useWindowSize();
const noNavigationAnimation = useAppLayoutStore(state => state.noNavigationAnimation);
2024-06-07 20:17:03 +03:00
const navigateHome = (event: React.MouseEvent<Element>) =>
router.push({ path: urls.home, newTab: event.ctrlKey || event.metaKey });
2025-02-22 14:03:13 +03:00
const navigateLibrary = (event: React.MouseEvent<Element>) =>
router.push({ path: urls.library, newTab: event.ctrlKey || event.metaKey });
const navigateHelp = (event: React.MouseEvent<Element>) =>
router.push({ path: urls.manuals, newTab: event.ctrlKey || event.metaKey });
2025-02-22 14:03:13 +03:00
const navigateCreateNew = (event: React.MouseEvent<Element>) =>
router.push({ path: urls.create_schema, newTab: event.ctrlKey || event.metaKey });
2024-06-07 20:17:03 +03:00
return (
<nav
className={clsx(
2025-01-23 19:41:31 +03:00
'z-navigation', //
2024-06-07 20:17:03 +03:00
'sticky top-0 left-0 right-0',
2025-01-21 20:33:05 +03:00
'select-none',
'bg-prim-100'
2024-06-07 20:17:03 +03:00
)}
>
<ToggleNavigation />
2024-12-11 23:37:23 +03:00
<div
2024-06-07 20:17:03 +03:00
className={clsx(
2025-01-23 19:41:31 +03:00
'pl-2 pr-[1.5rem] sm:pr-[0.9rem] h-[3rem]', //
2024-06-07 20:17:03 +03:00
'flex',
'cc-shadow-border'
)}
2024-12-11 23:37:23 +03:00
style={{
2025-02-22 16:12:29 +03:00
willChange: 'max-height, translate',
transitionProperty: 'max-height, translate',
2024-12-11 23:37:23 +03:00
transitionDuration: `${PARAMETER.moveDuration}ms`,
2025-02-22 16:12:29 +03:00
maxHeight: noNavigationAnimation ? '0rem' : '3rem',
2024-12-11 23:37:23 +03:00
translate: noNavigationAnimation ? '0 -1.5rem' : '0'
}}
2024-06-07 20:17:03 +03:00
>
2024-12-11 23:37:23 +03:00
<div
tabIndex={-1}
className={clsx('flex items-center mr-auto', !size.isSmall && 'cursor-pointer')}
onClick={!size.isSmall ? navigateHome : undefined}
>
2024-06-07 20:17:03 +03:00
<Logo />
</div>
<div className='flex gap-1 py-[0.3rem]'>
2024-06-23 14:20:37 +03:00
<NavigationButton text='Новая схема' icon={<IconNewItem2 size='1.5rem' />} onClick={navigateCreateNew} />
<NavigationButton text='Библиотека' icon={<IconLibrary2 size='1.5rem' />} onClick={navigateLibrary} />
<NavigationButton text='Справка' icon={<IconManuals size='1.5rem' />} onClick={navigateHelp} />
2025-01-21 20:33:05 +03:00
2024-06-07 20:17:03 +03:00
<UserMenu />
</div>
2024-12-11 23:37:23 +03:00
</div>
2024-06-07 20:17:03 +03:00
</nav>
);
}