analytica-frontend-lib 1.2.85 → 1.2.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/ActivitiesHistory/index.js.map +1 -1
  2. package/dist/ActivitiesHistory/index.mjs.map +1 -1
  3. package/dist/NotificationCard/index.js +1 -1
  4. package/dist/NotificationCard/index.js.map +1 -1
  5. package/dist/NotificationCard/index.mjs +1 -1
  6. package/dist/NotificationCard/index.mjs.map +1 -1
  7. package/dist/RecommendedLessonsHistory/index.d.ts +1 -1
  8. package/dist/RecommendedLessonsHistory/index.d.ts.map +1 -1
  9. package/dist/RecommendedLessonsHistory/index.js +148 -142
  10. package/dist/RecommendedLessonsHistory/index.js.map +1 -1
  11. package/dist/RecommendedLessonsHistory/index.mjs +147 -141
  12. package/dist/RecommendedLessonsHistory/index.mjs.map +1 -1
  13. package/dist/hooks/useActivitiesHistory/index.js.map +1 -1
  14. package/dist/hooks/useActivitiesHistory/index.mjs.map +1 -1
  15. package/dist/hooks/useNotifications.d.ts +2 -2
  16. package/dist/hooks/useNotifications.d.ts.map +1 -1
  17. package/dist/hooks/useRecommendedClassDrafts/index.d.ts +57 -0
  18. package/dist/hooks/useRecommendedClassDrafts/index.d.ts.map +1 -0
  19. package/dist/hooks/{useGoalDrafts → useRecommendedClassDrafts}/index.js +40 -40
  20. package/dist/hooks/useRecommendedClassDrafts/index.js.map +1 -0
  21. package/dist/hooks/{useGoalDrafts → useRecommendedClassDrafts}/index.mjs +33 -33
  22. package/dist/hooks/useRecommendedClassDrafts/index.mjs.map +1 -0
  23. package/dist/hooks/useRecommendedClassDrafts.d.ts +57 -0
  24. package/dist/hooks/useRecommendedClassDrafts.d.ts.map +1 -0
  25. package/dist/hooks/{useGoalModels.d.ts → useRecommendedClassModels.d.ts} +32 -32
  26. package/dist/hooks/useRecommendedClassModels.d.ts.map +1 -0
  27. package/dist/hooks/useRecommendedLessonDetails.d.ts +44 -44
  28. package/dist/hooks/useRecommendedLessonDetails.d.ts.map +1 -1
  29. package/dist/hooks/useRecommendedLessons/index.d.ts +35 -35
  30. package/dist/hooks/useRecommendedLessons/index.d.ts.map +1 -1
  31. package/dist/hooks/useRecommendedLessons/index.js +41 -41
  32. package/dist/hooks/useRecommendedLessons/index.js.map +1 -1
  33. package/dist/hooks/useRecommendedLessons/index.mjs +37 -37
  34. package/dist/hooks/useRecommendedLessons/index.mjs.map +1 -1
  35. package/dist/hooks/useRecommendedLessons.d.ts +35 -35
  36. package/dist/hooks/useRecommendedLessons.d.ts.map +1 -1
  37. package/dist/hooks/useRecommendedLessonsPage/index.d.ts +21 -21
  38. package/dist/hooks/useRecommendedLessonsPage/index.d.ts.map +1 -1
  39. package/dist/hooks/useRecommendedLessonsPage/index.js +39 -33
  40. package/dist/hooks/useRecommendedLessonsPage/index.js.map +1 -1
  41. package/dist/hooks/useRecommendedLessonsPage/index.mjs +39 -33
  42. package/dist/hooks/useRecommendedLessonsPage/index.mjs.map +1 -1
  43. package/dist/hooks/useRecommendedLessonsPage.d.ts +21 -21
  44. package/dist/hooks/useRecommendedLessonsPage.d.ts.map +1 -1
  45. package/dist/index.d.ts +14 -11
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +359 -288
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.mjs +329 -262
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/store/notificationStore.d.ts.map +1 -1
  52. package/dist/types/activitiesHistory/index.js.map +1 -1
  53. package/dist/types/activitiesHistory/index.mjs.map +1 -1
  54. package/dist/types/common.d.ts +2 -2
  55. package/dist/types/lessonAvailability.d.ts +33 -0
  56. package/dist/types/lessonAvailability.d.ts.map +1 -0
  57. package/dist/types/notifications.d.ts +5 -5
  58. package/dist/types/notifications.d.ts.map +1 -1
  59. package/dist/types/recommendedLessons/index.d.ts +112 -112
  60. package/dist/types/recommendedLessons/index.d.ts.map +1 -1
  61. package/dist/types/recommendedLessons/index.js +25 -25
  62. package/dist/types/recommendedLessons/index.js.map +1 -1
  63. package/dist/types/recommendedLessons/index.mjs +17 -17
  64. package/dist/types/recommendedLessons/index.mjs.map +1 -1
  65. package/dist/types/recommendedLessons.d.ts +112 -112
  66. package/dist/types/recommendedLessons.d.ts.map +1 -1
  67. package/dist/utils/lessonAvailabilityUtils.d.ts +45 -0
  68. package/dist/utils/lessonAvailabilityUtils.d.ts.map +1 -0
  69. package/package.json +1 -1
  70. package/dist/hooks/useGoalDrafts/index.d.ts +0 -57
  71. package/dist/hooks/useGoalDrafts/index.d.ts.map +0 -1
  72. package/dist/hooks/useGoalDrafts/index.js.map +0 -1
  73. package/dist/hooks/useGoalDrafts/index.mjs.map +0 -1
  74. package/dist/hooks/useGoalDrafts.d.ts +0 -57
  75. package/dist/hooks/useGoalDrafts.d.ts.map +0 -1
  76. package/dist/hooks/useGoalModels.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useActivitiesHistory.ts","../../../src/types/common.ts","../../../src/types/activitiesHistory.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport {\n ActivityApiStatus,\n mapActivityStatusToDisplay,\n} from '../types/activitiesHistory';\nimport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for activity history API response validation\n * Based on /activities/history endpoint\n */\nconst activityHistoryResponseSchema = z.object({\n id: z.string().uuid(),\n title: z.string(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n status: z.nativeEnum(ActivityApiStatus),\n completionPercentage: z.number().min(0).max(100).optional().default(0),\n subjectId: z.string().uuid().optional().nullable(),\n schoolId: z.string().optional(),\n schoolName: z.string().optional(),\n year: z.string().optional(),\n className: z.string().optional(),\n subjectName: z.string().optional(),\n});\n\nexport const activitiesHistoryApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n activities: z.array(z.unknown()).transform((items) =>\n items\n .map((item) => activityHistoryResponseSchema.safeParse(item))\n .filter(\n (\n result\n ): result is {\n success: true;\n data: z.infer<typeof activityHistoryResponseSchema>;\n } => result.success\n )\n .map((result) => result.data)\n ),\n pagination: z.object({\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n totalPages: z.number(),\n }),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseActivitiesHistoryState {\n activities: ActivityTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivitiesHistoryReturn extends UseActivitiesHistoryState {\n fetchActivities: (filters?: ActivityHistoryFilters) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_ACTIVITIES_PAGINATION: ActivityPagination = {\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 activity - Activity from API response\n * @returns Formatted activity for table display\n */\nexport const transformActivityToTableItem = (\n activity: ActivityHistoryResponse\n): ActivityTableItem => {\n return {\n id: activity.id,\n startDate: activity.startDate\n ? dayjs(activity.startDate).format('DD/MM')\n : '-',\n deadline: activity.finalDate\n ? dayjs(activity.finalDate).format('DD/MM')\n : '-',\n title: activity.title,\n school: activity.schoolName || '-',\n year: activity.year || '-',\n subject: activity.subjectName || '-',\n class: activity.className || '-',\n status: mapActivityStatusToDisplay(activity.status),\n completionPercentage: activity.completionPercentage,\n };\n};\n\n/**\n * Handle errors during activity fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleActivityFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de histórico de atividades',\n 'Erro ao carregar histórico de atividades'\n);\n\n/**\n * Factory function to create useActivitiesHistory hook\n *\n * @param fetchActivitiesHistory - Function to fetch activities from API\n * @returns Hook for managing activities history\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchActivitiesHistory = async (filters) => {\n * const response = await api.get('/activities/history', { params: filters });\n * return response.data;\n * };\n *\n * const useActivitiesHistory = createUseActivitiesHistory(fetchActivitiesHistory);\n *\n * // In your component\n * const { activities, loading, error, pagination, fetchActivities } = useActivitiesHistory();\n * ```\n */\nexport const createUseActivitiesHistory = (\n fetchActivitiesHistory: (\n filters?: ActivityHistoryFilters\n ) => Promise<ActivitiesHistoryApiResponse>\n) => {\n return (): UseActivitiesHistoryReturn => {\n const [state, setState] = useState<UseActivitiesHistoryState>({\n activities: [],\n loading: false,\n error: null,\n pagination: DEFAULT_ACTIVITIES_PAGINATION,\n });\n\n /**\n * Fetch activities history from API\n * @param filters - Optional filters for pagination, search, sorting, etc.\n */\n const fetchActivities = useCallback(\n async (filters?: ActivityHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchActivitiesHistory(filters);\n\n // Validate response with Zod\n const validatedData =\n activitiesHistoryApiResponseSchema.parse(responseData);\n\n // Transform activities to table format\n const tableItems = validatedData.data.activities.map(\n transformActivityToTableItem\n );\n\n // Update state with validated and transformed data\n setState({\n activities: tableItems,\n loading: false,\n error: null,\n pagination: validatedData.data.pagination,\n });\n } catch (error) {\n const errorMessage = handleActivityFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchActivitiesHistory]\n );\n\n return {\n ...state,\n fetchActivities,\n };\n };\n};\n\n/**\n * Alias for createUseActivitiesHistory\n */\nexport const createActivitiesHistoryHook = createUseActivitiesHistory;\n","/**\n * Common Type Definitions\n * Shared types used across multiple features (activities, goals, etc.)\n */\n\n/**\n * Generic API status for activities and goals\n * Used by backend endpoints for status filtering\n */\nexport enum GenericApiStatus {\n A_VENCER = 'A_VENCER',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUIDA',\n}\n\n/**\n * Generic display status for UI components\n * Used for Badge and status display in tables\n */\nexport enum GenericDisplayStatus {\n ATIVA = 'ATIVA',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUÍDA',\n}\n\n/**\n * Badge action types for status visualization\n * Maps to Badge component action prop\n */\nexport enum BadgeActionType {\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\n/**\n * Get badge action based on display status\n * @param status - Display status value\n * @returns Badge action type for styling\n */\nexport const getStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => {\n const actionMap: Record<GenericDisplayStatus, BadgeActionType> = {\n [GenericDisplayStatus.CONCLUIDA]: BadgeActionType.SUCCESS,\n [GenericDisplayStatus.ATIVA]: BadgeActionType.WARNING,\n [GenericDisplayStatus.VENCIDA]: BadgeActionType.ERROR,\n };\n return actionMap[status] ?? BadgeActionType.WARNING;\n};\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapApiStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => {\n const statusMap: Record<GenericApiStatus, GenericDisplayStatus> = {\n [GenericApiStatus.A_VENCER]: GenericDisplayStatus.ATIVA,\n [GenericApiStatus.VENCIDA]: GenericDisplayStatus.VENCIDA,\n [GenericApiStatus.CONCLUIDA]: GenericDisplayStatus.CONCLUIDA,\n };\n return statusMap[apiStatus];\n};\n","/**\n * Activities History Type Definitions\n * Types and interfaces for activities history and models functionality\n * Based on /activities/history and /activity-drafts endpoints\n */\n\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n mapApiStatusToDisplay,\n} from './common';\n\n/**\n * Activity status from backend API /activities/history\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as ActivityApiStatus } from './common';\n\n/**\n * Activity status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as ActivityDisplayStatus } from './common';\n\n/**\n * Badge action types for activity status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as ActivityBadgeActionType } from './common';\n\n/**\n * Activity draft type enum (matches backend ACTIVITY_DRAFT_TYPE)\n */\nexport enum ActivityDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Activity history response from backend API /activities/history\n */\nexport interface ActivityHistoryResponse {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n status: GenericApiStatus;\n completionPercentage: number;\n subjectId?: string | null;\n schoolId?: string;\n schoolName?: string;\n year?: string;\n className?: string;\n subjectName?: string;\n}\n\n/**\n * Activity table item interface for activities list table\n */\nexport interface ActivityTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Pagination info from API\n */\nexport interface ActivityPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Activities history API complete response\n */\nexport interface ActivitiesHistoryApiResponse {\n message: string;\n data: {\n activities: ActivityHistoryResponse[];\n pagination: ActivityPagination;\n };\n}\n\n/**\n * Activity history filters for API query parameters\n */\nexport interface ActivityHistoryFilters {\n page?: number;\n limit?: number;\n status?: GenericApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n sortBy?: 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Activity draft filters object from backend\n */\nexport interface ActivityDraftFilters {\n questionTypes?: string[];\n questionBanks?: string[];\n subjects?: string[];\n topics?: string[];\n subtopics?: string[];\n contents?: string[];\n}\n\n/**\n * Subject object with icon and color information\n */\nexport interface SubjectData {\n id: string;\n subjectName: string;\n subjectIcon: string;\n subjectColor: string;\n}\n\n/**\n * Activity model response from backend API (/activity-drafts)\n */\nexport interface ActivityModelResponse {\n id: string;\n type: ActivityDraftType;\n title: string | null;\n creatorUserInstitutionId: string | null;\n subjectId: string | null;\n subject?: SubjectData | null;\n filters: ActivityDraftFilters | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Activity model table item for display\n */\nexport interface ActivityModelTableItem extends Record<string, unknown> {\n id: string;\n title: string;\n savedAt: string;\n subject: SubjectData | null;\n subjectId: string | null;\n}\n\n/**\n * Activity models API response\n */\nexport interface ActivityModelsApiResponse {\n message: string;\n data: {\n activityDrafts: ActivityModelResponse[];\n total: number;\n };\n}\n\n/**\n * Activity model filters for API query\n */\nexport interface ActivityModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: ActivityDraftType;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface ActivityFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface ActivityUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on activity display status\n * @param status - Activity display status\n * @returns Badge action type for styling\n */\nexport const getActivityStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Activity status options for filter\n */\nexport const ACTIVITY_FILTER_STATUS_OPTIONS: ActivityFilterOption[] = [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n];\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapActivityStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => mapApiStatusToDisplay(apiStatus);\n","import { z } from 'zod';\n\n/**\n * Factory function to create a fetch error handler\n * This reduces code duplication across data fetching hooks\n *\n * @param validationErrorMessage - Message to display for Zod validation errors\n * @param genericErrorMessage - Message to display for other errors\n * @returns Error handler function that returns appropriate error message\n *\n * @example\n * ```typescript\n * const handleFetchError = createFetchErrorHandler(\n * 'Erro ao validar dados',\n * 'Erro ao carregar dados'\n * );\n *\n * try {\n * // fetch data\n * } catch (error) {\n * const errorMessage = handleFetchError(error);\n * }\n * ```\n */\nexport const createFetchErrorHandler =\n (validationErrorMessage: string, genericErrorMessage: string) =>\n (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error(validationErrorMessage, error);\n return validationErrorMessage;\n }\n\n console.error(genericErrorMessage, error);\n return genericErrorMessage;\n };\n"],"mappings":"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","names":["import_zod","GenericApiStatus","dayjs"]}
1
+ {"version":3,"sources":["../../../src/hooks/useActivitiesHistory.ts","../../../src/types/common.ts","../../../src/types/activitiesHistory.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport {\n ActivityApiStatus,\n mapActivityStatusToDisplay,\n} from '../types/activitiesHistory';\nimport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for activity history API response validation\n * Based on /activities/history endpoint\n */\nconst activityHistoryResponseSchema = z.object({\n id: z.string().uuid(),\n title: z.string(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n status: z.nativeEnum(ActivityApiStatus),\n completionPercentage: z.number().min(0).max(100).optional().default(0),\n subjectId: z.string().uuid().optional().nullable(),\n schoolId: z.string().optional(),\n schoolName: z.string().optional(),\n year: z.string().optional(),\n className: z.string().optional(),\n subjectName: z.string().optional(),\n});\n\nexport const activitiesHistoryApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n activities: z.array(z.unknown()).transform((items) =>\n items\n .map((item) => activityHistoryResponseSchema.safeParse(item))\n .filter(\n (\n result\n ): result is {\n success: true;\n data: z.infer<typeof activityHistoryResponseSchema>;\n } => result.success\n )\n .map((result) => result.data)\n ),\n pagination: z.object({\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n totalPages: z.number(),\n }),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseActivitiesHistoryState {\n activities: ActivityTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivitiesHistoryReturn extends UseActivitiesHistoryState {\n fetchActivities: (filters?: ActivityHistoryFilters) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_ACTIVITIES_PAGINATION: ActivityPagination = {\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 activity - Activity from API response\n * @returns Formatted activity for table display\n */\nexport const transformActivityToTableItem = (\n activity: ActivityHistoryResponse\n): ActivityTableItem => {\n return {\n id: activity.id,\n startDate: activity.startDate\n ? dayjs(activity.startDate).format('DD/MM')\n : '-',\n deadline: activity.finalDate\n ? dayjs(activity.finalDate).format('DD/MM')\n : '-',\n title: activity.title,\n school: activity.schoolName || '-',\n year: activity.year || '-',\n subject: activity.subjectName || '-',\n class: activity.className || '-',\n status: mapActivityStatusToDisplay(activity.status),\n completionPercentage: activity.completionPercentage,\n };\n};\n\n/**\n * Handle errors during activity fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleActivityFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de histórico de atividades',\n 'Erro ao carregar histórico de atividades'\n);\n\n/**\n * Factory function to create useActivitiesHistory hook\n *\n * @param fetchActivitiesHistory - Function to fetch activities from API\n * @returns Hook for managing activities history\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchActivitiesHistory = async (filters) => {\n * const response = await api.get('/activities/history', { params: filters });\n * return response.data;\n * };\n *\n * const useActivitiesHistory = createUseActivitiesHistory(fetchActivitiesHistory);\n *\n * // In your component\n * const { activities, loading, error, pagination, fetchActivities } = useActivitiesHistory();\n * ```\n */\nexport const createUseActivitiesHistory = (\n fetchActivitiesHistory: (\n filters?: ActivityHistoryFilters\n ) => Promise<ActivitiesHistoryApiResponse>\n) => {\n return (): UseActivitiesHistoryReturn => {\n const [state, setState] = useState<UseActivitiesHistoryState>({\n activities: [],\n loading: false,\n error: null,\n pagination: DEFAULT_ACTIVITIES_PAGINATION,\n });\n\n /**\n * Fetch activities history from API\n * @param filters - Optional filters for pagination, search, sorting, etc.\n */\n const fetchActivities = useCallback(\n async (filters?: ActivityHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchActivitiesHistory(filters);\n\n // Validate response with Zod\n const validatedData =\n activitiesHistoryApiResponseSchema.parse(responseData);\n\n // Transform activities to table format\n const tableItems = validatedData.data.activities.map(\n transformActivityToTableItem\n );\n\n // Update state with validated and transformed data\n setState({\n activities: tableItems,\n loading: false,\n error: null,\n pagination: validatedData.data.pagination,\n });\n } catch (error) {\n const errorMessage = handleActivityFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchActivitiesHistory]\n );\n\n return {\n ...state,\n fetchActivities,\n };\n };\n};\n\n/**\n * Alias for createUseActivitiesHistory\n */\nexport const createActivitiesHistoryHook = createUseActivitiesHistory;\n","/**\n * Common Type Definitions\n * Shared types used across multiple features (activities, recommendedClass, etc.)\n */\n\n/**\n * Generic API status for activities and recommendedClass\n * Used by backend endpoints for status filtering\n */\nexport enum GenericApiStatus {\n A_VENCER = 'A_VENCER',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUIDA',\n}\n\n/**\n * Generic display status for UI components\n * Used for Badge and status display in tables\n */\nexport enum GenericDisplayStatus {\n ATIVA = 'ATIVA',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUÍDA',\n}\n\n/**\n * Badge action types for status visualization\n * Maps to Badge component action prop\n */\nexport enum BadgeActionType {\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\n/**\n * Get badge action based on display status\n * @param status - Display status value\n * @returns Badge action type for styling\n */\nexport const getStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => {\n const actionMap: Record<GenericDisplayStatus, BadgeActionType> = {\n [GenericDisplayStatus.CONCLUIDA]: BadgeActionType.SUCCESS,\n [GenericDisplayStatus.ATIVA]: BadgeActionType.WARNING,\n [GenericDisplayStatus.VENCIDA]: BadgeActionType.ERROR,\n };\n return actionMap[status] ?? BadgeActionType.WARNING;\n};\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapApiStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => {\n const statusMap: Record<GenericApiStatus, GenericDisplayStatus> = {\n [GenericApiStatus.A_VENCER]: GenericDisplayStatus.ATIVA,\n [GenericApiStatus.VENCIDA]: GenericDisplayStatus.VENCIDA,\n [GenericApiStatus.CONCLUIDA]: GenericDisplayStatus.CONCLUIDA,\n };\n return statusMap[apiStatus];\n};\n","/**\n * Activities History Type Definitions\n * Types and interfaces for activities history and models functionality\n * Based on /activities/history and /activity-drafts endpoints\n */\n\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n mapApiStatusToDisplay,\n} from './common';\n\n/**\n * Activity status from backend API /activities/history\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as ActivityApiStatus } from './common';\n\n/**\n * Activity status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as ActivityDisplayStatus } from './common';\n\n/**\n * Badge action types for activity status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as ActivityBadgeActionType } from './common';\n\n/**\n * Activity draft type enum (matches backend ACTIVITY_DRAFT_TYPE)\n */\nexport enum ActivityDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Activity history response from backend API /activities/history\n */\nexport interface ActivityHistoryResponse {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n status: GenericApiStatus;\n completionPercentage: number;\n subjectId?: string | null;\n schoolId?: string;\n schoolName?: string;\n year?: string;\n className?: string;\n subjectName?: string;\n}\n\n/**\n * Activity table item interface for activities list table\n */\nexport interface ActivityTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Pagination info from API\n */\nexport interface ActivityPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Activities history API complete response\n */\nexport interface ActivitiesHistoryApiResponse {\n message: string;\n data: {\n activities: ActivityHistoryResponse[];\n pagination: ActivityPagination;\n };\n}\n\n/**\n * Activity history filters for API query parameters\n */\nexport interface ActivityHistoryFilters {\n page?: number;\n limit?: number;\n status?: GenericApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n sortBy?: 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Activity draft filters object from backend\n */\nexport interface ActivityDraftFilters {\n questionTypes?: string[];\n questionBanks?: string[];\n subjects?: string[];\n topics?: string[];\n subtopics?: string[];\n contents?: string[];\n}\n\n/**\n * Subject object with icon and color information\n */\nexport interface SubjectData {\n id: string;\n subjectName: string;\n subjectIcon: string;\n subjectColor: string;\n}\n\n/**\n * Activity model response from backend API (/activity-drafts)\n */\nexport interface ActivityModelResponse {\n id: string;\n type: ActivityDraftType;\n title: string | null;\n creatorUserInstitutionId: string | null;\n subjectId: string | null;\n subject?: SubjectData | null;\n filters: ActivityDraftFilters | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Activity model table item for display\n */\nexport interface ActivityModelTableItem extends Record<string, unknown> {\n id: string;\n title: string;\n savedAt: string;\n subject: SubjectData | null;\n subjectId: string | null;\n}\n\n/**\n * Activity models API response\n */\nexport interface ActivityModelsApiResponse {\n message: string;\n data: {\n activityDrafts: ActivityModelResponse[];\n total: number;\n };\n}\n\n/**\n * Activity model filters for API query\n */\nexport interface ActivityModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: ActivityDraftType;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface ActivityFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface ActivityUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on activity display status\n * @param status - Activity display status\n * @returns Badge action type for styling\n */\nexport const getActivityStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Activity status options for filter\n */\nexport const ACTIVITY_FILTER_STATUS_OPTIONS: ActivityFilterOption[] = [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n];\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapActivityStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => mapApiStatusToDisplay(apiStatus);\n","import { z } from 'zod';\n\n/**\n * Factory function to create a fetch error handler\n * This reduces code duplication across data fetching hooks\n *\n * @param validationErrorMessage - Message to display for Zod validation errors\n * @param genericErrorMessage - Message to display for other errors\n * @returns Error handler function that returns appropriate error message\n *\n * @example\n * ```typescript\n * const handleFetchError = createFetchErrorHandler(\n * 'Erro ao validar dados',\n * 'Erro ao carregar dados'\n * );\n *\n * try {\n * // fetch data\n * } catch (error) {\n * const errorMessage = handleFetchError(error);\n * }\n * ```\n */\nexport const createFetchErrorHandler =\n (validationErrorMessage: string, genericErrorMessage: string) =>\n (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error(validationErrorMessage, error);\n return validationErrorMessage;\n }\n\n console.error(genericErrorMessage, error);\n return genericErrorMessage;\n };\n"],"mappings":"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","names":["import_zod","GenericApiStatus","dayjs"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useActivitiesHistory.ts","../../../src/types/common.ts","../../../src/types/activitiesHistory.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport {\n ActivityApiStatus,\n mapActivityStatusToDisplay,\n} from '../types/activitiesHistory';\nimport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for activity history API response validation\n * Based on /activities/history endpoint\n */\nconst activityHistoryResponseSchema = z.object({\n id: z.string().uuid(),\n title: z.string(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n status: z.nativeEnum(ActivityApiStatus),\n completionPercentage: z.number().min(0).max(100).optional().default(0),\n subjectId: z.string().uuid().optional().nullable(),\n schoolId: z.string().optional(),\n schoolName: z.string().optional(),\n year: z.string().optional(),\n className: z.string().optional(),\n subjectName: z.string().optional(),\n});\n\nexport const activitiesHistoryApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n activities: z.array(z.unknown()).transform((items) =>\n items\n .map((item) => activityHistoryResponseSchema.safeParse(item))\n .filter(\n (\n result\n ): result is {\n success: true;\n data: z.infer<typeof activityHistoryResponseSchema>;\n } => result.success\n )\n .map((result) => result.data)\n ),\n pagination: z.object({\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n totalPages: z.number(),\n }),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseActivitiesHistoryState {\n activities: ActivityTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivitiesHistoryReturn extends UseActivitiesHistoryState {\n fetchActivities: (filters?: ActivityHistoryFilters) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_ACTIVITIES_PAGINATION: ActivityPagination = {\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 activity - Activity from API response\n * @returns Formatted activity for table display\n */\nexport const transformActivityToTableItem = (\n activity: ActivityHistoryResponse\n): ActivityTableItem => {\n return {\n id: activity.id,\n startDate: activity.startDate\n ? dayjs(activity.startDate).format('DD/MM')\n : '-',\n deadline: activity.finalDate\n ? dayjs(activity.finalDate).format('DD/MM')\n : '-',\n title: activity.title,\n school: activity.schoolName || '-',\n year: activity.year || '-',\n subject: activity.subjectName || '-',\n class: activity.className || '-',\n status: mapActivityStatusToDisplay(activity.status),\n completionPercentage: activity.completionPercentage,\n };\n};\n\n/**\n * Handle errors during activity fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleActivityFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de histórico de atividades',\n 'Erro ao carregar histórico de atividades'\n);\n\n/**\n * Factory function to create useActivitiesHistory hook\n *\n * @param fetchActivitiesHistory - Function to fetch activities from API\n * @returns Hook for managing activities history\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchActivitiesHistory = async (filters) => {\n * const response = await api.get('/activities/history', { params: filters });\n * return response.data;\n * };\n *\n * const useActivitiesHistory = createUseActivitiesHistory(fetchActivitiesHistory);\n *\n * // In your component\n * const { activities, loading, error, pagination, fetchActivities } = useActivitiesHistory();\n * ```\n */\nexport const createUseActivitiesHistory = (\n fetchActivitiesHistory: (\n filters?: ActivityHistoryFilters\n ) => Promise<ActivitiesHistoryApiResponse>\n) => {\n return (): UseActivitiesHistoryReturn => {\n const [state, setState] = useState<UseActivitiesHistoryState>({\n activities: [],\n loading: false,\n error: null,\n pagination: DEFAULT_ACTIVITIES_PAGINATION,\n });\n\n /**\n * Fetch activities history from API\n * @param filters - Optional filters for pagination, search, sorting, etc.\n */\n const fetchActivities = useCallback(\n async (filters?: ActivityHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchActivitiesHistory(filters);\n\n // Validate response with Zod\n const validatedData =\n activitiesHistoryApiResponseSchema.parse(responseData);\n\n // Transform activities to table format\n const tableItems = validatedData.data.activities.map(\n transformActivityToTableItem\n );\n\n // Update state with validated and transformed data\n setState({\n activities: tableItems,\n loading: false,\n error: null,\n pagination: validatedData.data.pagination,\n });\n } catch (error) {\n const errorMessage = handleActivityFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchActivitiesHistory]\n );\n\n return {\n ...state,\n fetchActivities,\n };\n };\n};\n\n/**\n * Alias for createUseActivitiesHistory\n */\nexport const createActivitiesHistoryHook = createUseActivitiesHistory;\n","/**\n * Common Type Definitions\n * Shared types used across multiple features (activities, goals, etc.)\n */\n\n/**\n * Generic API status for activities and goals\n * Used by backend endpoints for status filtering\n */\nexport enum GenericApiStatus {\n A_VENCER = 'A_VENCER',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUIDA',\n}\n\n/**\n * Generic display status for UI components\n * Used for Badge and status display in tables\n */\nexport enum GenericDisplayStatus {\n ATIVA = 'ATIVA',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUÍDA',\n}\n\n/**\n * Badge action types for status visualization\n * Maps to Badge component action prop\n */\nexport enum BadgeActionType {\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\n/**\n * Get badge action based on display status\n * @param status - Display status value\n * @returns Badge action type for styling\n */\nexport const getStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => {\n const actionMap: Record<GenericDisplayStatus, BadgeActionType> = {\n [GenericDisplayStatus.CONCLUIDA]: BadgeActionType.SUCCESS,\n [GenericDisplayStatus.ATIVA]: BadgeActionType.WARNING,\n [GenericDisplayStatus.VENCIDA]: BadgeActionType.ERROR,\n };\n return actionMap[status] ?? BadgeActionType.WARNING;\n};\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapApiStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => {\n const statusMap: Record<GenericApiStatus, GenericDisplayStatus> = {\n [GenericApiStatus.A_VENCER]: GenericDisplayStatus.ATIVA,\n [GenericApiStatus.VENCIDA]: GenericDisplayStatus.VENCIDA,\n [GenericApiStatus.CONCLUIDA]: GenericDisplayStatus.CONCLUIDA,\n };\n return statusMap[apiStatus];\n};\n","/**\n * Activities History Type Definitions\n * Types and interfaces for activities history and models functionality\n * Based on /activities/history and /activity-drafts endpoints\n */\n\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n mapApiStatusToDisplay,\n} from './common';\n\n/**\n * Activity status from backend API /activities/history\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as ActivityApiStatus } from './common';\n\n/**\n * Activity status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as ActivityDisplayStatus } from './common';\n\n/**\n * Badge action types for activity status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as ActivityBadgeActionType } from './common';\n\n/**\n * Activity draft type enum (matches backend ACTIVITY_DRAFT_TYPE)\n */\nexport enum ActivityDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Activity history response from backend API /activities/history\n */\nexport interface ActivityHistoryResponse {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n status: GenericApiStatus;\n completionPercentage: number;\n subjectId?: string | null;\n schoolId?: string;\n schoolName?: string;\n year?: string;\n className?: string;\n subjectName?: string;\n}\n\n/**\n * Activity table item interface for activities list table\n */\nexport interface ActivityTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Pagination info from API\n */\nexport interface ActivityPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Activities history API complete response\n */\nexport interface ActivitiesHistoryApiResponse {\n message: string;\n data: {\n activities: ActivityHistoryResponse[];\n pagination: ActivityPagination;\n };\n}\n\n/**\n * Activity history filters for API query parameters\n */\nexport interface ActivityHistoryFilters {\n page?: number;\n limit?: number;\n status?: GenericApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n sortBy?: 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Activity draft filters object from backend\n */\nexport interface ActivityDraftFilters {\n questionTypes?: string[];\n questionBanks?: string[];\n subjects?: string[];\n topics?: string[];\n subtopics?: string[];\n contents?: string[];\n}\n\n/**\n * Subject object with icon and color information\n */\nexport interface SubjectData {\n id: string;\n subjectName: string;\n subjectIcon: string;\n subjectColor: string;\n}\n\n/**\n * Activity model response from backend API (/activity-drafts)\n */\nexport interface ActivityModelResponse {\n id: string;\n type: ActivityDraftType;\n title: string | null;\n creatorUserInstitutionId: string | null;\n subjectId: string | null;\n subject?: SubjectData | null;\n filters: ActivityDraftFilters | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Activity model table item for display\n */\nexport interface ActivityModelTableItem extends Record<string, unknown> {\n id: string;\n title: string;\n savedAt: string;\n subject: SubjectData | null;\n subjectId: string | null;\n}\n\n/**\n * Activity models API response\n */\nexport interface ActivityModelsApiResponse {\n message: string;\n data: {\n activityDrafts: ActivityModelResponse[];\n total: number;\n };\n}\n\n/**\n * Activity model filters for API query\n */\nexport interface ActivityModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: ActivityDraftType;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface ActivityFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface ActivityUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on activity display status\n * @param status - Activity display status\n * @returns Badge action type for styling\n */\nexport const getActivityStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Activity status options for filter\n */\nexport const ACTIVITY_FILTER_STATUS_OPTIONS: ActivityFilterOption[] = [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n];\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapActivityStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => mapApiStatusToDisplay(apiStatus);\n","import { z } from 'zod';\n\n/**\n * Factory function to create a fetch error handler\n * This reduces code duplication across data fetching hooks\n *\n * @param validationErrorMessage - Message to display for Zod validation errors\n * @param genericErrorMessage - Message to display for other errors\n * @returns Error handler function that returns appropriate error message\n *\n * @example\n * ```typescript\n * const handleFetchError = createFetchErrorHandler(\n * 'Erro ao validar dados',\n * 'Erro ao carregar dados'\n * );\n *\n * try {\n * // fetch data\n * } catch (error) {\n * const errorMessage = handleFetchError(error);\n * }\n * ```\n */\nexport const createFetchErrorHandler =\n (validationErrorMessage: string, genericErrorMessage: string) =>\n (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error(validationErrorMessage, error);\n return validationErrorMessage;\n }\n\n console.error(genericErrorMessage, error);\n return genericErrorMessage;\n };\n"],"mappings":"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","names":["z","GenericApiStatus","z"]}
1
+ {"version":3,"sources":["../../../src/hooks/useActivitiesHistory.ts","../../../src/types/common.ts","../../../src/types/activitiesHistory.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport {\n ActivityApiStatus,\n mapActivityStatusToDisplay,\n} from '../types/activitiesHistory';\nimport type {\n ActivityHistoryResponse,\n ActivityTableItem,\n ActivitiesHistoryApiResponse,\n ActivityHistoryFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for activity history API response validation\n * Based on /activities/history endpoint\n */\nconst activityHistoryResponseSchema = z.object({\n id: z.string().uuid(),\n title: z.string(),\n startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n status: z.nativeEnum(ActivityApiStatus),\n completionPercentage: z.number().min(0).max(100).optional().default(0),\n subjectId: z.string().uuid().optional().nullable(),\n schoolId: z.string().optional(),\n schoolName: z.string().optional(),\n year: z.string().optional(),\n className: z.string().optional(),\n subjectName: z.string().optional(),\n});\n\nexport const activitiesHistoryApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n activities: z.array(z.unknown()).transform((items) =>\n items\n .map((item) => activityHistoryResponseSchema.safeParse(item))\n .filter(\n (\n result\n ): result is {\n success: true;\n data: z.infer<typeof activityHistoryResponseSchema>;\n } => result.success\n )\n .map((result) => result.data)\n ),\n pagination: z.object({\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n totalPages: z.number(),\n }),\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseActivitiesHistoryState {\n activities: ActivityTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivitiesHistoryReturn extends UseActivitiesHistoryState {\n fetchActivities: (filters?: ActivityHistoryFilters) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_ACTIVITIES_PAGINATION: ActivityPagination = {\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 activity - Activity from API response\n * @returns Formatted activity for table display\n */\nexport const transformActivityToTableItem = (\n activity: ActivityHistoryResponse\n): ActivityTableItem => {\n return {\n id: activity.id,\n startDate: activity.startDate\n ? dayjs(activity.startDate).format('DD/MM')\n : '-',\n deadline: activity.finalDate\n ? dayjs(activity.finalDate).format('DD/MM')\n : '-',\n title: activity.title,\n school: activity.schoolName || '-',\n year: activity.year || '-',\n subject: activity.subjectName || '-',\n class: activity.className || '-',\n status: mapActivityStatusToDisplay(activity.status),\n completionPercentage: activity.completionPercentage,\n };\n};\n\n/**\n * Handle errors during activity fetch\n * Uses the generic error handler factory to reduce code duplication\n */\nexport const handleActivityFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de histórico de atividades',\n 'Erro ao carregar histórico de atividades'\n);\n\n/**\n * Factory function to create useActivitiesHistory hook\n *\n * @param fetchActivitiesHistory - Function to fetch activities from API\n * @returns Hook for managing activities history\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchActivitiesHistory = async (filters) => {\n * const response = await api.get('/activities/history', { params: filters });\n * return response.data;\n * };\n *\n * const useActivitiesHistory = createUseActivitiesHistory(fetchActivitiesHistory);\n *\n * // In your component\n * const { activities, loading, error, pagination, fetchActivities } = useActivitiesHistory();\n * ```\n */\nexport const createUseActivitiesHistory = (\n fetchActivitiesHistory: (\n filters?: ActivityHistoryFilters\n ) => Promise<ActivitiesHistoryApiResponse>\n) => {\n return (): UseActivitiesHistoryReturn => {\n const [state, setState] = useState<UseActivitiesHistoryState>({\n activities: [],\n loading: false,\n error: null,\n pagination: DEFAULT_ACTIVITIES_PAGINATION,\n });\n\n /**\n * Fetch activities history from API\n * @param filters - Optional filters for pagination, search, sorting, etc.\n */\n const fetchActivities = useCallback(\n async (filters?: ActivityHistoryFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchActivitiesHistory(filters);\n\n // Validate response with Zod\n const validatedData =\n activitiesHistoryApiResponseSchema.parse(responseData);\n\n // Transform activities to table format\n const tableItems = validatedData.data.activities.map(\n transformActivityToTableItem\n );\n\n // Update state with validated and transformed data\n setState({\n activities: tableItems,\n loading: false,\n error: null,\n pagination: validatedData.data.pagination,\n });\n } catch (error) {\n const errorMessage = handleActivityFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchActivitiesHistory]\n );\n\n return {\n ...state,\n fetchActivities,\n };\n };\n};\n\n/**\n * Alias for createUseActivitiesHistory\n */\nexport const createActivitiesHistoryHook = createUseActivitiesHistory;\n","/**\n * Common Type Definitions\n * Shared types used across multiple features (activities, recommendedClass, etc.)\n */\n\n/**\n * Generic API status for activities and recommendedClass\n * Used by backend endpoints for status filtering\n */\nexport enum GenericApiStatus {\n A_VENCER = 'A_VENCER',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUIDA',\n}\n\n/**\n * Generic display status for UI components\n * Used for Badge and status display in tables\n */\nexport enum GenericDisplayStatus {\n ATIVA = 'ATIVA',\n VENCIDA = 'VENCIDA',\n CONCLUIDA = 'CONCLUÍDA',\n}\n\n/**\n * Badge action types for status visualization\n * Maps to Badge component action prop\n */\nexport enum BadgeActionType {\n SUCCESS = 'success',\n WARNING = 'warning',\n ERROR = 'error',\n}\n\n/**\n * Get badge action based on display status\n * @param status - Display status value\n * @returns Badge action type for styling\n */\nexport const getStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => {\n const actionMap: Record<GenericDisplayStatus, BadgeActionType> = {\n [GenericDisplayStatus.CONCLUIDA]: BadgeActionType.SUCCESS,\n [GenericDisplayStatus.ATIVA]: BadgeActionType.WARNING,\n [GenericDisplayStatus.VENCIDA]: BadgeActionType.ERROR,\n };\n return actionMap[status] ?? BadgeActionType.WARNING;\n};\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapApiStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => {\n const statusMap: Record<GenericApiStatus, GenericDisplayStatus> = {\n [GenericApiStatus.A_VENCER]: GenericDisplayStatus.ATIVA,\n [GenericApiStatus.VENCIDA]: GenericDisplayStatus.VENCIDA,\n [GenericApiStatus.CONCLUIDA]: GenericDisplayStatus.CONCLUIDA,\n };\n return statusMap[apiStatus];\n};\n","/**\n * Activities History Type Definitions\n * Types and interfaces for activities history and models functionality\n * Based on /activities/history and /activity-drafts endpoints\n */\n\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n mapApiStatusToDisplay,\n} from './common';\n\n/**\n * Activity status from backend API /activities/history\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as ActivityApiStatus } from './common';\n\n/**\n * Activity status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as ActivityDisplayStatus } from './common';\n\n/**\n * Badge action types for activity status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as ActivityBadgeActionType } from './common';\n\n/**\n * Activity draft type enum (matches backend ACTIVITY_DRAFT_TYPE)\n */\nexport enum ActivityDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Activity history response from backend API /activities/history\n */\nexport interface ActivityHistoryResponse {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n status: GenericApiStatus;\n completionPercentage: number;\n subjectId?: string | null;\n schoolId?: string;\n schoolName?: string;\n year?: string;\n className?: string;\n subjectName?: string;\n}\n\n/**\n * Activity table item interface for activities list table\n */\nexport interface ActivityTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Pagination info from API\n */\nexport interface ActivityPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Activities history API complete response\n */\nexport interface ActivitiesHistoryApiResponse {\n message: string;\n data: {\n activities: ActivityHistoryResponse[];\n pagination: ActivityPagination;\n };\n}\n\n/**\n * Activity history filters for API query parameters\n */\nexport interface ActivityHistoryFilters {\n page?: number;\n limit?: number;\n status?: GenericApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n sortBy?: 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Activity draft filters object from backend\n */\nexport interface ActivityDraftFilters {\n questionTypes?: string[];\n questionBanks?: string[];\n subjects?: string[];\n topics?: string[];\n subtopics?: string[];\n contents?: string[];\n}\n\n/**\n * Subject object with icon and color information\n */\nexport interface SubjectData {\n id: string;\n subjectName: string;\n subjectIcon: string;\n subjectColor: string;\n}\n\n/**\n * Activity model response from backend API (/activity-drafts)\n */\nexport interface ActivityModelResponse {\n id: string;\n type: ActivityDraftType;\n title: string | null;\n creatorUserInstitutionId: string | null;\n subjectId: string | null;\n subject?: SubjectData | null;\n filters: ActivityDraftFilters | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Activity model table item for display\n */\nexport interface ActivityModelTableItem extends Record<string, unknown> {\n id: string;\n title: string;\n savedAt: string;\n subject: SubjectData | null;\n subjectId: string | null;\n}\n\n/**\n * Activity models API response\n */\nexport interface ActivityModelsApiResponse {\n message: string;\n data: {\n activityDrafts: ActivityModelResponse[];\n total: number;\n };\n}\n\n/**\n * Activity model filters for API query\n */\nexport interface ActivityModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: ActivityDraftType;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface ActivityFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface ActivityUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on activity display status\n * @param status - Activity display status\n * @returns Badge action type for styling\n */\nexport const getActivityStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Activity status options for filter\n */\nexport const ACTIVITY_FILTER_STATUS_OPTIONS: ActivityFilterOption[] = [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n];\n\n/**\n * Map API status to display status\n * @param apiStatus - Status from backend API\n * @returns Formatted status for UI display\n */\nexport const mapActivityStatusToDisplay = (\n apiStatus: GenericApiStatus\n): GenericDisplayStatus => mapApiStatusToDisplay(apiStatus);\n","import { z } from 'zod';\n\n/**\n * Factory function to create a fetch error handler\n * This reduces code duplication across data fetching hooks\n *\n * @param validationErrorMessage - Message to display for Zod validation errors\n * @param genericErrorMessage - Message to display for other errors\n * @returns Error handler function that returns appropriate error message\n *\n * @example\n * ```typescript\n * const handleFetchError = createFetchErrorHandler(\n * 'Erro ao validar dados',\n * 'Erro ao carregar dados'\n * );\n *\n * try {\n * // fetch data\n * } catch (error) {\n * const errorMessage = handleFetchError(error);\n * }\n * ```\n */\nexport const createFetchErrorHandler =\n (validationErrorMessage: string, genericErrorMessage: string) =>\n (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error(validationErrorMessage, error);\n return validationErrorMessage;\n }\n\n console.error(genericErrorMessage, error);\n return genericErrorMessage;\n };\n"],"mappings":"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","names":["z","GenericApiStatus","z"]}
@@ -50,7 +50,7 @@ export declare const createUseNotifications: (apiClient: NotificationApiClient)
50
50
  title: string;
51
51
  type: string;
52
52
  } | null;
53
- goal?: {
53
+ recommendedClass?: {
54
54
  id: string;
55
55
  title: string;
56
56
  } | null;
@@ -118,7 +118,7 @@ export declare const createNotificationsHook: (apiClient: NotificationApiClient)
118
118
  title: string;
119
119
  type: string;
120
120
  } | null;
121
- goal?: {
121
+ recommendedClass?: {
122
122
  id: string;
123
123
  title: string;
124
124
  } | null;
@@ -1 +1 @@
1
- {"version":3,"file":"useNotifications.d.ts","sourceRoot":"","sources":["../../src/hooks/useNotifications.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG9E;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,qBAAqB;;;;;;;;;;;;;gCAoF3D,MAAM,eACG,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;;kCAzDf,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;kCA2BhB,MAAM,KAAG,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwG9C,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,uBAAuB,GAAI,WAAW,qBAAqB;;;;;;;;;;;;;gCAlG5D,MAAM,eACG,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;;kCAzDf,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;kCA2BhB,MAAM,KAAG,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6H9C,CAAC"}
1
+ {"version":3,"file":"useNotifications.d.ts","sourceRoot":"","sources":["../../src/hooks/useNotifications.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAG9E;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,qBAAqB;;;;;;;;;;;;;gCAsF3D,MAAM,eACG,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;;kCA3Df,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;kCA4BhB,MAAM,KAAG,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyG9C,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,uBAAuB,GAAI,WAAW,qBAAqB;;;;;;;;;;;;;gCAlG5D,MAAM,eACG,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;;kCA3Df,MAAM,aACR,MAAM,oBACC,MAAM,IAAI;kCA4BhB,MAAM,KAAG,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8H9C,CAAC"}
@@ -0,0 +1,57 @@
1
+ import type { RecommendedClassModelTableItem, RecommendedClassModelsApiResponse, RecommendedClassModelFilters, RecommendedClassModelPagination } from '../types/recommendedLessons';
2
+ /**
3
+ * Hook state interface for recommendedClass drafts
4
+ */
5
+ export interface UseRecommendedClassDraftsState {
6
+ models: RecommendedClassModelTableItem[];
7
+ loading: boolean;
8
+ error: string | null;
9
+ pagination: RecommendedClassModelPagination;
10
+ }
11
+ /**
12
+ * Hook return type for recommendedClass drafts
13
+ */
14
+ export interface UseRecommendedClassDraftsReturn extends UseRecommendedClassDraftsState {
15
+ fetchModels: (filters?: RecommendedClassModelFilters, subjectsMap?: Map<string, string>) => Promise<void>;
16
+ deleteModel: (id: string) => Promise<boolean>;
17
+ }
18
+ /**
19
+ * Default pagination values for drafts
20
+ */
21
+ export declare const DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION: RecommendedClassModelPagination;
22
+ /**
23
+ * Handle errors during draft fetch
24
+ * Uses the generic error handler factory to reduce code duplication
25
+ */
26
+ export declare const handleRecommendedClassDraftFetchError: (error: unknown) => string;
27
+ /**
28
+ * Factory function to create useRecommendedClassDrafts hook
29
+ *
30
+ * @param fetchRecommendedClassDrafts - Function to fetch drafts from API
31
+ * @param deleteRecommendedClassDraft - Function to delete a draft
32
+ * @returns Hook for managing recommendedClass drafts
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * // In your app setup
37
+ * const fetchRecommendedClassDrafts = async (filters) => {
38
+ * const response = await api.get('/recommended-class/drafts', { params: { ...filters, type: 'RASCUNHO' } });
39
+ * return response.data;
40
+ * };
41
+ *
42
+ * const deleteRecommendedClassDraft = async (id) => {
43
+ * await api.delete(`/recommended-class/drafts/${id}`);
44
+ * };
45
+ *
46
+ * const useRecommendedClassDrafts = createUseRecommendedClassDrafts(fetchRecommendedClassDrafts, deleteRecommendedClassDraft);
47
+ *
48
+ * // In your component
49
+ * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassDrafts();
50
+ * ```
51
+ */
52
+ export declare const createUseRecommendedClassDrafts: (fetchRecommendedClassDrafts: (filters?: RecommendedClassModelFilters) => Promise<RecommendedClassModelsApiResponse>, deleteRecommendedClassDraft: (id: string) => Promise<void>) => () => UseRecommendedClassDraftsReturn;
53
+ /**
54
+ * Alias for createUseRecommendedClassDrafts
55
+ */
56
+ export declare const createRecommendedClassDraftsHook: (fetchRecommendedClassDrafts: (filters?: RecommendedClassModelFilters) => Promise<RecommendedClassModelsApiResponse>, deleteRecommendedClassDraft: (id: string) => Promise<void>) => () => UseRecommendedClassDraftsReturn;
57
+ //# sourceMappingURL=useRecommendedClassDrafts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecommendedClassDrafts.d.ts","sourceRoot":"","sources":["../../src/hooks/useRecommendedClassDrafts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,8BAA8B,EAC9B,iCAAiC,EACjC,4BAA4B,EAC5B,+BAA+B,EAChC,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,+BAA+B,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,+BACf,SAAQ,8BAA8B;IACtC,WAAW,EAAE,CACX,OAAO,CAAC,EAAE,4BAA4B,EACtC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,eAAO,MAAM,2CAA2C,EAAE,+BAMvD,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,qCAAqC,4BAGjD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,+BAA+B,GAC1C,6BAA6B,CAC3B,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,iCAAiC,CAAC,EAC/C,6BAA6B,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,WAE/C,+BAuFZ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,gCAjGd,CAC3B,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,iCAAiC,CAAC,+BAClB,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,WAE/C,+BA4FkE,CAAC"}
@@ -27,37 +27,37 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
 
30
- // src/hooks/useGoalDrafts.ts
31
- var useGoalDrafts_exports = {};
32
- __export(useGoalDrafts_exports, {
33
- DEFAULT_GOAL_DRAFTS_PAGINATION: () => DEFAULT_GOAL_DRAFTS_PAGINATION,
34
- createGoalDraftsHook: () => createGoalDraftsHook,
35
- createUseGoalDrafts: () => createUseGoalDrafts,
36
- handleGoalDraftFetchError: () => handleGoalDraftFetchError
30
+ // src/hooks/useRecommendedClassDrafts.ts
31
+ var useRecommendedClassDrafts_exports = {};
32
+ __export(useRecommendedClassDrafts_exports, {
33
+ DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION: () => DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,
34
+ createRecommendedClassDraftsHook: () => createRecommendedClassDraftsHook,
35
+ createUseRecommendedClassDrafts: () => createUseRecommendedClassDrafts,
36
+ handleRecommendedClassDraftFetchError: () => handleRecommendedClassDraftFetchError
37
37
  });
38
- module.exports = __toCommonJS(useGoalDrafts_exports);
38
+ module.exports = __toCommonJS(useRecommendedClassDrafts_exports);
39
39
  var import_react2 = require("react");
40
40
 
41
- // src/hooks/useGoalModels.ts
41
+ // src/hooks/useRecommendedClassModels.ts
42
42
  var import_react = require("react");
43
43
  var import_zod2 = require("zod");
44
44
  var import_dayjs = __toESM(require("dayjs"));
45
45
 
46
46
  // src/types/recommendedLessons.ts
47
- var GOAL_FILTER_STATUS_OPTIONS = [
47
+ var RECOMMENDED_CLASS_FILTER_STATUS_OPTIONS = [
48
48
  { id: "VENCIDA" /* VENCIDA */, name: "Vencida" },
49
49
  { id: "A_VENCER" /* A_VENCER */, name: "Ativa" }
50
50
  ];
51
- var GOAL_STATUS_OPTIONS = [
51
+ var RECOMMENDED_CLASS_STATUS_OPTIONS = [
52
52
  { id: "A_VENCER" /* A_VENCER */, name: "A Vencer" },
53
53
  { id: "VENCIDA" /* VENCIDA */, name: "Vencida" },
54
54
  { id: "CONCLUIDA" /* CONCLUIDA */, name: "Conclu\xEDda" }
55
55
  ];
56
- var GoalDraftType = /* @__PURE__ */ ((GoalDraftType2) => {
57
- GoalDraftType2["MODELO"] = "MODELO";
58
- GoalDraftType2["RASCUNHO"] = "RASCUNHO";
59
- return GoalDraftType2;
60
- })(GoalDraftType || {});
56
+ var RecommendedClassDraftType = /* @__PURE__ */ ((RecommendedClassDraftType2) => {
57
+ RecommendedClassDraftType2["MODELO"] = "MODELO";
58
+ RecommendedClassDraftType2["RASCUNHO"] = "RASCUNHO";
59
+ return RecommendedClassDraftType2;
60
+ })(RecommendedClassDraftType || {});
61
61
 
62
62
  // src/utils/hookErrorHandler.ts
63
63
  var import_zod = require("zod");
@@ -70,10 +70,10 @@ var createFetchErrorHandler = (validationErrorMessage, genericErrorMessage) => (
70
70
  return genericErrorMessage;
71
71
  };
72
72
 
73
- // src/hooks/useGoalModels.ts
74
- var goalModelResponseSchema = import_zod2.z.object({
73
+ // src/hooks/useRecommendedClassModels.ts
74
+ var recommendedClassModelResponseSchema = import_zod2.z.object({
75
75
  id: import_zod2.z.string().uuid(),
76
- type: import_zod2.z.nativeEnum(GoalDraftType),
76
+ type: import_zod2.z.nativeEnum(RecommendedClassDraftType),
77
77
  title: import_zod2.z.string(),
78
78
  description: import_zod2.z.string().nullable(),
79
79
  creatorUserInstitutionId: import_zod2.z.string().uuid(),
@@ -83,14 +83,14 @@ var goalModelResponseSchema = import_zod2.z.object({
83
83
  createdAt: import_zod2.z.string(),
84
84
  updatedAt: import_zod2.z.string()
85
85
  });
86
- var goalModelsApiResponseSchema = import_zod2.z.object({
86
+ var recommendedClassModelsApiResponseSchema = import_zod2.z.object({
87
87
  message: import_zod2.z.string(),
88
88
  data: import_zod2.z.object({
89
- drafts: import_zod2.z.array(goalModelResponseSchema),
89
+ drafts: import_zod2.z.array(recommendedClassModelResponseSchema),
90
90
  total: import_zod2.z.number()
91
91
  })
92
92
  });
93
- var transformGoalModelToTableItem = (model, subjectsMap) => {
93
+ var transformRecommendedClassModelToTableItem = (model, subjectsMap) => {
94
94
  const subjectName = model.subjectId ? subjectsMap?.get(model.subjectId) || "" : "";
95
95
  return {
96
96
  id: model.id,
@@ -100,38 +100,38 @@ var transformGoalModelToTableItem = (model, subjectsMap) => {
100
100
  subjectId: model.subjectId
101
101
  };
102
102
  };
103
- var handleGoalModelFetchError = createFetchErrorHandler(
103
+ var handleRecommendedClassModelFetchError = createFetchErrorHandler(
104
104
  "Erro ao validar dados de modelos de aulas",
105
105
  "Erro ao carregar modelos de aulas"
106
106
  );
107
107
 
108
- // src/hooks/useGoalDrafts.ts
109
- var DEFAULT_GOAL_DRAFTS_PAGINATION = {
108
+ // src/hooks/useRecommendedClassDrafts.ts
109
+ var DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION = {
110
110
  total: 0,
111
111
  page: 1,
112
112
  limit: 10,
113
113
  totalPages: 0
114
114
  };
115
- var handleGoalDraftFetchError = createFetchErrorHandler(
115
+ var handleRecommendedClassDraftFetchError = createFetchErrorHandler(
116
116
  "Erro ao validar dados de rascunhos de aulas",
117
117
  "Erro ao carregar rascunhos de aulas"
118
118
  );
119
- var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
119
+ var createUseRecommendedClassDrafts = (fetchRecommendedClassDrafts, deleteRecommendedClassDraft) => {
120
120
  return () => {
121
121
  const [state, setState] = (0, import_react2.useState)({
122
122
  models: [],
123
123
  loading: false,
124
124
  error: null,
125
- pagination: DEFAULT_GOAL_DRAFTS_PAGINATION
125
+ pagination: DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION
126
126
  });
127
127
  const fetchModels = (0, import_react2.useCallback)(
128
128
  async (filters, subjectsMap) => {
129
129
  setState((prev) => ({ ...prev, loading: true, error: null }));
130
130
  try {
131
- const responseData = await fetchGoalDrafts(filters);
132
- const validatedData = goalModelsApiResponseSchema.parse(responseData);
131
+ const responseData = await fetchRecommendedClassDrafts(filters);
132
+ const validatedData = recommendedClassModelsApiResponseSchema.parse(responseData);
133
133
  const tableItems = validatedData.data.drafts.map(
134
- (draft) => transformGoalModelToTableItem(draft, subjectsMap)
134
+ (draft) => transformRecommendedClassModelToTableItem(draft, subjectsMap)
135
135
  );
136
136
  const limit = filters?.limit || 10;
137
137
  const page = filters?.page || 1;
@@ -149,7 +149,7 @@ var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
149
149
  }
150
150
  });
151
151
  } catch (error) {
152
- const errorMessage = handleGoalDraftFetchError(error);
152
+ const errorMessage = handleRecommendedClassDraftFetchError(error);
153
153
  setState((prev) => ({
154
154
  ...prev,
155
155
  loading: false,
@@ -157,19 +157,19 @@ var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
157
157
  }));
158
158
  }
159
159
  },
160
- [fetchGoalDrafts]
160
+ [fetchRecommendedClassDrafts]
161
161
  );
162
162
  const deleteModel = (0, import_react2.useCallback)(
163
163
  async (id) => {
164
164
  try {
165
- await deleteGoalDraft(id);
165
+ await deleteRecommendedClassDraft(id);
166
166
  return true;
167
167
  } catch (error) {
168
168
  console.error("Erro ao deletar rascunho:", error);
169
169
  return false;
170
170
  }
171
171
  },
172
- [deleteGoalDraft]
172
+ [deleteRecommendedClassDraft]
173
173
  );
174
174
  return {
175
175
  ...state,
@@ -178,12 +178,12 @@ var createUseGoalDrafts = (fetchGoalDrafts, deleteGoalDraft) => {
178
178
  };
179
179
  };
180
180
  };
181
- var createGoalDraftsHook = createUseGoalDrafts;
181
+ var createRecommendedClassDraftsHook = createUseRecommendedClassDrafts;
182
182
  // Annotate the CommonJS export names for ESM import in node:
183
183
  0 && (module.exports = {
184
- DEFAULT_GOAL_DRAFTS_PAGINATION,
185
- createGoalDraftsHook,
186
- createUseGoalDrafts,
187
- handleGoalDraftFetchError
184
+ DEFAULT_RECOMMENDED_CLASS_DRAFTS_PAGINATION,
185
+ createRecommendedClassDraftsHook,
186
+ createUseRecommendedClassDrafts,
187
+ handleRecommendedClassDraftFetchError
188
188
  });
189
189
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/useRecommendedClassDrafts.ts","../../../src/hooks/useRecommendedClassModels.ts","../../../src/types/recommendedLessons.ts","../../../src/utils/hookErrorHandler.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';\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\n 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 fetchRecommendedClassDrafts - Function to fetch drafts from API\n * @param deleteRecommendedClassDraft - Function to delete a draft\n * @returns Hook for managing recommendedClass drafts\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchRecommendedClassDrafts = async (filters) => {\n * const response = await api.get('/recommended-class/drafts', { params: { ...filters, type: 'RASCUNHO' } });\n * return response.data;\n * };\n *\n * const deleteRecommendedClassDraft = async (id) => {\n * await api.delete(`/recommended-class/drafts/${id}`);\n * };\n *\n * const useRecommendedClassDrafts = createUseRecommendedClassDrafts(fetchRecommendedClassDrafts, deleteRecommendedClassDraft);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassDrafts();\n * ```\n */\nexport const createUseRecommendedClassDrafts = (\n fetchRecommendedClassDrafts: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>,\n deleteRecommendedClassDraft: (id: string) => Promise<void>\n) => {\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\n const responseData = await fetchRecommendedClassDrafts(filters);\n\n // Validate response with Zod\n const validatedData =\n recommendedClassModelsApiResponseSchema.parse(responseData);\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 [fetchRecommendedClassDrafts]\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 deleteRecommendedClassDraft(id);\n return true;\n } catch (error) {\n console.error('Erro ao deletar rascunho:', error);\n return false;\n }\n },\n [deleteRecommendedClassDraft]\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';\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 startDate: z.string().nullable(),\n finalDate: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\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\n 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 = model.subjectId\n ? subjectsMap?.get(model.subjectId) || ''\n : '';\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 };\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 fetchRecommendedClassModels - Function to fetch models from API\n * @param deleteRecommendedClassModel - Function to delete a model\n * @returns Hook for managing recommendedClass models\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchRecommendedClassModels = async (filters) => {\n * const response = await api.get('/recommended-class/drafts', { params: { ...filters, type: 'MODELO' } });\n * return response.data;\n * };\n *\n * const deleteRecommendedClassModel = async (id) => {\n * await api.delete(`/recommended-class/drafts/${id}`);\n * };\n *\n * const useRecommendedClassModels = createUseRecommendedClassModels(fetchRecommendedClassModels, deleteRecommendedClassModel);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useRecommendedClassModels();\n * ```\n */\nexport const createUseRecommendedClassModels = (\n fetchRecommendedClassModels: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>,\n deleteRecommendedClassModel: (id: string) => Promise<void>\n) => {\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\n const responseData = await fetchRecommendedClassModels(filters);\n\n // Validate response with Zod\n const validatedData =\n recommendedClassModelsApiResponseSchema.parse(responseData);\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 [fetchRecommendedClassModels]\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 deleteRecommendedClassModel(id);\n return true;\n } catch (error) {\n console.error('Erro ao deletar modelo:', error);\n return false;\n }\n },\n [deleteRecommendedClassModel]\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","/**\n * Recommended Lessons / Recommended Class (Aulas Recomendadas) Type Definitions\n * Based on /recommended-class/history endpoint\n */\n\nimport {\n GenericApiStatus,\n GenericDisplayStatus,\n BadgeActionType,\n getStatusBadgeAction,\n} from './common';\n\n/**\n * Recommended Class status from backend API\n * Re-exported from common for backward compatibility\n */\nexport { GenericApiStatus as RecommendedClassApiStatus } from './common';\n\n/**\n * Recommended Class status for display in UI (Badge component)\n * Re-exported from common for backward compatibility\n */\nexport { GenericDisplayStatus as RecommendedClassDisplayStatus } from './common';\n\n/**\n * Badge action types for recommended class status visualization\n * Re-exported from common for backward compatibility\n */\nexport { BadgeActionType as RecommendedClassBadgeActionType } from './common';\n\n/**\n * Subject info from API response\n */\nexport interface RecommendedClassSubject {\n id: string;\n name: string;\n}\n\n/**\n * Creator info from API response\n */\nexport interface RecommendedClassCreator {\n id: string;\n name: string;\n}\n\n/**\n * Recommended Class stats from API response\n */\nexport interface RecommendedClassStats {\n totalStudents: number;\n completedCount: number;\n completionPercentage: number;\n}\n\n/**\n * Class breakdown info from API response\n */\nexport interface RecommendedClassBreakdown {\n classId: string;\n className: string;\n schoolId: string;\n schoolName: string;\n studentCount: number;\n completedCount: number;\n}\n\n/**\n * Recommended Class data from API response\n */\nexport interface RecommendedClassData {\n id: string;\n title: string;\n startDate: string | null;\n finalDate: string | null;\n createdAt: string;\n progress: number;\n totalLessons: number;\n}\n\n/**\n * Recommended Class history item from /recommended-class/history endpoint\n */\nexport interface RecommendedClassHistoryItem {\n recommendedClass: RecommendedClassData;\n subject: RecommendedClassSubject | null;\n creator: RecommendedClassCreator | null;\n stats: RecommendedClassStats;\n breakdown: RecommendedClassBreakdown[];\n}\n\n/**\n * Recommended Class table item interface for recommended class list table\n */\nexport interface RecommendedClassTableItem extends Record<string, unknown> {\n id: string;\n startDate: string | null;\n deadline: string | null;\n title: string;\n school: string;\n year: string;\n subject: string;\n class: string;\n status: GenericDisplayStatus;\n completionPercentage: number;\n}\n\n/**\n * Recommended Class history API complete response from /recommended-class/history\n */\nexport interface RecommendedClassHistoryApiResponse {\n message: string;\n data: {\n recommendedClass: RecommendedClassHistoryItem[];\n total: number;\n };\n}\n\n/**\n * Recommended Class history filters for API query parameters\n */\nexport interface RecommendedClassHistoryFilters {\n page?: number;\n limit?: number;\n status?: GenericApiStatus;\n search?: string;\n startDate?: string;\n finalDate?: string;\n subjectId?: string;\n schoolId?: string;\n schoolIds?: string[];\n classId?: string;\n classIds?: string[];\n studentIds?: string[];\n sortBy?: 'createdAt' | 'finalDate' | 'title' | 'completionPercentage';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Pagination info for recommended class history\n */\nexport interface RecommendedClassHistoryPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n\n/**\n * Filter option for dropdowns\n * Extends with index signature to be compatible with CheckBoxGroup Item type\n */\nexport interface RecommendedClassFilterOption {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * User data for filter options (schools, classes, subjects)\n */\nexport interface RecommendedClassUserFilterData {\n schools?: Array<{ id: string; name: string }>;\n classes?: Array<{ id: string; name: string; schoolId?: string }>;\n subjects?: Array<{ id: string; name: string }>;\n schoolYears?: Array<{ id: string; name: string }>;\n}\n\n/**\n * Get status badge action based on recommended class display status\n * @param status - Recommended Class display status\n * @returns Badge action type for styling\n */\nexport const getRecommendedClassStatusBadgeAction = (\n status: GenericDisplayStatus\n): BadgeActionType => getStatusBadgeAction(status);\n\n/**\n * Recommended Class status options for filter (Vencida and Ativa)\n */\nexport const RECOMMENDED_CLASS_FILTER_STATUS_OPTIONS: RecommendedClassFilterOption[] =\n [\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.A_VENCER, name: 'Ativa' },\n ];\n\n/**\n * All recommended class status options\n */\nexport const RECOMMENDED_CLASS_STATUS_OPTIONS: RecommendedClassFilterOption[] =\n [\n { id: GenericApiStatus.A_VENCER, name: 'A Vencer' },\n { id: GenericApiStatus.VENCIDA, name: 'Vencida' },\n { id: GenericApiStatus.CONCLUIDA, name: 'Concluída' },\n ];\n\n// ============================================\n// Recommended Lesson Details Types\n// Based on /recommended class/{id} and /recommended class/{id}/details endpoints\n// ============================================\n\n/**\n * Student status for display in UI\n */\nexport enum StudentLessonStatus {\n A_INICIAR = 'A INICIAR',\n EM_ANDAMENTO = 'EM ANDAMENTO',\n NAO_FINALIZADO = 'NÃO FINALIZADO',\n CONCLUIDO = 'CONCLUÍDO',\n}\n\n/**\n * Badge action type for student status\n */\nexport const getStudentStatusBadgeAction = (\n status: StudentLessonStatus\n): 'success' | 'warning' | 'error' | 'info' => {\n const actionMap: Record<\n StudentLessonStatus,\n 'success' | 'warning' | 'error' | 'info'\n > = {\n [StudentLessonStatus.CONCLUIDO]: 'success',\n [StudentLessonStatus.EM_ANDAMENTO]: 'info',\n [StudentLessonStatus.A_INICIAR]: 'warning',\n [StudentLessonStatus.NAO_FINALIZADO]: 'error',\n };\n return actionMap[status] ?? 'warning';\n};\n\n/**\n * Checks if a deadline has passed\n * @param deadline - ISO date string of the deadline\n * @returns true if deadline has passed, false otherwise\n */\nexport const isDeadlinePassed = (deadline: string | null): boolean => {\n if (!deadline) return false;\n return new Date(deadline) < new Date();\n};\n\n/**\n * Derives student display status from progress, completedAt, and deadline\n * @param progress - Student progress percentage (0-100)\n * @param completedAt - ISO date string when student completed, or null\n * @param deadline - ISO date string of the recommended class deadline, or null\n * @returns The appropriate StudentLessonStatus\n */\nexport const deriveStudentStatus = (\n progress: number,\n completedAt: string | null,\n deadline?: string | null\n): StudentLessonStatus => {\n // If completed (either by completedAt or 100% progress), it's CONCLUIDO\n if (completedAt) return StudentLessonStatus.CONCLUIDO;\n if (progress === 100) return StudentLessonStatus.CONCLUIDO;\n\n // If deadline passed and not completed, it's NAO_FINALIZADO\n if (isDeadlinePassed(deadline ?? null) && progress < 100) {\n return StudentLessonStatus.NAO_FINALIZADO;\n }\n\n // Otherwise, derive from progress\n if (progress === 0) return StudentLessonStatus.A_INICIAR;\n if (progress > 0) return StudentLessonStatus.EM_ANDAMENTO;\n return StudentLessonStatus.A_INICIAR;\n};\n\n/**\n * Formats days to complete as a readable string\n */\nexport const formatDaysToComplete = (\n daysToComplete: number | null\n): string | null => {\n if (daysToComplete === null) return null;\n if (daysToComplete === 1) return '1 dia';\n return `${daysToComplete} dias`;\n};\n\n// ============================================\n// API Response Types - /recommended class/{id}/details\n// ============================================\n\n/**\n * Student data from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailStudent {\n userInstitutionId: string;\n userId: string;\n name: string;\n progress: number;\n completedAt: string | null;\n avgScore: number | null;\n daysToComplete: number | null;\n}\n\n/**\n * Aggregated stats from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailAggregated {\n completionPercentage: number;\n avgScore: number | null;\n}\n\n/**\n * Content performance item from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailContentPerformanceItem {\n contentId: string;\n contentName: string;\n rate: number;\n}\n\n/**\n * Content performance from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailContentPerformance {\n best: RecommendedClassDetailContentPerformanceItem | null;\n worst: RecommendedClassDetailContentPerformanceItem | null;\n}\n\n/**\n * Response data from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailsData {\n students: RecommendedClassDetailStudent[];\n aggregated: RecommendedClassDetailAggregated;\n contentPerformance: RecommendedClassDetailContentPerformance;\n}\n\n/**\n * Full API response from /recommended class/{id}/details endpoint\n */\nexport interface RecommendedClassDetailsApiResponse {\n message: string;\n data: RecommendedClassDetailsData;\n}\n\n// ============================================\n// Recommended Class Activity Types - /recommended class/{id} activities\n// ============================================\n\n/**\n * Activity status for recommended class activities\n * Used in activitiesRecommendedClass array from /recommended class/{id} endpoint\n */\nexport const RECOMMENDED_CLASS_ACTIVITY_STATUS = {\n PENDENTE: 'PENDENTE',\n CONCLUIDA: 'CONCLUIDA',\n EXPIRADA: 'EXPIRADA',\n} as const;\n\nexport type RecommendedClassActivityStatus =\n (typeof RECOMMENDED_CLASS_ACTIVITY_STATUS)[keyof typeof RECOMMENDED_CLASS_ACTIVITY_STATUS];\n\n/**\n * Activity details within a recommended class\n */\nexport interface RecommendedClassActivity {\n id: string;\n title: string;\n status: RecommendedClassActivityStatus;\n}\n\n/**\n * User activities within a recommended class\n */\nexport interface RecommendedClassSupUsersActivities {\n id: string;\n activity: RecommendedClassActivity;\n userInstitutionId: string;\n answeredAt: string | null;\n timeSpent: number;\n score: number | null;\n lastInteraction: string;\n}\n\n/**\n * Activities associated with a recommended class\n */\nexport interface RecommendedClassActivities {\n recommendedClassId: string;\n supUsersActivitiesId: string;\n supUsersActivities: RecommendedClassSupUsersActivities;\n}\n\n// ============================================\n// API Response Types - /recommended class/{id}\n// ============================================\n\n/**\n * Subject info from lesson in /recommended class/{id} response\n */\nexport interface RecommendedClassLessonSubject {\n id: string;\n name: string;\n color: string;\n icon: string;\n}\n\n/**\n * Lesson info from /recommended class/{id} response\n */\nexport interface RecommendedClassLesson {\n id: string;\n content: { id: string; name: string };\n subtopic: { id: string; name: string };\n topic: { id: string; name: string };\n subject: RecommendedClassLessonSubject;\n}\n\n/**\n * Lesson progress from /recommended class/{id} response\n */\nexport interface RecommendedClassLessonProgress {\n id: string;\n userId: string;\n lessonId: string;\n progress: number;\n lesson: RecommendedClassLesson;\n}\n\n/**\n * Lesson recommended class item from /recommended class/{id} response\n */\nexport interface RecommendedClassLessonsItem {\n recommendedClassId: string;\n supLessonsProgressId: string;\n supLessonsProgress: RecommendedClassLessonProgress;\n}\n\n/**\n * Recommended Class metadata from /recommended class/{id} endpoint\n */\nexport interface RecommendedClassMetadata {\n id: string;\n title: string;\n startDate: string;\n finalDate: string;\n progress: number;\n lessons: RecommendedClassLessonsItem[];\n activities?: RecommendedClassActivities[];\n}\n\n/**\n * Full API response from /recommended class/{id} endpoint\n */\nexport interface RecommendedClassApiResponse {\n message: string;\n data: RecommendedClassMetadata;\n}\n\n// ============================================\n// Combined Data for Component\n// ============================================\n\n/**\n * Combined data structure for RecommendedLessonDetails component\n * Combines data from /recommended class/{id}, /recommended class/{id}/details, and breakdown info\n */\nexport interface LessonDetailsData {\n /** Recommended Class metadata from /recommended class/{id} */\n recommendedClass: RecommendedClassMetadata;\n /** Details from /recommended class/{id}/details */\n details: RecommendedClassDetailsData;\n /** Optional breakdown info from /recommended-class/history */\n breakdown?: RecommendedClassBreakdown;\n}\n\n// ============================================\n// Recommended Class Draft/Model Types\n// Based on /recommended-class/drafts endpoint\n// ============================================\n\n/**\n * Recommended Class draft type enum - matches backend RECOMMENDED_CLASS_DRAFT_TYPE\n */\nexport enum RecommendedClassDraftType {\n MODELO = 'MODELO',\n RASCUNHO = 'RASCUNHO',\n}\n\n/**\n * Recommended Class model response from backend API /recommended-class/drafts\n */\nexport interface RecommendedClassModelResponse {\n id: string;\n type: RecommendedClassDraftType;\n title: string;\n description: string | null;\n creatorUserInstitutionId: string;\n subjectId: string | null;\n startDate: string | null;\n finalDate: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Recommended Class model table item for display in models table\n */\nexport interface RecommendedClassModelTableItem\n extends Record<string, unknown> {\n id: string;\n title: string;\n savedAt: string;\n subject: string;\n subjectId: string | null;\n}\n\n/**\n * Recommended Class models API complete response from /recommended-class/drafts\n */\nexport interface RecommendedClassModelsApiResponse {\n message: string;\n data: {\n drafts: RecommendedClassModelResponse[];\n total: number;\n };\n}\n\n/**\n * Recommended Class model filters for API query parameters\n */\nexport interface RecommendedClassModelFilters {\n page?: number;\n limit?: number;\n search?: string;\n subjectId?: string;\n type?: RecommendedClassDraftType;\n}\n\n/**\n * Pagination info for recommended class models\n */\nexport interface RecommendedClassModelPagination {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n}\n","import { z } from 'zod';\n\n/**\n * Factory function to create a fetch error handler\n * This reduces code duplication across data fetching hooks\n *\n * @param validationErrorMessage - Message to display for Zod validation errors\n * @param genericErrorMessage - Message to display for other errors\n * @returns Error handler function that returns appropriate error message\n *\n * @example\n * ```typescript\n * const handleFetchError = createFetchErrorHandler(\n * 'Erro ao validar dados',\n * 'Erro ao carregar dados'\n * );\n *\n * try {\n * // fetch data\n * } catch (error) {\n * const errorMessage = handleFetchError(error);\n * }\n * ```\n */\nexport const createFetchErrorHandler =\n (validationErrorMessage: string, genericErrorMessage: string) =>\n (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error(validationErrorMessage, error);\n return validationErrorMessage;\n }\n\n console.error(genericErrorMessage, error);\n return genericErrorMessage;\n };\n"],"mappings":"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","names":["import_react","import_zod","RecommendedClassDraftType","dayjs"]}