UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

227 lines (223 loc) 6.93 kB
import { createFetchErrorHandler } from "./chunk-UANZJ7NH.mjs"; import { RecommendedClassDraftType } from "./chunk-FD4UD2X5.mjs"; // src/hooks/useRecommendedClassDrafts.ts import { useState as useState2, useCallback as useCallback2 } from "react"; // src/hooks/useRecommendedClassModels.ts import { useState, useCallback } from "react"; import { z } from "zod"; import dayjs from "dayjs"; var recommendedClassModelResponseSchema = z.object({ id: z.string().uuid(), type: z.nativeEnum(RecommendedClassDraftType), title: z.string(), description: z.string().nullable(), creatorUserInstitutionId: z.string().uuid(), subjectId: z.string().uuid().nullable(), subject: z.object({ id: z.string(), name: z.string() }).nullable().optional(), startDate: z.string().nullable(), finalDate: z.string().nullable(), createdAt: z.string(), updatedAt: z.string(), // Activity drafts attached to this model. Kept in the schema so Zod // preserves the field during validation — used to derive // activityDraftsCount for the send-modal "Permitir refazer?" gate. activityDrafts: z.array( z.object({ activityDraftId: z.uuid(), sequence: z.number(), title: z.string().nullable().optional() }) ).optional().default([]) }); var recommendedClassModelsApiResponseSchema = z.object({ message: z.string(), data: z.object({ drafts: z.array(recommendedClassModelResponseSchema), total: z.number() }) }); var DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION = { total: 0, page: 1, limit: 10, totalPages: 0 }; var transformRecommendedClassModelToTableItem = (model, subjectsMap) => { const subjectName = model.subject?.name || (model.subjectId ? subjectsMap?.get(model.subjectId) || "" : ""); return { id: model.id, title: model.title || "Sem t\xEDtulo", savedAt: dayjs(model.createdAt).format("DD/MM/YYYY"), subject: subjectName, subjectId: model.subjectId, activityDraftsCount: model.activityDrafts?.length ?? 0 }; }; var handleRecommendedClassModelFetchError = createFetchErrorHandler( "Erro ao validar dados de modelos de aulas", "Erro ao carregar modelos de aulas" ); var createUseRecommendedClassModels = (apiClient) => { return () => { const [state, setState] = useState({ models: [], loading: false, error: null, pagination: DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION }); const fetchModels = useCallback( async (filters, subjectsMap) => { setState((prev) => ({ ...prev, loading: true, error: null })); try { const response = await apiClient.get( "/recommended-class/drafts", { params: filters } ); const validatedData = recommendedClassModelsApiResponseSchema.parse( response.data ); const tableItems = validatedData.data.drafts.map( (model) => transformRecommendedClassModelToTableItem(model, subjectsMap) ); const limit = filters?.limit || 10; const page = filters?.page || 1; const total = validatedData.data.total; const totalPages = Math.ceil(total / limit); setState({ models: tableItems, loading: false, error: null, pagination: { total, page, limit, totalPages } }); } catch (error) { const errorMessage = handleRecommendedClassModelFetchError(error); setState((prev) => ({ ...prev, loading: false, error: errorMessage })); } }, [apiClient] ); const deleteModel = useCallback( async (id) => { try { await apiClient.delete(`/recommended-class/drafts/${id}`); return true; } catch (error) { console.error("Erro ao deletar modelo:", error); return false; } }, [apiClient] ); return { ...state, fetchModels, deleteModel }; }; }; var createRecommendedClassModelsHook = createUseRecommendedClassModels; // src/hooks/useRecommendedClassDrafts.ts var DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION = { total: 0, page: 1, limit: 10, totalPages: 0 }; var handleRecommendedClassDraftFetchError = createFetchErrorHandler( "Erro ao validar dados de rascunhos de aulas", "Erro ao carregar rascunhos de aulas" ); var createUseRecommendedClassDrafts = (apiClient) => { return () => { const [state, setState] = useState2({ models: [], loading: false, error: null, pagination: DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION }); const fetchModels = useCallback2( async (filters, subjectsMap) => { setState((prev) => ({ ...prev, loading: true, error: null })); try { const response = await apiClient.get( "/recommended-class/drafts", { params: filters } ); const validatedData = recommendedClassModelsApiResponseSchema.parse( response.data ); const tableItems = validatedData.data.drafts.map( (draft) => transformRecommendedClassModelToTableItem(draft, subjectsMap) ); const limit = filters?.limit || 10; const page = filters?.page || 1; const total = validatedData.data.total; const totalPages = Math.ceil(total / limit); setState({ models: tableItems, loading: false, error: null, pagination: { total, page, limit, totalPages } }); } catch (error) { const errorMessage = handleRecommendedClassDraftFetchError(error); setState((prev) => ({ ...prev, loading: false, error: errorMessage })); } }, [apiClient] ); const deleteModel = useCallback2( async (id) => { try { await apiClient.delete(`/recommended-class/drafts/${id}`); return true; } catch (error) { console.error("Erro ao deletar rascunho:", error); return false; } }, [apiClient] ); return { ...state, fetchModels, deleteModel }; }; }; var createRecommendedClassDraftsHook = createUseRecommendedClassDrafts; export { recommendedClassModelsApiResponseSchema, DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION, transformRecommendedClassModelToTableItem, handleRecommendedClassModelFetchError, createUseRecommendedClassModels, createRecommendedClassModelsHook, DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION, handleRecommendedClassDraftFetchError, createUseRecommendedClassDrafts, createRecommendedClassDraftsHook }; //# sourceMappingURL=chunk-3DZ6JVFL.mjs.map