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.
@@ -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":";AAAA,SAAS,UAAU,mBAAmB;AACtC,SAAS,KAAAA,UAAS;AAClB,OAAO,WAAW;;;ACiCX,IAAK,oBAAL,kBAAKC,uBAAL;AACL,EAAAA,mBAAA,YAAS;AACT,EAAAA,mBAAA,cAAW;AAFD,SAAAA;AAAA,GAAA;AAuKL,IAAM,iCAAyD;AAAA,EACpE,EAAE,+BAA+B,MAAM,WAAW;AAAA,EAClD,EAAE,6BAA8B,MAAM,UAAU;AAAA,EAChD,EAAE,iCAAgC,MAAM,eAAY;AACtD;;;AC9MA,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;;;AFlBF,IAAM,6BAA6BC,GAChC,OAAO;AAAA,EACN,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACzC,CAAC,EACA,SAAS;AAKZ,IAAM,8BAA8BA,GAAE,OAAO;AAAA,EAC3C,IAAIA,GAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAMA,GAAE,WAAW,iBAAiB;AAAA,EACpC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,0BAA0BA,GAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACrD,WAAWA,GAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,SAAS;AAAA,EACT,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO;AACtB,CAAC;AAKM,IAAM,kCAAkCA,GAAE,OAAO;AAAA,EACtD,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,OAAO;AAAA,IACb,gBAAgBA,GAAE,MAAM,2BAA2B;AAAA,IACnD,OAAOA,GAAE,OAAO;AAAA,EAClB,CAAC;AACH,CAAC;AA0BM,IAAM,4BAAgD;AAAA,EAC3D,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AACd;AAQO,IAAM,4BAA4B,CACvC,OACA,gBAC2B;AAC3B,QAAM,cAAc,MAAM,YACtB,aAAa,IAAI,MAAM,SAAS,KAAK,KACrC;AAEJ,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,OAAO,MAAM,SAAS;AAAA,IACtB,SAAS,MAAM,MAAM,SAAS,EAAE,OAAO,YAAY;AAAA,IACnD,SAAS;AAAA,IACT,WAAW,MAAM;AAAA,EACnB;AACF;AAMO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AACF;AA2BO,IAAM,0BAA0B,CACrC,qBAGA,wBACG;AACH,SAAO,MAA+B;AACpC,UAAM,CAAC,OAAO,QAAQ,IAAI,SAAiC;AAAA,MACzD,QAAQ,CAAC;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY;AAAA,IACd,CAAC;AAOD,UAAM,cAAc;AAAA,MAClB,OACE,SACA,gBACG;AACH,iBAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE5D,YAAI;AAEF,gBAAM,eAAe,MAAM,oBAAoB,OAAO;AAGtD,gBAAM,gBACJ,gCAAgC,MAAM,YAAY;AAGpD,gBAAM,aAAa,cAAc,KAAK,eAAe;AAAA,YAAI,CAAC,UACxD,0BAA0B,OAAO,WAAW;AAAA,UAC9C;AAGA,gBAAM,QAAQ,SAAS,SAAS;AAChC,gBAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAM,QAAQ,cAAc,KAAK;AACjC,gBAAM,aAAa,KAAK,KAAK,QAAQ,KAAK;AAG1C,mBAAS;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,YACP,YAAY;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eAAe,sBAAsB,KAAK;AAChD,mBAAS,CAAC,UAAU;AAAA,YAClB,GAAG;AAAA,YACH,SAAS;AAAA,YACT,OAAO;AAAA,UACT,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,CAAC,mBAAmB;AAAA,IACtB;AAOA,UAAM,cAAc;AAAA,MAClB,OAAO,OAAiC;AACtC,YAAI;AACF,gBAAM,oBAAoB,EAAE;AAC5B,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,KAAK;AAC9C,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,CAAC,mBAAmB;AAAA,IACtB;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,2BAA2B;","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 handleFiltersChange = (0, import_react38.useCallback)(
12955
- (filters) => {
12956
- setDraftFilters(filters);
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 handleApplyFilters = (0, import_react38.useCallback)(() => {
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
- activity?.type || "RASCUNHO" /* RASCUNHO */
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, onActivityChange, onSaveModel]
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 import_react_router_dom = require("react-router-dom");
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)(import_react_router_dom.Navigate, { to: redirectTo, replace: true });
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)(import_react_router_dom.Navigate, { to: redirectTo, replace: true });
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)(import_react_router_dom.Navigate, { to: redirectTo, replace: true });
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, import_react_router_dom.useLocation)();
16899
- const redirectToLogin = () => /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react_router_dom.Navigate, { to: fallbackPath, state: { from: location }, replace: true });
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 import_react_router_dom2 = require("react-router-dom");
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, import_react_router_dom2.useLocation)();
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 import_react_router_dom3 = require("react-router-dom");
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, import_react_router_dom3.useNavigate)();
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 import_react_router_dom4 = require("react-router-dom");
19266
+ var import_react_router_dom5 = require("react-router-dom");
19178
19267
  var useUrlParams = (config) => {
19179
- const location = (0, import_react_router_dom4.useLocation)();
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 import_react_router_dom5 = require("react-router-dom");
19493
+ var import_react_router_dom6 = require("react-router-dom");
19405
19494
  function useAppContent(config) {
19406
- const navigate = (0, import_react_router_dom5.useNavigate)();
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(),