From 0ae7cb702f41a1305c394bdcb21734f97a1b7843 Mon Sep 17 00:00:00 2001 From: Nastya Date: Wed, 23 Jul 2025 15:14:25 +0300 Subject: [PATCH] errorreporter --- package.json | 2 +- src/api/auth.ts | 2 +- src/api/cart.ts | 2 +- src/api/history.ts | 2 +- src/api/makeRequest.ts | 48 ------------------- src/api/price.ts | 2 +- src/api/promocode.ts | 2 +- src/api/recentlyPurchasedTariffs.ts | 2 +- src/api/tariff.ts | 2 +- src/api/ticket.ts | 2 +- src/api/user.ts | 2 +- src/api/verification.ts | 2 +- src/api/wallet.ts | 2 +- src/components/FloatingSupportChat/Chat.tsx | 1 + src/components/NavbarLanding/NavbarFull.tsx | 10 +--- src/components/NavbarSite/DialogMenu.tsx | 10 +--- src/components/NavbarSite/NavbarFull.tsx | 10 +--- src/components/NavbarSite/NavbarPanel.tsx | 10 +--- src/index.tsx | 37 +++++++++----- .../AnyServicePayment/AnyServicePayment.tsx | 7 +-- src/pages/ApologyPage.tsx | 5 ++ src/useUserAccountFetcher.ts | 2 +- src/utils/hooks/useReauthorization.ts | 13 ++--- src/utils/logout.ts | 25 ++++++++++ yarn.lock | 8 ++-- 25 files changed, 85 insertions(+), 125 deletions(-) delete mode 100644 src/api/makeRequest.ts create mode 100644 src/utils/logout.ts diff --git a/package.json b/package.json index 22dd7f3..06222fa 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", - "@frontend/kitui": "^1.0.108", + "@frontend/kitui": "^1.0.110", "@mui/icons-material": "^5.10.14", "@mui/material": "^5.10.14", "@mui/x-date-pickers": "^7.13.0", diff --git a/src/api/auth.ts b/src/api/auth.ts index 9f1069c..b4de6be 100644 --- a/src/api/auth.ts +++ b/src/api/auth.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/api/cart.ts b/src/api/cart.ts index 38c115e..b06da10 100644 --- a/src/api/cart.ts +++ b/src/api/cart.ts @@ -1,5 +1,5 @@ import { UserAccount } from "@frontend/kitui"; -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import Cart from "@root/pages/Cart/Cart"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/api/history.ts b/src/api/history.ts index 99857ad..d7e36b6 100644 --- a/src/api/history.ts +++ b/src/api/history.ts @@ -1,6 +1,6 @@ import { Tariff } from "@frontend/kitui"; import { parseAxiosError } from "@root/utils/parse-error"; -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; export interface GetHistoryResponse { totalPages: number; diff --git a/src/api/makeRequest.ts b/src/api/makeRequest.ts deleted file mode 100644 index fcffb8c..0000000 --- a/src/api/makeRequest.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as KIT from "@frontend/kitui"; -import { Method, ResponseType, AxiosError } from "axios"; -import { clearAuthToken } from "@frontend/kitui"; -import { clearUserData } from "@root/stores/user"; -import { clearCustomTariffs } from "@root/stores/customTariffs"; -import { clearTickets } from "@root/stores/tickets"; -import { redirect } from "react-router-dom"; -import { setNotEnoughMoneyAmount } from "@stores/allTypesOfPurchases"; - -interface MakeRequest { - method?: Method | undefined; - url: string; - body?: unknown; - useToken?: boolean | undefined; - contentType?: boolean | undefined; - responseType?: ResponseType | undefined; - signal?: AbortSignal | undefined; - withCredentials?: boolean | undefined; -} -interface ErrorResponseData { - message?: string; -} - -async function makeRequest( - data: MakeRequest -): Promise { - try { - const response = await KIT.makeRequest(data); - - return response as TResponse; - } catch (e) { - const error = e as AxiosError; - if ( - error.response?.status === 400 && - (error.response?.data as ErrorResponseData)?.message === - "refreshToken is empty" - ) { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0); - redirect("/"); - } - throw e; - } -} -export default makeRequest; diff --git a/src/api/price.ts b/src/api/price.ts index a411f78..3020634 100644 --- a/src/api/price.ts +++ b/src/api/price.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import type { GetDiscountsResponse } from "@root/model/discount"; import { useUserStore } from "@root/stores/user"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/api/promocode.ts b/src/api/promocode.ts index eab67f2..14dc7b9 100644 --- a/src/api/promocode.ts +++ b/src/api/promocode.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { parseAxiosError } from "@utils/parse-error"; diff --git a/src/api/recentlyPurchasedTariffs.ts b/src/api/recentlyPurchasedTariffs.ts index 39e9592..a02acca 100644 --- a/src/api/recentlyPurchasedTariffs.ts +++ b/src/api/recentlyPurchasedTariffs.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { parseAxiosError } from "@root/utils/parse-error"; const API_URL = `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1`; diff --git a/src/api/tariff.ts b/src/api/tariff.ts index 0e3ba58..896e6cd 100644 --- a/src/api/tariff.ts +++ b/src/api/tariff.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { Tariff } from "@frontend/kitui"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/api/ticket.ts b/src/api/ticket.ts index 824d052..9fe9a21 100644 --- a/src/api/ticket.ts +++ b/src/api/ticket.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { parseAxiosError } from "@root/utils/parse-error"; import { createTicket as createTicketRequest } from "@frontend/kitui"; import type { CreateTicketResponse } from "@frontend/kitui"; diff --git a/src/api/user.ts b/src/api/user.ts index a3a62db..f68c305 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -1,5 +1,5 @@ import { User } from "@frontend/kitui"; -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { PatchUserRequest } from "@root/model/user"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/api/verification.ts b/src/api/verification.ts index 1406055..9e92962 100644 --- a/src/api/verification.ts +++ b/src/api/verification.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { jsonToFormdata } from "@root/utils/jsonToFormdata"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/api/wallet.ts b/src/api/wallet.ts index 7023628..254433e 100644 --- a/src/api/wallet.ts +++ b/src/api/wallet.ts @@ -1,4 +1,4 @@ -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import { SendPaymentRequest, SendPaymentResponse } from "@root/model/wallet"; import { parseAxiosError } from "@root/utils/parse-error"; diff --git a/src/components/FloatingSupportChat/Chat.tsx b/src/components/FloatingSupportChat/Chat.tsx index 08b8774..8d3cd25 100644 --- a/src/components/FloatingSupportChat/Chat.tsx +++ b/src/components/FloatingSupportChat/Chat.tsx @@ -129,6 +129,7 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) { shown: { me: 1 }, ticket_id: "111", user_id: "greetingMessage", + system: true, }; }, [open]); diff --git a/src/components/NavbarLanding/NavbarFull.tsx b/src/components/NavbarLanding/NavbarFull.tsx index a857000..9ab1066 100644 --- a/src/components/NavbarLanding/NavbarFull.tsx +++ b/src/components/NavbarLanding/NavbarFull.tsx @@ -29,6 +29,7 @@ import { currencyFormatter } from "@root/utils/currencyFormatter"; import { clearCustomTariffs } from "@root/stores/customTariffs"; import { clearTickets } from "@root/stores/tickets"; import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" +import { logoutAndRedirect } from "@root/utils/logout"; interface Props { isLoggedIn: boolean; @@ -44,15 +45,8 @@ export default function NavbarFull({ isLoggedIn }: Props) { const [open, setOpen] = useState(false); async function handleLogoutClick() { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0) - navigate("/"); - + logoutAndRedirect(navigate); const [_, logoutError] = await logout(); - if (logoutError) { return enqueueSnackbar(logoutError); } diff --git a/src/components/NavbarSite/DialogMenu.tsx b/src/components/NavbarSite/DialogMenu.tsx index 476bba7..4cc448b 100644 --- a/src/components/NavbarSite/DialogMenu.tsx +++ b/src/components/NavbarSite/DialogMenu.tsx @@ -18,6 +18,7 @@ import { enqueueSnackbar } from "notistack"; import { clearCustomTariffs } from "@root/stores/customTariffs"; import { clearTickets } from "@root/stores/tickets"; import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" +import { logoutAndRedirect } from "@root/utils/logout"; type MenuItem = { name: string; @@ -66,15 +67,8 @@ export default function DialogMenu({ handleClose }: DialogMenuProps) { }; async function handleLogoutClick() { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0) - navigate("/"); - + logoutAndRedirect(navigate); const [_, logoutError] = await logout(); - if (logoutError) { return enqueueSnackbar(logoutError); } diff --git a/src/components/NavbarSite/NavbarFull.tsx b/src/components/NavbarSite/NavbarFull.tsx index 53ed1cb..1816aa7 100644 --- a/src/components/NavbarSite/NavbarFull.tsx +++ b/src/components/NavbarSite/NavbarFull.tsx @@ -18,6 +18,7 @@ import { clearTickets } from "@root/stores/tickets"; import type { ReactNode } from "react"; import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" +import { logoutAndRedirect } from "@root/utils/logout"; interface Props { children: ReactNode; @@ -30,15 +31,8 @@ export default function NavbarFull({ children }: Props) { const initials = useUserStore((state) => state.initials); async function handleLogoutClick() { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0) - navigate("/"); - + logoutAndRedirect(navigate); const [_, logoutError] = await logout(); - if (logoutError) { return enqueueSnackbar(logoutError); } diff --git a/src/components/NavbarSite/NavbarPanel.tsx b/src/components/NavbarSite/NavbarPanel.tsx index 3a97ac4..3a57c3a 100644 --- a/src/components/NavbarSite/NavbarPanel.tsx +++ b/src/components/NavbarSite/NavbarPanel.tsx @@ -19,6 +19,7 @@ import { currencyFormatter } from "@root/utils/currencyFormatter"; import walletIcon from "@root/assets/Icons/wallet_icon.svg"; import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" +import { logoutAndRedirect } from "@root/utils/logout"; export const NavbarPanel = () => { const navigate = useNavigate(); @@ -28,15 +29,8 @@ export const NavbarPanel = () => { const initials = useUserStore((state) => state.initials); async function handleLogoutClick() { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0) - navigate("/"); - + logoutAndRedirect(navigate); const [_, logoutError] = await logout(); - if (logoutError) { return enqueueSnackbar(logoutError); } diff --git a/src/index.tsx b/src/index.tsx index 678643e..09f9860 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -62,6 +62,10 @@ import { ModalRequestCreate } from "./pages/Tariffs/ModalRequestCreate"; import * as crutch from "./useUserAccountFetcher"; import { useTryBuy } from "./utils/hooks/useTryBuy"; import AnyServicePayment from "./pages/AnyServicePayment/AnyServicePayment"; +import { ErrorBoundary } from "react-error-boundary"; +import { ApologyFallback } from "./pages/ApologyPage"; +import { handleComponentError } from "./utils/handleComponentError"; +import { createMakeRequestConfig } from "@frontend/kitui"; pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.js`; @@ -225,24 +229,31 @@ const App = () => { ); }; +createMakeRequestConfig(undefined, handleComponentError, () => []); + const root = ReactDOM.createRoot( document.getElementById("root") as HTMLElement ); root.render( // - - - - - - - - - + + + + + + + + + + + // ); diff --git a/src/pages/AnyServicePayment/AnyServicePayment.tsx b/src/pages/AnyServicePayment/AnyServicePayment.tsx index 2b7e87a..a709bac 100644 --- a/src/pages/AnyServicePayment/AnyServicePayment.tsx +++ b/src/pages/AnyServicePayment/AnyServicePayment.tsx @@ -19,6 +19,7 @@ import { clearCustomTariffs } from "@root/stores/customTariffs"; import { clearTickets } from "@root/stores/tickets"; import { cancelPayCartProcess, setAction, setBackWay, setFromDomain, setNotEnoughMoneyAmount, startPayCartProcess } from "@stores/allTypesOfPurchases" import { Action, FromDomain } from "@root/model/autoPay"; +import { logoutAndRedirect, clearUserSession } from "@root/utils/logout"; //http://localhost:3001/payment?fromdomain=localhost:3000&action=buy&dif=96900&userid=68773ec66816e2c659b36dad&sec= let first = true; @@ -74,11 +75,7 @@ export default function AnyServicePayment() { if (URLaction && URLmoneyDifferent && URLtoken) { (async () => { if (getAuthToken()) { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0) + logoutAndRedirect(navigate); await logout(); } diff --git a/src/pages/ApologyPage.tsx b/src/pages/ApologyPage.tsx index e6c9474..7be04af 100644 --- a/src/pages/ApologyPage.tsx +++ b/src/pages/ApologyPage.tsx @@ -1,4 +1,5 @@ import { Box, Typography } from "@mui/material"; +import { FallbackProps } from "react-error-boundary"; export const ApologyPage = ({ message }: { message: string }) => { return ( @@ -20,3 +21,7 @@ export const ApologyPage = ({ message }: { message: string }) => { ); }; + +export function ApologyFallback({ error }: FallbackProps) { + return ; +} diff --git a/src/useUserAccountFetcher.ts b/src/useUserAccountFetcher.ts index 59715da..7e0841f 100644 --- a/src/useUserAccountFetcher.ts +++ b/src/useUserAccountFetcher.ts @@ -2,7 +2,7 @@ import { useEffect, useLayoutEffect, useRef } from "react"; import { createUserAccount, devlog, getAuthToken, setAuthToken } from "@frontend/kitui"; import { isAxiosError } from "axios"; -import makeRequest from "@api/makeRequest"; +import { makeRequest } from "@frontend/kitui"; import type { UserAccount } from "@frontend/kitui"; diff --git a/src/utils/hooks/useReauthorization.ts b/src/utils/hooks/useReauthorization.ts index cc57937..c5cbefe 100644 --- a/src/utils/hooks/useReauthorization.ts +++ b/src/utils/hooks/useReauthorization.ts @@ -6,6 +6,7 @@ import { clearTickets } from '@root/stores/tickets'; import { clearUserData, setUserId, useUserStore } from '@root/stores/user'; import { useEffect, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; +import { clearUserSession, logoutAndRedirect } from "@root/utils/logout"; interface QuizAuthParams { action?: string; @@ -62,11 +63,7 @@ export const useReauthorization = () => { try { // Если есть текущий токен, очищаем данные if (getAuthToken()) { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0); + logoutAndRedirect(navigate); await logout(); } @@ -95,11 +92,7 @@ export const useReauthorization = () => { // Если есть токен в URL, устанавливаем его // Очищаем данные только если токен действительно изменился if (getAuthToken() !== URLtoken) { - clearAuthToken(); - clearUserData(); - clearCustomTariffs(); - clearTickets(); - setNotEnoughMoneyAmount(0); + clearUserSession(); // Не вызываем logout() чтобы избежать перенаправления } setAuthToken(URLtoken); diff --git a/src/utils/logout.ts b/src/utils/logout.ts new file mode 100644 index 0000000..bc0350c --- /dev/null +++ b/src/utils/logout.ts @@ -0,0 +1,25 @@ +import { clearAuthToken } from "@frontend/kitui"; +import { clearUserData } from "@root/stores/user"; +import { clearCustomTariffs } from "@root/stores/customTariffs"; +import { clearTickets } from "@root/stores/tickets"; +import { setNotEnoughMoneyAmount } from "@root/stores/allTypesOfPurchases"; +import { NavigateFunction } from "react-router-dom"; + +/** + * Очищает все пользовательские данные (без редиректа) + */ +export function clearUserSession() { + clearAuthToken(); + clearUserData(); + clearCustomTariffs(); + clearTickets(); + setNotEnoughMoneyAmount(0); +} + +/** + * Выполняет полный логаут пользователя и редиректит на главную страницу + */ +export function logoutAndRedirect(navigate: NavigateFunction) { + clearUserSession(); + navigate("/"); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 469222d..3b1b8b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1521,10 +1521,10 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@frontend/kitui@^1.0.108": - version "1.0.108" - resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.108/kitui-1.0.108.tgz#1bb609dfe07668b6fd9a7b8618c229e0bb609f1e" - integrity sha512-4DiF7GHX0RbBMZpFioclc3B87N+HrGLv1B3DveUCdHzukfxvFXyEKnRZQ4wYljO2A3FLSD9+4Dr6cSuZYw95OQ== +"@frontend/kitui@^1.0.110": + version "1.0.110" + resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.110/kitui-1.0.110.tgz#0c0a968293338537a2811e7761f8efe933893573" + integrity sha512-XOCev5zNtNZ8fu3IfK6oFNOqT8lE9jlmUX1kQ3OO+H30/LBpnBrww9nV/aHV2TEm0wYXdRMvaEtU6VOb72sDdg== dependencies: immer "^10.0.2" reconnecting-eventsource "^1.6.2"