feat: request types

This commit is contained in:
IlyaDoronin 2024-05-16 16:40:52 +03:00
parent 4e4565813a
commit 2dab3aebe5
11 changed files with 83 additions and 50 deletions

@ -1,5 +1,5 @@
import type { SuspenseProps } from "react"; import type { SuspenseProps } from "react";
import { lazy, Suspense, useEffect, useLayoutEffect, useRef } from "react"; import { lazy, Suspense } from "react";
import { lazily } from "react-lazily"; import { lazily } from "react-lazily";
import ContactFormModal from "@ui_kit/ContactForm"; import ContactFormModal from "@ui_kit/ContactForm";
import dayjs from "dayjs"; import dayjs from "dayjs";
@ -22,7 +22,6 @@ import {
UserAccount, UserAccount,
useUserFetcher, useUserFetcher,
} from "@frontend/kitui"; } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest";
import type { OriginalUserAccount } from "@root/user"; import type { OriginalUserAccount } from "@root/user";
import { import {
clearUserData, clearUserData,

@ -1,12 +1,17 @@
import { makeRequest } from "@api/makeRequest"; import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error";
import type { import type {
LoginRequest, LoginRequest,
LoginResponse, LoginResponse,
RegisterRequest, RegisterRequest,
RegisterResponse, RegisterResponse,
} from "@frontend/kitui"; } from "@frontend/kitui";
import { parseAxiosError } from "../utils/parse-error";
type RecoverResponse = {
message: string;
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/auth`; const API_URL = `${process.env.REACT_APP_DOMAIN}/auth`;
@ -54,7 +59,7 @@ export const login = async (
} }
}; };
export const logout = async (): Promise<[unknown, string?]> => { export const logout = async (): Promise<[void | null, string?]> => {
try { try {
const logoutResponse = await makeRequest<never, void>({ const logoutResponse = await makeRequest<never, void>({
method: "POST", method: "POST",
@ -73,7 +78,7 @@ export const logout = async (): Promise<[unknown, string?]> => {
export const recover = async ( export const recover = async (
email: string, email: string,
): Promise<[unknown | null, string?]> => { ): Promise<[RecoverResponse | null, string?]> => {
try { try {
const formData = new FormData(); const formData = new FormData();
formData.append("email", email); formData.append("email", email);
@ -82,7 +87,7 @@ export const recover = async (
`${process.env.REACT_APP_DOMAIN}/changepwd`, `${process.env.REACT_APP_DOMAIN}/changepwd`,
); );
const recoverResponse = await makeRequest<unknown, unknown>({ const recoverResponse = await makeRequest<FormData, RecoverResponse>({
url: `${process.env.REACT_APP_DOMAIN}/codeword/recover`, url: `${process.env.REACT_APP_DOMAIN}/codeword/recover`,
body: formData, body: formData,
useToken: false, useToken: false,

@ -1,8 +1,9 @@
import { UserAccount } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest"; import { makeRequest } from "@api/makeRequest";
import { parseAxiosError } from "@utils/parse-error"; import { parseAxiosError } from "@utils/parse-error";
import type { UserAccount } from "@frontend/kitui";
const API_URL = `${process.env.REACT_APP_DOMAIN}/customer/cart`; const API_URL = `${process.env.REACT_APP_DOMAIN}/customer/cart`;
const payCart = async (): Promise<[UserAccount | null, string?]> => { const payCart = async (): Promise<[UserAccount | null, string?]> => {
@ -21,9 +22,11 @@ const payCart = async (): Promise<[UserAccount | null, string?]> => {
} }
}; };
const addCartItem = async (id: string): Promise<[unknown | null, string?]> => { const addCartItem = async (
id: string,
): Promise<[UserAccount | null, string?]> => {
try { try {
const addedItem = await makeRequest<never, unknown>({ const addedItem = await makeRequest<never, UserAccount>({
method: "PATCH", method: "PATCH",
url: `${API_URL}?id=${id}`, url: `${API_URL}?id=${id}`,
}); });
@ -38,9 +41,9 @@ const addCartItem = async (id: string): Promise<[unknown | null, string?]> => {
const deleteCartItem = async ( const deleteCartItem = async (
id: string, id: string,
): Promise<[unknown | null, string?]> => { ): Promise<[UserAccount | null, string?]> => {
try { try {
const deletedItem = await makeRequest<never, unknown>({ const deletedItem = await makeRequest<never, UserAccount>({
method: "DELETE", method: "DELETE",
url: `${API_URL}?id=${id}`, url: `${API_URL}?id=${id}`,
}); });

@ -1,4 +1,5 @@
import { makeRequest } from "@frontend/kitui"; import { makeRequest } from "@frontend/kitui";
import { parseAxiosError } from "@utils/parse-error"; import { parseAxiosError } from "@utils/parse-error";
import type { Discount } from "@model/discounts"; import type { Discount } from "@model/discounts";
@ -9,12 +10,10 @@ export const getDiscounts = async (
userId: string, userId: string,
): Promise<[Discount[] | null, string?]> => { ): Promise<[Discount[] | null, string?]> => {
try { try {
const { Discounts } = await makeRequest<unknown, { Discounts: Discount[] }>( const { Discounts } = await makeRequest<never, { Discounts: Discount[] }>({
{ method: "GET",
method: "GET", url: `${API_URL}/user/${userId}`,
url: `${API_URL}/user/${userId}`, });
},
);
return [Discounts]; return [Discounts];
} catch (nativeError) { } catch (nativeError) {

@ -1,10 +1,11 @@
import * as KIT from "@frontend/kitui"; import * as KIT from "@frontend/kitui";
import { Method, ResponseType, AxiosError } from "axios"; import { Method, ResponseType, AxiosError } from "axios";
import { redirect } from "react-router-dom";
import { clearAuthToken } from "@frontend/kitui"; import { clearAuthToken } from "@frontend/kitui";
import { cleanAuthTicketData } from "@root/ticket"; import { cleanAuthTicketData } from "@root/ticket";
import { clearUserData } from "@root/user"; import { clearUserData } from "@root/user";
import { clearQuizData } from "@root/quizes/store"; import { clearQuizData } from "@root/quizes/store";
import { redirect } from "react-router-dom";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";

@ -1,24 +1,26 @@
import { makeRequest } from "@api/makeRequest"; import { makeRequest } from "@api/makeRequest";
import { CreateQuestionRequest } from "model/question/create";
import { RawQuestion } from "model/question/question"; import { replaceSpacesToEmptyLines } from "@utils/replaceSpacesToEmptyLines";
import { import { parseAxiosError } from "@utils/parse-error";
import type { CreateQuestionRequest } from "model/question/create";
import type { RawQuestion } from "model/question/question";
import type {
GetQuestionListRequest, GetQuestionListRequest,
GetQuestionListResponse, GetQuestionListResponse,
} from "@model/question/getList"; } from "@model/question/getList";
import { import type {
EditQuestionRequest, EditQuestionRequest,
EditQuestionResponse, EditQuestionResponse,
} from "@model/question/edit"; } from "@model/question/edit";
import { import type {
DeleteQuestionRequest, DeleteQuestionRequest,
DeleteQuestionResponse, DeleteQuestionResponse,
} from "@model/question/delete"; } from "@model/question/delete";
import { import type {
CopyQuestionRequest, CopyQuestionRequest,
CopyQuestionResponse, CopyQuestionResponse,
} from "@model/question/copy"; } from "@model/question/copy";
import { replaceSpacesToEmptyLines } from "../utils/replaceSpacesToEmptyLines";
import { parseAxiosError } from "@utils/parse-error";
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`; const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`;

@ -1,14 +1,19 @@
import { makeRequest } from "@api/makeRequest"; import { makeRequest } from "@api/makeRequest";
import { defaultQuizConfig } from "@model/quizSettings"; import { defaultQuizConfig } from "@model/quizSettings";
import { CopyQuizRequest, CopyQuizResponse } from "model/quiz/copy";
import { CreateQuizRequest } from "model/quiz/create";
import { DeleteQuizRequest, DeleteQuizResponse } from "model/quiz/delete";
import { EditQuizRequest, EditQuizResponse } from "model/quiz/edit";
import { GetQuizRequest, GetQuizResponse } from "model/quiz/get";
import { GetQuizListRequest, GetQuizListResponse } from "model/quiz/getList";
import { RawQuiz } from "model/quiz/quiz";
import { parseAxiosError } from "@utils/parse-error"; import { parseAxiosError } from "@utils/parse-error";
import type { RawQuiz } from "model/quiz/quiz";
import type { CopyQuizRequest, CopyQuizResponse } from "model/quiz/copy";
import type { CreateQuizRequest } from "model/quiz/create";
import type { DeleteQuizRequest, DeleteQuizResponse } from "model/quiz/delete";
import type { EditQuizRequest, EditQuizResponse } from "model/quiz/edit";
import type { GetQuizRequest, GetQuizResponse } from "model/quiz/get";
import type {
GetQuizListRequest,
GetQuizListResponse,
} from "model/quiz/getList";
type AddedQuizImagesResponse = { type AddedQuizImagesResponse = {
[key: string]: string; [key: string]: string;
}; };

@ -1,8 +1,9 @@
import { makeRequest } from "@api/makeRequest"; import { makeRequest } from "@api/makeRequest";
import { RawResult } from "@model/result/result";
import { parseAxiosError } from "@utils/parse-error"; import { parseAxiosError } from "@utils/parse-error";
import type { RawResult } from "@model/result/result";
interface IResultListBody { interface IResultListBody {
to: number; to: number;
from: string; from: string;
@ -37,6 +38,10 @@ type ResultFilter = {
to?: string; to?: string;
}; };
type ObsolescenceRequest = {
answers: number[];
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`; const API_URL = `${process.env.REACT_APP_DOMAIN}/squiz`;
const getResultList = async ( const getResultList = async (
@ -61,9 +66,9 @@ const getResultList = async (
const deleteResult = async ( const deleteResult = async (
resultId: number, resultId: number,
): Promise<[unknown | null, string?]> => { ): Promise<[string | null, string?]> => {
try { try {
const deletedResult = await makeRequest<unknown, unknown>({ const deletedResult = await makeRequest<void, string>({
method: "DELETE", method: "DELETE",
url: `${API_URL}/results/delete/${resultId}`, url: `${API_URL}/results/delete/${resultId}`,
body: {}, body: {},
@ -79,9 +84,9 @@ const deleteResult = async (
const obsolescenceResult = async ( const obsolescenceResult = async (
idResultArray: number[], idResultArray: number[],
): Promise<[unknown | null, string?]> => { ): Promise<[null, string?]> => {
try { try {
const obsolescencedResult = await makeRequest<unknown, unknown>({ const obsolescencedResult = await makeRequest<ObsolescenceRequest, null>({
method: "PATCH", method: "PATCH",
url: `${API_URL}/result/seen`, url: `${API_URL}/result/seen`,
body: { answers: idResultArray }, body: { answers: idResultArray },
@ -99,7 +104,7 @@ const getAnswerResultList = async (
resultId: number, resultId: number,
): Promise<[IAnswerResult[] | null, string?]> => { ): Promise<[IAnswerResult[] | null, string?]> => {
try { try {
const answerResultList = await makeRequest<unknown, IAnswerResult[]>({ const answerResultList = await makeRequest<never, IAnswerResult[]>({
method: "GET", method: "GET",
url: `${API_URL}/result/${resultId}`, url: `${API_URL}/result/${resultId}`,
}); });
@ -115,12 +120,12 @@ const getAnswerResultList = async (
const AnswerResultListEx = async ( const AnswerResultListEx = async (
quizId: number, quizId: number,
body: ResultFilter, body: ResultFilter,
): Promise<[unknown | null, string?]> => { ): Promise<[Blob | null, string?]> => {
try { try {
const answerResultListEx = await makeRequest<unknown, unknown>({ const answerResultListEx = await makeRequest<ResultFilter, Blob>({
method: "POST", method: "POST",
url: `${API_URL}/results/${quizId}/export`, url: `${API_URL}/results/${quizId}/export`,
body: body, body,
responseType: "blob", responseType: "blob",
}); });

@ -1,10 +1,17 @@
import { makeRequest } from "@api/makeRequest";
import { createTicket as createTicketRequest } from "@frontend/kitui"; import { createTicket as createTicketRequest } from "@frontend/kitui";
import { parseAxiosError } from "../utils/parse-error";
import { SendTicketMessageRequest } from "@frontend/kitui"; import { makeRequest } from "@api/makeRequest";
import type { CreateTicketResponse } from "@frontend/kitui"; import { parseAxiosError } from "@utils/parse-error";
import type {
SendTicketMessageRequest,
CreateTicketResponse,
} from "@frontend/kitui";
type SendFileResponse = {
message: string;
};
const API_URL = `${process.env.REACT_APP_DOMAIN}/heruvym`; const API_URL = `${process.env.REACT_APP_DOMAIN}/heruvym`;
@ -51,14 +58,14 @@ export const shownMessage = async (id: string): Promise<[null, string?]> => {
export const sendFile = async ( export const sendFile = async (
ticketId: string, ticketId: string,
file: File, file: File,
): Promise<[unknown | null, string?]> => { ): Promise<[SendFileResponse | null, string?]> => {
try { try {
const body = new FormData(); const body = new FormData();
body.append(file.name, file); body.append(file.name, file);
body.append("ticket", ticketId); body.append("ticket", ticketId);
const sendResponse = await makeRequest<FormData, unknown>({ const sendResponse = await makeRequest<FormData, SendFileResponse>({
method: "POST", method: "POST",
url: `${process.env.REACT_APP_DOMAIN}/heruvym/sendFiles`, url: `${process.env.REACT_APP_DOMAIN}/heruvym/sendFiles`,
body, body,

@ -5,6 +5,10 @@ import { parseAxiosError } from "@utils/parse-error";
import type { UserAccount } from "@frontend/kitui"; import type { UserAccount } from "@frontend/kitui";
import type { OriginalUserAccount } from "@root/user"; import type { OriginalUserAccount } from "@root/user";
type RecoverUserRequest = {
password: string;
};
export const getUser = async (): Promise<[UserAccount | null, string?]> => { export const getUser = async (): Promise<[UserAccount | null, string?]> => {
try { try {
const user = await makeRequest<never, UserAccount>({ const user = await makeRequest<never, UserAccount>({
@ -47,7 +51,7 @@ export const recoverUser = async (
password: string, password: string,
): Promise<[unknown | null, string?]> => { ): Promise<[unknown | null, string?]> => {
try { try {
const recoverResponse = await makeRequest<{ password: string }, unknown>({ const recoverResponse = await makeRequest<RecoverUserRequest, unknown>({
url: `${process.env.REACT_APP_DOMAIN}/user`, url: `${process.env.REACT_APP_DOMAIN}/user`,
method: "PATCH", method: "PATCH",
body: { password }, body: { password },

@ -4,7 +4,6 @@ import {
useTicketMessages, useTicketMessages,
useTicketsFetcher, useTicketsFetcher,
} from "@frontend/kitui"; } from "@frontend/kitui";
import { makeRequest } from "@api/makeRequest";
import FloatingSupportChat from "./FloatingSupportChat"; import FloatingSupportChat from "./FloatingSupportChat";
import { useUserStore } from "@root/user"; import { useUserStore } from "@root/user";
import { useCallback, useEffect, useMemo, useState } from "react"; import { useCallback, useEffect, useMemo, useState } from "react";
@ -137,6 +136,10 @@ export default () => {
addOrUpdateUnauthMessages(messages); addOrUpdateUnauthMessages(messages);
}, []), }, []),
onError: useCallback((error: Error) => { onError: useCallback((error: Error) => {
if (error.name === "CanceledError") {
return;
}
const [message] = parseAxiosError(error); const [message] = parseAxiosError(error);
if (message) enqueueSnackbar(message); if (message) enqueueSnackbar(message);
}, []), }, []),