amati/apps/frontend/src/modules/assessmentManagement/queries/assessmentQueries.ts

156 lines
4.7 KiB
TypeScript

import client from "@/honoClient";
import fetchRPC from "@/utils/fetchRPC";
import { queryOptions, UseMutationOptions } from "@tanstack/react-query";
type SubmitOptionResponse = {
message: string;
answer: {
id: string;
createdAt: string | null;
validationInformation: string;
};
};
export const fetchAspects = async () => {
return await fetchRPC(
client.assessments.aspect.$get({
query: {}
})
);
};
// Query untuk mendapatkan semua pertanyaan berdasarkan halaman dan limit
export const getQuestionsAllQueryOptions = (page: number, limit: number, q?: string) =>
queryOptions({
queryKey: ["assessment", { page, limit, q }],
queryFn: () =>
fetchRPC(
client.assessments.getAllQuestions.$get({
query: {
limit: String(limit),
page: String(page),
q: q || "",
},
})
),
});
// Query untuk mendapatkan jawaban berdasarkan assessment ID
export const getAnswersQueryOptions = (assessmentId: string, page: number, limit: number, q?: string) =>
queryOptions({
queryKey: ["assessment", { assessmentId, page, limit, q }],
queryFn: () =>
fetchRPC(
client.assessments.getAnswers.$get({
query: {
assessmentId,
limit: String(limit),
page: String(page),
q: q || "",
},
})
),
});
// Query untuk toggle flag jawaban berdasarkan questionId
export const toggleFlagAnswer = async (questionId: string) => {
return await fetchRPC(
client.assessments[":questionId"].toggleFlag.$patch({
param: { questionId }
})
);
};
// Opsional: Jika Anda ingin menggunakan react-query untuk toggleFlag
export const toggleFlagAnswerMutationOptions = (questionId: string) => ({
mutationFn: () => toggleFlagAnswer(questionId),
});
// Query untuk mendapatkan rata-rata skor berdasarkan aspectId dan assessmentId
export const getAverageScoreQueryOptions = (assessmentId: string) =>
queryOptions({
queryKey: ["averageScore", { assessmentId }],
queryFn: () =>
fetchRPC(
client.assessments["average-score"].aspects.assessments[":assessmentId"].$get({
param: {
assessmentId,
},
})
),
});
export const submitOption = async (form: {
optionId: string;
assessmentId: string;
questionId: string;
isFlagged?: boolean;
filename?: string;
}): Promise<SubmitOptionResponse> => {
return await fetchRPC(
client.assessments.submitOption.$post({
json: form,
})
);
};
export const submitOptionMutationOptions: UseMutationOptions<
SubmitOptionResponse,
Error,
Parameters<typeof submitOption>[0]
> = {
mutationFn: submitOption,
};
export const submitValidation = async (
form: {
assessmentId: string;
questionId: string;
validationInformation: string;
}
) => {
return await fetchRPC(
client.assessments.submitValidation.$post({
json: {
...form,
assessmentId: String(form.assessmentId),
questionId: String(form.questionId),
},
})
);
};
export const submitValidationMutationOptions = () => ({
mutationFn: submitValidation,
});
// Function to upload a file
const uploadFile = async (formData: FormData, assessmentId: string, questionId: string) => {
const token = localStorage.getItem('accessToken');
const response = await fetch(`${import.meta.env.VITE_BACKEND_BASE_URL}/assessments/uploadFile?assessmentId=${assessmentId}&questionId=${questionId}`, {
method: 'POST',
body: formData,
headers: {
'Authorization': `Bearer ${token}`
}
});
if (!response.ok) {
const errorData = await response.json();
console.error('Error Data:', errorData);
throw new Error(errorData.message || 'Error uploading file');
}
const responseData = await response.json();
return responseData; // Return the JSON response with file URL
};
// Options for the mutation
export const uploadFileMutationOptions = (): UseMutationOptions<{ imageUrl: string }, Error, FormData> => ({
mutationFn: (formData: FormData) => {
const assessmentId = formData.get('assessmentId') as string;
const questionId = formData.get('questionId') as string;
return uploadFile(formData, assessmentId, questionId);
},
});