UNPKG

analytica-frontend-lib

Version:

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

1 lines 11.5 kB
{"version":3,"sources":["../src/hooks/useRecommendedLessons.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport { RecommendedClassDisplayStatus } from '../types/recommendedLessons';\nimport type {\n RecommendedClassHistoryItem,\n RecommendedClassTableItem,\n RecommendedClassHistoryApiResponse,\n RecommendedClassHistoryFilters,\n RecommendedClassHistoryPagination,\n} from '../types/recommendedLessons';\n\n/**\n * Zod schema for recommendedClass history API response validation\n * Based on /recommended-class/history endpoint\n */\nconst recommendedClassSubjectSchema = z\n .object({\n id: z.string().uuid(),\n name: z.string(),\n })\n .nullable();\n\nconst recommendedClassCreatorSchema = z\n .object({\n id: z.string().uuid(),\n name: z.string(),\n })\n .nullable();\n\nconst recommendedClassStatsSchema = z.object({\n totalStudents: z.number(),\n completedCount: z.number(),\n completionPercentage: z.number(),\n});\n\nconst recommendedClassBreakdownSchema = z.object({\n classId: z.string().uuid(),\n className: z.string(),\n schoolId: z.string(),\n schoolName: z.string(),\n studentCount: z.number(),\n completedCount: z.number(),\n});\n\nconst recommendedClassDataSchema = z.object({\n id: z.string().uuid(),\n title: z.string(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n createdAt: z.string(),\n progress: z.number(),\n totalLessons: z.number(),\n});\n\nconst recommendedClassHistoryItemSchema = z.object({\n recommendedClass: recommendedClassDataSchema,\n subject: recommendedClassSubjectSchema,\n creator: recommendedClassCreatorSchema,\n stats: recommendedClassStatsSchema,\n breakdown: z.array(recommendedClassBreakdownSchema),\n});\n\nexport const recommendedClassHistoryApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n recommendedClass: z.array(recommendedClassHistoryItemSchema),\n total: z.number(),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseRecommendedLessonsHistoryState {\n recommendedClass: RecommendedClassTableItem[];\n loading: boolean;\n error: string | null;\n pagination: RecommendedClassHistoryPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseRecommendedLessonsHistoryReturn extends UseRecommendedLessonsHistoryState {\n fetchRecommendedClass: (\n filters?: RecommendedClassHistoryFilters\n ) => Promise<void>;\n}\n\n/**\n * Determine status based on dates and completion\n * @param finalDate - RecommendedClass final date\n * @param completionPercentage - Completion percentage\n * @returns Display status for UI\n */\nexport const determineRecommendedClassStatus = (\n finalDate: string | null,\n completionPercentage: number\n): RecommendedClassDisplayStatus => {\n if (completionPercentage === 100) {\n return RecommendedClassDisplayStatus.CONCLUIDA;\n }\n\n if (finalDate) {\n const now = dayjs();\n const deadline = dayjs(finalDate);\n if (deadline.isBefore(now)) {\n return RecommendedClassDisplayStatus.VENCIDA;\n }\n }\n\n return RecommendedClassDisplayStatus.ATIVA;\n};\n\n/**\n * Transform API response to table item format\n * @param item - RecommendedClass history item from API response\n * @returns Formatted recommendedClass for table display\n */\nexport const transformRecommendedClassToTableItem = (\n item: RecommendedClassHistoryItem\n): RecommendedClassTableItem => {\n // Get first breakdown for school/class info (or aggregate)\n const firstBreakdown = item.breakdown[0];\n const schoolName = firstBreakdown?.schoolName || '-';\n const className = firstBreakdown?.className || '-';\n\n // If multiple classes, show count\n const classDisplay =\n item.breakdown.length > 1 ? `${item.breakdown.length} turmas` : className;\n\n return {\n id: item.recommendedClass.id,\n startDate: item.recommendedClass.startDate\n ? dayjs(item.recommendedClass.startDate).format('DD/MM')\n : '-',\n deadline: item.recommendedClass.finalDate\n ? dayjs(item.recommendedClass.finalDate).format('DD/MM')\n : '-',\n title: item.recommendedClass.title,\n school: schoolName,\n year: '-', // API doesn't provide year directly\n creator: item.creator?.name || '-',\n creatorId: item.creator?.id ?? null,\n subject: item.subject?.name || '-',\n class: classDisplay,\n status: determineRecommendedClassStatus(\n item.recommendedClass.finalDate,\n item.stats.completionPercentage\n ),\n completionPercentage: item.stats.completionPercentage,\n };\n};\n\n/**\n * Handle errors during recommendedClass fetch\n * @param error - Error object\n * @returns Error message for UI display\n */\nexport const handleRecommendedClassFetchError = (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error('Erro ao validar dados de histórico de aulas:', error);\n return 'Erro ao validar dados de histórico de aulas';\n }\n\n console.error('Erro ao carregar histórico de aulas:', error);\n return 'Erro ao carregar histórico de aulas';\n};\n\n/**\n * Factory function to create useRecommendedLessonsHistory hook\n *\n * @param fetchRecommendedClassHistory - Function to fetch recommendedClass from API\n * @returns Hook for managing recommended lessons history\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchRecommendedClassHistory = async (filters) => {\n * const response = await api.get('/recommended-class/history', { params: filters });\n * return response.data;\n * };\n *\n * const useRecommendedClassHistory = createUseRecommendedLessonsHistory(fetchRecommendedClassHistory);\n *\n * // In your component\n * const { recommendedClass, loading, error, pagination, fetchRecommendedClass } = useRecommendedClassHistory();\n * ```\n */\nexport const createUseRecommendedLessonsHistory = (\n fetchRecommendedClassHistory: (\n filters?: RecommendedClassHistoryFilters\n ) => Promise<RecommendedClassHistoryApiResponse>\n) => {\n return (): UseRecommendedLessonsHistoryReturn => {\n const [state, setState] = useState<UseRecommendedLessonsHistoryState>({\n recommendedClass: [],\n loading: false,\n error: null,\n pagination: {\n total: 0,\n page: 1,\n limit: 10,\n totalPages: 0,\n },\n });\n\n /**\n * Fetch recommendedClass history from API\n * @param filters - Optional filters for pagination, search, sorting, etc.\n */\n const fetchRecommendedClass = useCallback(\n async (filters?: RecommendedClassHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchRecommendedClassHistory(filters);\n\n // Validate response with Zod\n const validatedData =\n recommendedClassHistoryApiResponseSchema.parse(responseData);\n\n // Transform recommendedClass to table format\n const tableItems = validatedData.data.recommendedClass.map(\n transformRecommendedClassToTableItem\n );\n\n // Calculate pagination from total\n const page = filters?.page || 1;\n const limit = filters?.limit || 10;\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 recommendedClass: 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 = handleRecommendedClassFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchRecommendedClassHistory]\n );\n\n return {\n ...state,\n fetchRecommendedClass,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonsHistory\n */\nexport const createRecommendedLessonsHistoryHook =\n createUseRecommendedLessonsHistory;\n"],"mappings":"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","names":[]}