errorreporter
All checks were successful
Deploy / CreateImage (push) Successful in 3m15s
Deploy / DeployService (push) Successful in 28s

This commit is contained in:
Nastya 2025-07-23 15:14:25 +03:00
parent 291d059654
commit 0ae7cb702f
25 changed files with 85 additions and 125 deletions

@ -20,7 +20,7 @@
"@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@emotion/react": "^11.10.5", "@emotion/react": "^11.10.5",
"@emotion/styled": "^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/icons-material": "^5.10.14",
"@mui/material": "^5.10.14", "@mui/material": "^5.10.14",
"@mui/x-date-pickers": "^7.13.0", "@mui/x-date-pickers": "^7.13.0",

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -1,5 +1,5 @@
import { UserAccount } from "@frontend/kitui"; import { UserAccount } from "@frontend/kitui";
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import Cart from "@root/pages/Cart/Cart"; import Cart from "@root/pages/Cart/Cart";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -1,6 +1,6 @@
import { Tariff } from "@frontend/kitui"; import { Tariff } from "@frontend/kitui";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
export interface GetHistoryResponse { export interface GetHistoryResponse {
totalPages: number; totalPages: number;

@ -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<TRequest = unknown, TResponse = unknown>(
data: MakeRequest
): Promise<TResponse> {
try {
const response = await KIT.makeRequest<unknown>(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;

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import type { GetDiscountsResponse } from "@root/model/discount"; import type { GetDiscountsResponse } from "@root/model/discount";
import { useUserStore } from "@root/stores/user"; import { useUserStore } from "@root/stores/user";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@utils/parse-error"; import { parseAxiosError } from "@utils/parse-error";

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";
const API_URL = `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1`; const API_URL = `${process.env.REACT_APP_DOMAIN}/customer/v1.0.1`;

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { Tariff } from "@frontend/kitui"; import { Tariff } from "@frontend/kitui";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";
import { createTicket as createTicketRequest } from "@frontend/kitui"; import { createTicket as createTicketRequest } from "@frontend/kitui";
import type { CreateTicketResponse } from "@frontend/kitui"; import type { CreateTicketResponse } from "@frontend/kitui";

@ -1,5 +1,5 @@
import { User } from "@frontend/kitui"; import { User } from "@frontend/kitui";
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { PatchUserRequest } from "@root/model/user"; import { PatchUserRequest } from "@root/model/user";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { jsonToFormdata } from "@root/utils/jsonToFormdata"; import { jsonToFormdata } from "@root/utils/jsonToFormdata";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -1,4 +1,4 @@
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import { SendPaymentRequest, SendPaymentResponse } from "@root/model/wallet"; import { SendPaymentRequest, SendPaymentResponse } from "@root/model/wallet";
import { parseAxiosError } from "@root/utils/parse-error"; import { parseAxiosError } from "@root/utils/parse-error";

@ -129,6 +129,7 @@ export default function Chat({ open = false, onclickArrow, sx }: Props) {
shown: { me: 1 }, shown: { me: 1 },
ticket_id: "111", ticket_id: "111",
user_id: "greetingMessage", user_id: "greetingMessage",
system: true,
}; };
}, [open]); }, [open]);

@ -29,6 +29,7 @@ import { currencyFormatter } from "@root/utils/currencyFormatter";
import { clearCustomTariffs } from "@root/stores/customTariffs"; import { clearCustomTariffs } from "@root/stores/customTariffs";
import { clearTickets } from "@root/stores/tickets"; import { clearTickets } from "@root/stores/tickets";
import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases"
import { logoutAndRedirect } from "@root/utils/logout";
interface Props { interface Props {
isLoggedIn: boolean; isLoggedIn: boolean;
@ -44,15 +45,8 @@ export default function NavbarFull({ isLoggedIn }: Props) {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
async function handleLogoutClick() { async function handleLogoutClick() {
clearAuthToken(); logoutAndRedirect(navigate);
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0)
navigate("/");
const [_, logoutError] = await logout(); const [_, logoutError] = await logout();
if (logoutError) { if (logoutError) {
return enqueueSnackbar(logoutError); return enqueueSnackbar(logoutError);
} }

@ -18,6 +18,7 @@ import { enqueueSnackbar } from "notistack";
import { clearCustomTariffs } from "@root/stores/customTariffs"; import { clearCustomTariffs } from "@root/stores/customTariffs";
import { clearTickets } from "@root/stores/tickets"; import { clearTickets } from "@root/stores/tickets";
import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases"
import { logoutAndRedirect } from "@root/utils/logout";
type MenuItem = { type MenuItem = {
name: string; name: string;
@ -66,15 +67,8 @@ export default function DialogMenu({ handleClose }: DialogMenuProps) {
}; };
async function handleLogoutClick() { async function handleLogoutClick() {
clearAuthToken(); logoutAndRedirect(navigate);
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0)
navigate("/");
const [_, logoutError] = await logout(); const [_, logoutError] = await logout();
if (logoutError) { if (logoutError) {
return enqueueSnackbar(logoutError); return enqueueSnackbar(logoutError);
} }

@ -18,6 +18,7 @@ import { clearTickets } from "@root/stores/tickets";
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases"
import { logoutAndRedirect } from "@root/utils/logout";
interface Props { interface Props {
children: ReactNode; children: ReactNode;
@ -30,15 +31,8 @@ export default function NavbarFull({ children }: Props) {
const initials = useUserStore((state) => state.initials); const initials = useUserStore((state) => state.initials);
async function handleLogoutClick() { async function handleLogoutClick() {
clearAuthToken(); logoutAndRedirect(navigate);
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0)
navigate("/");
const [_, logoutError] = await logout(); const [_, logoutError] = await logout();
if (logoutError) { if (logoutError) {
return enqueueSnackbar(logoutError); return enqueueSnackbar(logoutError);
} }

@ -19,6 +19,7 @@ import { currencyFormatter } from "@root/utils/currencyFormatter";
import walletIcon from "@root/assets/Icons/wallet_icon.svg"; import walletIcon from "@root/assets/Icons/wallet_icon.svg";
import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases" import {setNotEnoughMoneyAmount} from "@stores/allTypesOfPurchases"
import { logoutAndRedirect } from "@root/utils/logout";
export const NavbarPanel = () => { export const NavbarPanel = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@ -28,15 +29,8 @@ export const NavbarPanel = () => {
const initials = useUserStore((state) => state.initials); const initials = useUserStore((state) => state.initials);
async function handleLogoutClick() { async function handleLogoutClick() {
clearAuthToken(); logoutAndRedirect(navigate);
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0)
navigate("/");
const [_, logoutError] = await logout(); const [_, logoutError] = await logout();
if (logoutError) { if (logoutError) {
return enqueueSnackbar(logoutError); return enqueueSnackbar(logoutError);
} }

@ -62,6 +62,10 @@ import { ModalRequestCreate } from "./pages/Tariffs/ModalRequestCreate";
import * as crutch from "./useUserAccountFetcher"; import * as crutch from "./useUserAccountFetcher";
import { useTryBuy } from "./utils/hooks/useTryBuy"; import { useTryBuy } from "./utils/hooks/useTryBuy";
import AnyServicePayment from "./pages/AnyServicePayment/AnyServicePayment"; 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`; 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( const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement document.getElementById("root") as HTMLElement
); );
root.render( root.render(
// <React.StrictMode> // <React.StrictMode>
<ThemeProvider theme={theme}> <ErrorBoundary
<LocalizationProvider FallbackComponent={ApologyFallback}
dateAdapter={AdapterMoment} onError={handleComponentError}
adapterLocale="ru" >
localeText={localeText} <ThemeProvider theme={theme}>
> <LocalizationProvider
<BrowserRouter> dateAdapter={AdapterMoment}
<CssBaseline /> adapterLocale="ru"
<SnackbarProvider /> localeText={localeText}
<App /> >
</BrowserRouter> <BrowserRouter>
</LocalizationProvider> <CssBaseline />
</ThemeProvider> <SnackbarProvider />
<App />
</BrowserRouter>
</LocalizationProvider>
</ThemeProvider>
</ErrorBoundary>
// </React.StrictMode> // </React.StrictMode>
); );

@ -19,6 +19,7 @@ import { clearCustomTariffs } from "@root/stores/customTariffs";
import { clearTickets } from "@root/stores/tickets"; import { clearTickets } from "@root/stores/tickets";
import { cancelPayCartProcess, setAction, setBackWay, setFromDomain, setNotEnoughMoneyAmount, startPayCartProcess } from "@stores/allTypesOfPurchases" import { cancelPayCartProcess, setAction, setBackWay, setFromDomain, setNotEnoughMoneyAmount, startPayCartProcess } from "@stores/allTypesOfPurchases"
import { Action, FromDomain } from "@root/model/autoPay"; 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= //http://localhost:3001/payment?fromdomain=localhost:3000&action=buy&dif=96900&userid=68773ec66816e2c659b36dad&sec=
let first = true; let first = true;
@ -74,11 +75,7 @@ export default function AnyServicePayment() {
if (URLaction && URLmoneyDifferent && URLtoken) { if (URLaction && URLmoneyDifferent && URLtoken) {
(async () => { (async () => {
if (getAuthToken()) { if (getAuthToken()) {
clearAuthToken(); logoutAndRedirect(navigate);
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0)
await logout(); await logout();
} }

@ -1,4 +1,5 @@
import { Box, Typography } from "@mui/material"; import { Box, Typography } from "@mui/material";
import { FallbackProps } from "react-error-boundary";
export const ApologyPage = ({ message }: { message: string }) => { export const ApologyPage = ({ message }: { message: string }) => {
return ( return (
@ -20,3 +21,7 @@ export const ApologyPage = ({ message }: { message: string }) => {
</Box> </Box>
); );
}; };
export function ApologyFallback({ error }: FallbackProps) {
return <ApologyPage message={error?.message || "что-то пошло не так"} />;
}

@ -2,7 +2,7 @@ import { useEffect, useLayoutEffect, useRef } from "react";
import { createUserAccount, devlog, getAuthToken, setAuthToken } from "@frontend/kitui"; import { createUserAccount, devlog, getAuthToken, setAuthToken } from "@frontend/kitui";
import { isAxiosError } from "axios"; import { isAxiosError } from "axios";
import makeRequest from "@api/makeRequest"; import { makeRequest } from "@frontend/kitui";
import type { UserAccount } from "@frontend/kitui"; import type { UserAccount } from "@frontend/kitui";

@ -6,6 +6,7 @@ import { clearTickets } from '@root/stores/tickets';
import { clearUserData, setUserId, useUserStore } from '@root/stores/user'; import { clearUserData, setUserId, useUserStore } from '@root/stores/user';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom'; import { useLocation, useNavigate } from 'react-router-dom';
import { clearUserSession, logoutAndRedirect } from "@root/utils/logout";
interface QuizAuthParams { interface QuizAuthParams {
action?: string; action?: string;
@ -62,11 +63,7 @@ export const useReauthorization = () => {
try { try {
// Если есть текущий токен, очищаем данные // Если есть текущий токен, очищаем данные
if (getAuthToken()) { if (getAuthToken()) {
clearAuthToken(); logoutAndRedirect(navigate);
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0);
await logout(); await logout();
} }
@ -95,11 +92,7 @@ export const useReauthorization = () => {
// Если есть токен в URL, устанавливаем его // Если есть токен в URL, устанавливаем его
// Очищаем данные только если токен действительно изменился // Очищаем данные только если токен действительно изменился
if (getAuthToken() !== URLtoken) { if (getAuthToken() !== URLtoken) {
clearAuthToken(); clearUserSession();
clearUserData();
clearCustomTariffs();
clearTickets();
setNotEnoughMoneyAmount(0);
// Не вызываем logout() чтобы избежать перенаправления // Не вызываем logout() чтобы избежать перенаправления
} }
setAuthToken(URLtoken); setAuthToken(URLtoken);

25
src/utils/logout.ts Normal file

@ -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("/");
}

@ -1521,10 +1521,10 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
"@frontend/kitui@^1.0.108": "@frontend/kitui@^1.0.110":
version "1.0.108" version "1.0.110"
resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.108/kitui-1.0.108.tgz#1bb609dfe07668b6fd9a7b8618c229e0bb609f1e" resolved "http://gitea.pena/api/packages/skeris/npm/%40frontend%2Fkitui/-/1.0.110/kitui-1.0.110.tgz#0c0a968293338537a2811e7761f8efe933893573"
integrity sha512-4DiF7GHX0RbBMZpFioclc3B87N+HrGLv1B3DveUCdHzukfxvFXyEKnRZQ4wYljO2A3FLSD9+4Dr6cSuZYw95OQ== integrity sha512-XOCev5zNtNZ8fu3IfK6oFNOqT8lE9jlmUX1kQ3OO+H30/LBpnBrww9nV/aHV2TEm0wYXdRMvaEtU6VOb72sDdg==
dependencies: dependencies:
immer "^10.0.2" immer "^10.0.2"
reconnecting-eventsource "^1.6.2" reconnecting-eventsource "^1.6.2"