вынесены запросы тарифов и привилегий в отдельный хук

This commit is contained in:
Nastya 2025-06-08 10:15:23 +03:00
parent 87d4c9d53d
commit 5ea6d6638a
7 changed files with 121 additions and 79 deletions

@ -1,13 +1,11 @@
import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type { GetTariffsResponse } from "@frontend/kitui";
const API_URL = `${process.env.REACT_APP_DOMAIN}/strator/tariff`;
export const getTariffs = async (
page: number,
page: number = 1,
): Promise<[GetTariffsResponse | null, string?]> => {
try {
const tariffs = await makeRequest<never, GetTariffsResponse>({
@ -17,7 +15,6 @@ export const getTariffs = async (
return [tariffs];
} catch (nativeError) {
const [error] = parseAxiosError(nativeError);
return [null, `Ошибка при получении списка тарифов. ${error}`];
}
};

9
src/api/tariffs.ts Normal file

@ -0,0 +1,9 @@
import { makeRequest } from '@utils/makeRequest';
import type { GetTariffsResponse } from '@/model/tariff';
export const getTariffs = async (): Promise<[GetTariffsResponse | null, string?]> => {
return makeRequest<GetTariffsResponse>({
url: `${process.env.REACT_APP_DOMAIN}/tariffs`,
method: 'GET'
});
};

@ -0,0 +1,59 @@
import { useUserStore } from "@/stores/user";
import { Box, Button, Modal, Typography } from "@mui/material"
interface Props {
isOpen: boolean;
openCloseHC: (b: boolean) => void;
}
export const PayModal = ({
isOpen,
openCloseHC
}: Props) => {
const privilegesOfUser = useUserStore((state) => state.userAccount?.privileges);
const user = useUserStore((state) => state.customerAccount); //у него есть wallet
return (
<Modal
open={Boolean(isOpen)}
onClose={() => openCloseHC(false)}
aria-labelledby="modal-modal-title"
aria-describedby="modal-modal-description"
>
<Box
sx={{
position: "absolute" as "absolute",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
maxWidth: "620px",
width: "100%",
bgcolor: "background.paper",
borderRadius: "12px",
boxShadow: 24,
p: "20px",
display: "flex",
flexDirection: "column",
alignItems: "center"
}}
>
<Typography sx={{ width: "100%", textAlign: "center", mb: "25px" }}>Данная услуга предоставляется за 500 рублей/опрос. Готовы оплатить?</Typography>
<Button variant="contained" onClick={() => openCloseHC(false)} >Нет</Button>
<Button sx={{ mb: "20px" }} onClick={handleDelete}>Да</Button>
</Box>
</Modal>
)
}

@ -1,10 +1,6 @@
import { logout } from "@api/auth";
import { activatePromocode } from "@api/promocode";
import type { Tariff } from "@frontend/kitui";
import { useToken } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest";
import ArrowLeft from "@icons/questionsPage/arrowLeft";
import type { GetTariffsResponse } from "@model/tariff";
import {
Box,
Button,
@ -12,15 +8,11 @@ import {
IconButton,
Modal,
Paper,
Select,
Typography,
useMediaQuery,
useTheme,
MenuItem,
} from "@mui/material";
import { clearQuizData } from "@root/quizes/store";
import { cleanAuthTicketData } from "@root/ticket";
import { clearUserData, useUserStore } from "@root/user";
import { useUserStore } from "@root/user";
import { LogoutButton } from "@ui_kit/LogoutButton";
import { useDomainDefine } from "@utils/hooks/useDomainDefine";
import { enqueueSnackbar } from "notistack";
@ -34,16 +26,14 @@ import { createTariffElements } from "./tariffsUtils/createTariffElements";
import { currencyFormatter } from "./tariffsUtils/currencyFormatter";
import { useWallet, setCash } from "@root/cash";
import { handleLogoutClick } from "@utils/HandleLogoutClick";
import { getDiscounts } from "@api/discounts";
import { cartApi } from "@api/cart";
import { getUser } from "@api/user";
import { getTariffs } from "@api/tariff";
import type { Discount } from "@model/discounts";
import { Other } from "./pages/Other";
import { ModalRequestCreate } from "./ModalRequestCreate";
import { cancelCC, useCC } from "@/stores/cc";
import { NavSelect } from "./NavSelect";
import { useTariffs } from '@utils/hooks/useTariffs';
import { useDiscounts } from '@utils/hooks/useDiscounts';
const StepperText: Record<string, string> = {
day: "Тарифы на время",
@ -59,9 +49,11 @@ function TariffPage() {
const isMobile = useMediaQuery(theme.breakpoints.down(600));
const userId = useUserStore((state) => state.userId);
const navigate = useNavigate();
const [tariffs, setTariffs] = useState<Tariff[]>([]);
const [user, setUser] = useState();
const [discounts, setDiscounts] = useState<Discount[]>([]);
const user = useUserStore((state) => state.customerAccount);
const a = useUserStore((state) => state.customerAccount); //c wallet
console.log("________________34563875693785692576_____________USERRRRRRR")
console.log(a)
const { data: discounts } = useDiscounts(userId);
const [isRequestCreate, setIsRequestCreate] = useState(false);
const [openModal, setOpenModal] = useState({});
const { cashString, cashCop, cashRub } = useWallet();
@ -70,56 +62,20 @@ function TariffPage() {
const [promocodeField, setPromocodeField] = useState<string>("");
const cc = useCC(store => store.cc)
const getTariffsList = async (): Promise<Tariff[]> => {
const tariffsList: Tariff[] = [];
let page = 2
const [tariffsResponse, tariffsResponseError] = await getTariffs(page - 1);
console.log(tariffsResponse)
if (tariffsResponseError || !tariffsResponse) {
return tariffsList;
}
tariffsList.push(...tariffsResponse.tariffs);
const { data: tariffs, error: tariffsError, isLoading: tariffsLoading } = useTariffs();
for (page; page <= tariffsResponse.totalPages; page += 1) {
const [tariffsResult] = await getTariffs(page);
if (tariffsResult) {
tariffsList.push(...tariffsResult.tariffs);
}
}
return tariffsList;
};
console.log("________34563875693785692576_____ TARIFFS")
console.log(tariffs)
useEffect(() => {
const get = async () => {
const [user, userError] = await getUser();
if (userError) {
return;
}
const tariffsList = await getTariffsList();
if (userId) {
const [discounts] = await getDiscounts(userId);
if (discounts?.length) {
setDiscounts(discounts);
}
}
setUser(user);
setTariffs(tariffsList);
if (a) {
let cs = currencyFormatter.format(Number(user.wallet.cash) / 100);
let cc = Number(user.wallet.cash);
let cr = Number(user.wallet.cash) / 100;
setCash(cs, cc, cr);
};
get();
}, []);
}
}, [a]);
useEffect(() => {
if (cc) {
@ -203,32 +159,17 @@ console.log(tariffsResponse)
if (error) {
enqueueSnackbar(error);
return;
}
enqueueSnackbar(greetings);
if (!userId) {
return;
}
const [discounts, discountsError] = await getDiscounts(userId);
if (discountsError) {
throw new Error(discountsError);
}
if (discounts?.length) {
setDiscounts(discounts);
}
}
const startRequestCreate = () => {
setIsRequestCreate(true)
}
if (!a) return null;
return (
<>
<Container
@ -346,7 +287,7 @@ console.log(tariffsResponse)
selectedItem={selectedItem}
content={[
{
title: `Убрать логотип “PenaQuiz”`,
title: `Убрать логотип "PenaQuiz"`,
onClick: () => setSelectedItem("hide")
},
{

@ -0,0 +1,10 @@
import useSWR from 'swr';
import { getDiscounts } from '@api/discounts';
import type { Discount } from '@model/discounts';
export const useDiscounts = (userId: string | null) => {
return useSWR<Discount[]>(
userId ? `discounts/${userId}` : null,
() => getDiscounts(userId!).then(([data]) => data)
);
};

@ -0,0 +1,19 @@
import useSWR from 'swr';
import { getTariffs } from '@/api/tariff';
import type { GetTariffsResponse, Tariff } from '@frontend/kitui';
export const useTariffs = () => {
const { data, error, isLoading } = useSWR<Tariff[]>('tariffs', async () => {
const [response] = await getTariffs();
if (response?.tariffs) {
return response.tariffs;
}
return [];
});
return {
data,
error,
isLoading
};
};

@ -0,0 +1,7 @@
import useSWR from 'swr';
import { getUser } from '@api/user';
import type { User } from '@frontend/kitui';
export const useUser = () => {
return useSWR<User>('user', getUser);
};