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

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