analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
145 lines (141 loc) • 4.79 kB
JavaScript
import {
createFetchErrorHandler
} from "./chunk-UANZJ7NH.mjs";
// src/hooks/useExamDetails.ts
import { useState, useCallback } from "react";
import dayjs from "dayjs";
// src/types/examDetails.ts
var StudentAnswerStatus = /* @__PURE__ */ ((StudentAnswerStatus2) => {
StudentAnswerStatus2["AWAITING_ANSWER_SHEET"] = "AWAITING_ANSWER_SHEET";
StudentAnswerStatus2["ANSWER_SHEET_RECEIVED"] = "ANSWER_SHEET_RECEIVED";
return StudentAnswerStatus2;
})(StudentAnswerStatus || {});
var StudentAnswerDisplayStatus = /* @__PURE__ */ ((StudentAnswerDisplayStatus2) => {
StudentAnswerDisplayStatus2["AWAITING_ANSWER_SHEET"] = "Aguardando gabarito";
StudentAnswerDisplayStatus2["ANSWER_SHEET_RECEIVED"] = "Gabarito recebido";
return StudentAnswerDisplayStatus2;
})(StudentAnswerDisplayStatus || {});
// src/hooks/useExamDetails.ts
var DEFAULT_EXAM_DETAILS_PAGINATION = {
total: 0,
page: 1,
limit: 10,
totalPages: 0
};
var mapBackendStatusToFrontend = (status) => {
if (status === "CONCLUIDO" /* CONCLUIDO */ || status === "AGUARDANDO_CORRECAO" /* AGUARDANDO_CORRECAO */) {
return "ANSWER_SHEET_RECEIVED" /* ANSWER_SHEET_RECEIVED */;
}
return "AWAITING_ANSWER_SHEET" /* AWAITING_ANSWER_SHEET */;
};
var transformStudent = (student) => ({
id: student.studentId,
studentId: student.studentId,
studentName: student.studentName,
status: mapBackendStatusToFrontend(student.status),
answerReceivedAt: student.answeredAt ? dayjs(student.answeredAt).format("DD MMM YYYY") : null,
score: student.score
});
var handleExamDetailsFetchError = createFetchErrorHandler(
"Erro ao validar dados de detalhes da prova",
"Erro ao carregar detalhes da prova"
);
var buildQueryParams = (filters) => {
if (!filters) return {};
const params = {};
for (const key in filters) {
const value = filters[key];
if (value !== void 0 && value !== null) {
params[key] = value;
}
}
return params;
};
var useExamDetailsImpl = (apiClient) => {
const [state, setState] = useState({
examData: null,
loading: false,
error: null,
pagination: DEFAULT_EXAM_DETAILS_PAGINATION
});
const fetchExamDetails = useCallback(
async (examId, filters) => {
setState((prev) => ({ ...prev, loading: true, error: null }));
try {
const params = buildQueryParams(filters);
const [examInfoResponse, examDetailsResponse] = await Promise.all([
apiClient.get(`/activities/${examId}/quiz`),
apiClient.get(
`/activities/${examId}/details`,
{
params
}
)
]);
const examInfo = examInfoResponse.data;
const examDetails = examDetailsResponse.data;
const students = examDetails.data.students.map(transformStudent);
const stats = {
averageScore: examDetails.data.generalStats.averageScore,
mostCorrectQuestions: examDetails.data.questionStats.mostCorrect,
mostIncorrectQuestions: examDetails.data.questionStats.mostIncorrect,
unansweredQuestions: examDetails.data.questionStats.notAnswered
};
const breakdown = examDetails.data.breakdown;
const schoolNames = [
...new Set(
breakdown.map((b) => b.school?.name).filter((name) => !!name)
)
];
const classNames = [
...new Set(
breakdown.map((b) => b.class?.name).filter((name) => !!name)
)
];
const examData = {
id: examInfo.data.id,
title: examInfo.data.title,
startDate: examInfo.data.startDate ? dayjs(examInfo.data.startDate).format("DD/MM/YYYY") : "-",
school: schoolNames.length > 0 ? schoolNames.join(", ") : "-",
className: classNames.length > 0 ? classNames.join(", ") : "-",
createdAt: dayjs(examInfo.data.createdAt).format("DD/MM/YYYY"),
stats,
students
};
setState({
examData,
loading: false,
error: null,
pagination: examDetails.data.pagination
});
} catch (error) {
const errorMessage = handleExamDetailsFetchError(error);
setState((prev) => ({
...prev,
loading: false,
error: errorMessage
}));
}
},
[apiClient]
);
return {
...state,
fetchExamDetails
};
};
var createUseExamDetails = (apiClient) => {
return () => useExamDetailsImpl(apiClient);
};
var createExamDetailsHook = createUseExamDetails;
export {
StudentAnswerStatus,
StudentAnswerDisplayStatus,
DEFAULT_EXAM_DETAILS_PAGINATION,
mapBackendStatusToFrontend,
transformStudent,
handleExamDetailsFetchError,
createUseExamDetails,
createExamDetailsHook
};
//# sourceMappingURL=chunk-JLZKEHDF.mjs.map