ConceptPortal-public/rsconcept/frontend/src/app/Navigation/UserDropdown.tsx

85 lines
2.8 KiB
TypeScript
Raw Normal View History

import { LuMoon, LuSun } from 'react-icons/lu';
2024-04-01 19:07:20 +03:00
import { IconAdmin, IconAdminOff, IconDatabase, IconHelp, IconHelpOff, IconLogout, IconUser } from '@/components/Icons';
import { CProps } from '@/components/props';
import Dropdown from '@/components/ui/Dropdown';
import DropdownButton from '@/components/ui/DropdownButton';
import { useAuth } from '@/context/AuthContext';
2023-12-26 14:23:51 +03:00
import { useConceptNavigation } from '@/context/NavigationContext';
2024-04-01 19:07:20 +03:00
import { useConceptOptions } from '@/context/OptionsContext';
2023-07-15 17:46:19 +03:00
import { urls } from '../urls';
2023-07-15 17:46:19 +03:00
interface UserDropdownProps {
2023-12-28 14:04:44 +03:00
isOpen: boolean;
hideDropdown: () => void;
2023-07-15 17:46:19 +03:00
}
function UserDropdown({ isOpen, hideDropdown }: UserDropdownProps) {
const { darkMode, adminMode, toggleAdminMode, toggleDarkMode, showHelp, toggleShowHelp } = useConceptOptions();
const router = useConceptNavigation();
2023-07-25 20:27:29 +03:00
const { user, logout } = useAuth();
2023-07-15 17:46:19 +03:00
function navigateProfile(event: CProps.EventMouse) {
2023-08-27 16:35:17 +03:00
hideDropdown();
router.push(urls.profile, event.ctrlKey);
2024-04-01 19:07:20 +03:00
}
2023-07-15 17:46:19 +03:00
2024-04-01 19:07:20 +03:00
function logoutAndRedirect() {
2023-07-25 20:27:29 +03:00
hideDropdown();
logout(() => router.push(urls.login));
2024-04-01 19:07:20 +03:00
}
function gotoAdmin() {
hideDropdown();
logout(() => router.push(urls.admin, true));
}
2024-04-01 19:07:20 +03:00
function handleToggleDarkMode() {
hideDropdown();
toggleDarkMode();
}
2023-07-16 22:53:22 +03:00
2023-07-15 17:46:19 +03:00
return (
<Dropdown className='mt-[1.5rem] min-w-[18ch] max-w-[12rem]' stretchLeft isOpen={isOpen}>
2024-04-01 19:07:20 +03:00
<DropdownButton
text={user?.username}
title='Профиль пользователя'
icon={<IconUser size='1rem' />}
2024-04-01 19:07:20 +03:00
onClick={navigateProfile}
/>
2023-12-28 14:04:44 +03:00
<DropdownButton
2024-04-01 19:07:20 +03:00
text={darkMode ? 'Тема: Темная' : 'Тема: Светлая'}
icon={darkMode ? <LuMoon size='1rem' /> : <LuSun size='1rem' />}
2023-12-28 14:04:44 +03:00
title='Переключение темы оформления'
2024-04-01 19:07:20 +03:00
onClick={handleToggleDarkMode}
/>
<DropdownButton
text={showHelp ? 'Помощь: Вкл' : 'Помощь: Выкл'}
icon={showHelp ? <IconHelp size='1rem' /> : <IconHelpOff size='1rem' />}
2024-04-01 19:07:20 +03:00
title='Отображение иконок подсказок'
onClick={toggleShowHelp}
/>
{user?.is_staff ? (
<DropdownButton
text={adminMode ? 'Админ: Вкл' : 'Админ: Выкл'}
icon={adminMode ? <IconAdmin size='1rem' /> : <IconAdminOff size='1rem' />}
title='Работа в режиме администратора'
onClick={toggleAdminMode}
/>
) : null}
{user?.is_staff ? (
<DropdownButton text='База данных' icon={<IconDatabase size='1rem' />} onClick={gotoAdmin} />
) : null}
2024-04-01 19:07:20 +03:00
<DropdownButton
text='Выйти...'
className='font-semibold'
icon={<IconLogout size='1rem' />}
2024-04-01 19:07:20 +03:00
onClick={logoutAndRedirect}
2023-12-28 14:04:44 +03:00
/>
</Dropdown>
);
2023-07-15 17:46:19 +03:00
}
2023-12-28 14:04:44 +03:00
export default UserDropdown;