diff --git a/src/App.tsx b/src/App.tsx index be99859..82088ca 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -169,7 +169,7 @@ function App() { ]} options={{ syncWithLocation: true, - warnWhenUnsavedChanges: true, + warnWhenUnsavedChanges: true, // Включаем глобально useNewQueryKeys: true, projectId: 'Wv044J-t53S3s-PcbJGe', }} diff --git a/src/components/header/index.tsx b/src/components/header/index.tsx index 8ae5cf5..f6420b0 100644 --- a/src/components/header/index.tsx +++ b/src/components/header/index.tsx @@ -6,7 +6,7 @@ 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} from '@refinedev/core' +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' @@ -23,28 +23,75 @@ type IUser = { } export const Header: React.FC = ({sticky = true}) => { - const navigate = useNavigate() 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) + } - // Установка языка по умолчанию из куки или ru useEffect(() => { const savedLang = Cookies.get('lang') || 'ru' i18n.changeLanguage(savedLang) }, [i18n]) - const handleLanguageChange = (lang: string) => { - Cookies.set('lang', lang) - i18n.changeLanguage(lang) - - navigate(0) - // Альтернативный вариант - переход на тот же URL - // navigate(location.pathname + location.search, { replace: true }) - } - return (