fix: Улучшено получение chat_id с поддержкой sessionStorage и разных форматов URL

This commit is contained in:
dosai 2025-11-01 20:23:06 +03:00
parent cc6b5d10ad
commit 5e88427368

View File

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