analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
1 lines • 9.12 kB
Source Map (JSON)
{"version":3,"sources":["../src/hooks/useActivityDrafts.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 ActivityModelFilters,\n ActivityModelsApiResponse,\n ActivityModelResponse,\n ActivityModelTableItem,\n ActivityPagination,\n} from '../types/activitiesHistory';\n\n/**\n * Options for configuring the useActivityDrafts hook\n */\nexport interface UseActivityDraftsOptions {\n /** Filter by activity category (PROVA, ATIVIDADE, etc.) */\n activityCategory?: 'PROVA' | 'ATIVIDADE';\n}\n\n/**\n * Hook state interface\n */\nexport interface UseActivityDraftsState {\n drafts: ActivityModelTableItem[];\n loading: boolean;\n error: string | null;\n pagination: ActivityPagination;\n}\n\n/**\n * Hook return type\n */\nexport interface UseActivityDraftsReturn extends UseActivityDraftsState {\n fetchDrafts: (filters?: ActivityModelFilters) => Promise<void>;\n deleteDraft: (id: string) => Promise<void>;\n}\n\n/**\n * Default pagination values\n */\nexport const DEFAULT_DRAFTS_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 draft - Draft from API response\n * @param subjectsMap - Optional map of subject IDs to names\n * @returns Formatted draft for table display\n */\nexport const transformDraftToTableItem = (\n draft: ActivityModelResponse,\n subjectsMap?: Map<string, string>\n): ActivityModelTableItem => {\n // Use subject from API response if available\n let subject = draft.subject;\n if (!subject && draft.subjectId && subjectsMap) {\n const subjectName = subjectsMap.get(draft.subjectId);\n if (subjectName) {\n subject = {\n id: draft.subjectId,\n name: subjectName,\n icon: 'BookOpen',\n color: '#6B7280',\n };\n }\n }\n\n // Map ActivityDraftType to ActivityType\n const activityType =\n draft.type === ActivityDraftType.MODELO\n ? ActivityType.MODELO\n : ActivityType.RASCUNHO;\n\n return {\n id: draft.id,\n type: activityType,\n title: draft.title || 'Sem título',\n savedAt: draft.updatedAt\n ? dayjs(draft.updatedAt).format('DD/MM/YYYY')\n : '-',\n subject: subject || null,\n subjectId: draft.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.RASCUNHO, // drafts = RASCUNHO\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 useActivityDraftsImpl = (\n apiClient: BaseApiClient,\n options?: UseActivityDraftsOptions\n): UseActivityDraftsReturn => {\n const [state, setState] = useState<UseActivityDraftsState>({\n drafts: [],\n loading: false,\n error: null,\n pagination: DEFAULT_DRAFTS_PAGINATION,\n });\n\n /**\n * Fetch activity drafts from API\n * @param filters - Optional filters for pagination, search, etc.\n */\n const fetchDrafts = useCallback(\n async (filters: ActivityModelFilters = {}) => {\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((draft) =>\n transformDraftToTableItem(draft)\n );\n\n const limit = filters.limit || 10;\n const total = response.data.data.total;\n\n setState({\n drafts: tableItems,\n loading: false,\n error: null,\n pagination: {\n total,\n page: filters.page || 1,\n limit,\n totalPages: Math.ceil(total / limit),\n },\n });\n } catch (error) {\n console.error('Erro ao carregar rascunhos:', error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: 'Erro ao carregar rascunhos',\n }));\n }\n },\n [apiClient, options?.activityCategory]\n );\n\n /**\n * Delete an activity draft\n * @param id - Draft ID to delete\n */\n const deleteDraft = useCallback(\n async (id: string): Promise<void> => {\n try {\n await apiClient.delete(`/activity-drafts/${id}`);\n // Update local state on success\n setState((prev) => ({\n ...prev,\n drafts: prev.drafts.filter((d) => d.id !== id),\n pagination: {\n ...prev.pagination,\n total: Math.max(0, prev.pagination.total - 1),\n },\n }));\n } catch (error) {\n console.error('Erro ao deletar rascunho:', error);\n throw error;\n }\n },\n [apiClient]\n );\n\n return {\n ...state,\n fetchDrafts,\n deleteDraft,\n };\n};\n\n/**\n * Factory function to create useActivityDrafts hook\n *\n * @param apiClient - API client instance (axios, fetch wrapper, etc.)\n * @param options - Hook configuration options\n * @returns Hook for managing activity drafts\n *\n * @example\n * ```tsx\n * // For activities\n * import { createUseActivityDrafts } from 'analytica-frontend-lib';\n * import api from '@/services/apiService';\n *\n * const useActivityDrafts = createUseActivityDrafts(api, { activityCategory: 'ATIVIDADE' });\n *\n * // For exams (provas)\n * const useExamDrafts = createUseActivityDrafts(api, { activityCategory: 'PROVA' });\n *\n * // In your component\n * const { drafts, loading, fetchDrafts, deleteDraft } = useActivityDrafts();\n * ```\n */\nexport const createUseActivityDrafts = (\n apiClient: BaseApiClient,\n options?: UseActivityDraftsOptions\n) => {\n return (): UseActivityDraftsReturn =>\n useActivityDraftsImpl(apiClient, options);\n};\n\n/**\n * Alias for createUseActivityDrafts\n */\nexport const createActivityDraftsHook = createUseActivityDrafts;\n"],"mappings":"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","names":[]}