HoshiAI-app/api/userTests.ts
2026-01-06 20:18:23 +01:00

90 lines
2.3 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { AxiosError } from "axios";
import { get_my_user_tests, get_user_test, post_start_random_test, post_start_test, post_test_answer, post_test_complete } from "./_client";
import { UserTestResponse } from "./types";
export const useMyTests = () => {
return useQuery({
queryKey: ['user-tests'],
queryFn: async () => {
const response = await get_my_user_tests();
return response.data;
}
})
}
export const useUserTest = (id: number) => {
return useQuery({
queryKey: ['user-test', id],
queryFn: async () => {
const response = await get_user_test(id);
return response.data;
}
})
}
interface RandomUserTestAttrs {
min: number,
max: number,
category_id: number
}
export const useRandomUserTestMutation = () => {
const queryClient = useQueryClient();
return useMutation<UserTestResponse, AxiosError, RandomUserTestAttrs>({
mutationFn: async ({ min, max, category_id }: RandomUserTestAttrs) => {
const response = await post_start_random_test(min, max, category_id);
queryClient.invalidateQueries({
queryKey: ["user-tests"]
});
return response.data;
}
})
}
interface StartTestAttrs {
test_id: number
}
export const useStartTestMutation = () => {
const queryClient = useQueryClient();
return useMutation<UserTestResponse, AxiosError, StartTestAttrs>({
mutationFn: async ({ test_id }: StartTestAttrs) => {
const response = await post_start_test(test_id);
queryClient.invalidateQueries({
queryKey: ["user-tests"]
});
return response.data;
}
})
}
interface AnswerAttrs {
answerId: number;
answer: (string | number)[];
}
export const useAnswerMutation = () => {
return useMutation<any, AxiosError, AnswerAttrs>({
mutationFn: ({ answerId, answer }) => post_test_answer(answerId, answer)
});
}
interface CompleteTestAttrs {
testId: number;
}
export const useCompleteTestMutation = () => {
const queryClient = useQueryClient();
return useMutation<any, AxiosError, CompleteTestAttrs>({
mutationFn: ({testId}) => post_test_complete(testId),
onSuccess: (_, { testId }) => {
queryClient.invalidateQueries({
queryKey: ["user-test", testId]
});
}
});
}