analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 8.92 kB
Source Map (JSON)
{"version":3,"sources":["../src/hooks/useActivityModels.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport dayjs from 'dayjs';\nimport type { BaseApiClient } from '../types/api';\nimport { ActivityDraftType } from '../types/activitiesHistory';\nimport { ActivityType } from '../components/ActivityCreate/ActivityCreate.types';\nimport type {\n ActivityModelResponse,\n ActivityModelTableItem,\n ActivityModelsApiResponse,\n ActivityModelFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\n\n/**\n * Options for configuring the useActivityModels hook\n */\nexport interface UseActivityModelsOptions {\n /** Filter by activity category (PROVA, ATIVIDADE, etc.) */\n activityCategory?: 'PROVA' | 'ATIVIDADE';\n}\n\n/**\n * Hook state interface\n */\nexport interface UseActivityModelsState {\n models: ActivityModelTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivityModelsReturn extends UseActivityModelsState {\n fetchModels: (\n filters?: ActivityModelFilters,\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_MODELS_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 model - Activity model from API response\n * @param subjectsMap - Map of subject IDs to subject names (fallback if subject is not in response)\n * @returns Formatted model for table display\n */\nexport const transformModelToTableItem = (\n model: ActivityModelResponse,\n subjectsMap?: Map<string, string>\n): ActivityModelTableItem => {\n // Use subject from API response if available\n // If not available and subjectsMap is provided, create a basic subject object\n let subject = model.subject;\n if (!subject && model.subjectId && subjectsMap) {\n const subjectName = subjectsMap.get(model.subjectId);\n if (subjectName) {\n subject = {\n id: model.subjectId,\n name: subjectName,\n icon: 'BookOpen',\n color: '#6B7280',\n };\n }\n }\n\n // Map ActivityDraftType to ActivityType\n const activityType =\n model.type === ActivityDraftType.MODELO\n ? ActivityType.MODELO\n : ActivityType.RASCUNHO;\n\n return {\n id: model.id,\n type: activityType,\n title: model.title || 'Sem título',\n savedAt: dayjs(model.createdAt).format('DD/MM/YYYY'),\n subject: subject || null,\n subjectId: model.subjectId,\n };\n};\n\n/**\n * Build query params from filters\n * @param filters - User filters\n * @param activityCategory - Optional activity category filter\n * @returns Query params object\n */\nconst buildQueryParams = (\n filters?: ActivityModelFilters,\n activityCategory?: string\n): Record<string, unknown> => {\n const params: Record<string, unknown> = {\n type: ActivityDraftType.MODELO, // models = MODELO\n };\n\n // Add activityCategory filter if provided\n if (activityCategory) {\n params.activityType = activityCategory;\n }\n\n if (filters) {\n for (const key in filters) {\n const value = filters[key as keyof ActivityModelFilters];\n if (value !== undefined && value !== null) {\n params[key] = value;\n }\n }\n }\n\n return params;\n};\n\n/**\n * Hook implementation\n */\nconst useActivityModelsImpl = (\n apiClient: BaseApiClient,\n options?: UseActivityModelsOptions\n): UseActivityModelsReturn => {\n const [state, setState] = useState<UseActivityModelsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_MODELS_PAGINATION,\n });\n\n const fetchModels = useCallback(\n async (\n filters?: ActivityModelFilters,\n subjectsMap?: Map<string, string>\n ) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const params = buildQueryParams(filters, options?.activityCategory);\n const response = await apiClient.get<ActivityModelsApiResponse>(\n '/activity-drafts',\n { params }\n );\n\n const tableItems = response.data.data.activityDrafts.map((model) =>\n transformModelToTableItem(model, subjectsMap)\n );\n\n const limit = filters?.limit || 10;\n const page = filters?.page || 1;\n const total = response.data.data.total;\n const totalPages = Math.ceil(total / limit);\n\n setState({\n models: tableItems,\n loading: false,\n error: null,\n pagination: { total, page, limit, totalPages },\n });\n } catch (error) {\n console.error('Erro ao carregar modelos:', error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: 'Erro ao carregar modelos de atividades',\n }));\n }\n },\n [apiClient, options?.activityCategory]\n );\n\n const deleteModel = useCallback(\n async (id: string): Promise<boolean> => {\n try {\n await apiClient.delete(`/activity-drafts/${id}`);\n setState((prev) => ({\n ...prev,\n models: prev.models.filter((m) => m.id !== id),\n pagination: {\n ...prev.pagination,\n total: Math.max(0, prev.pagination.total - 1),\n },\n }));\n return true;\n } catch (error) {\n console.error('Erro ao deletar modelo:', error);\n return false;\n }\n },\n [apiClient]\n );\n\n return { ...state, fetchModels, deleteModel };\n};\n\n/**\n * Factory function to create useActivityModels hook\n *\n * @param apiClient - API client instance (axios, fetch wrapper, etc.)\n * @param options - Hook configuration options\n * @returns Hook for managing activity models\n *\n * @example\n * ```tsx\n * import { createUseActivityModels } from 'analytica-frontend-lib';\n * import api from '@/services/apiService';\n *\n * const useActivityModels = createUseActivityModels(api, { activityCategory: 'ATIVIDADE' });\n *\n * // In your component\n * const { models, loading, fetchModels, deleteModel } = useActivityModels();\n * ```\n */\nexport const createUseActivityModels = (\n apiClient: BaseApiClient,\n options?: UseActivityModelsOptions\n) => {\n return (): UseActivityModelsReturn =>\n useActivityModelsImpl(apiClient, options);\n};\n\n/**\n * Alias for createUseActivityModels\n */\nexport const createActivityModelsHook = createUseActivityModels;\n"],"mappings":"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","names":[]}