front-hub/src/utils/hooks/useReauthorization.ts
Nastya 0ae7cb702f
All checks were successful
Deploy / CreateImage (push) Successful in 3m15s
Deploy / DeployService (push) Successful in 28s
errorreporter
2025-07-23 15:14:25 +03:00

105 lines
4.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
};
};