import { clearAuthToken, getAuthToken, setAuthToken } from '@frontend/kitui'; import { logout } from '@root/api/auth'; import { setNotEnoughMoneyAmount } from '@root/stores/allTypesOfPurchases'; import { clearCustomTariffs } from '@root/stores/customTariffs'; import { clearTickets } from '@root/stores/tickets'; import { clearUserData, setUserId, useUserStore } from '@root/stores/user'; import { useEffect, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { clearUserSession, logoutAndRedirect } from "@root/utils/logout"; interface QuizAuthParams { action?: string; dif?: string; data?: string; userid?: string; wayback?: string; } export const useReauthorization = () => { const userId = useUserStore(store => store.userId); const user = useUserStore(store => store.user); const { search } = useLocation(); const navigate = useNavigate(); const [isProcessing, setIsProcessing] = useState(false); useEffect(() => { // Этот эффект сработает при каждом изменении query-параметров const params = new URLSearchParams(search); // Обработка старых параметров (userid, sec) const URLuserId = params.get('userid'); const URLtoken = params.get('sec'); // Обработка новых параметров авторизации const quizParams: QuizAuthParams = { action: params.get("action") || undefined, dif: params.get("dif") || undefined, data: params.get("data") || undefined, userid: params.get("userid") || undefined, wayback: params.get("wayback") || undefined, }; const { action, dif, data: token, userid: quizUserId, wayback } = quizParams; // Если есть новые параметры авторизации, обрабатываем их if (action && dif && token && quizUserId) { // Если пользователь уже авторизован и это тот же пользователь, перенаправляем на payment if (user?._id === quizUserId) { let returnUrl = `/payment?action=${action}&dif=${dif}&user=${quizUserId}`; if (wayback) returnUrl += `&wayback=${wayback}`; navigate(returnUrl, { replace: true }); return; } // Если уже обрабатываем авторизацию, не запускаем повторно if (isProcessing) { return; } setIsProcessing(true); const processQuizAuth = async () => { try { // Если есть текущий токен, очищаем данные if (getAuthToken()) { logoutAndRedirect(navigate); await logout(); } // Устанавливаем новый токен и ID пользователя setAuthToken(token); setUserId(quizUserId); } catch (error) { console.error("Ошибка авторизации:", error); // Перенаправляем на внешний сайт в случае ошибки const link = document.createElement("a"); link.href = "https://quiz.pena.digital/tariffs"; document.body.appendChild(link); link.click(); } finally { setIsProcessing(false); } }; processQuizAuth(); return; } // Обработка старых параметров (userid, sec) if (URLuserId !== userId && URLtoken) { // Если есть токен в URL, устанавливаем его // Очищаем данные только если токен действительно изменился if (getAuthToken() !== URLtoken) { clearUserSession(); // Не вызываем logout() чтобы избежать перенаправления } setAuthToken(URLtoken); } }, [search, userId, user?._id, navigate, isProcessing]); return { isProcessing, }; };