analytica-frontend-lib 1.2.57 → 1.2.59
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.
- package/dist/ActivitiesHistory/index.js +1 -1
- package/dist/ActivitiesHistory/index.js.map +1 -1
- package/dist/ActivitiesHistory/index.mjs +1 -1
- package/dist/ActivitiesHistory/index.mjs.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.d.ts +7 -7
- package/dist/hooks/useActivitiesHistory/index.js +1 -1
- package/dist/hooks/useActivitiesHistory/index.js.map +1 -1
- package/dist/hooks/useActivitiesHistory/index.mjs +1 -1
- package/dist/hooks/useActivitiesHistory/index.mjs.map +1 -1
- package/dist/hooks/useActivitiesHistory.d.ts +7 -7
- package/dist/hooks/useActivityModels/index.d.ts +6 -6
- package/dist/hooks/useActivityModels/index.js.map +1 -1
- package/dist/hooks/useActivityModels/index.mjs.map +1 -1
- package/dist/hooks/useActivityModels.d.ts +6 -6
- package/dist/index.js +147 -58
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +137 -48
- package/dist/index.mjs.map +1 -1
- package/dist/types/activitiesHistory/index.d.ts +1 -1
- package/dist/types/activitiesHistory/index.d.ts.map +1 -1
- package/dist/types/activitiesHistory/index.js.map +1 -1
- package/dist/types/activitiesHistory/index.mjs.map +1 -1
- package/dist/types/activitiesHistory.d.ts +1 -1
- package/dist/types/activitiesHistory.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/useActivityModels.ts","../../../src/types/activitiesHistory.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport { ActivityDraftType } from '../types/activitiesHistory';\nimport type {\n ActivityModelResponse,\n ActivityModelTableItem,\n ActivityModelsApiResponse,\n ActivityModelFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for activity draft filters\n */\nconst activityDraftFiltersSchema = z\n .object({\n questionTypes: z.array(z.string()).optional(),\n questionBanks: z.array(z.string()).optional(),\n subjects: z.array(z.string()).optional(),\n topics: z.array(z.string()).optional(),\n subtopics: z.array(z.string()).optional(),\n contents: z.array(z.string()).optional(),\n })\n .nullable();\n\n/**\n * Zod schema for activity model response validation\n */\nconst activityModelResponseSchema = z.object({\n id: z.string().uuid(),\n type: z.nativeEnum(ActivityDraftType),\n title: z.string().nullable(),\n creatorUserInstitutionId: z.string().uuid().nullable(),\n subjectId: z.string().uuid().nullable(),\n filters: activityDraftFiltersSchema,\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\n/**\n * Zod schema for activity models API response validation\n */\nexport const activityModelsApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n activityDrafts: z.array(activityModelResponseSchema),\n total: z.number(),\n }),\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\n * @returns Formatted model for table display\n */\nexport const transformModelToTableItem = (\n model: ActivityModelResponse,\n subjectsMap?: Map<string, string>\n): ActivityModelTableItem => {\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 handleModelFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de modelos de atividades',\n 'Erro ao carregar modelos de atividades'\n);\n\n/**\n * Factory function to create useActivityModels hook\n *\n * @param fetchActivityModels - Function to fetch models from API\n * @param deleteActivityModel - Function to delete a model\n * @returns Hook for managing activity models\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchActivityModels = async (filters) => {\n * const response = await api.get('/activity-drafts', { params: { ...filters, type: 'MODELO' } });\n * return response.data;\n * };\n *\n * const deleteActivityModel = async (id) => {\n * await api.delete(`/activity-drafts/${id}`);\n * };\n *\n * const useActivityModels = createUseActivityModels(fetchActivityModels, deleteActivityModel);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useActivityModels();\n * ```\n */\nexport const createUseActivityModels = (\n fetchActivityModels: (\n filters?: ActivityModelFilters\n ) => Promise<ActivityModelsApiResponse>,\n deleteActivityModel: (id: string) => Promise<void>\n) => {\n return (): UseActivityModelsReturn => {\n const [state, setState] = useState<UseActivityModelsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_MODELS_PAGINATION,\n });\n\n /**\n * Fetch activity 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?: ActivityModelFilters,\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 fetchActivityModels(filters);\n\n // Validate response with Zod\n const validatedData =\n activityModelsApiResponseSchema.parse(responseData);\n\n // Transform models to table format\n const tableItems = validatedData.data.activityDrafts.map((model) =>\n transformModelToTableItem(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 = handleModelFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchActivityModels]\n );\n\n /**\n * Delete an activity 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 deleteActivityModel(id);\n return true;\n } catch (error) {\n console.error('Erro ao deletar modelo:', error);\n return false;\n }\n },\n [deleteActivityModel]\n );\n\n return {\n ...state,\n fetchModels,\n deleteModel,\n };\n };\n};\n\n/**\n * Alias for createUseActivityModels\n */\nexport const createActivityModelsHook = createUseActivityModels;\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":"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","names":["z","ActivityDraftType","z"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/useActivityModels.ts","../../../src/types/activitiesHistory.ts","../../../src/utils/hookErrorHandler.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport { z } from 'zod';\nimport dayjs from 'dayjs';\nimport { ActivityDraftType } from '../types/activitiesHistory';\nimport type {\n ActivityModelResponse,\n ActivityModelTableItem,\n ActivityModelsApiResponse,\n ActivityModelFilters,\n ActivityPagination,\n} from '../types/activitiesHistory';\nimport { createFetchErrorHandler } from '../utils/hookErrorHandler';\n\n/**\n * Zod schema for activity draft filters\n */\nconst activityDraftFiltersSchema = z\n .object({\n questionTypes: z.array(z.string()).optional(),\n questionBanks: z.array(z.string()).optional(),\n subjects: z.array(z.string()).optional(),\n topics: z.array(z.string()).optional(),\n subtopics: z.array(z.string()).optional(),\n contents: z.array(z.string()).optional(),\n })\n .nullable();\n\n/**\n * Zod schema for activity model response validation\n */\nconst activityModelResponseSchema = z.object({\n id: z.string().uuid(),\n type: z.nativeEnum(ActivityDraftType),\n title: z.string().nullable(),\n creatorUserInstitutionId: z.string().uuid().nullable(),\n subjectId: z.string().uuid().nullable(),\n filters: activityDraftFiltersSchema,\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\n/**\n * Zod schema for activity models API response validation\n */\nexport const activityModelsApiResponseSchema = z.object({\n message: z.string(),\n data: z.object({\n activityDrafts: z.array(activityModelResponseSchema),\n total: z.number(),\n }),\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\n * @returns Formatted model for table display\n */\nexport const transformModelToTableItem = (\n model: ActivityModelResponse,\n subjectsMap?: Map<string, string>\n): ActivityModelTableItem => {\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 handleModelFetchError = createFetchErrorHandler(\n 'Erro ao validar dados de modelos de atividades',\n 'Erro ao carregar modelos de atividades'\n);\n\n/**\n * Factory function to create useActivityModels hook\n *\n * @param fetchActivityModels - Function to fetch models from API\n * @param deleteActivityModel - Function to delete a model\n * @returns Hook for managing activity models\n *\n * @example\n * ```tsx\n * // In your app setup\n * const fetchActivityModels = async (filters) => {\n * const response = await api.get('/activity-drafts', { params: { ...filters, type: 'MODELO' } });\n * return response.data;\n * };\n *\n * const deleteActivityModel = async (id) => {\n * await api.delete(`/activity-drafts/${id}`);\n * };\n *\n * const useActivityModels = createUseActivityModels(fetchActivityModels, deleteActivityModel);\n *\n * // In your component\n * const { models, loading, error, pagination, fetchModels, deleteModel } = useActivityModels();\n * ```\n */\nexport const createUseActivityModels = (\n fetchActivityModels: (\n filters?: ActivityModelFilters\n ) => Promise<ActivityModelsApiResponse>,\n deleteActivityModel: (id: string) => Promise<void>\n) => {\n return (): UseActivityModelsReturn => {\n const [state, setState] = useState<UseActivityModelsState>({\n models: [],\n loading: false,\n error: null,\n pagination: DEFAULT_MODELS_PAGINATION,\n });\n\n /**\n * Fetch activity 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?: ActivityModelFilters,\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 fetchActivityModels(filters);\n\n // Validate response with Zod\n const validatedData =\n activityModelsApiResponseSchema.parse(responseData);\n\n // Transform models to table format\n const tableItems = validatedData.data.activityDrafts.map((model) =>\n transformModelToTableItem(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 = handleModelFetchError(error);\n setState((prev) => ({\n ...prev,\n loading: false,\n error: errorMessage,\n }));\n }\n },\n [fetchActivityModels]\n );\n\n /**\n * Delete an activity 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 deleteActivityModel(id);\n return true;\n } catch (error) {\n console.error('Erro ao deletar modelo:', error);\n return false;\n }\n },\n [deleteActivityModel]\n );\n\n return {\n ...state,\n fetchModels,\n deleteModel,\n };\n };\n};\n\n/**\n * Alias for createUseActivityModels\n */\nexport const createActivityModelsHook = createUseActivityModels;\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":"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","names":["z","ActivityDraftType","z"]}
|
|
@@ -42,7 +42,6 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
42
42
|
type: ActivityDraftType;
|
|
43
43
|
title: string | null;
|
|
44
44
|
createdAt: string;
|
|
45
|
-
updatedAt: string;
|
|
46
45
|
filters: {
|
|
47
46
|
contents?: string[] | undefined;
|
|
48
47
|
questionTypes?: string[] | undefined;
|
|
@@ -52,13 +51,13 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
52
51
|
questionBanks?: string[] | undefined;
|
|
53
52
|
} | null;
|
|
54
53
|
subjectId: string | null;
|
|
54
|
+
updatedAt: string;
|
|
55
55
|
creatorUserInstitutionId: string | null;
|
|
56
56
|
}, {
|
|
57
57
|
id: string;
|
|
58
58
|
type: ActivityDraftType;
|
|
59
59
|
title: string | null;
|
|
60
60
|
createdAt: string;
|
|
61
|
-
updatedAt: string;
|
|
62
61
|
filters: {
|
|
63
62
|
contents?: string[] | undefined;
|
|
64
63
|
questionTypes?: string[] | undefined;
|
|
@@ -68,6 +67,7 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
68
67
|
questionBanks?: string[] | undefined;
|
|
69
68
|
} | null;
|
|
70
69
|
subjectId: string | null;
|
|
70
|
+
updatedAt: string;
|
|
71
71
|
creatorUserInstitutionId: string | null;
|
|
72
72
|
}>, "many">;
|
|
73
73
|
total: z.ZodNumber;
|
|
@@ -78,7 +78,6 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
78
78
|
type: ActivityDraftType;
|
|
79
79
|
title: string | null;
|
|
80
80
|
createdAt: string;
|
|
81
|
-
updatedAt: string;
|
|
82
81
|
filters: {
|
|
83
82
|
contents?: string[] | undefined;
|
|
84
83
|
questionTypes?: string[] | undefined;
|
|
@@ -88,6 +87,7 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
88
87
|
questionBanks?: string[] | undefined;
|
|
89
88
|
} | null;
|
|
90
89
|
subjectId: string | null;
|
|
90
|
+
updatedAt: string;
|
|
91
91
|
creatorUserInstitutionId: string | null;
|
|
92
92
|
}[];
|
|
93
93
|
}, {
|
|
@@ -97,7 +97,6 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
97
97
|
type: ActivityDraftType;
|
|
98
98
|
title: string | null;
|
|
99
99
|
createdAt: string;
|
|
100
|
-
updatedAt: string;
|
|
101
100
|
filters: {
|
|
102
101
|
contents?: string[] | undefined;
|
|
103
102
|
questionTypes?: string[] | undefined;
|
|
@@ -107,6 +106,7 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
107
106
|
questionBanks?: string[] | undefined;
|
|
108
107
|
} | null;
|
|
109
108
|
subjectId: string | null;
|
|
109
|
+
updatedAt: string;
|
|
110
110
|
creatorUserInstitutionId: string | null;
|
|
111
111
|
}[];
|
|
112
112
|
}>;
|
|
@@ -118,7 +118,6 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
118
118
|
type: ActivityDraftType;
|
|
119
119
|
title: string | null;
|
|
120
120
|
createdAt: string;
|
|
121
|
-
updatedAt: string;
|
|
122
121
|
filters: {
|
|
123
122
|
contents?: string[] | undefined;
|
|
124
123
|
questionTypes?: string[] | undefined;
|
|
@@ -128,6 +127,7 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
128
127
|
questionBanks?: string[] | undefined;
|
|
129
128
|
} | null;
|
|
130
129
|
subjectId: string | null;
|
|
130
|
+
updatedAt: string;
|
|
131
131
|
creatorUserInstitutionId: string | null;
|
|
132
132
|
}[];
|
|
133
133
|
};
|
|
@@ -140,7 +140,6 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
140
140
|
type: ActivityDraftType;
|
|
141
141
|
title: string | null;
|
|
142
142
|
createdAt: string;
|
|
143
|
-
updatedAt: string;
|
|
144
143
|
filters: {
|
|
145
144
|
contents?: string[] | undefined;
|
|
146
145
|
questionTypes?: string[] | undefined;
|
|
@@ -150,6 +149,7 @@ export declare const activityModelsApiResponseSchema: z.ZodObject<{
|
|
|
150
149
|
questionBanks?: string[] | undefined;
|
|
151
150
|
} | null;
|
|
152
151
|
subjectId: string | null;
|
|
152
|
+
updatedAt: string;
|
|
153
153
|
creatorUserInstitutionId: string | null;
|
|
154
154
|
}[];
|
|
155
155
|
};
|
package/dist/index.js
CHANGED
|
@@ -12333,6 +12333,7 @@ var createQuestionsListHook = (apiClient) => {
|
|
|
12333
12333
|
|
|
12334
12334
|
// src/components/ActivityCreate/ActivityCreate.tsx
|
|
12335
12335
|
var import_react38 = require("react");
|
|
12336
|
+
var import_react_router_dom = require("react-router-dom");
|
|
12336
12337
|
var import_phosphor_react28 = require("phosphor-react");
|
|
12337
12338
|
|
|
12338
12339
|
// src/components/ActivityListQuestions/ActivityListQuestions.tsx
|
|
@@ -12667,6 +12668,26 @@ function formatTime(date) {
|
|
|
12667
12668
|
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
12668
12669
|
return `${hours}:${minutes}`;
|
|
12669
12670
|
}
|
|
12671
|
+
function getTypeFromUrl(type) {
|
|
12672
|
+
switch (type) {
|
|
12673
|
+
case "RASCUNHO" /* RASCUNHO */:
|
|
12674
|
+
return "rascunho";
|
|
12675
|
+
case "MODELO" /* MODELO */:
|
|
12676
|
+
return "modelo";
|
|
12677
|
+
default:
|
|
12678
|
+
return "rascunho";
|
|
12679
|
+
}
|
|
12680
|
+
}
|
|
12681
|
+
function getTypeFromUrlString(type) {
|
|
12682
|
+
switch (type) {
|
|
12683
|
+
case "rascunho":
|
|
12684
|
+
return "RASCUNHO" /* RASCUNHO */;
|
|
12685
|
+
case "modelo":
|
|
12686
|
+
return "MODELO" /* MODELO */;
|
|
12687
|
+
default:
|
|
12688
|
+
return "RASCUNHO" /* RASCUNHO */;
|
|
12689
|
+
}
|
|
12690
|
+
}
|
|
12670
12691
|
function convertQuestionToPreview(question) {
|
|
12671
12692
|
const subjectInfo = question.knowledgeMatrix && question.knowledgeMatrix.length > 0 ? {
|
|
12672
12693
|
subjectName: question.knowledgeMatrix[0].subject?.name || void 0,
|
|
@@ -12930,14 +12951,12 @@ var CreateActivity = ({
|
|
|
12930
12951
|
apiClient,
|
|
12931
12952
|
institutionId,
|
|
12932
12953
|
isDark,
|
|
12933
|
-
activity,
|
|
12934
|
-
onActivityChange,
|
|
12935
|
-
loading = false,
|
|
12936
|
-
preFilters,
|
|
12937
12954
|
onBack,
|
|
12938
12955
|
onCreateActivity,
|
|
12939
12956
|
onSaveModel
|
|
12940
12957
|
}) => {
|
|
12958
|
+
const params = (0, import_react_router_dom.useParams)();
|
|
12959
|
+
const navigate = (0, import_react_router_dom.useNavigate)();
|
|
12941
12960
|
const applyFilters = useQuestionFiltersStore(
|
|
12942
12961
|
(state) => state.applyFilters
|
|
12943
12962
|
);
|
|
@@ -12951,26 +12970,18 @@ var CreateActivity = ({
|
|
|
12951
12970
|
(state) => state.setDraftFilters
|
|
12952
12971
|
);
|
|
12953
12972
|
const addToast = ToastStore_default((state) => state.addToast);
|
|
12954
|
-
const
|
|
12955
|
-
|
|
12956
|
-
|
|
12957
|
-
},
|
|
12958
|
-
[setDraftFilters]
|
|
12973
|
+
const [activity, setActivity] = (0, import_react38.useState)(null);
|
|
12974
|
+
const [preFilters, setPreFilters] = (0, import_react38.useState)(
|
|
12975
|
+
null
|
|
12959
12976
|
);
|
|
12960
|
-
const
|
|
12961
|
-
applyFilters();
|
|
12962
|
-
}, [applyFilters]);
|
|
12977
|
+
const [loading, setLoading] = (0, import_react38.useState)(false);
|
|
12963
12978
|
const [questions, setQuestions] = (0, import_react38.useState)([]);
|
|
12964
12979
|
const [loadingInitialQuestions, setLoadingInitialQuestions] = (0, import_react38.useState)(false);
|
|
12965
|
-
const [draftId, setDraftId] = (0, import_react38.useState)(
|
|
12966
|
-
activity?.id ? activity.id : null
|
|
12967
|
-
);
|
|
12980
|
+
const [draftId, setDraftId] = (0, import_react38.useState)(params.id || null);
|
|
12968
12981
|
const [activityType, setActivityType] = (0, import_react38.useState)(
|
|
12969
|
-
|
|
12970
|
-
);
|
|
12971
|
-
const [lastSavedAt, setLastSavedAt] = (0, import_react38.useState)(
|
|
12972
|
-
activity?.updatedAt ? new Date(activity.updatedAt) : null
|
|
12982
|
+
getTypeFromUrlString(params.type)
|
|
12973
12983
|
);
|
|
12984
|
+
const [lastSavedAt, setLastSavedAt] = (0, import_react38.useState)(null);
|
|
12974
12985
|
const [isSaving, setIsSaving] = (0, import_react38.useState)(false);
|
|
12975
12986
|
const [isSendModalOpen, setIsSendModalOpen] = (0, import_react38.useState)(false);
|
|
12976
12987
|
const [categories, setCategories] = (0, import_react38.useState)([]);
|
|
@@ -12980,6 +12991,16 @@ var CreateActivity = ({
|
|
|
12980
12991
|
const lastSavedFiltersRef = (0, import_react38.useRef)(null);
|
|
12981
12992
|
const lastSavedQuestionsRef = (0, import_react38.useRef)([]);
|
|
12982
12993
|
const hasAppliedInitialFiltersRef = (0, import_react38.useRef)(false);
|
|
12994
|
+
const lastFetchedActivityIdRef = (0, import_react38.useRef)(null);
|
|
12995
|
+
const handleFiltersChange = (0, import_react38.useCallback)(
|
|
12996
|
+
(filters) => {
|
|
12997
|
+
setDraftFilters(filters);
|
|
12998
|
+
},
|
|
12999
|
+
[setDraftFilters]
|
|
13000
|
+
);
|
|
13001
|
+
const handleApplyFilters = (0, import_react38.useCallback)(() => {
|
|
13002
|
+
applyFilters();
|
|
13003
|
+
}, [applyFilters]);
|
|
12983
13004
|
const useActivityFiltersData = createUseActivityFiltersData(apiClient);
|
|
12984
13005
|
const { knowledgeAreas, loadKnowledgeAreas } = useActivityFiltersData({
|
|
12985
13006
|
selectedSubjects: [],
|
|
@@ -13006,6 +13027,49 @@ var CreateActivity = ({
|
|
|
13006
13027
|
(0, import_react38.useEffect)(() => {
|
|
13007
13028
|
hasAppliedInitialFiltersRef.current = false;
|
|
13008
13029
|
}, [activity?.id, activity?.filters, resolvedPreFilters]);
|
|
13030
|
+
(0, import_react38.useEffect)(() => {
|
|
13031
|
+
const fetchActivityDraft = async () => {
|
|
13032
|
+
if (params.id && params.id !== lastFetchedActivityIdRef.current) {
|
|
13033
|
+
setLoading(true);
|
|
13034
|
+
try {
|
|
13035
|
+
const response = await apiClient.get(`/activity-drafts/${params.id}`);
|
|
13036
|
+
const activityData = "data" in response.data ? response.data.data : response.data;
|
|
13037
|
+
setActivity(activityData);
|
|
13038
|
+
setPreFilters(activityData.filters);
|
|
13039
|
+
setDraftId(activityData.id || null);
|
|
13040
|
+
setActivityType(activityData.type);
|
|
13041
|
+
if (activityData.updatedAt) {
|
|
13042
|
+
setLastSavedAt(new Date(activityData.updatedAt));
|
|
13043
|
+
}
|
|
13044
|
+
lastFetchedActivityIdRef.current = params.id;
|
|
13045
|
+
} catch (error) {
|
|
13046
|
+
console.error("Erro ao buscar rascunho da atividade:", error);
|
|
13047
|
+
addToast({
|
|
13048
|
+
title: "Erro ao carregar atividade",
|
|
13049
|
+
description: error instanceof Error ? error.message : "Ocorreu um erro ao carregar a atividade. Tente novamente.",
|
|
13050
|
+
variant: "solid",
|
|
13051
|
+
action: "warning",
|
|
13052
|
+
position: "top-right"
|
|
13053
|
+
});
|
|
13054
|
+
} finally {
|
|
13055
|
+
setLoading(false);
|
|
13056
|
+
}
|
|
13057
|
+
}
|
|
13058
|
+
};
|
|
13059
|
+
fetchActivityDraft();
|
|
13060
|
+
}, [params.id, apiClient, addToast]);
|
|
13061
|
+
(0, import_react38.useEffect)(() => {
|
|
13062
|
+
if (activity?.id && activity?.type) {
|
|
13063
|
+
const urlType = getTypeFromUrl(activity.type);
|
|
13064
|
+
const currentUrlType = params.type;
|
|
13065
|
+
const currentUrlId = params.id;
|
|
13066
|
+
if (!currentUrlType || !currentUrlId || currentUrlId !== activity.id || currentUrlType !== urlType) {
|
|
13067
|
+
navigate(`/criar-atividade/${urlType}/${activity.id}`, {
|
|
13068
|
+
replace: true
|
|
13069
|
+
});
|
|
13070
|
+
}
|
|
13071
|
+
}
|
|
13072
|
+
}, [activity?.id, activity?.type, params.type, params.id, navigate]);
|
|
13009
13073
|
const validateSaveConditions = (0, import_react38.useCallback)(() => {
|
|
13010
13074
|
if (questions.length === 0 && !hasFirstSaveBeenDone.current) {
|
|
13011
13075
|
return false;
|
|
@@ -13043,6 +13107,33 @@ var CreateActivity = ({
|
|
|
13043
13107
|
setLastSavedAt(
|
|
13044
13108
|
savedDraft?.updatedAt ? new Date(savedDraft.updatedAt) : /* @__PURE__ */ new Date()
|
|
13045
13109
|
);
|
|
13110
|
+
if (savedDraft) {
|
|
13111
|
+
setActivity((prevActivity) => {
|
|
13112
|
+
if (!prevActivity || prevActivity.id !== savedDraft.id) {
|
|
13113
|
+
return {
|
|
13114
|
+
id: savedDraft.id,
|
|
13115
|
+
type: savedDraft.type,
|
|
13116
|
+
title: savedDraft.title,
|
|
13117
|
+
subjectId: savedDraft.subjectId,
|
|
13118
|
+
filters: savedDraft.filters,
|
|
13119
|
+
questionIds: questions.map((q) => q.id),
|
|
13120
|
+
updatedAt: savedDraft.updatedAt
|
|
13121
|
+
};
|
|
13122
|
+
}
|
|
13123
|
+
return {
|
|
13124
|
+
...prevActivity,
|
|
13125
|
+
type: savedDraft.type,
|
|
13126
|
+
title: savedDraft.title,
|
|
13127
|
+
subjectId: savedDraft.subjectId,
|
|
13128
|
+
questionIds: questions.map((q) => q.id),
|
|
13129
|
+
updatedAt: savedDraft.updatedAt
|
|
13130
|
+
};
|
|
13131
|
+
});
|
|
13132
|
+
setActivityType(savedDraft.type);
|
|
13133
|
+
if (savedDraft.id) {
|
|
13134
|
+
lastFetchedActivityIdRef.current = savedDraft.id;
|
|
13135
|
+
}
|
|
13136
|
+
}
|
|
13046
13137
|
if (payload.type === "MODELO" /* MODELO */ && onSaveModel && response?.data) {
|
|
13047
13138
|
onSaveModel(response.data);
|
|
13048
13139
|
}
|
|
@@ -13078,30 +13169,36 @@ var CreateActivity = ({
|
|
|
13078
13169
|
[]
|
|
13079
13170
|
);
|
|
13080
13171
|
const updateStateAfterSave = (0, import_react38.useCallback)(
|
|
13081
|
-
(savedDraft, fullResponse) => {
|
|
13172
|
+
(savedDraft, fullResponse, wasNewDraft = false) => {
|
|
13082
13173
|
setDraftId(savedDraft.id);
|
|
13083
13174
|
setLastSavedAt(
|
|
13084
13175
|
savedDraft.updatedAt ? new Date(savedDraft.updatedAt) : /* @__PURE__ */ new Date()
|
|
13085
13176
|
);
|
|
13086
13177
|
lastSavedQuestionsRef.current = questions;
|
|
13087
13178
|
lastSavedFiltersRef.current = appliedFilters;
|
|
13179
|
+
const updatedActivity = {
|
|
13180
|
+
id: savedDraft.id,
|
|
13181
|
+
type: savedDraft.type,
|
|
13182
|
+
title: savedDraft.title,
|
|
13183
|
+
subjectId: savedDraft.subjectId,
|
|
13184
|
+
filters: savedDraft.filters,
|
|
13185
|
+
questionIds: questions.map((q) => q.id),
|
|
13186
|
+
updatedAt: savedDraft.updatedAt
|
|
13187
|
+
};
|
|
13188
|
+
setActivity(updatedActivity);
|
|
13189
|
+
setActivityType(savedDraft.type);
|
|
13190
|
+
lastFetchedActivityIdRef.current = savedDraft.id;
|
|
13191
|
+
if (wasNewDraft && savedDraft.id) {
|
|
13192
|
+
const urlType = getTypeFromUrl(savedDraft.type);
|
|
13193
|
+
navigate(`/criar-atividade/${urlType}/${savedDraft.id}`, {
|
|
13194
|
+
replace: true
|
|
13195
|
+
});
|
|
13196
|
+
}
|
|
13088
13197
|
if (savedDraft.type === "MODELO" /* MODELO */ && onSaveModel && fullResponse) {
|
|
13089
13198
|
onSaveModel(fullResponse);
|
|
13090
13199
|
}
|
|
13091
|
-
if (onActivityChange) {
|
|
13092
|
-
const updatedActivity = {
|
|
13093
|
-
id: savedDraft.id,
|
|
13094
|
-
type: savedDraft.type,
|
|
13095
|
-
title: savedDraft.title,
|
|
13096
|
-
subjectId: savedDraft.subjectId,
|
|
13097
|
-
filters: savedDraft.filters,
|
|
13098
|
-
questionIds: questions.map((q) => q.id),
|
|
13099
|
-
updatedAt: savedDraft.updatedAt
|
|
13100
|
-
};
|
|
13101
|
-
onActivityChange(updatedActivity);
|
|
13102
|
-
}
|
|
13103
13200
|
},
|
|
13104
|
-
[questions, appliedFilters,
|
|
13201
|
+
[questions, appliedFilters, onSaveModel, navigate]
|
|
13105
13202
|
);
|
|
13106
13203
|
const saveDraft = (0, import_react38.useCallback)(async () => {
|
|
13107
13204
|
if (!validateSaveConditions()) {
|
|
@@ -13120,7 +13217,7 @@ var CreateActivity = ({
|
|
|
13120
13217
|
);
|
|
13121
13218
|
hasFirstSaveBeenDone.current = true;
|
|
13122
13219
|
const savedDraft = extractDraftFromResponse(response);
|
|
13123
|
-
updateStateAfterSave(savedDraft, response?.data);
|
|
13220
|
+
updateStateAfterSave(savedDraft, response?.data, true);
|
|
13124
13221
|
} catch (error) {
|
|
13125
13222
|
console.error("\u274C Erro ao salvar rascunho:", error);
|
|
13126
13223
|
const errorMessage = error instanceof Error ? error.message : "Ocorreu um erro ao salvar o rascunho. Tente novamente.";
|
|
@@ -13147,14 +13244,6 @@ var CreateActivity = ({
|
|
|
13147
13244
|
const handleSaveModel = (0, import_react38.useCallback)(async () => {
|
|
13148
13245
|
setActivityType("MODELO" /* MODELO */);
|
|
13149
13246
|
}, []);
|
|
13150
|
-
(0, import_react38.useEffect)(() => {
|
|
13151
|
-
if (activity?.id) {
|
|
13152
|
-
setDraftId(activity.id);
|
|
13153
|
-
}
|
|
13154
|
-
if (activity?.updatedAt) {
|
|
13155
|
-
setLastSavedAt(new Date(activity.updatedAt));
|
|
13156
|
-
}
|
|
13157
|
-
}, [activity?.id, activity?.updatedAt]);
|
|
13158
13247
|
(0, import_react38.useEffect)(() => {
|
|
13159
13248
|
loadKnowledgeAreas();
|
|
13160
13249
|
}, [loadKnowledgeAreas]);
|
|
@@ -13401,7 +13490,7 @@ var CreateActivity = ({
|
|
|
13401
13490
|
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
|
|
13402
13491
|
ActivityCreateHeader,
|
|
13403
13492
|
{
|
|
13404
|
-
activity,
|
|
13493
|
+
activity: activity || void 0,
|
|
13405
13494
|
activityType,
|
|
13406
13495
|
lastSavedAt,
|
|
13407
13496
|
isSaving,
|
|
@@ -16758,7 +16847,7 @@ var Whiteboard_default = Whiteboard;
|
|
|
16758
16847
|
|
|
16759
16848
|
// src/components/Auth/Auth.tsx
|
|
16760
16849
|
var import_react47 = require("react");
|
|
16761
|
-
var
|
|
16850
|
+
var import_react_router_dom2 = require("react-router-dom");
|
|
16762
16851
|
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
16763
16852
|
var AuthContext = (0, import_react47.createContext)(void 0);
|
|
16764
16853
|
var AuthProvider = ({
|
|
@@ -16858,10 +16947,10 @@ var ProtectedRoute = ({
|
|
|
16858
16947
|
return null;
|
|
16859
16948
|
}
|
|
16860
16949
|
}
|
|
16861
|
-
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
16950
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_router_dom2.Navigate, { to: redirectTo, replace: true });
|
|
16862
16951
|
}
|
|
16863
16952
|
if (additionalCheck && !additionalCheck({ isAuthenticated, isLoading, ...authState })) {
|
|
16864
|
-
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
16953
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_router_dom2.Navigate, { to: redirectTo, replace: true });
|
|
16865
16954
|
}
|
|
16866
16955
|
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_jsx_runtime72.Fragment, { children });
|
|
16867
16956
|
};
|
|
@@ -16876,7 +16965,7 @@ var PublicRoute = ({
|
|
|
16876
16965
|
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)("div", { className: "text-text-950 text-lg", children: "Carregando..." }) });
|
|
16877
16966
|
}
|
|
16878
16967
|
if (isAuthenticated && redirectIfAuthenticated) {
|
|
16879
|
-
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
16968
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_router_dom2.Navigate, { to: redirectTo, replace: true });
|
|
16880
16969
|
}
|
|
16881
16970
|
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_jsx_runtime72.Fragment, { children });
|
|
16882
16971
|
};
|
|
@@ -16895,8 +16984,8 @@ var useAuthGuard = (options = {}) => {
|
|
|
16895
16984
|
};
|
|
16896
16985
|
var useRouteAuth = (fallbackPath = "/") => {
|
|
16897
16986
|
const { isAuthenticated, isLoading } = useAuth();
|
|
16898
|
-
const location = (0,
|
|
16899
|
-
const redirectToLogin = () => /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(
|
|
16987
|
+
const location = (0, import_react_router_dom2.useLocation)();
|
|
16988
|
+
const redirectToLogin = () => /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_router_dom2.Navigate, { to: fallbackPath, state: { from: location }, replace: true });
|
|
16900
16989
|
return {
|
|
16901
16990
|
isAuthenticated,
|
|
16902
16991
|
isLoading,
|
|
@@ -16973,7 +17062,7 @@ function createZustandAuthAdapter(useAuthStore2) {
|
|
|
16973
17062
|
|
|
16974
17063
|
// src/components/Auth/useUrlAuthentication.ts
|
|
16975
17064
|
var import_react48 = require("react");
|
|
16976
|
-
var
|
|
17065
|
+
var import_react_router_dom3 = require("react-router-dom");
|
|
16977
17066
|
var getAuthParams = (location, extractParams) => {
|
|
16978
17067
|
const searchParams = new URLSearchParams(location.search);
|
|
16979
17068
|
return extractParams ? extractParams(searchParams) : {
|
|
@@ -17019,7 +17108,7 @@ var handleUserData = (responseData, setUser) => {
|
|
|
17019
17108
|
}
|
|
17020
17109
|
};
|
|
17021
17110
|
function useUrlAuthentication(options) {
|
|
17022
|
-
const location = (0,
|
|
17111
|
+
const location = (0, import_react_router_dom3.useLocation)();
|
|
17023
17112
|
const processedRef = (0, import_react48.useRef)(false);
|
|
17024
17113
|
(0, import_react48.useEffect)(() => {
|
|
17025
17114
|
const handleAuthentication = async () => {
|
|
@@ -18970,14 +19059,14 @@ var QuizListResultByMateria = ({
|
|
|
18970
19059
|
};
|
|
18971
19060
|
|
|
18972
19061
|
// src/components/BreadcrumbMenu/BreadcrumbMenu.tsx
|
|
18973
|
-
var
|
|
19062
|
+
var import_react_router_dom4 = require("react-router-dom");
|
|
18974
19063
|
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
18975
19064
|
var BreadcrumbMenu = ({
|
|
18976
19065
|
breadcrumbs,
|
|
18977
19066
|
onBreadcrumbClick,
|
|
18978
19067
|
className = "!px-0 py-4 flex-wrap w-full"
|
|
18979
19068
|
}) => {
|
|
18980
|
-
const navigate = (0,
|
|
19069
|
+
const navigate = (0, import_react_router_dom4.useNavigate)();
|
|
18981
19070
|
const handleClick = (breadcrumb, index) => {
|
|
18982
19071
|
if (onBreadcrumbClick) {
|
|
18983
19072
|
onBreadcrumbClick(breadcrumb, index);
|
|
@@ -19174,9 +19263,9 @@ var useBreadcrumbBuilder = (config) => {
|
|
|
19174
19263
|
|
|
19175
19264
|
// src/components/BreadcrumbMenu/useUrlParams.ts
|
|
19176
19265
|
var import_react55 = require("react");
|
|
19177
|
-
var
|
|
19266
|
+
var import_react_router_dom5 = require("react-router-dom");
|
|
19178
19267
|
var useUrlParams = (config) => {
|
|
19179
|
-
const location = (0,
|
|
19268
|
+
const location = (0, import_react_router_dom5.useLocation)();
|
|
19180
19269
|
return (0, import_react55.useMemo)(() => {
|
|
19181
19270
|
const segments = location.pathname.split("/").filter(Boolean);
|
|
19182
19271
|
const params = {};
|
|
@@ -19401,9 +19490,9 @@ function useAppInitialization() {
|
|
|
19401
19490
|
|
|
19402
19491
|
// src/hooks/useAppContent.ts
|
|
19403
19492
|
var import_react58 = require("react");
|
|
19404
|
-
var
|
|
19493
|
+
var import_react_router_dom6 = require("react-router-dom");
|
|
19405
19494
|
function useAppContent(config) {
|
|
19406
|
-
const navigate = (0,
|
|
19495
|
+
const navigate = (0, import_react_router_dom6.useNavigate)();
|
|
19407
19496
|
const { setTokens, setSessionInfo, setSelectedProfile } = useAuthStore();
|
|
19408
19497
|
const {
|
|
19409
19498
|
api,
|
|
@@ -24530,7 +24619,7 @@ var activityHistoryResponseSchema = import_zod7.z.object({
|
|
|
24530
24619
|
finalDate: import_zod7.z.string().nullable(),
|
|
24531
24620
|
status: import_zod7.z.nativeEnum(GenericApiStatus),
|
|
24532
24621
|
completionPercentage: import_zod7.z.number().min(0).max(100),
|
|
24533
|
-
subjectId: import_zod7.z.string().uuid().nullable(),
|
|
24622
|
+
subjectId: import_zod7.z.string().uuid().optional().nullable(),
|
|
24534
24623
|
schoolId: import_zod7.z.string().optional(),
|
|
24535
24624
|
schoolName: import_zod7.z.string().optional(),
|
|
24536
24625
|
year: import_zod7.z.string().optional(),
|