front-hub/src/utils/hooks/useReauthorization.ts

105 lines
4.4 KiB
TypeScript
Raw Normal View History

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";
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);
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();
// Не вызываем logout() чтобы избежать перенаправления
}
setAuthToken(URLtoken);
}
}, [search, userId, user?._id, navigate, isProcessing]);
return {
isProcessing,
};
};