import React, { useEffect, useState, useRef } from "react"; import { useNavigate, useSearchParams } from "react-router-dom"; import { cancelPayCartProcess, setNotEnoughMoneyAmount, startPayCartProcess } from "@root/stores/allTypesOfPurchases"; import { useUserStore } from "@root/stores/user"; import { setAction, setBackWay, setFromDomain, setAdditionalinformation } from "@root/stores/allTypesOfPurchases"; import { Action, FromDomain } from "@root/model/autoPay"; export const useAutoPay = (): [string, React.Dispatch>] => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const hasProcessed = useRef(false); const userId = useUserStore(store => store.userId) const [paymentValueField, setPaymentValueField] = useState("0"); useEffect(() => { // Если уже обработали, не выполняем повторно if (hasProcessed.current) { console.log("useAutoPay - уже обработано, пропускаем"); return; } console.log("useAutoPay - useEffect запущен"); // Сначала извлекаем все параметры let URLfromDomain = searchParams.get("fromdomain");//домен откуда произошёл запрос на финансовые работы let URLaction = searchParams.get("action");//что мы, собсна, хотим: оплатить, пополнить, купить и создать квиз let URLuserId = searchParams.get("userid");//тот кто начал всё это действо const URLwayBack = searchParams.get("wayback") ?? "";//путь по которому нужно будет пройти после того как закончим манипуляции (без домена) let URLmoneyDifferent = Number(searchParams.get("dif"));//сколько нужно деняк (в копейках) const URLadditionalinformation = searchParams.get("additionalinformation") ?? "";//дополнительная информация console.log("useAutoPay - извлеченные параметры:"); console.log("URLfromDomain:", URLfromDomain); console.log("URLaction:", URLaction); console.log("URLuserId:", URLuserId); console.log("URLwayBack:", URLwayBack); console.log("URLmoneyDifferent (копейки):", URLmoneyDifferent); console.log("URLadditionalinformation:", URLadditionalinformation); console.log("userId:", userId); // Если нет URL параметров, но мы уже на странице /payment, не делаем ничего if (!URLfromDomain && !URLaction && !URLuserId && URLmoneyDifferent === 0) { console.log("useAutoPay - нет URL параметров, но мы уже на /payment, пропускаем"); hasProcessed.current = true; return; } //Анализ нужно ли вообще вмешательство этого хука const condition1 = URLuserId !== null && URLuserId && URLuserId === userId; const condition2 = URLfromDomain === "quiz" || URLfromDomain === "squiz" || URLfromDomain === "hub" || URLfromDomain === "shub" || URLfromDomain === "localhost:3000"; const condition3 = URLaction === "topupwallet" || URLaction === "createquizcc" || URLaction === "buy"; const condition4 = !Number.isNaN(URLmoneyDifferent); console.log("useAutoPay - проверка условий:"); console.log("condition1 (userId совпадает):", condition1); console.log("condition2 (fromDomain валидный):", condition2); console.log("condition3 (action валидный):", condition3); console.log("condition4 (moneyDifferent валидный):", condition4); if (condition1 && condition2 && condition3 && condition4) { console.log("useAutoPay - условия выполнены, устанавливаем значения"); // Ставим флаг, что сайт в состоянии ожидания пополнения счёта для оплаты startPayCartProcess(URLuserId); console.log("useAutoPay - устанавливаем fromDomain:", URLfromDomain); setFromDomain(URLfromDomain as FromDomain); const processedBackWay = URLwayBack.startsWith('/') ? URLwayBack.slice(1) : URLwayBack; console.log("useAutoPay - устанавливаем backWay:", processedBackWay); setBackWay(processedBackWay); console.log("useAutoPay - устанавливаем action:", URLaction); setAction(URLaction as Action); console.log("useAutoPay - устанавливаем additionalinformation:", URLadditionalinformation); setAdditionalinformation(URLadditionalinformation); // URLmoneyDifferent в копейках, конвертируем в рубли для отображения const rubles = URLmoneyDifferent / 100; setPaymentValueField(rubles.toString()); setNotEnoughMoneyAmount(URLmoneyDifferent); console.log("useAutoPay - установлено paymentValueField (рубли):", rubles.toString()); console.log("useAutoPay - установлено backWay:", processedBackWay); console.log("useAutoPay - установлено additionalinformation:", URLadditionalinformation); // Только после установки всех значений делаем навигацию navigate("/payment", { replace: true }); } else { console.log("useAutoPay - условия не выполнены, отменяем процесс"); console.log("Причины:"); if (!condition1) console.log("- userId не совпадает"); if (!condition2) console.log("- fromDomain не валидный:", URLfromDomain); if (!condition3) console.log("- action не валидный:", URLaction); if (!condition4) console.log("- moneyDifferent не валидный:", URLmoneyDifferent); cancelPayCartProcess(); } // Отмечаем, что обработали hasProcessed.current = true; // Убираем cleanup функцию, так как она вызывается слишком рано // Cleanup будет в Payment компоненте при размонтировании }, [searchParams, userId, navigate]) return [paymentValueField, setPaymentValueField]; }