{"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":[]}