analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
158 lines (157 loc) • 5.13 kB
JavaScript
// src/hooks/useRecommendedLessons.ts
import { useState, useCallback } from "react";
import { z } from "zod";
import dayjs from "dayjs";
var recommendedClassSubjectSchema = z.object({
id: z.string().uuid(),
name: z.string()
}).nullable();
var recommendedClassCreatorSchema = z.object({
id: z.string().uuid(),
name: z.string()
}).nullable();
var recommendedClassStatsSchema = z.object({
totalStudents: z.number(),
completedCount: z.number(),
completionPercentage: z.number()
});
var recommendedClassBreakdownSchema = z.object({
classId: z.string().uuid(),
className: z.string(),
schoolId: z.string(),
schoolName: z.string(),
studentCount: z.number(),
completedCount: z.number()
});
var recommendedClassDataSchema = z.object({
id: z.string().uuid(),
title: z.string(),
startDate: z.string().nullable(),
finalDate: z.string().nullable(),
createdAt: z.string(),
progress: z.number(),
totalLessons: z.number()
});
var recommendedClassHistoryItemSchema = z.object({
recommendedClass: recommendedClassDataSchema,
subject: recommendedClassSubjectSchema,
creator: recommendedClassCreatorSchema,
stats: recommendedClassStatsSchema,
breakdown: z.array(recommendedClassBreakdownSchema)
});
var recommendedClassHistoryApiResponseSchema = z.object({
message: z.string(),
data: z.object({
recommendedClass: z.array(recommendedClassHistoryItemSchema),
total: z.number()
})
});
var determineRecommendedClassStatus = (finalDate, completionPercentage) => {
if (completionPercentage === 100) {
return "CONCLU\xCDDA" /* CONCLUIDA */;
}
if (finalDate) {
const now = dayjs();
const deadline = dayjs(finalDate);
if (deadline.isBefore(now)) {
return "VENCIDA" /* VENCIDA */;
}
}
return "ATIVA" /* ATIVA */;
};
var transformRecommendedClassToTableItem = (item) => {
const firstBreakdown = item.breakdown[0];
const schoolName = firstBreakdown?.schoolName || "-";
const className = firstBreakdown?.className || "-";
const classDisplay = item.breakdown.length > 1 ? `${item.breakdown.length} turmas` : className;
return {
id: item.recommendedClass.id,
startDate: item.recommendedClass.startDate ? dayjs(item.recommendedClass.startDate).format("DD/MM") : "-",
deadline: item.recommendedClass.finalDate ? dayjs(item.recommendedClass.finalDate).format("DD/MM") : "-",
title: item.recommendedClass.title,
school: schoolName,
year: "-",
// API doesn't provide year directly
creator: item.creator?.name || "-",
creatorId: item.creator?.id ?? null,
subject: item.subject?.name || "-",
class: classDisplay,
status: determineRecommendedClassStatus(
item.recommendedClass.finalDate,
item.stats.completionPercentage
),
completionPercentage: item.stats.completionPercentage
};
};
var handleRecommendedClassFetchError = (error) => {
if (error instanceof z.ZodError) {
console.error("Erro ao validar dados de hist\xF3rico de aulas:", error);
return "Erro ao validar dados de hist\xF3rico de aulas";
}
console.error("Erro ao carregar hist\xF3rico de aulas:", error);
return "Erro ao carregar hist\xF3rico de aulas";
};
var createUseRecommendedLessonsHistory = (fetchRecommendedClassHistory) => {
return () => {
const [state, setState] = useState({
recommendedClass: [],
loading: false,
error: null,
pagination: {
total: 0,
page: 1,
limit: 10,
totalPages: 0
}
});
const fetchRecommendedClass = useCallback(
async (filters) => {
setState((prev) => ({ ...prev, loading: true, error: null }));
try {
const responseData = await fetchRecommendedClassHistory(filters);
const validatedData = recommendedClassHistoryApiResponseSchema.parse(responseData);
const tableItems = validatedData.data.recommendedClass.map(
transformRecommendedClassToTableItem
);
const page = filters?.page || 1;
const limit = filters?.limit || 10;
const total = validatedData.data.total;
const totalPages = Math.ceil(total / limit);
setState({
recommendedClass: tableItems,
loading: false,
error: null,
pagination: {
total,
page,
limit,
totalPages
}
});
} catch (error) {
const errorMessage = handleRecommendedClassFetchError(error);
setState((prev) => ({
...prev,
loading: false,
error: errorMessage
}));
}
},
[fetchRecommendedClassHistory]
);
return {
...state,
fetchRecommendedClass
};
};
};
var createRecommendedLessonsHistoryHook = createUseRecommendedLessonsHistory;
export {
recommendedClassHistoryApiResponseSchema,
determineRecommendedClassStatus,
transformRecommendedClassToTableItem,
handleRecommendedClassFetchError,
createUseRecommendedLessonsHistory,
createRecommendedLessonsHistoryHook
};
//# sourceMappingURL=chunk-KP6KKVAB.mjs.map