frontPanel/src/utils/hooks/useAutoPay.ts

103 lines
4.2 KiB
TypeScript
Raw Normal View History

import { cartApi } from "@api/cart";
import { useUserStore } from "@/stores/user";
2024-08-03 09:19:35 +00:00
import { enqueueSnackbar } from "notistack";
import { useEffect } from "react";
import { useNavigate, useSearchParams } from "react-router-dom";
import { calcTimeOfReadyPayCart, cancelPayCartProcess, startPayCartProcess, useNotEnoughMoneyAmount } from "@/stores/notEnoughMoneyAmount";
import { startCC } from "@/stores/cc";
2025-06-09 14:26:19 +00:00
import { setEditQuizId, setCurrentStep } from "@root/quizes/actions";
2024-08-03 09:19:35 +00:00
/*
Есть три пути по которому мы ходили из квиза в хаб. Нам нехватило денег при:
1)Покупке обычного тарифа
2)Покупке тарифа-заказ-квиза
3)Покупке тарифа в настройке квиза в вкладке ИИ
*/
2024-08-03 09:19:35 +00:00
export const useAfterPay = () => {
const navigate = useNavigate();
const [searchParams, setSearchParams] = useSearchParams();
2024-08-03 09:19:35 +00:00
const userId = useUserStore(store => store.userId)
const userAccount = useUserStore(state => state.userAccount);
const userWithWallet = useUserStore((state) => state.customerAccount); //c wallet
const siteReadyPayCart = useNotEnoughMoneyAmount(state => state.siteReadyPayCart);
2024-08-03 09:19:35 +00:00
let URLaction = searchParams.get("action");//что мы, собсна, хотим: оплатить, пополнить, заказать квиз
let URLuserId = searchParams.get("userid");//тот кто начал всё это действо
let URLadditionalinformation = searchParams.get("additionalinformation");//его токен
2025-06-09 14:26:19 +00:00
useEffect(() => {
setSearchParams({}, { replace: true });
2024-08-03 09:19:35 +00:00
if (userId && URLuserId && userId === URLuserId) {
if (URLaction === "buy") startPayCartProcess(URLuserId);
if (URLaction === "createquizcc") {
startCC();
2024-08-03 09:19:35 +00:00
(async () => {
//Проверяем можем ли мы оплатить корзину здесь и сейчас
const [, payCartError] = await cartApi.pay();
2024-08-03 09:19:35 +00:00
if (payCartError) {
//Не получилось купить корзину. Ставим флаг, что сайт в состоянии ожидания пополнения счёта для оплаты
startPayCartProcess(URLuserId);
2024-08-03 09:19:35 +00:00
} else {
navigate("/tariffs");
cancelPayCartProcess();
}
})()
}
//Покупка ИИ тарифа из настройки квиза ИИ вкладки
if (URLaction === "buy" && URLadditionalinformation) {
const quizId = Number(URLadditionalinformation);
if (quizId) {
setEditQuizId(Number(quizId)); //Выбираем квиз
setCurrentStep(17); // Шаг для персонализации AI
// Проверяем wayback параметр для определения куда переходить
const wayback = searchParams.get("wayback");
if (wayback === "edit") {
// Сначала переходим на /edit, затем на /personalization-ai
navigate("/edit");
// Используем setTimeout чтобы дать время для загрузки /edit
setTimeout(() => {
navigate("/personalization-ai");
}, 100);
} else {
// Прямой переход на /personalization-ai
navigate("/personalization-ai");
}
}
}
}
}, []);
//Обработка необходимости купить после пополнения
useEffect(() => {
if (userId !== null && siteReadyPayCart !== null && siteReadyPayCart[userId] !== undefined) {
const deadline = siteReadyPayCart[userId];
if (calcTimeOfReadyPayCart(deadline)) {
//Время ещё не вышло. У нас стоит флаг покупать корзину если время не вышло.
(async () => {
const [, payCartError] = await cartApi.pay();
if (!payCartError) {
enqueueSnackbar("Товары успешно приобретены");
cancelPayCartProcess();
2024-08-03 09:19:35 +00:00
}
})()
}
}
}, [userAccount, userId, siteReadyPayCart, userWithWallet])
}