import DarkModeOutlined from '@mui/icons-material/DarkModeOutlined' import LightModeOutlined from '@mui/icons-material/LightModeOutlined' import AppBar from '@mui/material/AppBar' import Avatar from '@mui/material/Avatar' import IconButton from '@mui/material/IconButton' import Stack from '@mui/material/Stack' import Toolbar from '@mui/material/Toolbar' import Typography from '@mui/material/Typography' import {useGetIdentity, usePermissions, useWarnAboutChange} from '@refinedev/core' import {HamburgerMenu, RefineThemedLayoutV2HeaderProps} from '@refinedev/mui' import React, {useContext, useEffect} from 'react' import {ColorModeContext} from '../../contexts/color-mode' import Cookies from 'js-cookie' import {useTranslation} from 'react-i18next' import {Button} from '@mui/material' import {useNavigate} from 'react-router' type IUser = { id: number name: string avatar: string is_admin: boolean } export const Header: React.FC = ({sticky = true}) => { const {mode, setMode} = useContext(ColorModeContext) const {data: user} = useGetIdentity() const {data: permissions} = usePermissions() const isAdmin = permissions?.includes('admin') const {i18n} = useTranslation() const {setWarnWhen, warnWhen} = useWarnAboutChange() const navigate = useNavigate() const handleLanguageChange = async (lang: string) => { // console.log('Language change requested:', lang) // console.log('Current warnWhen state:', warnWhen) const form = document.querySelector('form') const inputs = form?.querySelectorAll('input, textarea, select') const saveButton = document.querySelector('.refine-save-button') as HTMLButtonElement // Сохраняем текущий URL перед любыми действиями const currentLocation = window.location.pathname + window.location.search if (form && saveButton) { const hasChanges = Array.from(inputs || []).some((input) => { if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) { return input.value !== input.defaultValue } if (input instanceof HTMLSelectElement) { return input.value !== input.options[input.selectedIndex].defaultSelected.toString() } return false }) if (hasChanges || warnWhen) { try { // console.log('Attempting to save changes...') setWarnWhen(false) saveButton.click() // console.log('Save button clicked') await new Promise((resolve) => setTimeout(resolve, 1000)) // После сохранения меняем язык и возвращаемся на ту же страницу Cookies.set('lang', lang) i18n.changeLanguage(lang) navigate(currentLocation) return } catch (error) { console.error('Failed to save form:', error) setWarnWhen(true) return } } } // Если нет формы или изменений, просто меняем язык // console.log('Setting language cookie:', lang) Cookies.set('lang', lang) // console.log('Changing i18n language') i18n.changeLanguage(lang) // Используем текущий URL для навигации navigate(0) } useEffect(() => { const savedLang = Cookies.get('lang') || 'ru' i18n.changeLanguage(savedLang) }, [i18n]) return ( {['ru', 'en', 'zh'].map((lang) => ( ))} { setMode() }} sx={{ marginRight: '2px', }} > {mode === 'dark' ? : } {(user?.avatar || user?.name) && ( {user?.name && ( {user?.name} {isAdmin ? 'Администратор' : 'Пользователь'} )} )} ) }