UNPKG

analytica-frontend-lib

Version:

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

1 lines 9.06 kB
{"version":3,"sources":["../src/hooks/useQuestionsData.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\n\n/**\n * Period filter options for questions data\n */\nexport type QuestionsDataPeriod =\n | '7_DAYS'\n | '1_MONTH'\n | '3_MONTHS'\n | '6_MONTHS'\n | '1_YEAR';\n\n/**\n * Trend direction for questions data\n */\nexport type QuestionsDataTrendDirection = 'up' | 'down' | 'stable';\n\n/**\n * Filters for questions data API request\n */\nexport interface QuestionsDataFilters {\n period?: QuestionsDataPeriod;\n subjectId?: string;\n schoolYearId?: string;\n classId?: string;\n schoolId?: string;\n}\n\n/**\n * Trend information from API response\n */\nexport interface QuestionsDataTrend {\n totalQuestions: number;\n correctPercentage: number;\n direction: QuestionsDataTrendDirection;\n}\n\n/**\n * API response data structure\n */\nexport interface QuestionsDataApiData {\n totalQuestions: number;\n correctQuestions: number;\n incorrectQuestions: number;\n blankQuestions: number;\n correctPercentage: number;\n incorrectPercentage: number;\n blankPercentage: number;\n trend: QuestionsDataTrend | null;\n}\n\n/**\n * API response structure for questions data endpoint\n */\nexport interface QuestionsDataApiResponse {\n message: string;\n data: QuestionsDataApiData;\n}\n\n/**\n * Transformed data for UI display.\n * Extends the basic QuestionsDataItem from component with additional API fields.\n * Can be passed directly to QuestionsData component (extra fields are ignored).\n */\nexport interface QuestionsDataHookResult {\n /** Total number of questions answered */\n total: number;\n /** Number of correct answers */\n corretas: number;\n /** Number of incorrect answers */\n incorretas: number;\n /** Number of blank (unanswered) questions */\n emBranco: number;\n /** Percentage of correct answers */\n correctPercentage: number;\n /** Percentage of incorrect answers */\n incorrectPercentage: number;\n /** Percentage of blank answers */\n blankPercentage: number;\n /** Trend information */\n trend: QuestionsDataTrend | null;\n}\n\n/**\n * Zod schema for trend direction\n */\nconst trendDirectionSchema = z.enum(['up', 'down', 'stable']);\n\n/**\n * Zod schema for trend object\n */\nconst trendSchema = z\n .object({\n totalQuestions: z.number(),\n correctPercentage: z.number(),\n direction: trendDirectionSchema,\n })\n .nullable();\n\n/**\n * Zod schema for questions data API response validation\n */\nexport const questionsDataApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n totalQuestions: z.number().min(0),\n correctQuestions: z.number().min(0),\n incorrectQuestions: z.number().min(0),\n blankQuestions: z.number().min(0),\n correctPercentage: z.number().min(0).max(100),\n incorrectPercentage: z.number().min(0).max(100),\n blankPercentage: z.number().min(0).max(100),\n trend: trendSchema,\n }),\n});\n\n/**\n * Hook state interface\n */\nexport interface UseQuestionsDataState {\n data: QuestionsDataHookResult | null;\n loading: boolean;\n error: string | null;\n}\n\n/**\n * Hook return type\n */\nexport interface UseQuestionsDataReturn extends UseQuestionsDataState {\n fetchQuestionsData: (filters?: QuestionsDataFilters) => Promise<void>;\n reset: () => void;\n}\n\n/**\n * Transform API response data to component format\n * @param apiData - Data from API response\n * @returns Transformed data for QuestionsData component\n */\nexport const transformQuestionsData = (\n apiData: QuestionsDataApiData\n): QuestionsDataHookResult => ({\n total: apiData.totalQuestions,\n corretas: apiData.correctQuestions,\n incorretas: apiData.incorrectQuestions,\n emBranco: apiData.blankQuestions,\n correctPercentage: apiData.correctPercentage,\n incorrectPercentage: apiData.incorrectPercentage,\n blankPercentage: apiData.blankPercentage,\n trend: apiData.trend,\n});\n\n/**\n * Handle errors during questions data fetch\n * @param error - Error object\n * @returns Error message for UI display\n */\nexport const handleQuestionsDataFetchError = (error: unknown): string => {\n if (error instanceof z.ZodError) {\n console.error('Erro ao validar dados de questões:', error);\n return 'Erro ao validar dados de questões';\n }\n\n console.error('Erro ao carregar dados de questões:', error);\n return 'Erro ao carregar dados de questões';\n};\n\n/**\n * Initial state for the hook\n */\nconst initialState: UseQuestionsDataState = {\n data: null,\n loading: false,\n error: null,\n};\n\n/**\n * Factory function to create useQuestionsData hook\n *\n * @param fetchQuestionsDataApi - Function to fetch questions data from API\n * @returns Hook for managing questions data\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchQuestionsDataApi = async (filters) => {\n * const response = await api.get('/performance/questions-data', { params: filters });\n * return response.data;\n * };\n *\n * const useQuestionsData = createUseQuestionsData(fetchQuestionsDataApi);\n *\n * // In your component\n * const { data, loading, error, fetchQuestionsData } = useQuestionsData();\n *\n * useEffect(() => {\n * fetchQuestionsData({ period: '1_MONTH' });\n * }, []);\n *\n * if (loading) return <Skeleton />;\n * if (!data) return null;\n *\n * return <QuestionsData data={data} />;\n * ```\n */\nexport const createUseQuestionsData = (\n fetchQuestionsDataApi: (\n filters?: QuestionsDataFilters\n ) => Promise<QuestionsDataApiResponse>\n) => {\n return (): UseQuestionsDataReturn => {\n const [state, setState] = useState<UseQuestionsDataState>(initialState);\n\n /**\n * Fetch questions data from API\n * @param filters - Optional filters for period, subject, class, etc.\n */\n const fetchQuestionsData = useCallback(\n async (filters?: QuestionsDataFilters) => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n // Fetch data from API\n const responseData = await fetchQuestionsDataApi(filters);\n\n // Validate response with Zod\n const validatedData =\n questionsDataApiResponseSchema.parse(responseData);\n\n // Transform data to component format\n const transformedData = transformQuestionsData(validatedData.data);\n\n // Update state with validated and transformed data\n setState({\n data: transformedData,\n loading: false,\n error: null,\n });\n } catch (error) {\n const errorMessage = handleQuestionsDataFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchQuestionsDataApi]\n );\n\n /**\n * Reset state to initial values\n */\n const reset = useCallback(() => {\n setState(initialState);\n }, []);\n\n return {\n ...state,\n fetchQuestionsData,\n reset,\n };\n };\n};\n\n/**\n * Alias for createUseQuestionsData\n */\nexport const createQuestionsDataHook = createUseQuestionsData;\n"],"mappings":";AAAA,SAAS,UAAU,mBAAmB;AACtC,SAAS,SAAS;AAsFlB,IAAM,uBAAuB,EAAE,KAAK,CAAC,MAAM,QAAQ,QAAQ,CAAC;AAK5D,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,gBAAgB,EAAE,OAAO;AAAA,EACzB,mBAAmB,EAAE,OAAO;AAAA,EAC5B,WAAW;AACb,CAAC,EACA,SAAS;AAKL,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,OAAO;AAAA,IACb,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAChC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAClC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACpC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAChC,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC5C,qBAAqB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC9C,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC1C,OAAO;AAAA,EACT,CAAC;AACH,CAAC;AAwBM,IAAM,yBAAyB,CACpC,aAC6B;AAAA,EAC7B,OAAO,QAAQ;AAAA,EACf,UAAU,QAAQ;AAAA,EAClB,YAAY,QAAQ;AAAA,EACpB,UAAU,QAAQ;AAAA,EAClB,mBAAmB,QAAQ;AAAA,EAC3B,qBAAqB,QAAQ;AAAA,EAC7B,iBAAiB,QAAQ;AAAA,EACzB,OAAO,QAAQ;AACjB;AAOO,IAAM,gCAAgC,CAAC,UAA2B;AACvE,MAAI,iBAAiB,EAAE,UAAU;AAC/B,YAAQ,MAAM,yCAAsC,KAAK;AACzD,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,0CAAuC,KAAK;AAC1D,SAAO;AACT;AAKA,IAAM,eAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AA+BO,IAAM,yBAAyB,CACpC,0BAGG;AACH,SAAO,MAA8B;AACnC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,YAAY;AAMtE,UAAM,qBAAqB;AAAA,MACzB,OAAO,YAAmC;AACxC,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE5D,YAAI;AAEF,gBAAM,eAAe,MAAM,sBAAsB,OAAO;AAGxD,gBAAM,gBACJ,+BAA+B,MAAM,YAAY;AAGnD,gBAAM,kBAAkB,uBAAuB,cAAc,IAAI;AAGjE,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eAAe,8BAA8B,KAAK;AACxD,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,SAAS;AAAA,YACT,OAAO;AAAA,UACT,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,CAAC,qBAAqB;AAAA,IACxB;AAKA,UAAM,QAAQ,YAAY,MAAM;AAC9B,eAAS,YAAY;AAAA,IACvB,GAAG,CAAC,CAAC;AAEL,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,0BAA0B;","names":[]}