fix payment
This commit is contained in:
parent
e44c64165a
commit
6169e03d9a
@ -71,6 +71,10 @@ const App = () => {
|
|||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const userId = useUserStore(state => state.userId);
|
const userId = useUserStore(state => state.userId);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
// Используем обновленный хук useReauthorization для обработки авторизации
|
||||||
|
const { isProcessing } = useReauthorization();
|
||||||
|
|
||||||
useUserFetcher({
|
useUserFetcher({
|
||||||
url: process.env.REACT_APP_DOMAIN + `/user/${userId}`,
|
url: process.env.REACT_APP_DOMAIN + `/user/${userId}`,
|
||||||
userId,
|
userId,
|
||||||
@ -188,6 +192,7 @@ const App = () => {
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<Route path={"/image/:srcImage"} element={<ChatImageNewWindow />} />
|
<Route path={"/image/:srcImage"} element={<ChatImageNewWindow />} />
|
||||||
|
|
||||||
<Route element={<PrivateRoute />}>
|
<Route element={<PrivateRoute />}>
|
||||||
<Route element={<ProtectedLayout />}>
|
<Route element={<ProtectedLayout />}>
|
||||||
<Route path="/tariffs" element={<Tariffs />} />
|
<Route path="/tariffs" element={<Tariffs />} />
|
||||||
|
@ -8,6 +8,7 @@ import {
|
|||||||
Typography,
|
Typography,
|
||||||
useMediaQuery,
|
useMediaQuery,
|
||||||
useTheme,
|
useTheme,
|
||||||
|
CircularProgress,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { activatePromocode } from "@root/api/promocode";
|
import { activatePromocode } from "@root/api/promocode";
|
||||||
import { sendPayment, sendRSPayment } from "@root/api/wallet";
|
import { sendPayment, sendRSPayment } from "@root/api/wallet";
|
||||||
@ -31,6 +32,7 @@ import { WarnModal } from "./WarnModal";
|
|||||||
import { mutate } from "swr";
|
import { mutate } from "swr";
|
||||||
import { allTypesOfPurchases } from "@root/stores/allTypesOfPurchases";
|
import { allTypesOfPurchases } from "@root/stores/allTypesOfPurchases";
|
||||||
import { useAutoPay } from "@root/utils/hooks/useAutoPay";
|
import { useAutoPay } from "@root/utils/hooks/useAutoPay";
|
||||||
|
import { useReauthorization } from "@root/utils/hooks/useReauthorization";
|
||||||
|
|
||||||
type PaymentMethod = {
|
type PaymentMethod = {
|
||||||
label: string;
|
label: string;
|
||||||
@ -61,6 +63,8 @@ export default function Payment() {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const handleCustomBackNavigation = useHistoryTracker();
|
const handleCustomBackNavigation = useHistoryTracker();
|
||||||
|
|
||||||
|
// Используем обновленный хук useReauthorization для обработки авторизации
|
||||||
|
const { isProcessing } = useReauthorization();
|
||||||
|
|
||||||
//Логика сбора данных из урла "чё мы ваще пришли на эту страницу"
|
//Логика сбора данных из урла "чё мы ваще пришли на эту страницу"
|
||||||
useAutoPay();
|
useAutoPay();
|
||||||
@ -172,6 +176,28 @@ export default function Payment() {
|
|||||||
px: isTablet ? (upMd ? "40px" : "18px") : "20px",
|
px: isTablet ? (upMd ? "40px" : "18px") : "20px",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
{/* Показываем состояние загрузки во время авторизации */}
|
||||||
|
{isProcessing && (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
minHeight: "400px",
|
||||||
|
gap: 2,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<CircularProgress size={60} />
|
||||||
|
<Typography variant="h6" color="text.secondary">
|
||||||
|
Идёт авторизация...
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Основной контент страницы */}
|
||||||
|
{!isProcessing && (
|
||||||
|
<>
|
||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
mt: "20px",
|
mt: "20px",
|
||||||
@ -334,6 +360,8 @@ export default function Payment() {
|
|||||||
</Box>
|
</Box>
|
||||||
<WarnModal open={warnModalOpen} setOpen={setWarnModalOpen} />
|
<WarnModal open={warnModalOpen} setOpen={setWarnModalOpen} />
|
||||||
<SorryModal open={sorryModalOpen} setOpen={setSorryModalOpen} />
|
<SorryModal open={sorryModalOpen} setOpen={setSorryModalOpen} />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</SectionWrapper>
|
</SectionWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -3,21 +3,94 @@ import { logout } from '@root/api/auth';
|
|||||||
import { setNotEnoughMoneyAmount } from '@root/stores/allTypesOfPurchases';
|
import { setNotEnoughMoneyAmount } from '@root/stores/allTypesOfPurchases';
|
||||||
import { clearCustomTariffs } from '@root/stores/customTariffs';
|
import { clearCustomTariffs } from '@root/stores/customTariffs';
|
||||||
import { clearTickets } from '@root/stores/tickets';
|
import { clearTickets } from '@root/stores/tickets';
|
||||||
import { clearUserData, useUserStore } from '@root/stores/user';
|
import { clearUserData, setUserId, useUserStore } from '@root/stores/user';
|
||||||
import { useEffect } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { useLocation } from 'react-router-dom';
|
import { useLocation, useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
|
interface QuizAuthParams {
|
||||||
|
action?: string;
|
||||||
|
dif?: string;
|
||||||
|
data?: string;
|
||||||
|
userid?: string;
|
||||||
|
wayback?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export const useReauthorization = () => {
|
export const useReauthorization = () => {
|
||||||
const userId = useUserStore(store => store.userId)
|
const userId = useUserStore(store => store.userId);
|
||||||
|
const user = useUserStore(store => store.user);
|
||||||
const { search } = useLocation();
|
const { search } = useLocation();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const [isProcessing, setIsProcessing] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Этот эффект сработает при каждом изменении query-параметров
|
// Этот эффект сработает при каждом изменении query-параметров
|
||||||
const params = new URLSearchParams(search);
|
const params = new URLSearchParams(search);
|
||||||
|
|
||||||
|
// Обработка старых параметров (userid, sec)
|
||||||
const URLuserId = params.get('userid');
|
const URLuserId = params.get('userid');
|
||||||
const URLtoken = params.get('sec');
|
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()) {
|
||||||
|
clearAuthToken();
|
||||||
|
clearUserData();
|
||||||
|
clearCustomTariffs();
|
||||||
|
clearTickets();
|
||||||
|
setNotEnoughMoneyAmount(0);
|
||||||
|
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) {
|
if (URLuserId !== userId && URLtoken) {
|
||||||
// Если есть токен в URL, устанавливаем его
|
// Если есть токен в URL, устанавливаем его
|
||||||
// Очищаем данные только если токен действительно изменился
|
// Очищаем данные только если токен действительно изменился
|
||||||
@ -31,5 +104,9 @@ export const useReauthorization = () => {
|
|||||||
}
|
}
|
||||||
setAuthToken(URLtoken);
|
setAuthToken(URLtoken);
|
||||||
}
|
}
|
||||||
}, [search]);
|
}, [search, userId, user?._id, navigate, isProcessing]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
isProcessing,
|
||||||
|
};
|
||||||
};
|
};
|
Loading…
Reference in New Issue
Block a user