diff --git a/frontend/components/DynamicCalculator.tsx b/frontend/components/DynamicCalculator.tsx index f8dae88..85c2b9c 100644 --- a/frontend/components/DynamicCalculator.tsx +++ b/frontend/components/DynamicCalculator.tsx @@ -56,35 +56,55 @@ export default function DynamicCalculator({ calculatorType }: DynamicCalculatorP setFormData(initialData); }, [calculator]); - // Получаем chat_id из URL (для статического экспорта используем window.location) + // Получаем chat_id из URL (для статического экспорта используем window.location напрямую) useEffect(() => { if (typeof window === 'undefined') return; - // Получаем chat_id из query параметров URL - const params = new URLSearchParams(window.location.search); - let id = params.get('chat_id'); - - // Если не найден в search params, проверяем hash - if (!id && window.location.hash) { - const hashParams = new URLSearchParams(window.location.hash.replace('#', '')); - id = hashParams.get('chat_id'); - } - - if (id) { - setChatId(id); - } - - // Также слушаем изменения URL (для навигации через кнопки) - const handleLocationChange = () => { - const newParams = new URLSearchParams(window.location.search); - const newId = newParams.get('chat_id'); - if (newId && newId !== chatId) { - setChatId(newId); + const updateChatId = () => { + // Получаем chat_id из query параметров URL + const params = new URLSearchParams(window.location.search); + let id = params.get('chat_id'); + + // Если не найден в search params, проверяем hash + if (!id && window.location.hash) { + const hashParams = new URLSearchParams(window.location.hash.replace('#', '')); + id = hashParams.get('chat_id'); + } + + // Если всё ещё не найден, проверяем весь URL строку + if (!id) { + const fullUrl = window.location.href; + const chatIdMatch = fullUrl.match(/[?&#]chat_id=([^&#]+)/); + if (chatIdMatch) { + id = decodeURIComponent(chatIdMatch[1]); + } + } + + if (id) { + setChatId(id); + // Сохраняем в sessionStorage для сохранения при переходах + if (typeof Storage !== 'undefined') { + sessionStorage.setItem('chat_id', id); + } + } else { + // Пробуем восстановить из sessionStorage + if (typeof Storage !== 'undefined') { + const savedChatId = sessionStorage.getItem('chat_id'); + if (savedChatId) { + setChatId(savedChatId); + } + } } }; - // Проверяем при монтировании и при изменении calculatorType - handleLocationChange(); + updateChatId(); + + // Слушаем изменения URL (popstate для навигации назад/вперёд) + window.addEventListener('popstate', updateChatId); + + return () => { + window.removeEventListener('popstate', updateChatId); + }; }, [calculatorType]); // Преобразование строки в число