2025-07-09 07:57:33 +00:00
|
|
|
|
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';
|
2025-07-23 12:14:25 +00:00
|
|
|
|
import { clearUserSession, logoutAndRedirect } from "@root/utils/logout";
|
2025-07-09 07:57:33 +00:00
|
|
|
|
|
|
|
|
|
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()) {
|
2025-07-23 12:14:25 +00:00
|
|
|
|
logoutAndRedirect(navigate);
|
2025-07-09 07:57:33 +00:00
|
|
|
|
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) {
|
2025-07-23 12:14:25 +00:00
|
|
|
|
clearUserSession();
|
2025-07-09 07:57:33 +00:00
|
|
|
|
// Не вызываем logout() чтобы избежать перенаправления
|
|
|
|
|
}
|
|
|
|
|
setAuthToken(URLtoken);
|
|
|
|
|
}
|
|
|
|
|
}, [search, userId, user?._id, navigate, isProcessing]);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
isProcessing,
|
|
|
|
|
};
|
|
|
|
|
};
|