156 lines
4.7 KiB
TypeScript
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);
|
|
},
|
|
}); |