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 => { return await fetchRPC( client.assessments.submitOption.$post({ json: form, }) ); }; export const submitOptionMutationOptions: UseMutationOptions< SubmitOptionResponse, Error, Parameters[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); }, });