UNPKG

analytica-frontend-lib

Version:

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

1 lines 38.8 kB
{"version":3,"sources":["../src/hooks/useRecommendedLessonsPage.ts"],"sourcesContent":["/**\n * useRecommendedLessonsPage Hook Factory\n *\n * Factory function to create a hook for RecommendedLessons, LessonDrafts, and LessonModels pages.\n * Contains all common state, memos, and callbacks.\n */\n\nimport { useCallback, useRef, useMemo, useState } from 'react';\nimport {\n RecommendedClassDraftType,\n type RecommendedClassHistoryFilters,\n type RecommendedClassHistoryApiResponse,\n type RecommendedClassTableItem,\n type RecommendedClassData,\n type UpdateRecommendedClassData,\n type RecommendedClassHistoryItem,\n type RecommendedClassModelFilters,\n type RecommendedClassModelsApiResponse,\n type RecommendedClassModelTableItem,\n type RecommendedClassModelResponse,\n} from '../types/recommendedLessons';\nimport type {\n SendLessonFormData,\n CategoryConfig,\n} from '../components/SendLessonModal/types';\nimport type { FilterConfig } from '../components/Filter';\nimport { SubjectEnum } from '../enums/SubjectEnum';\nimport type { BaseApiClient } from '../types/api';\nimport { loadCategoriesData } from '../utils/categoryDataUtils';\nimport { useDynamicStudentFetching } from '../utils/useDynamicStudentFetching';\n\n/**\n * API client interface\n */\nexport interface RecommendedLessonsApiClient {\n get: <T>(\n url: string,\n config?: { params?: Record<string, unknown> }\n ) => Promise<{ data: T }>;\n post: <T>(url: string, data?: unknown) => Promise<{ data: T }>;\n patch: <T>(url: string, data?: unknown) => Promise<{ data: T }>;\n delete: <T>(url: string) => Promise<{ data: T }>;\n}\n\n/**\n * User institution data structure\n */\nexport interface UserInstitution {\n school: { id: string; name: string };\n schoolYear: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * Subject teacher class data structure\n */\nexport interface SubTeacherTopicClass {\n subject: { id: string; name: string };\n class: { id: string; name: string };\n}\n\n/**\n * User data structure\n */\nexport interface RecommendedLessonsUserData {\n userInstitutions?: UserInstitution[];\n subTeacherTopicClasses?: SubTeacherTopicClass[];\n}\n\n/**\n * Navigation paths configuration\n */\nexport interface RecommendedLessonsPagePaths {\n /** Path for creating a new lesson */\n createLesson: string;\n /** Path for creating a new model */\n createModel: string;\n /** Base path for lesson details */\n lessonDetails: string;\n /** Base path for editing a lesson */\n editLesson: string;\n /** Path for editing a model (with id parameter) */\n editModel: string;\n}\n\n/**\n * API endpoints configuration\n */\nexport interface RecommendedLessonsPageEndpoints {\n /** Endpoint for fetching recommendedClass history */\n recommendedClassHistory: string;\n /** Endpoint for fetching recommendedClass models/drafts */\n recommendedClassDrafts: string;\n /** Endpoint for submitting a recommendedClass */\n submitRecommendedClass: string;\n}\n\n/**\n * UI text configuration\n */\nexport interface RecommendedLessonsPageTexts {\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n}\n\n/**\n * Configuration for createUseRecommendedLessonsPage factory\n */\nexport interface UseRecommendedLessonsPageConfig {\n /** API client for making requests */\n api: RecommendedLessonsApiClient;\n /** Navigation function */\n navigate: (path: string, options?: { state?: unknown }) => void;\n /** User data for filter options */\n userData: RecommendedLessonsUserData | null;\n /** Navigation paths */\n paths: RecommendedLessonsPagePaths;\n /** API endpoints */\n endpoints: RecommendedLessonsPageEndpoints;\n /** UI text */\n texts: RecommendedLessonsPageTexts;\n /** Image for empty state */\n emptyStateImage: string;\n /** Image for no search results */\n noSearchImage: string;\n /** Function to map subject name to SubjectEnum */\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n /** Extra filter categories to inject (e.g., creatorType for gestors) */\n extraFilterCategories?: FilterConfig[];\n}\n\n/**\n * Return type for the useRecommendedLessonsPage hook\n */\nexport interface UseRecommendedLessonsPageReturn {\n /** Props for RecommendedLessonsHistory component */\n historyProps: {\n fetchRecommendedClassHistory: (\n filters?: RecommendedClassHistoryFilters\n ) => Promise<RecommendedClassHistoryApiResponse>;\n fetchRecommendedClassModels: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>;\n deleteRecommendedClassModel: (id: string) => Promise<void>;\n onCreateLesson: () => void;\n onCreateModel: () => void;\n onRowClick: (row: RecommendedClassTableItem) => void;\n deleteRecommendedClass: (id: string) => Promise<void>;\n updateRecommendedClass: (\n id: string,\n data: UpdateRecommendedClassData\n ) => Promise<void>;\n fetchRecommendedClassById: (id: string) => Promise<RecommendedClassData>;\n onEditModel: (model: RecommendedClassModelTableItem) => void;\n onSendLesson: (model: RecommendedClassModelTableItem) => void;\n fetchRecommendedClassDrafts: (\n filters?: RecommendedClassModelFilters\n ) => Promise<RecommendedClassModelsApiResponse>;\n deleteRecommendedClassDraft: (id: string) => Promise<void>;\n onSendDraft: (draft: RecommendedClassModelTableItem) => void;\n onEditDraft: (draft: RecommendedClassModelTableItem) => void;\n emptyStateImage: string;\n noSearchImage: string;\n mapSubjectNameToEnum: (subjectName: string) => SubjectEnum | null;\n userFilterData: {\n schools: Array<{ id: string; name: string }>;\n classes: Array<{ id: string; name: string }>;\n subjects: Array<{ id: string; name: string }>;\n schoolYears: Array<{ id: string; name: string }>;\n };\n subjectsMap: Map<string, string>;\n title: string;\n createButtonText: string;\n searchPlaceholder: string;\n extraFilterCategories?: FilterConfig[];\n };\n /** Props for SendLessonModal component */\n modalProps: {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (formData: SendLessonFormData) => Promise<void>;\n categories: CategoryConfig[];\n onCategoriesChange: (categories: CategoryConfig[]) => void;\n isLoading: boolean;\n modalTitle: string | undefined;\n /** Whether the selected model has activity drafts attached, which\n * controls the visibility of the \"Permitir refazer?\" field. */\n hasAttachedActivities: boolean;\n };\n /** Navigate function for custom tab handlers */\n navigate: (path: string, options?: { state?: unknown }) => void;\n}\n\n/**\n * Build query parameters from filter object\n */\nconst buildQueryParams = (\n filters?: Record<string, unknown>\n): Record<string, unknown> => {\n if (!filters) return {};\n\n const params: Record<string, unknown> = {};\n for (const key in filters) {\n const value = filters[key];\n if (value !== undefined && value !== null) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n params[key] = value;\n }\n }\n }\n return params;\n};\n\n/**\n * Get school options from user data\n */\nconst getSchoolOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const schoolMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.school?.id && inst.school?.name) {\n schoolMap.set(inst.school.id, inst.school.name);\n }\n });\n\n return Array.from(schoolMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get class options from user data\n */\nconst getClassOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const classMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.class?.id && inst.class?.name) {\n classMap.set(inst.class.id, inst.class.name);\n }\n });\n\n return Array.from(classMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get subject options from user data\n */\nconst getSubjectOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.subTeacherTopicClasses) return [];\n\n const subjectMap = new Map<string, string>();\n userData.subTeacherTopicClasses.forEach((stc) => {\n if (stc.subject?.id && stc.subject?.name) {\n subjectMap.set(stc.subject.id, stc.subject.name);\n }\n });\n\n return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Get school year options from user data\n */\nconst getSchoolYearOptions = (\n userData: RecommendedLessonsUserData | null\n): Array<{ id: string; name: string }> => {\n if (!userData?.userInstitutions) return [];\n\n const yearMap = new Map<string, string>();\n userData.userInstitutions.forEach((inst) => {\n if (inst.schoolYear?.id && inst.schoolYear?.name) {\n yearMap.set(inst.schoolYear.id, inst.schoolYear.name);\n }\n });\n\n return Array.from(yearMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Factory function to create useRecommendedLessonsPage hook\n *\n * @param config - Configuration object with API client, navigation, user data, paths, etc.\n * @returns Hook function that returns historyProps, modalProps, and navigate\n *\n * @example\n * ```tsx\n * // In your app setup\n * const useRecommendedLessonsPage = createUseRecommendedLessonsPage({\n * api,\n * navigate,\n * userData,\n * paths: {\n * createLesson: '/criar-aula',\n * createModel: '/criar-aula?mode=model',\n * lessonDetails: '/aulas-recomendadas',\n * editLesson: '/aulas-recomendadas',\n * editModel: '/criar-aula?mode=model&id=',\n * },\n * endpoints: {\n * recommendedClassHistory: '/recommended-class/history',\n * recommendedClassDrafts: '/recommended-class/drafts',\n * submitRecommendedClass: '/recommendedClass',\n * },\n * texts: {\n * title: 'Histórico de aulas recomendadas',\n * createButtonText: 'Criar aula',\n * searchPlaceholder: 'Buscar aula',\n * },\n * emptyStateImage,\n * noSearchImage,\n * mapSubjectNameToEnum,\n * });\n *\n * // In your component\n * const { historyProps, modalProps, navigate } = useRecommendedLessonsPage();\n * ```\n */\ntype FilterDataState = {\n schools: Array<{ id: string; name: string }>;\n classes: Array<{ id: string; name: string }>;\n subjects: Array<{ id: string; name: string }>;\n schoolYears: Array<{ id: string; name: string }>;\n};\n\n/**\n * Convert a Map of id→name pairs to an array of {id, name} objects\n */\nconst toFilterArray = (m: Map<string, string>) =>\n Array.from(m.entries()).map(([id, name]) => ({ id, name }));\n\n/**\n * Collect school, class and schoolYear data from a single breakdown entry\n */\nconst collectBreakdownData = (\n b: RecommendedClassHistoryItem['breakdown'][number],\n schoolMap: Map<string, string>,\n classMap: Map<string, string>,\n schoolYearMap: Map<string, string>\n) => {\n if (b.schoolId && b.schoolName) {\n schoolMap.set(b.schoolId, b.schoolName);\n }\n if (b.classId && b.className) {\n classMap.set(b.classId, b.className);\n }\n if (b.schoolYearId && b.schoolYearName) {\n schoolYearMap.set(b.schoolYearId, b.schoolYearName);\n }\n};\n\n/**\n * Extract filter maps from history response items\n */\nconst extractMapsFromItems = (\n items: RecommendedClassHistoryItem[]\n): {\n schoolMap: Map<string, string>;\n classMap: Map<string, string>;\n subjectMap: Map<string, string>;\n schoolYearMap: Map<string, string>;\n} => {\n const schoolMap = new Map<string, string>();\n const classMap = new Map<string, string>();\n const subjectMap = new Map<string, string>();\n const schoolYearMap = new Map<string, string>();\n\n for (const item of items) {\n if (item.subject?.id && item.subject?.name) {\n subjectMap.set(item.subject.id, item.subject.name);\n }\n for (const b of item.breakdown) {\n collectBreakdownData(b, schoolMap, classMap, schoolYearMap);\n }\n }\n\n return { schoolMap, classMap, subjectMap, schoolYearMap };\n};\n\n/**\n * Extract unique subjects from draft/model items for filter population\n */\nconst extractSubjectsFromDraftItems = (\n drafts: RecommendedClassModelResponse[]\n): Array<{ id: string; name: string }> => {\n const subjectMap = new Map<string, string>();\n for (const draft of drafts) {\n if (draft.subject?.id && draft.subject?.name) {\n subjectMap.set(draft.subject.id, draft.subject.name);\n }\n }\n return Array.from(subjectMap.entries()).map(([id, name]) => ({ id, name }));\n};\n\n/**\n * Check if a merged map differs from the previous array (size or name changes)\n */\nconst hasMapChanged = (\n merged: Map<string, string>,\n prev: Array<{ id: string; name: string }>\n): boolean => {\n if (merged.size !== prev.length) return true;\n return prev.some((item) => merged.get(item.id) !== item.name);\n};\n\n/**\n * Merge new filter maps with previous filter state, returning prev if unchanged\n */\nconst mergeFilterData = (\n prev: FilterDataState,\n maps: {\n schoolMap: Map<string, string>;\n classMap: Map<string, string>;\n subjectMap: Map<string, string>;\n schoolYearMap: Map<string, string>;\n }\n): FilterDataState => {\n const mergedSchools = new Map([\n ...prev.schools.map((s) => [s.id, s.name] as [string, string]),\n ...maps.schoolMap,\n ]);\n const mergedClasses = new Map([\n ...prev.classes.map((c) => [c.id, c.name] as [string, string]),\n ...maps.classMap,\n ]);\n const mergedSubjects = new Map([\n ...prev.subjects.map((s) => [s.id, s.name] as [string, string]),\n ...maps.subjectMap,\n ]);\n const mergedSchoolYears = new Map([\n ...prev.schoolYears.map((y) => [y.id, y.name] as [string, string]),\n ...maps.schoolYearMap,\n ]);\n\n if (\n !hasMapChanged(mergedSchools, prev.schools) &&\n !hasMapChanged(mergedClasses, prev.classes) &&\n !hasMapChanged(mergedSubjects, prev.subjects) &&\n !hasMapChanged(mergedSchoolYears, prev.schoolYears)\n ) {\n return prev;\n }\n\n return {\n schools: toFilterArray(mergedSchools),\n classes: toFilterArray(mergedClasses),\n subjects: toFilterArray(mergedSubjects),\n schoolYears: toFilterArray(mergedSchoolYears),\n };\n};\n\n/**\n * Merge two arrays of filter options, deduplicating by id\n */\nconst mergeFilterOptions = (\n base: Array<{ id: string; name: string }>,\n extra: Array<{ id: string; name: string }>\n): Array<{ id: string; name: string }> => {\n if (extra.length === 0) return base;\n const baseIds = new Set(base.map((item) => item.id));\n const hasNew = extra.some((item) => !baseIds.has(item.id));\n if (!hasNew) return base;\n\n const map = new Map(base.map((item) => [item.id, item.name] as const));\n extra.forEach((item) => {\n if (!map.has(item.id)) {\n map.set(item.id, item.name);\n }\n });\n return Array.from(map.entries()).map(([id, name]) => ({ id, name }));\n};\n\nexport const createUseRecommendedLessonsPage = (\n config: UseRecommendedLessonsPageConfig\n): (() => UseRecommendedLessonsPageReturn) => {\n const {\n api,\n navigate,\n userData,\n paths,\n endpoints,\n texts,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n extraFilterCategories,\n } = config;\n\n return (): UseRecommendedLessonsPageReturn => {\n // Store original recommendedClass data for navigation\n const recommendedClassMapRef = useRef<\n Map<string, RecommendedClassHistoryItem>\n >(new Map());\n\n // Filter data extracted from history API responses\n const [historyFilterData, setHistoryFilterData] = useState<FilterDataState>(\n {\n schools: [],\n classes: [],\n subjects: [],\n schoolYears: [],\n }\n );\n\n // SendLessonModal state\n const [sendModalOpen, setSendModalOpen] = useState(false);\n const [selectedModel, setSelectedModel] =\n useState<RecommendedClassModelTableItem | null>(null);\n const [sendModalLoading, setSendModalLoading] = useState(false);\n const [sendModalCategories, setSendModalCategories] = useState<\n CategoryConfig[]\n >([]);\n\n // Build user filter data: merge userData with historyFilterData (union, dedupe by id)\n const userFilterData = useMemo(() => {\n const baseSchools = getSchoolOptions(userData);\n const baseClasses = getClassOptions(userData);\n const baseSubjects = getSubjectOptions(userData);\n const baseSchoolYears = getSchoolYearOptions(userData);\n return {\n schools: mergeFilterOptions(baseSchools, historyFilterData.schools),\n classes: mergeFilterOptions(baseClasses, historyFilterData.classes),\n subjects: mergeFilterOptions(baseSubjects, historyFilterData.subjects),\n schoolYears: mergeFilterOptions(\n baseSchoolYears,\n historyFilterData.schoolYears\n ),\n };\n }, [userData, historyFilterData]);\n\n // Memoized subjects map for models display\n const subjectsMap = useMemo(() => {\n const map = new Map<string, string>();\n userFilterData.subjects.forEach((s) => {\n map.set(s.id, s.name);\n });\n return map;\n }, [userFilterData.subjects]);\n\n /**\n * Extract unique filter options from history response data\n */\n const extractFilterDataFromHistory = useCallback(\n (items: RecommendedClassHistoryItem[]) => {\n const maps = extractMapsFromItems(items);\n setHistoryFilterData((prev) => mergeFilterData(prev, maps));\n },\n []\n );\n\n /**\n * Fetch recommendedClass history from API\n */\n const fetchRecommendedClassHistory = useCallback(\n async (\n filters?: RecommendedClassHistoryFilters\n ): Promise<RecommendedClassHistoryApiResponse> => {\n const params = buildQueryParams(filters as Record<string, unknown>);\n const response = await api.get<RecommendedClassHistoryApiResponse>(\n endpoints.recommendedClassHistory,\n { params }\n );\n\n // Store original recommendedClass data for later use in navigation\n const items = response.data.data.recommendedClass;\n items.forEach((item) => {\n recommendedClassMapRef.current.set(item.recommendedClass.id, item);\n });\n\n // Extract filter options from response data\n extractFilterDataFromHistory(items);\n\n return response.data;\n },\n [api, endpoints.recommendedClassHistory, extractFilterDataFromHistory]\n );\n\n /**\n * Fetch recommendedClass models from API\n */\n const fetchRecommendedClassModels = useCallback(\n async (\n filters?: RecommendedClassModelFilters\n ): Promise<RecommendedClassModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: RecommendedClassDraftType.MODELO,\n });\n const response = await api.get<RecommendedClassModelsApiResponse>(\n endpoints.recommendedClassDrafts,\n { params }\n );\n\n // Extract subjects from response to populate the subject filter\n const subjects = extractSubjectsFromDraftItems(\n response.data.data.drafts\n );\n if (subjects.length > 0) {\n setHistoryFilterData((prev) => ({\n ...prev,\n subjects: mergeFilterOptions(prev.subjects, subjects),\n }));\n }\n\n return response.data;\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass model\n */\n const deleteRecommendedClassModel = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Fetch recommendedClass drafts from API\n */\n const fetchRecommendedClassDrafts = useCallback(\n async (\n filters?: RecommendedClassModelFilters\n ): Promise<RecommendedClassModelsApiResponse> => {\n const params = buildQueryParams({\n ...filters,\n type: RecommendedClassDraftType.RASCUNHO,\n });\n const response = await api.get<RecommendedClassModelsApiResponse>(\n endpoints.recommendedClassDrafts,\n { params }\n );\n\n // Extract subjects from response to populate the subject filter\n const subjects = extractSubjectsFromDraftItems(\n response.data.data.drafts\n );\n if (subjects.length > 0) {\n setHistoryFilterData((prev) => ({\n ...prev,\n subjects: mergeFilterOptions(prev.subjects, subjects),\n }));\n }\n\n return response.data;\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Delete a recommendedClass draft\n */\n const deleteRecommendedClassDraft = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.recommendedClassDrafts}/${id}`);\n },\n [api, endpoints.recommendedClassDrafts]\n );\n\n /**\n * Handle create lesson button click\n */\n const handleCreateLesson = useCallback(() => {\n navigate(paths.createLesson);\n }, []);\n\n /**\n * Handle create model button click\n */\n const handleCreateModel = useCallback(() => {\n navigate(paths.createModel);\n }, []);\n\n /**\n * Handle row click - navigate to recommendedClass details\n */\n const handleRowClick = useCallback((row: RecommendedClassTableItem) => {\n const originalData = recommendedClassMapRef.current.get(row.id);\n navigate(`${paths.lessonDetails}/${row.id}`, {\n state: { recommendedClassData: originalData },\n });\n }, []);\n\n /**\n * Delete a recommendedClass (history item)\n */\n const deleteRecommendedClass = useCallback(\n async (id: string): Promise<void> => {\n await api.delete(`${endpoints.submitRecommendedClass}/${id}`);\n },\n [api, endpoints.submitRecommendedClass]\n );\n\n /**\n * Update a recommendedClass (history item) title and/or dates\n */\n const updateRecommendedClass = useCallback(\n async (id: string, data: UpdateRecommendedClassData): Promise<void> => {\n await api.patch(`${endpoints.submitRecommendedClass}/${id}`, data);\n },\n [api, endpoints.submitRecommendedClass]\n );\n\n /**\n * Fetch a single recommendedClass by id (used to pre-fill the edit modal)\n */\n const fetchRecommendedClassById = useCallback(\n async (id: string): Promise<RecommendedClassData> => {\n const response = await api.get<{ data: RecommendedClassData }>(\n `${endpoints.submitRecommendedClass}/${id}`\n );\n return response.data.data;\n },\n [api, endpoints.submitRecommendedClass]\n );\n\n /**\n * Handle edit model action\n */\n const handleEditModel = useCallback(\n (model: RecommendedClassModelTableItem) => {\n navigate(`${paths.editModel}${model.id}`);\n },\n []\n );\n\n /**\n * Handle send lesson button click - opens modal\n */\n const handleSendLesson = useCallback(\n async (model: RecommendedClassModelTableItem) => {\n setSelectedModel(model);\n\n // Load recipients from the API (same flow as lesson creation), so the\n // Destinatário step shows the Escola → Série → Turma → Aluno cascade.\n try {\n const categories = await loadCategoriesData(api, []);\n setSendModalCategories(categories);\n } catch (error) {\n console.error('Erro ao carregar destinatários:', error);\n setSendModalCategories([]);\n }\n\n setSendModalOpen(true);\n },\n [api]\n );\n\n /**\n * Handle send lesson modal submit\n */\n const handleSendLessonSubmit = useCallback(\n async (formData: SendLessonFormData) => {\n if (!selectedModel) return;\n\n setSendModalLoading(true);\n try {\n // The model row only carries summary data, so fetch the draft to get\n // its lessons/activities. POST /recommended-class requires lessonIds\n // and a target — here we target the selected students.\n const draftResponse = await api.get<{\n data: {\n title: string;\n lessons?: Array<{ lessonId: string }>;\n activityDrafts?: Array<{ activityDraftId: string }>;\n };\n }>(`${endpoints.recommendedClassDrafts}/${selectedModel.id}`);\n const draft = draftResponse.data.data;\n\n const lessonIds = (draft.lessons ?? []).map((lesson, index) => ({\n lessonId: lesson.lessonId,\n sequence: index + 1,\n }));\n\n const activityDraftIds = (draft.activityDrafts ?? []).map(\n (activity, index) => ({\n activityDraftId: activity.activityDraftId,\n sequence: index + 1,\n })\n );\n const hasAttachedActivities = activityDraftIds.length > 0;\n\n await api.post(endpoints.submitRecommendedClass, {\n title: formData.title || selectedModel.title,\n startDate: new Date(\n `${formData.startDate}T${formData.startTime}`\n ).toISOString(),\n finalDate: new Date(\n `${formData.finalDate}T${formData.finalTime}`\n ).toISOString(),\n lessonIds,\n ...(hasAttachedActivities && { activityDraftIds }),\n targetStudentIds: formData.students.map((s) => s.userInstitutionId),\n ...(formData.notification && {\n notification: formData.notification,\n }),\n ...(hasAttachedActivities && {\n canRetry: formData.canRetry ?? false,\n }),\n });\n\n setSendModalOpen(false);\n setSelectedModel(null);\n } finally {\n setSendModalLoading(false);\n }\n },\n [\n api,\n endpoints.recommendedClassDrafts,\n endpoints.submitRecommendedClass,\n selectedModel,\n ]\n );\n\n /**\n * Handle send lesson modal close\n */\n const handleSendModalClose = useCallback(() => {\n setSendModalOpen(false);\n setSelectedModel(null);\n }, []);\n\n /**\n * Handle categories change in the send modal, fetching students\n * dynamically as the school/série/turma selection changes.\n */\n const { handleCategoriesChange } = useDynamicStudentFetching(\n setSendModalCategories,\n { apiClient: api as unknown as BaseApiClient }\n );\n\n return {\n historyProps: {\n fetchRecommendedClassHistory,\n fetchRecommendedClassModels,\n deleteRecommendedClassModel,\n onCreateLesson: handleCreateLesson,\n onCreateModel: handleCreateModel,\n onRowClick: handleRowClick,\n deleteRecommendedClass,\n updateRecommendedClass,\n fetchRecommendedClassById,\n onEditModel: handleEditModel,\n onSendLesson: handleSendLesson,\n fetchRecommendedClassDrafts,\n deleteRecommendedClassDraft,\n onSendDraft: handleSendLesson,\n onEditDraft: handleEditModel,\n emptyStateImage,\n noSearchImage,\n mapSubjectNameToEnum,\n userFilterData,\n subjectsMap,\n title: texts.title,\n createButtonText: texts.createButtonText,\n searchPlaceholder: texts.searchPlaceholder,\n extraFilterCategories,\n },\n modalProps: {\n isOpen: sendModalOpen,\n onClose: handleSendModalClose,\n onSubmit: handleSendLessonSubmit,\n categories: sendModalCategories,\n onCategoriesChange: handleCategoriesChange,\n isLoading: sendModalLoading,\n modalTitle: selectedModel?.title,\n hasAttachedActivities: (selectedModel?.activityDraftsCount ?? 0) > 0,\n },\n navigate,\n };\n };\n};\n\n/**\n * Alias for createUseRecommendedLessonsPage\n */\nexport const createRecommendedLessonsPageHook = createUseRecommendedLessonsPage;\n"],"mappings":"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","names":[]}