fix recover and fix customer запись в стор

This commit is contained in:
Nastya 2025-07-20 15:17:39 +03:00
parent 0d0acfd7b9
commit 33b695ef13
9 changed files with 252 additions and 29 deletions

@ -97,8 +97,17 @@ export default function App() {
useUserAccountFetcher<UserAccount>({ useUserAccountFetcher<UserAccount>({
url: `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1/account`, url: `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1/account`,
userId, userId,
onNewUserAccount: setCustomerAccount, onNewUserAccount: (account) => {
console.log("App: Setting customerAccount:", account);
console.log("App: customerAccount structure:", {
userId: account?.userId,
wallet: account?.wallet,
cart: account?.cart
});
setCustomerAccount(account);
},
onError: (error) => { onError: (error) => {
console.log("App: Error in customerAccount fetcher:", error);
const errorMessage = getMessageFromFetchError(error); const errorMessage = getMessageFromFetchError(error);
if (errorMessage) { if (errorMessage) {
enqueueSnackbar(errorMessage); enqueueSnackbar(errorMessage);

@ -0,0 +1,12 @@
import { useAuthRedirect } from "../../utils/hooks/useAuthRedirect";
export default function Payment() {
// Используем хук авторизации
const { isProcessing } = useAuthRedirect();
// Если идет обработка авторизации, показываем загрузку
if (isProcessing) {
return <div>Идёт загрузка...</div>;
}
// ... existing component code ...

@ -1,11 +1,13 @@
import { Tabs as MuiTabs } from "@mui/material"; import { Tabs as MuiTabs } from "@mui/material";
import { CustomTab } from "./CustomTab"; import { CustomTab } from "./CustomTab";
import { TypePages } from "./types";
type TabsProps = { type TabsProps = {
names: string[]; names: string[];
items: string[]; items: string[];
selectedItem: "day" | "count" | "dop" | "hide" | "create"; selectedItem: TypePages;
setSelectedItem: (num: "day" | "count" | "dop") => void; setSelectedItem: (num: TypePages) => void;
toDop: () => void;
}; };
export const Tabs = ({ export const Tabs = ({
@ -18,7 +20,7 @@ export const Tabs = ({
sx={{ m: "25px" }} sx={{ m: "25px" }}
TabIndicatorProps={{ sx: { display: "none" } }} TabIndicatorProps={{ sx: { display: "none" } }}
value={selectedItem} value={selectedItem}
onChange={(event, newValue: "day" | "count" | "dop") => { onChange={(event, newValue: TypePages) => {
setSelectedItem(newValue); setSelectedItem(newValue);
}} }}
variant="scrollable" variant="scrollable"

@ -46,11 +46,16 @@ function TariffPage() {
const navigate = useNavigate(); const navigate = useNavigate();
const user = useUserStore((state) => state.customerAccount); const user = useUserStore((state) => state.customerAccount);
const userWithWallet = useUserStore((state) => state.customerAccount); //c wallet const userWithWallet = useUserStore((state) => state.customerAccount); //c wallet
const userAccount = useUserStore((state) => state.userAccount);
console.log("________________userWithWallet_____________USERRRRRRR") console.log("________________userWithWallet_____________USERRRRRRR")
console.log(userWithWallet) console.log(userWithWallet)
const { data: discounts } = useDiscounts(userId); console.log("________________userAccount_____________")
console.log(userAccount)
console.log("________________customerAccount_____________")
console.log(user)
const { data: discounts, error: discountsError, isLoading: discountsLoading } = useDiscounts(userId);
const [isRequestCreate, setIsRequestCreate] = useState(false); const [isRequestCreate, setIsRequestCreate] = useState(false);
const [openModal, setOpenModal] = useState({}); const [openModal, setOpenModal] = useState<{ id?: string; price?: number }>({});
const { cashString, cashCop, cashRub } = useWallet(); const { cashString, cashCop, cashRub } = useWallet();
const [selectedItem, setSelectedItem] = useState<TypePages>("day"); const [selectedItem, setSelectedItem] = useState<TypePages>("day");
const { isTestServer } = useDomainDefine(); const { isTestServer } = useDomainDefine();
@ -64,20 +69,70 @@ console.log("________34563875693785692576_____ TARIFFS")
console.log(tariffs) console.log(tariffs)
useEffect(() => { useEffect(() => {
if (userWithWallet) { if (userWithWallet && user) {
let cs = currencyFormatter.format(Number(user.wallet.cash) / 100); let cs = currencyFormatter.format(Number(user.wallet.cash) / 100);
let cc = Number(user.wallet.cash); let cc = Number(user.wallet.cash);
let cr = Number(user.wallet.cash) / 100; let cr = Number(user.wallet.cash) / 100;
setCash(cs, cc, cr); setCash(cs, cc, cr);
} }
}, [userWithWallet]); }, [userWithWallet, user]);
useEffect(() => { useEffect(() => {
if (cc) { if (cc) {
setIsRequestCreate(true) setIsRequestCreate(true)
cancelCC() cancelCC()
} }
}, []) }, [])
if (!user || !tariffs || !discounts) return <LoadingPage />;
// Добавляем логирование для диагностики
console.log("Tariffs loading state:", {
user: !!user,
userWithWallet: !!userWithWallet,
userId: userId,
tariffs: !!tariffs,
discounts: !!discounts,
tariffsLoading,
tariffsError,
discountsLoading,
discountsError,
userDetails: user ? {
id: user._id,
wallet: user.wallet,
cart: user.cart?.length
} : null
});
// Проверяем, что все данные загружены и нет ошибок
const isDataLoading = tariffsLoading || (userId && discountsLoading);
const hasErrors = tariffsError || discountsError;
// Если userId есть, но customerAccount еще не загружен, показываем загрузку
const isCustomerAccountLoading = userId && !user;
const hasAllData = user && tariffs && (userId ? discounts : true);
if (isDataLoading || isCustomerAccountLoading) {
console.log("Showing loading page because:", {
dataLoading: isDataLoading,
customerAccountLoading: isCustomerAccountLoading,
userId,
user: !!user
});
return <LoadingPage />;
}
if (hasErrors) {
console.log("Showing loading page because of errors:", { tariffsError, discountsError });
return <LoadingPage />;
}
if (!hasAllData) {
console.log("Showing loading page because:", {
noUser: !user,
noTariffs: !tariffs,
noDiscounts: userId && !discounts
});
return <LoadingPage />;
}
const openModalHC = (tariffInfo: any) => setOpenModal(tariffInfo); const openModalHC = (tariffInfo: any) => setOpenModal(tariffInfo);
const tryBuy = async ({ id, price }: { id: string; price: number }) => { const tryBuy = async ({ id, price }: { id: string; price: number }) => {
@ -99,21 +154,30 @@ console.log(tariffs)
//Если нам хватает денежек - покупаем тариф //Если нам хватает денежек - покупаем тариф
const [data, payError] = await cartApi.pay(); const [data, payError] = await cartApi.pay();
console.log("payError || !data")
console.log("payError", payError)
console.log("data", data)
if (payError || !data) { if (payError || !data) {
console.log("прошли 1 проверку_______")
//если денег не хватило //если денег не хватило
if (payError?.includes("insufficient funds") || payError?.includes("Payment Required")) { if (payError?.includes("insufficient funds") || payError?.includes("Payment Required")) {
console.log("прошли 2 проверку_______")
let cashDif = Number(payError.split(":")[1]); let cashDif = Number(payError.split(":")[1]);
var link = document.createElement("a");
link.href = generateHubWalletRequestURL({ if (!userId) {
enqueueSnackbar("Ошибка: ID пользователя не найден");
return;
}
const l = generateHubWalletRequestURL({
action: cc ? "createquizcc" : "buy", action: cc ? "createquizcc" : "buy",
dif: cashDif.toString(), dif: cashDif.toString(),
userid: userId, userid: userId,
wayback: "list",
token token
}); });
// link.href = `https://${isTestServer ? "s" : ""}hub.pena.digital/quizpayment?action=squizpay&dif=${cashDif}&data=${token}&userid=${userId}`; console.log(l)
// if (cc) link.href = link.href + "&cc=true"//после покупки тарифа и возвращения будем знать что надо открыть модалку window.location.href = l;
document.body.appendChild(link);
link.click();
return; return;
} }
@ -257,7 +321,7 @@ console.log(tariffs)
tariffs={tariffs} tariffs={tariffs}
user={user} user={user}
discounts={discounts} discounts={discounts || []}
openModalHC={openModalHC} openModalHC={openModalHC}
userPrivilegies={userPrivilegies} userPrivilegies={userPrivilegies}
startRequestCreate={startRequestCreate} startRequestCreate={startRequestCreate}
@ -304,7 +368,7 @@ console.log(tariffs)
tariffs={tariffs} tariffs={tariffs}
user={user} user={user}
discounts={discounts} discounts={discounts || []}
openModalHC={openModalHC} openModalHC={openModalHC}
userPrivilegies={userPrivilegies} userPrivilegies={userPrivilegies}
startRequestCreate={startRequestCreate} startRequestCreate={startRequestCreate}
@ -314,8 +378,12 @@ console.log(tariffs)
<PaymentConfirmationModal <PaymentConfirmationModal
open={Object.values(openModal).length > 0} open={Object.values(openModal).length > 0}
onClose={() => setOpenModal({})} onClose={() => setOpenModal({})}
onConfirm={() => tryBuy(openModal)} onConfirm={() => {
price={openModal.price} if (openModal.id && openModal.price !== undefined) {
tryBuy({ id: openModal.id, price: openModal.price });
}
}}
price={openModal.price || 0}
/> />
<ModalRequestCreate open={isRequestCreate} onClose={() => setIsRequestCreate(false)} /> <ModalRequestCreate open={isRequestCreate} onClose={() => setIsRequestCreate(false)} />
</> </>

@ -242,7 +242,7 @@ export default function SignupDialog() {
</Link> </Link>
<Link <Link
component={RouterLink} component={RouterLink}
to="/restore" to="/recover"
state={{ backgroundLocation: location.state.backgroundLocation }} state={{ backgroundLocation: location.state.backgroundLocation }}
sx={{ color: "#7E2AEA" }} sx={{ color: "#7E2AEA" }}
> >

@ -71,5 +71,7 @@ export const clearUserData = () => useUserStore.setState({ ...initialState });
export const setUserAccount = (userAccount: OriginalUserAccount) => export const setUserAccount = (userAccount: OriginalUserAccount) =>
useUserStore.setState({ userAccount }); useUserStore.setState({ userAccount });
export const setCustomerAccount = (customerAccount: UserAccount) => export const setCustomerAccount = (customerAccount: UserAccount) => {
console.log("setCustomerAccount called with:", customerAccount);
useUserStore.setState({ customerAccount }); useUserStore.setState({ customerAccount });
};

@ -17,8 +17,24 @@ export const generateHubWalletRequestURL = ({
}) => { }) => {
let currentDomain = window.location.host; let currentDomain = window.location.host;
if (currentDomain === "localhost") currentDomain += ":3000"; if (currentDomain === "localhost") currentDomain += ":3000";
let url = `https://${isTestServer ? "s" : ""}hub.pena.digital/payment?fromdomain=${currentDomain}&action=${action}&dif=${dif}&userid=${userid}&sec=${token}`;
if (additionalinformation) url += `&additionalinformation=${additionalinformation}`; // Используем более надежный способ генерации URL
if (wayback) url += `&wayback=${wayback}`; const baseUrl = `http://localhost:3001/anyservicepayment`;
const params = new URLSearchParams({
fromdomain: currentDomain,
action: action,
dif: dif,
userid: userid,
sec: token
});
if (additionalinformation) params.append('additionalinformation', additionalinformation);
if (wayback) params.append('wayback', wayback);
let url = `${baseUrl}?${params.toString()}`;
// Для продакшена раскомментировать эту строку:
// let url = `https://${isTestServer ? "s" : ""}hub.pena.digital/payment?${params.toString()}`;
return url; return url;
} }

@ -0,0 +1,80 @@
import { useEffect, useState } from "react";
import { useNavigate, useSearchParams } from "react-router-dom";
import {
clearAuthToken,
getMessageFromFetchError,
setAuthToken,
getAuthToken,
} from "@frontend/kitui";
import {
clearUserData,
setUser,
setUserAccount,
setUserId,
useUserStore,
} from "@root/stores/user";
import { logout } from "@root/api/auth";
import { clearCustomTariffs } from "@root/stores/customTariffs";
import { clearTickets } from "@root/stores/tickets";
import { setNotEnoughMoneyAmount } from "@stores/cart";
export const useAuthRedirect = () => {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const [isProcessing, setIsProcessing] = useState(false);
const user = useUserStore((state) => state.user);
const action = searchParams.get("action");
const dif = searchParams.get("dif");
const token = searchParams.get("data");
const userId = searchParams.get("userid");
const wayback = searchParams.get("wayback");
useEffect(() => {
if (isProcessing) return;
// Если пользователь уже авторизован и это тот же пользователь
if (user?._id === userId) {
let returnUrl = `/payment?action=${action}&dif=${dif}&user=${userId}`;
if (wayback) returnUrl += `&wayback=${wayback}`;
navigate(returnUrl, { replace: true });
return;
}
// Если есть все необходимые параметры для авторизации
if (action && dif && token && userId) {
setIsProcessing(true);
(async () => {
try {
// Очищаем старые данные если есть токен
if (getAuthToken()) {
clearAuthToken();
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0);
await logout();
}
// Устанавливаем новый токен и ID пользователя
setAuthToken(token);
setUserId(userId);
// Перенаправляем на страницу оплаты
let returnUrl = `/payment?action=${action}&dif=${dif}&user=${userId}`;
if (wayback) returnUrl += `&wayback=${wayback}`;
navigate(returnUrl, { replace: true });
} catch (error) {
console.error("Auth redirect error:", error);
// В случае ошибки перенаправляем на главную страницу тарифов
navigate("/tariffs", { replace: true });
} finally {
setIsProcessing(false);
}
})();
}
}, [user, action, dif, token, userId, wayback, navigate, isProcessing]);
return { isProcessing };
};

@ -26,6 +26,7 @@ export const useUserAccountFetcher = <T = UserAccount>({
useEffect(() => { useEffect(() => {
if (!userId) return; if (!userId) return;
console.log("useUserAccountFetcher: Starting request for userId:", userId, "url:", url);
const controller = new AbortController(); const controller = new AbortController();
makeRequest<never, T>({ makeRequest<never, T>({
url, url,
@ -37,23 +38,56 @@ export const useUserAccountFetcher = <T = UserAccount>({
}) })
.then((result) => { .then((result) => {
devlog("User account", result); devlog("User account", result);
console.log(result) console.log("useUserAccountFetcher: Success for userId:", userId, "result:", result);
if (result) onNewUserAccountRef.current(result); if (result) onNewUserAccountRef.current(result);
}) })
.catch((error) => { .catch((error) => {
devlog("Error fetching user account", error); devlog("Error fetching user account", error);
console.log("useUserAccountFetcher: Error for userId:", userId, "error:", error);
if (error.response?.status === 409) return; if (error.response?.status === 409) return;
if (isAxiosError(error) && error.response?.status === 404) { if (isAxiosError(error) && error.response?.status === 404) {
createUserAccount(controller.signal, url.replace("get", "create")) console.log("useUserAccountFetcher: Creating user account for userId:", userId);
// Формируем правильный URL для создания аккаунта
let createUrl = url;
if (url.includes("/customer/v1.0.1/account")) {
// Для customerAccount используем тот же URL (POST запрос)
createUrl = url;
} else if (url.includes("/squiz/account/get")) {
// Для userAccount заменяем get на create
createUrl = url.replace("get", "create");
}
console.log("useUserAccountFetcher: Create URL:", createUrl);
createUserAccount(controller.signal, createUrl)
.then((result) => { .then((result) => {
devlog("Created user account", result); devlog("Created user account", result);
console.log("это пойдёт в стор: ") console.log("useUserAccountFetcher: Account created successfully:", result);
console.log(result)
if (result) onNewUserAccountRef.current(result.created_account as T); // Проверяем структуру ответа и записываем в стор
if (result) {
// Если результат содержит created_account, используем его
if (result.created_account) {
console.log("useUserAccountFetcher: Using result.created_account");
onNewUserAccountRef.current(result.created_account as T);
}
// Если результат сам является аккаунтом (для customerAccount)
else if (result.userId && result.wallet) {
console.log("useUserAccountFetcher: Using result directly as customerAccount");
onNewUserAccountRef.current(result as T);
}
// Если ничего не подходит, логируем для диагностики
else {
console.log("useUserAccountFetcher: Unknown result structure:", result);
onNewUserAccountRef.current(result as T);
}
}
}) })
.catch((error) => { .catch((error) => {
if (error.response?.status === 409) return; if (error.response?.status === 409) return;
devlog("Error creating user account", error); devlog("Error creating user account", error);
console.log("useUserAccountFetcher: Error creating account:", error);
onErrorRef.current?.(error); onErrorRef.current?.(error);
}); });
} else { } else {