import { makeRequest } from "@api/makeRequest"; 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"; type AddedQuizImagesResponse = { [key: string]: string; }; const API_URL = process.env.REACT_APP_DOMAIN + "/squiz"; const IMAGES_URL = process.env.REACT_APP_DOMAIN + "/squizstorer"; export const createQuiz = async ( body?: Partial, ): Promise<[RawQuiz | null, string?]> => { try { const createdQuiz = await makeRequest({ method: "POST", url: `${API_URL}/quiz/create`, body: { ...defaultCreateQuizBody, ...body }, }); return [createdQuiz]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const getQuizList = async ( body?: Partial, ): Promise<[RawQuiz[] | null, string?]> => { try { const { items } = await makeRequest< GetQuizListRequest, GetQuizListResponse >({ method: "POST", url: `${API_URL}/quiz/getList`, body: { ...defaultGetQuizListBody, ...body }, }); return [items]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const getQuiz = async ( body?: Partial, ): Promise<[GetQuizResponse | null, string?]> => { try { const quiz = await makeRequest({ method: "GET", url: `${API_URL}/quiz/get`, body: { ...defaultGetQuizBody, ...body }, }); return [quiz]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const editQuiz = async ( body: EditQuizRequest, signal?: AbortSignal, ): Promise<[EditQuizResponse | null, string?]> => { try { const editedQuiz = await makeRequest({ method: "PATCH", url: `${API_URL}/quiz/edit`, body, signal, }); return [editedQuiz]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const copyQuiz = async ( id: number, ): Promise<[EditQuizResponse | null, string?]> => { try { const copiedQuiz = await makeRequest({ method: "POST", url: `${API_URL}/quiz/copy`, body: { id }, }); return [copiedQuiz]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const deleteQuiz = async ( id: number, ): Promise<[DeleteQuizResponse | null, string?]> => { try { const deletedQuiz = await makeRequest< DeleteQuizRequest, DeleteQuizResponse >({ method: "DELETE", url: `${API_URL}/quiz/delete`, body: { id }, }); return [deletedQuiz]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const addQuizImages = async ( quizId: number, image: Blob, ): Promise<[AddedQuizImagesResponse | null, string?]> => { try { const formData = new FormData(); formData.append("quiz", quizId.toString()); formData.append("image", image); const addedQuizImages = await makeRequest< FormData, AddedQuizImagesResponse >({ url: `${IMAGES_URL}/quiz/putImages`, body: formData, method: "PUT", }); return [addedQuizImages]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, error]; } }; export const quizApi = { create: createQuiz, getList: getQuizList, get: getQuiz, edit: editQuiz, copy: copyQuiz, delete: deleteQuiz, addImages: addQuizImages, }; const defaultCreateQuizBody: CreateQuizRequest = { fingerprinting: true, repeatable: true, note_prevented: true, mail_notifications: false, unique_answers: true, name: "", description: "", config: JSON.stringify(defaultQuizConfig), status: "stop", limit: 0, due_to: 0, time_of_passing: 0, pausable: false, super: false, group_id: 0, }; const defaultGetQuizBody: GetQuizRequest = { quiz_id: "string", limit: 0, page: 0, need_config: true, }; const defaultGetQuizListBody: GetQuizListRequest = { limit: 100, offset: 0, };