105 lines
4.4 KiB
TypeScript
105 lines
4.4 KiB
TypeScript
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,
|
||
};
|
||
}; |