UNPKG

analytica-frontend-lib

Version:

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

1 lines 16.9 kB
{"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),\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(activityHistoryResponseSchema),\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 * 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 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: string;\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":";AAAA,SAAS,UAAU,mBAAmB;AACtC,SAAS,KAAAA,UAAS;AAClB,OAAO,WAAW;;;ACOX,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,eAAY;AAHF,SAAAA;AAAA,GAAA;AA+CL,IAAM,wBAAwB,CACnC,cACyB;AACzB,QAAM,YAA4D;AAAA,IAChE,CAAC,yBAAyB,GAAG;AAAA,IAC7B,CAAC,uBAAwB,GAAG;AAAA,IAC5B,CAAC,2BAA0B,GAAG;AAAA,EAChC;AACA,SAAO,UAAU,SAAS;AAC5B;;;ACyIO,IAAM,iCAAyD;AAAA,EACpE,EAAE,+BAA+B,MAAM,WAAW;AAAA,EAClD,EAAE,6BAA8B,MAAM,UAAU;AAAA,EAChD,EAAE,iCAAgC,MAAM,eAAY;AACtD;AAOO,IAAM,6BAA6B,CACxC,cACyB,sBAAsB,SAAS;;;ACvN1D,SAAS,SAAS;AAwBX,IAAM,0BACX,CAAC,wBAAgC,wBACjC,CAAC,UAA2B;AAC1B,MAAI,iBAAiB,EAAE,UAAU;AAC/B,YAAQ,MAAM,wBAAwB,KAAK;AAC3C,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,qBAAqB,KAAK;AACxC,SAAO;AACT;;;AHdF,IAAM,gCAAgCC,GAAE,OAAO;AAAA,EAC7C,IAAIA,GAAE,OAAO,EAAE,KAAK;AAAA,EACpB,OAAOA,GAAE,OAAO;AAAA,EAChB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQA,GAAE,WAAW,gBAAiB;AAAA,EACtC,sBAAsBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/C,WAAWA,GAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAEM,IAAM,qCAAqCA,GAAE,OAAO;AAAA,EACzD,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,OAAO;AAAA,IACb,YAAYA,GAAE,MAAM,6BAA6B;AAAA,IACjD,YAAYA,GAAE,OAAO;AAAA,MACnB,OAAOA,GAAE,OAAO;AAAA,MAChB,MAAMA,GAAE,OAAO;AAAA,MACf,OAAOA,GAAE,OAAO;AAAA,MAChB,YAAYA,GAAE,OAAO;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAsBM,IAAM,gCAAoD;AAAA,EAC/D,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AACd;AAOO,IAAM,+BAA+B,CAC1C,aACsB;AACtB,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,WAAW,SAAS,YAChB,MAAM,SAAS,SAAS,EAAE,OAAO,OAAO,IACxC;AAAA,IACJ,UAAU,SAAS,YACf,MAAM,SAAS,SAAS,EAAE,OAAO,OAAO,IACxC;AAAA,IACJ,OAAO,SAAS;AAAA,IAChB,QAAQ,SAAS,cAAc;AAAA,IAC/B,MAAM,SAAS,QAAQ;AAAA,IACvB,SAAS,SAAS,eAAe;AAAA,IACjC,OAAO,SAAS,aAAa;AAAA,IAC7B,QAAQ,2BAA2B,SAAS,MAAM;AAAA,IAClD,sBAAsB,SAAS;AAAA,EACjC;AACF;AAMO,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA;AACF;AAsBO,IAAM,6BAA6B,CACxC,2BAGG;AACH,SAAO,MAAkC;AACvC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAoC;AAAA,MAC5D,YAAY,CAAC;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAMD,UAAM,kBAAkB;AAAA,MACtB,OAAO,YAAqC;AAC1C,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE5D,YAAI;AAEF,gBAAM,eAAe,MAAM,uBAAuB,OAAO;AAGzD,gBAAM,gBACJ,mCAAmC,MAAM,YAAY;AAGvD,gBAAM,aAAa,cAAc,KAAK,WAAW;AAAA,YAC/C;AAAA,UACF;AAGA,mBAAS;AAAA,YACP,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,OAAO;AAAA,YACP,YAAY,cAAc,KAAK;AAAA,UACjC,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eAAe,yBAAyB,KAAK;AACnD,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,SAAS;AAAA,YACT,OAAO;AAAA,UACT,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,CAAC,sBAAsB;AAAA,IACzB;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,8BAA8B;","names":["z","GenericApiStatus","z"]}