analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 16.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/hooks/useRecommendedClassDrafts.ts","../src/hooks/useRecommendedClassModels.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport {\n recommendedClassModelsApiResponseSchema,\n transformRecommendedClassModelToTableItem,\n} from './useRecommendedClassModels';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\nimport type {\n RecommendedClassModelTableItem,\n RecommendedClassModelsApiResponse,\n RecommendedClassModelFilters,\n RecommendedClassModelPagination,\n} from '../types/recommendedLessons';\nimport type { BaseApiClient } from '../types/api';\n\n/**\n * Hook state interface for recommendedClass drafts\n */\nexport interface UseRecommendedClassDraftsState {\n models: RecommendedClassModelTableItem[];\n loading: boolean;\n error: string | null;\n pagination: RecommendedClassModelPagination;\n}\n\n/**\n * Hook return type for recommendedClass drafts\n */\nexport interface UseRecommendedClassDraftsReturn extends UseRecommendedClassDraftsState {\n fetchModels: (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => Promise<void>;\n deleteModel: (id: string) => Promise<boolean>;\n}\n\n/**\n * Default pagination values for drafts\n */\nexport const DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION: RecommendedClassModelPagination =\n {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n };\n\n/**\n * Handle errors during draft fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleRecommendedClassDraftFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de rascunhos de aulas',\n 'Erro ao carregar rascunhos de aulas'\n);\n\n/**\n * Factory function to create useRecommendedClassDrafts hook\n *\n * @param apiClient - API client adapter with get and delete methods\n * @returns Hook for managing recommendedClass drafts\n *\n * @example\n * ```tsx\n * const useRecommendedClassDrafts = createUseRecommendedClassDrafts(apiClientAdapter);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassDrafts();\n * ```\n */\nexport const createUseRecommendedClassDrafts = (apiClient: BaseApiClient) => {\n return (): UseRecommendedClassDraftsReturn => {\n const [state, setState] = useState<UseRecommendedClassDraftsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,\n });\n\n /**\n * Fetch recommendedClass drafts from API\n * @param filters - Optional filters for pagination, search, etc.\n * @param subjectsMap - Map of subject IDs to subject names for display\n */\n const fetchModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API using adapter\n const response =\n await apiClient.get<RecommendedClassModelsApiResponse>(\n '/recommended-class/drafts',\n { params: filters as Record<string, unknown> }\n );\n\n // Validate response with Zod\n const validatedData = recommendedClassModelsApiResponseSchema.parse(\n response.data\n );\n\n // Transform drafts to table format\n const tableItems = validatedData.data.drafts.map((draft) =>\n transformRecommendedClassModelToTableItem(draft, subjectsMap)\n );\n\n // Calculate pagination\n const limit = filters?.limit || 10;\n const page = filters?.page || 1;\n const total = validatedData.data.total;\n const totalPages = Math.ceil(total / limit);\n\n // Update state with validated and transformed data\n setState({\n models: tableItems,\n loading: false,\n error: null,\n pagination: {\n total,\n page,\n limit,\n totalPages,\n },\n });\n } catch (error) {\n const errorMessage = handleRecommendedClassDraftFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [apiClient]\n );\n\n /**\n * Delete a recommendedClass draft\n * @param id - Draft ID to delete\n * @returns True if deletion was successful\n */\n const deleteModel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n await apiClient.delete(`/recommended-class/drafts/${id}`);\n return true;\n } catch (error) {\n console.error('Erro ao deletar rascunho:', error);\n return false;\n }\n },\n [apiClient]\n );\n\n return {\n ...state,\n fetchModels,\n deleteModel,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedClassDrafts\n */\nexport const createRecommendedClassDraftsHook = createUseRecommendedClassDrafts;\n","import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport { RecommendedClassDraftType } from '../types/recommendedLessons';\nimport type {\n RecommendedClassModelResponse,\n RecommendedClassModelTableItem,\n RecommendedClassModelsApiResponse,\n RecommendedClassModelFilters,\n RecommendedClassModelPagination,\n} from '../types/recommendedLessons';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\nimport type { BaseApiClient } from '../types/api';\n\n/**\n * Zod schema for recommendedClass model response validation\n */\nconst recommendedClassModelResponseSchema = z.object({\n id: z.string().uuid(),\n type: z.nativeEnum(RecommendedClassDraftType),\n title: z.string(),\n description: z.string().nullable(),\n creatorUserInstitutionId: z.string().uuid(),\n subjectId: z.string().uuid().nullable(),\n subject: z.object({ id: z.string(), name: z.string() }).nullable().optional(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n // Activity drafts attached to this model. Kept in the schema so Zod\n // preserves the field during validation — used to derive\n // activityDraftsCount for the send-modal \"Permitir refazer?\" gate.\n activityDrafts: z\n .array(\n z.object({\n activityDraftId: z.uuid(),\n sequence: z.number(),\n title: z.string().nullable().optional(),\n })\n )\n .optional()\n .default([]),\n});\n\n/**\n * Zod schema for recommendedClass models API response validation\n */\nexport const recommendedClassModelsApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n drafts: z.array(recommendedClassModelResponseSchema),\n total: z.number(),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseRecommendedClassModelsState {\n models: RecommendedClassModelTableItem[];\n loading: boolean;\n error: string | null;\n pagination: RecommendedClassModelPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseRecommendedClassModelsReturn extends UseRecommendedClassModelsState {\n fetchModels: (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => Promise<void>;\n deleteModel: (id: string) => Promise<boolean>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION: RecommendedClassModelPagination =\n {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n };\n\n/**\n * Transform API response to table item format\n * @param model - RecommendedClass model from API response\n * @param subjectsMap - Map of subject IDs to subject names\n * @returns Formatted model for table display\n */\nexport const transformRecommendedClassModelToTableItem = (\n model: RecommendedClassModelResponse,\n subjectsMap?: Map<string, string>\n): RecommendedClassModelTableItem => {\n const subjectName =\n model.subject?.name ||\n (model.subjectId ? subjectsMap?.get(model.subjectId) || '' : '');\n\n return {\n id: model.id,\n title: model.title || 'Sem título',\n savedAt: dayjs(model.createdAt).format('DD/MM/YYYY'),\n subject: subjectName,\n subjectId: model.subjectId,\n activityDraftsCount: model.activityDrafts?.length ?? 0,\n };\n};\n\n/**\n * Handle errors during model fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleRecommendedClassModelFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de modelos de aulas',\n 'Erro ao carregar modelos de aulas'\n);\n\n/**\n * Factory function to create useRecommendedClassModels hook\n *\n * @param apiClient - API client adapter with get and delete methods\n * @returns Hook for managing recommendedClass models\n *\n * @example\n * ```tsx\n * const useRecommendedClassModels = createUseRecommendedClassModels(apiClientAdapter);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassModels();\n * ```\n */\nexport const createUseRecommendedClassModels = (apiClient: BaseApiClient) => {\n return (): UseRecommendedClassModelsReturn => {\n const [state, setState] = useState<UseRecommendedClassModelsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_RECOMMENDED_CLASS_MODELS_PAGINATION,\n });\n\n /**\n * Fetch recommendedClass models from API\n * @param filters - Optional filters for pagination, search, etc.\n * @param subjectsMap - Map of subject IDs to subject names for display\n */\n const fetchModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters,\n subjectsMap?: Map<string, string>\n ) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API using adapter\n const response =\n await apiClient.get<RecommendedClassModelsApiResponse>(\n '/recommended-class/drafts',\n { params: filters as Record<string, unknown> }\n );\n\n // Validate response with Zod\n const validatedData = recommendedClassModelsApiResponseSchema.parse(\n response.data\n );\n\n // Transform models to table format\n const tableItems = validatedData.data.drafts.map((model) =>\n transformRecommendedClassModelToTableItem(model, subjectsMap)\n );\n\n // Calculate pagination\n const limit = filters?.limit || 10;\n const page = filters?.page || 1;\n const total = validatedData.data.total;\n const totalPages = Math.ceil(total / limit);\n\n // Update state with validated and transformed data\n setState({\n models: tableItems,\n loading: false,\n error: null,\n pagination: {\n total,\n page,\n limit,\n totalPages,\n },\n });\n } catch (error) {\n const errorMessage = handleRecommendedClassModelFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [apiClient]\n );\n\n /**\n * Delete a recommendedClass model\n * @param id - Model ID to delete\n * @returns True if deletion was successful\n */\n const deleteModel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n await apiClient.delete(`/recommended-class/drafts/${id}`);\n return true;\n } catch (error) {\n console.error('Erro ao deletar modelo:', error);\n return false;\n }\n },\n [apiClient]\n );\n\n return {\n ...state,\n fetchModels,\n deleteModel,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedClassModels\n */\nexport const createRecommendedClassModelsHook = createUseRecommendedClassModels;\n"],"mappings":"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","names":["useState","useCallback","useState","useCallback"]}