{"version":3,"sources":["../src/components/RecommendedLessonDetails/RecommendedLessonDetails.tsx","../src/components/RecommendedLessonDetails/components/Breadcrumb.tsx","../src/components/RecommendedLessonDetails/components/LessonHeader.tsx","../src/components/RecommendedLessonDetails/utils/lessonDetailsUtils.ts","../src/components/RecommendedLessonDetails/components/LoadingSkeleton.tsx","../src/components/RecommendedLessonDetails/components/ResultsSection.tsx","../src/components/RecommendedLessonDetails/components/StudentsTable.tsx","../src/components/RecommendedLessonDetails/components/StudentPerformanceModal.tsx","../src/components/RecommendedLessonDetails/components/StudentActivityPerformanceModal.tsx","../src/components/RecommendedLessonDetails/components/RecommendedLessonViewModal.tsx","../src/components/RecommendedLessonDetails/utils/performanceUtils.ts"],"sourcesContent":["import { useMemo, useState, useCallback } from 'react';\nimport Text from '../Text/Text';\nimport useToastStore from '../Toast/utils/ToastStore';\nimport { cn } from '../../utils/utils';\nimport type { LessonDetailsData } from '../../types/recommendedLessons';\nimport type { SubjectEnum } from '../../enums/SubjectEnum';\nimport type { BaseApiClient } from '../../types/api';\nimport {\n  Breadcrumb,\n  LessonHeader,\n  LoadingSkeleton,\n  ResultsSection,\n  StudentsTable,\n  StudentActivityPerformanceModal,\n  RecommendedLessonViewModal,\n} from './components';\nimport { transformStudentForDisplay } from './utils/lessonDetailsUtils';\nimport {\n  convertStudentAnswersToPerformanceData,\n  type StudentAnswersResponse,\n} from './utils/performanceUtils';\nimport {\n  DEFAULT_LABELS,\n  type BreadcrumbItem,\n  type LessonDetailsLabels,\n  type StudentActivityPerformanceData,\n} from './types';\n\n/**\n * Props for RecommendedLessonDetails component\n */\nexport interface RecommendedLessonDetailsProps {\n  /** Lesson data to display (from API responses) */\n  data: LessonDetailsData | null;\n  /** Loading state */\n  loading?: boolean;\n  /** Error message */\n  error?: string | null;\n  /** Callback when \"Ver aula\" button is clicked */\n  onViewLesson?: () => void;\n  /**\n   * API client for making requests.\n   * When provided, enables the \"Corrigir atividade\" functionality.\n   */\n  apiClient?: BaseApiClient;\n  /** Callback for breadcrumb navigation */\n  onBreadcrumbClick?: (path: string) => void;\n  /** Function to map subject name to SubjectEnum */\n  mapSubjectNameToEnum?: (name: string) => SubjectEnum | null;\n  /** Custom breadcrumb items */\n  breadcrumbs?: BreadcrumbItem[];\n  /** Custom labels */\n  labels?: Partial<LessonDetailsLabels>;\n  /** Additional CSS classes */\n  className?: string;\n}\n\n/**\n * RecommendedLessonDetails component\n *\n * Displays detailed information about a recommended lesson including:\n * - Breadcrumb navigation\n * - Lesson metadata (title, dates, school, subject, class)\n * - Results cards (completion %, best result topic, hardest topic)\n * - Students table with status, progress, and actions\n *\n * @example\n * ```tsx\n * <RecommendedLessonDetails\n *   data={{\n *     recommendedClass: recommendedClassData,       // from /recommendedClass/{id}\n *     details: detailsData, // from /recommendedClass/{id}/details\n *     breakdown: breakdown, // optional, from /recommended-class/history\n *   }}\n *   apiClient={api}\n *   onViewLesson={() => navigate('/view-lesson')}\n *   mapSubjectNameToEnum={mapSubjectNameToEnum}\n * />\n * ```\n */\nconst RecommendedLessonDetails = ({\n  data,\n  loading = false,\n  error = null,\n  onViewLesson,\n  apiClient,\n  onBreadcrumbClick,\n  mapSubjectNameToEnum,\n  breadcrumbs,\n  labels: customLabels,\n  className,\n}: RecommendedLessonDetailsProps) => {\n  const labels = useMemo(\n    () => ({ ...DEFAULT_LABELS, ...customLabels }),\n    [customLabels]\n  );\n\n  // Toast store for notifications\n  const addToast = useToastStore((state) => state.addToast);\n\n  // Activity performance modal state\n  const [performanceModalOpen, setPerformanceModalOpen] = useState(false);\n  const [performanceData, setPerformanceData] =\n    useState<StudentActivityPerformanceData | null>(null);\n  const [performanceLoading, setPerformanceLoading] = useState(false);\n  const [performanceError, setPerformanceError] = useState<string | null>(null);\n\n  // View lesson modal state\n  const [viewLessonModalOpen, setViewLessonModalOpen] = useState(false);\n\n  /**\n   * Handle correct activity action\n   * Fetches all activities and lessons for the student and opens the performance modal\n   */\n  const handleCorrectActivity = useCallback(\n    async (studentId: string) => {\n      if (!apiClient || !data?.recommendedClass.id) return;\n\n      // Find student from data\n      const student = data?.details.students.find(\n        (s) => s.userInstitutionId === studentId\n      );\n\n      // Guard: ensure student and userId are valid before proceeding\n      if (!student?.userId) {\n        addToast({\n          title: 'Erro ao carregar aluno',\n          description: 'Não foi possível identificar o aluno. Tente novamente.',\n          variant: 'solid',\n          action: 'warning',\n          position: 'top-right',\n        });\n        return;\n      }\n\n      const studentName = student.name;\n      const userId = student.userId;\n\n      setPerformanceModalOpen(true);\n      setPerformanceLoading(true);\n      setPerformanceData(null);\n      setPerformanceError(null);\n\n      try {\n        // Fetch all answers for the student in this recommended class\n        const response = await apiClient.get<StudentAnswersResponse>(\n          `/recommended-class/${data.recommendedClass.id}/student/${studentId}/answers`\n        );\n\n        // Convert API response to performance data format\n        const performanceData = convertStudentAnswersToPerformanceData(\n          response.data,\n          studentId,\n          userId,\n          studentName\n        );\n\n        setPerformanceData(performanceData);\n      } catch (err) {\n        console.error('Error fetching activity performance data:', err);\n        setPerformanceError(\n          err instanceof Error\n            ? err.message\n            : 'Erro ao carregar desempenho do aluno'\n        );\n      } finally {\n        setPerformanceLoading(false);\n      }\n    },\n    [apiClient, data?.recommendedClass.id, data?.details.students, addToast]\n  );\n\n  /**\n   * Handle close performance modal\n   */\n  const handleClosePerformanceModal = useCallback(() => {\n    setPerformanceModalOpen(false);\n    setPerformanceData(null);\n    setPerformanceError(null);\n  }, []);\n\n  /**\n   * Handle view lesson action\n   * If onViewLesson prop is provided, call it; otherwise open internal modal\n   */\n  const handleViewLesson = useCallback(() => {\n    if (onViewLesson) {\n      onViewLesson();\n    } else {\n      setViewLessonModalOpen(true);\n    }\n  }, [onViewLesson]);\n\n  /**\n   * Handle close view lesson modal\n   */\n  const handleCloseViewLessonModal = useCallback(() => {\n    setViewLessonModalOpen(false);\n  }, []);\n\n  const defaultBreadcrumbs: BreadcrumbItem[] = useMemo(\n    () => [\n      { label: 'Aulas recomendadas', path: '/aulas-recomendadas' },\n      { label: data?.recommendedClass.title || 'Detalhes' },\n    ],\n    [data?.recommendedClass.title]\n  );\n\n  const breadcrumbItems = breadcrumbs || defaultBreadcrumbs;\n\n  // Transform API students to display format\n  const displayStudents = useMemo(() => {\n    if (!data?.details.students) return [];\n    const deadline = data?.recommendedClass.finalDate;\n    return data.details.students.map((student) =>\n      transformStudentForDisplay(student, deadline)\n    );\n  }, [data?.details.students, data?.recommendedClass.finalDate]);\n\n  if (loading) {\n    return (\n      <div\n        className={cn('flex flex-col gap-6', className)}\n        data-testid=\"lesson-details-loading\"\n      >\n        <LoadingSkeleton />\n      </div>\n    );\n  }\n\n  if (error) {\n    return (\n      <div\n        className={cn(\n          'flex flex-col items-center justify-center py-12',\n          className\n        )}\n        data-testid=\"lesson-details-error\"\n      >\n        <Text size=\"md\" className=\"text-error-700\">\n          {error}\n        </Text>\n      </div>\n    );\n  }\n\n  if (!data) {\n    return null;\n  }\n\n  return (\n    <>\n      <div\n        className={cn('flex flex-col gap-6', className)}\n        data-testid=\"recommended-class-details\"\n      >\n        {/* Breadcrumb */}\n        <Breadcrumb items={breadcrumbItems} onItemClick={onBreadcrumbClick} />\n\n        {/* Header with metadata */}\n        <LessonHeader\n          data={data}\n          onViewLesson={handleViewLesson}\n          mapSubjectNameToEnum={mapSubjectNameToEnum}\n          viewLessonLabel={labels.viewLesson}\n        />\n\n        {/* Results section */}\n        <ResultsSection data={data} labels={labels} />\n\n        {/* Students table */}\n        <StudentsTable\n          students={displayStudents}\n          onCorrectActivity={apiClient ? handleCorrectActivity : undefined}\n          labels={labels}\n        />\n      </div>\n\n      {/* Student Activity Performance Modal */}\n      {apiClient && (\n        <StudentActivityPerformanceModal\n          isOpen={performanceModalOpen}\n          onClose={handleClosePerformanceModal}\n          data={performanceData}\n          loading={performanceLoading}\n          error={performanceError}\n          apiClient={apiClient}\n        />\n      )}\n\n      {/* View Lesson Modal */}\n      <RecommendedLessonViewModal\n        isOpen={viewLessonModalOpen}\n        onClose={handleCloseViewLessonModal}\n        data={data}\n        apiClient={apiClient}\n      />\n    </>\n  );\n};\n\nexport default RecommendedLessonDetails;\n","import { CaretRightIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport type { BreadcrumbItem } from '../types';\n\n/**\n * Props for Breadcrumb component\n */\ninterface BreadcrumbProps {\n  /** Breadcrumb items to display */\n  items: BreadcrumbItem[];\n  /** Callback when a breadcrumb item is clicked */\n  onItemClick?: (path: string) => void;\n}\n\n/**\n * Breadcrumb navigation component\n * Displays a path of navigation items with optional click handlers\n */\nexport const Breadcrumb = ({ items, onItemClick }: BreadcrumbProps) => (\n  <nav className=\"flex items-center gap-2 text-sm\" aria-label=\"Breadcrumb\">\n    {items.map((item, index) => (\n      <Text\n        key={item.path ?? item.label}\n        as=\"span\"\n        className=\"flex items-center gap-2\"\n      >\n        {index > 0 && <CaretRightIcon size={14} className=\"text-text-500\" />}\n        {item.path ? (\n          <button\n            type=\"button\"\n            onClick={() => onItemClick?.(item.path!)}\n            className=\"text-text-600 hover:text-primary-700 transition-colors\"\n          >\n            {item.label}\n          </button>\n        ) : (\n          <Text as=\"span\" className=\"text-text-950 font-medium\">\n            {item.label}\n          </Text>\n        )}\n      </Text>\n    ))}\n  </nav>\n);\n\nexport default Breadcrumb;\n","import { BookBookmarkIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport Button from '../../Button/Button';\nimport { getSubjectInfo } from '../../SubjectInfo/SubjectInfo';\nimport { cn } from '../../../utils/utils';\nimport type { LessonDetailsData } from '../../../types/recommendedLessons';\nimport type { SubjectEnum } from '../../../enums/SubjectEnum';\nimport { formatDate } from '../utils/lessonDetailsUtils';\n\n/**\n * Props for LessonHeader component\n */\ninterface LessonHeaderProps {\n  /** Lesson details data */\n  data: LessonDetailsData;\n  /** Callback when \"Ver aula\" button is clicked */\n  onViewLesson?: () => void;\n  /** Function to map subject name to SubjectEnum */\n  mapSubjectNameToEnum?: (name: string) => SubjectEnum | null;\n  /** Label for the view lesson button */\n  viewLessonLabel: string;\n}\n\n/**\n * Header section with lesson metadata\n * Displays title, dates, school, subject, and class information\n */\nexport const LessonHeader = ({\n  data,\n  onViewLesson,\n  mapSubjectNameToEnum,\n  viewLessonLabel,\n}: LessonHeaderProps) => {\n  const { recommendedClass, breakdown } = data;\n\n  // Extract subject from first lesson if available\n  const subjectName =\n    recommendedClass.lessons[0]?.supLessonsProgress?.lesson?.subject?.name ||\n    '';\n  const subjectEnum = mapSubjectNameToEnum?.(subjectName);\n  const subjectInfo = subjectEnum ? getSubjectInfo(subjectEnum) : null;\n\n  return (\n    <div className=\"bg-background rounded-xl border border-border-50 p-6\">\n      <div className=\"flex flex-col lg:flex-row lg:items-start lg:justify-between gap-4\">\n        <div className=\"flex flex-col gap-2\">\n          <Text\n            as=\"h1\"\n            size=\"xl\"\n            weight=\"bold\"\n            className=\"text-text-950 lg:text-2xl\"\n          >\n            {recommendedClass.title}\n          </Text>\n          <div className=\"flex flex-wrap items-center gap-2 text-sm text-text-600\">\n            <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n              Início em {formatDate(recommendedClass.startDate)}\n            </Text>\n            <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n              •\n            </Text>\n            <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n              Prazo final {formatDate(recommendedClass.finalDate)}\n            </Text>\n            {breakdown?.schoolName && (\n              <>\n                <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n                  •\n                </Text>\n                <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n                  {breakdown.schoolName}\n                </Text>\n              </>\n            )}\n            {subjectName && (\n              <>\n                <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n                  •\n                </Text>\n                <Text as=\"span\" size=\"sm\" className=\"flex items-center gap-1\">\n                  {subjectInfo && (\n                    <Text\n                      as=\"span\"\n                      className={cn(\n                        'size-5 rounded flex items-center justify-center text-white',\n                        subjectInfo.colorClass\n                      )}\n                    >\n                      {subjectInfo.icon}\n                    </Text>\n                  )}\n                  {subjectName}\n                </Text>\n              </>\n            )}\n            {breakdown?.className && (\n              <>\n                <Text as=\"span\" size=\"sm\" className=\"text-text-400\">\n                  •\n                </Text>\n                <Text as=\"span\" size=\"sm\" className=\"text-text-600\">\n                  {breakdown.className}\n                </Text>\n              </>\n            )}\n          </div>\n        </div>\n        {onViewLesson && (\n          <Button\n            variant=\"solid\"\n            action=\"primary\"\n            size=\"small\"\n            iconLeft={<BookBookmarkIcon size={16} />}\n            onClick={onViewLesson}\n          >\n            {viewLessonLabel}\n          </Button>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default LessonHeader;\n","import type { RecommendedClassDetailStudent } from '../../../types/recommendedLessons';\nimport {\n  deriveStudentStatus,\n  formatDaysToComplete,\n} from '../../../types/recommendedLessons';\nimport type { DisplayStudent } from '../types';\n\n/**\n * Format date string to display format (DD/MM/YYYY)\n * @param dateString - ISO date string or null\n * @returns Formatted date string or placeholder\n */\nexport const formatDate = (dateString: string | null): string => {\n  if (!dateString) return '-';\n  const date = new Date(dateString);\n  if (Number.isNaN(date.getTime())) return '-';\n  return date.toLocaleDateString('pt-BR', {\n    day: '2-digit',\n    month: '2-digit',\n    year: 'numeric',\n  });\n};\n\n/**\n * Transform API student data to display format\n * @param student - Student data from API\n * @param deadline - RecommendedClass deadline to determine NAO_FINALIZADO status\n * @returns Transformed student for table display\n */\nexport const transformStudentForDisplay = (\n  student: RecommendedClassDetailStudent,\n  deadline?: string | null\n): DisplayStudent => ({\n  id: student.userInstitutionId,\n  name: student.name,\n  status: deriveStudentStatus(student.progress, student.completedAt, deadline),\n  completionPercentage: student.progress,\n  duration: formatDaysToComplete(student.daysToComplete),\n});\n","import {\n  SkeletonText,\n  SkeletonRounded,\n  SkeletonTable,\n} from '../../Skeleton/Skeleton';\n\n/**\n * Loading skeleton component for RecommendedLessonDetails\n * Uses the shared Skeleton components from the library\n */\nexport const LoadingSkeleton = () => (\n  <div className=\"flex flex-col gap-6\">\n    {/* Breadcrumb skeleton */}\n    <SkeletonText width={256} />\n\n    {/* Header skeleton */}\n    <div className=\"bg-background rounded-xl border border-border-50 p-6\">\n      <div className=\"flex flex-col gap-3\">\n        <SkeletonText width=\"75%\" height={28} />\n        <SkeletonText width=\"50%\" />\n      </div>\n    </div>\n\n    {/* Results section skeleton */}\n    <div className=\"flex flex-col gap-4\">\n      <SkeletonText width={192} height={20} />\n      <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n        <SkeletonRounded height={140} />\n        <SkeletonRounded height={140} />\n        <SkeletonRounded height={140} />\n      </div>\n    </div>\n\n    {/* Table skeleton */}\n    <div className=\"bg-background rounded-xl border border-border-50 p-4\">\n      <SkeletonTable rows={4} columns={5} />\n    </div>\n  </div>\n);\n\nexport default LoadingSkeleton;\n","import { TrophyIcon, WarningIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport ProgressCircle from '../../ProgressCircle/ProgressCircle';\nimport type { LessonDetailsData } from '../../../types/recommendedLessons';\nimport type { LessonDetailsLabels } from '../types';\n\n/**\n * Props for ResultsSection component\n */\ninterface ResultsSectionProps {\n  /** Lesson details data */\n  data: LessonDetailsData;\n  /** Labels for the component */\n  labels: LessonDetailsLabels;\n}\n\n/**\n * Results section with 3 cards\n * Displays completion percentage, best result, and hardest topic\n */\nexport const ResultsSection = ({ data, labels }: ResultsSectionProps) => {\n  const { details } = data;\n  const { aggregated, contentPerformance } = details;\n\n  return (\n    <div className=\"flex flex-col gap-4\">\n      <Text as=\"h2\" size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n        {labels.resultsTitle}\n      </Text>\n      {/* White container with the 3 cards */}\n      <div className=\"bg-background rounded-xl border border-border-50 p-4\">\n        <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n          {/* Completion percentage card */}\n          <div className=\"flex flex-col items-center justify-center rounded-xl p-4 min-h-28 bg-primary-50\">\n            <ProgressCircle\n              value={aggregated.completionPercentage}\n              size=\"small\"\n              variant=\"blue\"\n              label={labels.completedLabel}\n              showPercentage\n            />\n          </div>\n\n          {/* Best result topic card */}\n          <div className=\"flex flex-col items-center justify-center rounded-xl p-4 min-h-28 bg-success-200\">\n            <Text\n              as=\"span\"\n              className=\"size-8 rounded-full flex items-center justify-center bg-warning-300 mb-2\"\n            >\n              <TrophyIcon size={18} weight=\"fill\" className=\"text-white\" />\n            </Text>\n            <Text\n              size=\"2xs\"\n              weight=\"bold\"\n              className=\"text-text-700 uppercase text-center leading-none mb-1\"\n            >\n              {labels.bestResultLabel}\n            </Text>\n            <Text\n              size=\"xl\"\n              weight=\"bold\"\n              className=\"text-success-700 text-center leading-none tracking-wide\"\n            >\n              {contentPerformance.best?.contentName || '-'}\n            </Text>\n          </div>\n\n          {/* Hardest topic card */}\n          <div className=\"flex flex-col items-center justify-center rounded-xl p-4 min-h-28 bg-error-100\">\n            <Text\n              as=\"span\"\n              className=\"size-8 rounded-full flex items-center justify-center bg-error-300 mb-2\"\n            >\n              <WarningIcon size={18} weight=\"fill\" className=\"text-error-700\" />\n            </Text>\n            <Text\n              size=\"2xs\"\n              weight=\"bold\"\n              className=\"text-text-700 uppercase text-center leading-none mb-1\"\n            >\n              {labels.hardestTopicLabel}\n            </Text>\n            <Text\n              size=\"xl\"\n              weight=\"bold\"\n              className=\"text-error-700 text-center leading-none tracking-wide\"\n            >\n              {contentPerformance.worst?.contentName || '-'}\n            </Text>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default ResultsSection;\n","import { UserIcon } from '@phosphor-icons/react';\nimport Text from '../../Text/Text';\nimport { TruncatedText } from '../../TruncatedText/TruncatedText';\nimport Button from '../../Button/Button';\nimport Badge from '../../Badge/Badge';\nimport ProgressBar from '../../ProgressBar/ProgressBar';\nimport Table, {\n  TableHeader,\n  TableBody,\n  TableHead,\n  TableRow,\n  TableCell,\n  useTableSort,\n} from '../../Table/Table';\nimport { getStudentStatusBadgeAction } from '../../../types/recommendedLessons';\nimport type { DisplayStudent, LessonDetailsLabels } from '../types';\n\n/**\n * Props for StudentsTable component\n */\ninterface StudentsTableProps {\n  /** List of students to display */\n  students: DisplayStudent[];\n  /** Callback when correct activity is clicked */\n  onCorrectActivity?: (studentId: string) => void;\n  /** Labels for the component */\n  labels: LessonDetailsLabels;\n  /** Empty state message */\n  emptyMessage?: string;\n}\n\n/**\n * Students table component\n * Displays students with their status, completion, and duration\n */\nexport const StudentsTable = ({\n  students,\n  onCorrectActivity,\n  labels,\n  emptyMessage = 'Nenhum aluno encontrado',\n}: StudentsTableProps) => {\n  const { sortedData, sortColumn, sortDirection, handleSort } =\n    useTableSort<DisplayStudent>(students);\n\n  return (\n    <div className=\"bg-background rounded-xl border border-border-50 overflow-hidden\">\n      <Table>\n        <TableHeader>\n          <TableRow>\n            <TableHead\n              sortable\n              sortDirection={sortColumn === 'name' ? sortDirection : undefined}\n              onSort={() => handleSort('name')}\n            >\n              {labels.studentColumn}\n            </TableHead>\n            <TableHead\n              sortable\n              sortDirection={\n                sortColumn === 'status' ? sortDirection : undefined\n              }\n              onSort={() => handleSort('status')}\n            >\n              {labels.statusColumn}\n            </TableHead>\n            <TableHead\n              sortable\n              sortDirection={\n                sortColumn === 'completionPercentage'\n                  ? sortDirection\n                  : undefined\n              }\n              onSort={() => handleSort('completionPercentage')}\n            >\n              {labels.completionColumn}\n            </TableHead>\n            <TableHead>{labels.durationColumn}</TableHead>\n            <TableHead className=\"w-[160px]\" />\n          </TableRow>\n        </TableHeader>\n        <TableBody>\n          {sortedData.length === 0 ? (\n            <TableRow>\n              <TableCell colSpan={5} className=\"text-center py-8\">\n                <Text size=\"sm\" className=\"text-text-500\">\n                  {emptyMessage}\n                </Text>\n              </TableCell>\n            </TableRow>\n          ) : (\n            sortedData.map((student) => (\n              <TableRow key={student.id}>\n                <TableCell className=\"max-w-[220px]\">\n                  <div className=\"flex items-center gap-2 min-w-0\">\n                    <Text\n                      as=\"span\"\n                      className=\"size-8 rounded-full bg-background-100 flex items-center justify-center shrink-0\"\n                    >\n                      <UserIcon size={16} className=\"text-text-500\" />\n                    </Text>\n                    <TruncatedText size=\"sm\" color=\"text-text-950\">\n                      {student.name}\n                    </TruncatedText>\n                  </div>\n                </TableCell>\n                <TableCell>\n                  <Badge\n                    variant=\"solid\"\n                    action={getStudentStatusBadgeAction(student.status)}\n                    size=\"small\"\n                  >\n                    {student.status}\n                  </Badge>\n                </TableCell>\n                <TableCell>\n                  <div className=\"flex flex-col gap-1 min-w-[120px]\">\n                    <Text size=\"sm\" className=\"text-primary-700 font-medium\">\n                      {student.completionPercentage}%\n                    </Text>\n                    <ProgressBar\n                      value={student.completionPercentage}\n                      size=\"small\"\n                      variant=\"blue\"\n                      className=\"w-full max-w-[100px]\"\n                    />\n                  </div>\n                </TableCell>\n                <TableCell>\n                  <Text size=\"sm\" className=\"text-text-700\">\n                    {student.duration ?? '-'}\n                  </Text>\n                </TableCell>\n                <TableCell>\n                  {onCorrectActivity && (\n                    <Button\n                      variant=\"outline\"\n                      size=\"extra-small\"\n                      onClick={() => onCorrectActivity(student.id)}\n                    >\n                      {labels.correctActivity}\n                    </Button>\n                  )}\n                </TableCell>\n              </TableRow>\n            ))\n          )}\n        </TableBody>\n      </Table>\n    </div>\n  );\n};\n\nexport default StudentsTable;\n","import { useMemo, type ReactNode } from 'react';\nimport { LightbulbFilamentIcon } from '@phosphor-icons/react/dist/csr/LightbulbFilament';\nimport { WarningCircleIcon } from '@phosphor-icons/react/dist/csr/WarningCircle';\nimport { UserIcon } from '@phosphor-icons/react/dist/csr/User';\nimport { CheckCircleIcon } from '@phosphor-icons/react/dist/csr/CheckCircle';\nimport { XCircleIcon } from '@phosphor-icons/react/dist/csr/XCircle';\nimport Modal from '../../Modal/Modal';\nimport Text from '../../Text/Text';\nimport Badge from '../../Badge/Badge';\nimport ProgressBar from '../../ProgressBar/ProgressBar';\nimport { CardAccordation } from '../../Accordation/Accordation';\nimport {\n  AlternativesList,\n  type Alternative,\n} from '../../Alternative/Alternative';\nimport { OptionStatus } from '../../../enums/Options';\nimport type {\n  StudentPerformanceData,\n  StudentPerformanceLabels,\n  LessonProgress,\n  LessonQuestion,\n} from '../types';\nimport { DEFAULT_PERFORMANCE_LABELS } from '../types';\nimport { HtmlMathRenderer } from '../../HtmlMathRenderer';\n\n/**\n * Props for StudentPerformanceModal component\n */\nexport interface StudentPerformanceModalProps {\n  /** Whether the modal is open */\n  isOpen: boolean;\n  /** Callback to close the modal */\n  onClose: () => void;\n  /** Student performance data */\n  data: StudentPerformanceData | null;\n  /** Loading state */\n  loading?: boolean;\n  /** Error message */\n  error?: string | null;\n  /** Custom labels */\n  labels?: Partial<StudentPerformanceLabels>;\n}\n\n/**\n * Performance card with colored header and white footer section\n * Matches the Figma design with icon, label, value on top and secondary info below\n */\nconst PerformanceCard = ({\n  icon,\n  label,\n  value,\n  secondaryLabel,\n  secondaryValue,\n  variant,\n}: {\n  icon: ReactNode;\n  label: string;\n  value: string | number;\n  secondaryLabel: string;\n  secondaryValue: string | null;\n  variant: 'success' | 'error';\n}) => {\n  const headerBgColor = {\n    success: 'bg-success-200',\n    error: 'bg-error-100',\n  }[variant];\n\n  const valueColor = {\n    success: 'text-success-700',\n    error: 'text-error-700',\n  }[variant];\n\n  const iconBgColor = {\n    success: 'bg-warning-300',\n    error: 'bg-error-300',\n  }[variant];\n\n  const secondaryLabelColor = {\n    success: 'text-success-600',\n    error: 'text-error-600',\n  }[variant];\n\n  return (\n    <div className=\"flex flex-col rounded-xl border border-border-50 bg-background overflow-hidden\">\n      {/* Header section with colored background */}\n      <div\n        className={`flex flex-col items-center justify-center p-4 gap-1 ${headerBgColor}`}\n      >\n        <Text\n          as=\"span\"\n          className={`size-8 rounded-full flex items-center justify-center ${iconBgColor}`}\n        >\n          {icon}\n        </Text>\n        <Text\n          size=\"2xs\"\n          weight=\"medium\"\n          className=\"text-text-800 uppercase text-center leading-none\"\n        >\n          {label}\n        </Text>\n        <Text size=\"xl\" weight=\"bold\" className={`${valueColor} text-center`}>\n          {value}\n        </Text>\n      </div>\n\n      {/* Footer section with white background */}\n      <div className=\"flex flex-col items-center gap-2 px-4 py-3\">\n        <Text\n          size=\"2xs\"\n          weight=\"medium\"\n          className={`${secondaryLabelColor} uppercase text-center`}\n        >\n          {secondaryLabel}\n        </Text>\n        <Badge size=\"large\" action=\"info\">\n          {secondaryValue || '-'}\n        </Badge>\n      </div>\n    </div>\n  );\n};\n\n/**\n * Determine the status of an alternative based on correctness and selection\n */\nconst getAlternativeStatus = (\n  isCorrect: boolean,\n  isSelected: boolean\n): OptionStatus | undefined => {\n  if (isCorrect) {\n    return OptionStatus.CORRECT;\n  }\n  if (isSelected) {\n    return OptionStatus.INCORRECT;\n  }\n  return undefined;\n};\n\n/**\n * Convert question alternatives to AlternativesList format\n */\nconst mapAlternatives = (question: LessonQuestion): Alternative[] => {\n  return question.alternatives.map((alt) => ({\n    value: alt.id,\n    label: alt.text,\n    status: getAlternativeStatus(alt.isCorrect, alt.isSelected),\n  }));\n};\n\n/**\n * Get selected alternative value from question\n */\nconst getSelectedValue = (question: LessonQuestion): string | undefined => {\n  const selected = question.alternatives.find((alt) => alt.isSelected);\n  return selected?.id;\n};\n\n/**\n * Question accordion item inside a lesson\n */\nconst QuestionAccordionItem = ({\n  question,\n  index,\n}: {\n  question: LessonQuestion;\n  index: number;\n}) => (\n  <CardAccordation\n    value={question.id}\n    className=\"bg-background rounded-xl border border-border-50\"\n    triggerClassName=\"py-5 px-5\"\n    contentClassName=\"px-5 pb-5\"\n    trigger={\n      <div className=\"flex items-center justify-between flex-1\">\n        <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950\">\n          Questão {index + 1}\n        </Text>\n        <Badge\n          size=\"small\"\n          action={question.isCorrect ? 'success' : 'error'}\n          variant=\"solid\"\n          iconLeft={question.isCorrect ? <CheckCircleIcon /> : <XCircleIcon />}\n        >\n          {question.isCorrect ? 'Correta' : 'Incorreta'}\n        </Badge>\n      </div>\n    }\n  >\n    <div className=\"flex flex-col gap-3\">\n      {/* Question statement */}\n      <HtmlMathRenderer\n        content={question.statement}\n        className=\"text-sm text-text-700\"\n      />\n\n      {/* Alternatives accordion */}\n      <CardAccordation\n        value={`${question.id}-alternatives`}\n        className=\"bg-background rounded-lg border border-border-50\"\n        triggerClassName=\"py-5 px-5\"\n        contentClassName=\"px-5 py-5\"\n        trigger={\n          <Text size=\"sm\" weight=\"medium\" className=\"text-text-800\">\n            Alternativas\n          </Text>\n        }\n      >\n        <AlternativesList\n          mode=\"readonly\"\n          alternatives={mapAlternatives(question)}\n          selectedValue={getSelectedValue(question)}\n          layout=\"default\"\n        />\n      </CardAccordation>\n    </div>\n  </CardAccordation>\n);\n\n/**\n * Lesson accordion item\n */\nconst LessonAccordionItem = ({ lesson }: { lesson: LessonProgress }) => (\n  <CardAccordation\n    value={lesson.id}\n    className=\"bg-background rounded-xl border border-border-50\"\n    triggerClassName=\"py-5 px-5\"\n    contentClassName=\"px-5 pb-5\"\n    trigger={\n      <div className=\"flex flex-col gap-1 flex-1\">\n        <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950\">\n          {lesson.title}\n        </Text>\n        <ProgressBar\n          value={lesson.progress}\n          variant=\"blue\"\n          size=\"medium\"\n          showPercentage\n          layout=\"default\"\n        />\n      </div>\n    }\n  >\n    <div className=\"flex flex-col gap-2\">\n      {lesson.questions.map((question, index) => (\n        <QuestionAccordionItem\n          key={question.id}\n          question={question}\n          index={index}\n        />\n      ))}\n    </div>\n  </CardAccordation>\n);\n\n/**\n * StudentPerformanceModal component\n *\n * Displays a modal with student performance details including:\n * - Student name with search icon\n * - Two performance cards (correct answers, incorrect answers)\n * - Expandable list of lessons with progress\n *\n * @example\n * ```tsx\n * <StudentPerformanceModal\n *   isOpen={isModalOpen}\n *   onClose={() => setIsModalOpen(false)}\n *   data={{\n *     studentName: 'Lucas Oliveira',\n *     correctAnswers: 8,\n *     incorrectAnswers: 7,\n *     bestResult: 'Fotossíntese',\n *     hardestTopic: 'Células',\n *     lessons: [\n *       { id: '1', title: 'Categorias Taxonômicas', progress: 50 },\n *     ],\n *   }}\n * />\n * ```\n */\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n  <div className=\"flex flex-col gap-4 animate-pulse\">\n    <div className=\"h-6 bg-background-200 rounded w-48\" />\n    <div className=\"grid grid-cols-2 gap-3\">\n      <div className=\"h-44 bg-background-200 rounded-xl\" />\n      <div className=\"h-44 bg-background-200 rounded-xl\" />\n    </div>\n  </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({ message }: { message: string }) => (\n  <div className=\"flex flex-col items-center justify-center py-8 gap-3\">\n    <Text\n      as=\"span\"\n      className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n    >\n      <WarningCircleIcon size={24} className=\"text-error-700\" />\n    </Text>\n    <Text size=\"md\" className=\"text-error-700 text-center\">\n      {message}\n    </Text>\n  </div>\n);\n\n/**\n * Performance content when data is available\n */\nconst PerformanceContent = ({\n  data,\n  labels,\n}: {\n  data: StudentPerformanceData;\n  labels: StudentPerformanceLabels;\n}) => (\n  <div className=\"flex flex-col gap-5\">\n    {/* Student name with icon */}\n    <div className=\"flex items-center gap-2\">\n      <Text\n        as=\"span\"\n        className=\"size-8 rounded-full bg-background-100 flex items-center justify-center\"\n      >\n        <UserIcon size={16} className=\"text-text-500\" />\n      </Text>\n      <Text size=\"md\" weight=\"medium\" className=\"text-text-950\">\n        {data.studentName}\n      </Text>\n    </div>\n\n    {/* Two performance cards in a row */}\n    <div className=\"grid grid-cols-2 gap-3\">\n      {/* Correct answers card */}\n      <PerformanceCard\n        icon={\n          <LightbulbFilamentIcon\n            size={18}\n            weight=\"fill\"\n            className=\"text-white\"\n          />\n        }\n        label={labels.correctAnswersLabel}\n        value={data.correctAnswers}\n        secondaryLabel={labels.bestResultLabel}\n        secondaryValue={data.bestResult}\n        variant=\"success\"\n      />\n\n      {/* Incorrect answers card */}\n      <PerformanceCard\n        icon={\n          <WarningCircleIcon\n            size={18}\n            weight=\"fill\"\n            className=\"text-error-700\"\n          />\n        }\n        label={labels.incorrectAnswersLabel}\n        value={data.incorrectAnswers}\n        secondaryLabel={labels.hardestTopicLabel}\n        secondaryValue={data.hardestTopic}\n        variant=\"error\"\n      />\n    </div>\n\n    {/* Lessons section */}\n    {data.lessons.length > 0 && (\n      <div className=\"flex flex-col gap-3\">\n        <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n          {labels.lessonsTitle}\n        </Text>\n        <div className=\"flex flex-col gap-2\">\n          {data.lessons.map((lesson) => (\n            <LessonAccordionItem key={lesson.id} lesson={lesson} />\n          ))}\n        </div>\n      </div>\n    )}\n  </div>\n);\n\n/**\n * Renders the modal content based on loading, error, and data state\n */\nconst renderModalContent = (\n  loading: boolean,\n  error: string | null | undefined,\n  data: StudentPerformanceData | null,\n  labels: StudentPerformanceLabels\n): ReactNode => {\n  if (loading) {\n    return <LoadingSkeleton />;\n  }\n\n  if (error) {\n    return <ErrorContent message={error} />;\n  }\n\n  if (data) {\n    return <PerformanceContent data={data} labels={labels} />;\n  }\n\n  return null;\n};\n\nexport const StudentPerformanceModal = ({\n  isOpen,\n  onClose,\n  data,\n  loading = false,\n  error = null,\n  labels: customLabels,\n}: StudentPerformanceModalProps) => {\n  const labels = useMemo(\n    () => ({ ...DEFAULT_PERFORMANCE_LABELS, ...customLabels }),\n    [customLabels]\n  );\n\n  if (!data && !loading && !error) {\n    return null;\n  }\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      onClose={onClose}\n      title={labels.title}\n      size=\"lg\"\n      contentClassName=\"max-h-[70vh] overflow-y-auto\"\n    >\n      {renderModalContent(loading, error, data, labels)}\n    </Modal>\n  );\n};\n\nexport default StudentPerformanceModal;\n","import {\n  useMemo,\n  useState,\n  useCallback,\n  useEffect,\n  type ReactNode,\n} from 'react';\nimport { TimerIcon } from '@phosphor-icons/react/dist/csr/Timer';\nimport { TrophyIcon } from '@phosphor-icons/react/dist/csr/Trophy';\nimport { WarningIcon } from '@phosphor-icons/react/dist/csr/Warning';\nimport { UserIcon } from '@phosphor-icons/react/dist/csr/User';\nimport { WarningCircleIcon } from '@phosphor-icons/react/dist/csr/WarningCircle';\nimport type { Icon } from '@phosphor-icons/react';\nimport Modal from '../../Modal/Modal';\nimport Text from '../../Text/Text';\nimport Badge from '../../Badge/Badge';\nimport Button from '../../Button/Button';\nimport Radio from '../../Radio/Radio';\nimport TextArea from '../../TextArea/TextArea';\nimport ProgressBar from '../../ProgressBar/ProgressBar';\nimport { CardAccordation, AccordionGroup } from '../../Accordation';\nimport {\n  AlternativesList,\n  type Alternative,\n} from '../../Alternative/Alternative';\nimport { OptionStatus } from '../../../enums/Options';\nimport useToastStore from '../../Toast/utils/ToastStore';\nimport { StatCard } from '../../shared/StatCard';\nimport type { BaseApiClient } from '../../../types/api';\nimport type {\n  StudentActivityPerformanceData,\n  StudentActivityPerformanceLabels,\n  PerformanceActivity,\n  PerformanceLesson,\n  LessonQuestion,\n} from '../types';\nimport { DEFAULT_ACTIVITY_PERFORMANCE_LABELS } from '../types';\nimport { cn } from '../../../utils/utils';\nimport { HtmlMathRenderer } from '../../HtmlMathRenderer';\n\n/** Field names for essay correction state updates */\nconst EssayCorrectionField = {\n  IsCorrect: 'isCorrect',\n  TeacherFeedback: 'teacherFeedback',\n} as const;\n\n/**\n * Essay correction state for a question\n */\ninterface EssayCorrectionState {\n  isCorrect: boolean | null;\n  teacherFeedback: string;\n  isSaving: boolean;\n  isSaved: boolean;\n}\n\n/**\n * Props for StudentActivityPerformanceModal component\n */\nexport interface StudentActivityPerformanceModalProps {\n  /** Whether the modal is open */\n  isOpen: boolean;\n  /** Callback to close the modal */\n  onClose: () => void;\n  /** Student activity performance data */\n  data: StudentActivityPerformanceData | null;\n  /** Loading state */\n  loading?: boolean;\n  /** Error message */\n  error?: string | null;\n  /** API client for saving corrections */\n  apiClient?: BaseApiClient;\n  /** Custom labels */\n  labels?: Partial<StudentActivityPerformanceLabels>;\n}\n\n/**\n * Configuration for info card variants\n */\ntype InfoVariant = 'time' | 'best' | 'hardest';\n\nconst infoVariantConfig: Record<\n  InfoVariant,\n  {\n    borderColor: string;\n    labelColor: string;\n    IconComponent: Icon;\n    iconColor: string;\n  }\n> = {\n  time: {\n    borderColor: 'border-primary-200',\n    labelColor: 'text-primary-600',\n    IconComponent: TimerIcon,\n    iconColor: 'text-primary-600',\n  },\n  best: {\n    borderColor: 'border-success-200',\n    labelColor: 'text-success-600',\n    IconComponent: TrophyIcon,\n    iconColor: 'text-success-600',\n  },\n  hardest: {\n    borderColor: 'border-error-200',\n    labelColor: 'text-error-600',\n    IconComponent: WarningIcon,\n    iconColor: 'text-error-600',\n  },\n};\n\n/**\n * Info card for time/best result/hardest topic\n */\nconst InfoCard = ({\n  label,\n  value,\n  variant,\n}: {\n  label: string;\n  value: string | null;\n  variant: InfoVariant;\n}) => {\n  const config = infoVariantConfig[variant];\n\n  return (\n    <div\n      className={cn(\n        'border rounded-xl py-3 px-4 flex flex-col items-center justify-center gap-2',\n        config.borderColor\n      )}\n    >\n      <Text className={cn('text-2xs font-medium uppercase', config.labelColor)}>\n        {label}\n      </Text>\n      <Badge size=\"large\" action=\"info\">\n        {value || '-'}\n      </Badge>\n    </div>\n  );\n};\n\n/**\n * Determine the status of an alternative based on correctness and selection\n */\nconst getAlternativeStatus = (\n  isCorrect: boolean,\n  isSelected: boolean\n): OptionStatus | undefined => {\n  if (isCorrect) return OptionStatus.CORRECT;\n  if (isSelected) return OptionStatus.INCORRECT;\n  return undefined;\n};\n\n/**\n * Convert question alternatives to AlternativesList format\n */\nconst mapAlternatives = (question: LessonQuestion): Alternative[] => {\n  return question.alternatives.map((alt) => ({\n    value: alt.id,\n    label: alt.text,\n    status: getAlternativeStatus(alt.isCorrect, alt.isSelected),\n  }));\n};\n\n/**\n * Get selected alternative value from question\n */\nconst getSelectedValue = (question: LessonQuestion): string | undefined => {\n  const selected = question.alternatives.find((alt) => alt.isSelected);\n  return selected?.id;\n};\n\n/**\n * Get badge action based on isCorrect value\n */\nconst getBadgeAction = (\n  isCorrect: boolean | null\n): 'success' | 'error' | 'info' => {\n  if (isCorrect === true) return 'success';\n  if (isCorrect === false) return 'error';\n  return 'info';\n};\n\n/**\n * Get badge label based on isCorrect value using provided labels\n */\nconst getBadgeLabel = (\n  isCorrect: boolean | null,\n  labels: StudentActivityPerformanceLabels\n): string => {\n  if (isCorrect === true) return labels.markCorrect;\n  if (isCorrect === false) return labels.markIncorrect;\n  return labels.pending;\n};\n\n/**\n * Generate a unique key for a question\n * Uses answerId if present, otherwise falls back to activityId-questionId composite\n */\nconst getQuestionKey = (question: LessonQuestion): string => {\n  if (question.answerId) {\n    return question.answerId;\n  }\n  return `${question.activityId}-${question.id}`;\n};\n\n/**\n * Lesson item with progress bar\n */\nconst LessonItem = ({ lesson }: { lesson: PerformanceLesson }) => (\n  <div className=\"bg-background rounded-xl border border-border-50 py-4 px-4 flex flex-col gap-2\">\n    <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950\">\n      {lesson.title}\n    </Text>\n    <div className=\"flex items-center gap-2\">\n      <ProgressBar\n        value={lesson.progress}\n        size=\"small\"\n        variant=\"blue\"\n        className=\"flex-1\"\n      />\n      <Text\n        size=\"xs\"\n        className=\"text-primary-700 font-medium min-w-[40px] text-right\"\n      >\n        {lesson.progress}%\n      </Text>\n    </div>\n  </div>\n);\n\n/**\n * Loading skeleton\n */\nconst LoadingSkeleton = () => (\n  <div\n    data-testid=\"loading-skeleton\"\n    className=\"flex flex-col gap-4 animate-pulse\"\n  >\n    <div className=\"h-6 bg-background-200 rounded w-48\" />\n    <div className=\"grid grid-cols-3 gap-3\">\n      <div className=\"h-28 bg-background-200 rounded-xl\" />\n      <div className=\"h-28 bg-background-200 rounded-xl\" />\n      <div className=\"h-28 bg-background-200 rounded-xl\" />\n    </div>\n    <div className=\"grid grid-cols-3 gap-3\">\n      <div className=\"h-20 bg-background-200 rounded-xl\" />\n      <div className=\"h-20 bg-background-200 rounded-xl\" />\n      <div className=\"h-20 bg-background-200 rounded-xl\" />\n    </div>\n  </div>\n);\n\n/**\n * Error content\n */\nconst ErrorContent = ({ message }: { message: string }) => (\n  <div className=\"flex flex-col items-center justify-center py-8 gap-3\">\n    <Text\n      as=\"span\"\n      className=\"size-12 rounded-full bg-error-100 flex items-center justify-center\"\n    >\n      <WarningCircleIcon size={24} className=\"text-error-700\" />\n    </Text>\n    <Text size=\"md\" className=\"text-error-700 text-center\">\n      {message}\n    </Text>\n  </div>\n);\n\n/**\n * StudentActivityPerformanceModal component\n *\n * Displays a modal with student activity performance including:\n * - Student name\n * - Result cards (score, correct/incorrect counts, time, best/hardest topics)\n * - Activities list with expandable questions and correction controls\n * - Lessons section with progress bars\n */\nexport const StudentActivityPerformanceModal = ({\n  isOpen,\n  onClose,\n  data,\n  loading = false,\n  error = null,\n  apiClient,\n  labels: customLabels,\n}: StudentActivityPerformanceModalProps) => {\n  const labels = useMemo(\n    () => ({ ...DEFAULT_ACTIVITY_PERFORMANCE_LABELS, ...customLabels }),\n    [customLabels]\n  );\n\n  // Toast store for notifications\n  const addToast = useToastStore((state) => state.addToast);\n\n  // State for essay question corrections (keyed by question id)\n  const [essayCorrections, setEssayCorrections] = useState<\n    Record<string, EssayCorrectionState>\n  >({});\n\n  // Initialize essay corrections from data when modal opens\n  useEffect(() => {\n    if (isOpen && data) {\n      const initialCorrections: Record<string, EssayCorrectionState> = {};\n\n      data.activities.forEach((activity) => {\n        activity.questions.forEach((question) => {\n          // Initialize all questions with their current state using unique key\n          const questionKey = getQuestionKey(question);\n          initialCorrections[questionKey] = {\n            isCorrect: question.isCorrect,\n            teacherFeedback: question.teacherFeedback || '',\n            isSaving: false,\n            isSaved: question.isCorrect != null,\n          };\n        });\n      });\n\n      setEssayCorrections(initialCorrections);\n    }\n  }, [isOpen, data]);\n\n  /**\n   * Update essay correction state\n   * Resets isSaved to false when any field changes so badge only updates after saving\n   */\n  const updateEssayCorrection = useCallback(\n    (\n      questionId: string,\n      field:\n        | (typeof EssayCorrectionField)['IsCorrect']\n        | (typeof EssayCorrectionField)['TeacherFeedback'],\n      value: boolean | string\n    ) => {\n      setEssayCorrections((prev) => ({\n        ...prev,\n        [questionId]: {\n          ...prev[questionId],\n          [field]: value,\n          // Reset isSaved when any field changes so badge doesn't update until saved\n          isSaved: false,\n        },\n      }));\n    },\n    []\n  );\n\n  /**\n   * Handle saving essay question correction\n   */\n  const handleSaveEssayCorrection = useCallback(\n    async (question: LessonQuestion) => {\n      if (!apiClient || !data) return;\n\n      const questionKey = getQuestionKey(question);\n      const correction = essayCorrections[questionKey];\n      if (correction?.isCorrect == null) {\n        return;\n      }\n\n      setEssayCorrections((prev) => ({\n        ...prev,\n        [questionKey]: { ...prev[questionKey], isSaving: true },\n      }));\n\n      try {\n        await apiClient.post(\n          `/activities/${question.activityId}/students/${data.userId}/questions/correction`,\n          {\n            questionId: question.id,\n            isCorrect: correction.isCorrect,\n            teacherFeedback: correction.teacherFeedback,\n          }\n        );\n\n        // Mark as saved and show success toast\n        setEssayCorrections((prev) => ({\n          ...prev,\n          [questionKey]: {\n            ...prev[questionKey],\n            isSaving: false,\n            isSaved: true,\n          },\n        }));\n\n        addToast({\n          title: 'Correção salva',\n          description: `A correção da questão foi salva com sucesso.`,\n          variant: 'solid',\n          action: 'success',\n          position: 'top-right',\n        });\n      } catch (err) {\n        console.error('Erro ao salvar correção da questão:', err);\n\n        setEssayCorrections((prev) => ({\n          ...prev,\n          [questionKey]: { ...prev[questionKey], isSaving: false },\n        }));\n\n        addToast({\n          title: 'Erro ao salvar correção',\n          description: 'Não foi possível salvar a correção. Tente novamente.',\n          variant: 'solid',\n          action: 'warning',\n          position: 'top-right',\n        });\n      }\n    },\n    [apiClient, data, essayCorrections, addToast]\n  );\n\n  // Reset corrections when modal closes\n  const handleClose = useCallback(() => {\n    setEssayCorrections({});\n    onClose();\n  }, [onClose]);\n\n  /**\n   * Render correction fields for a question (radio group, textarea, save button)\n   * Same pattern as CorrectActivityModal\n   */\n  const renderCorrectionFields = (question: LessonQuestion) => {\n    const questionKey = getQuestionKey(question);\n    const correction = essayCorrections[questionKey] || {\n      isCorrect: null,\n      teacherFeedback: '',\n      isSaving: false,\n      isSaved: false,\n    };\n\n    let radioValue: string | undefined;\n    if (correction.isCorrect === null) {\n      radioValue = undefined;\n    } else if (correction.isCorrect) {\n      radioValue = 'true';\n    } else {\n      radioValue = 'false';\n    }\n\n    return (\n      <div className=\"space-y-4 border-t border-border-100 pt-4 mt-4\">\n        {/* Is correct radio group */}\n        <div className=\"space-y-2\">\n          <Text className=\"text-sm font-semibold text-text-950\">\n            {labels.isCorrectQuestionLabel}\n          </Text>\n          <div className=\"flex gap-4\">\n            <Radio\n              name={`isCorrect-${questionKey}`}\n              value=\"true\"\n              id={`correct-yes-${questionKey}`}\n              label={labels.correctYes}\n              size=\"medium\"\n              checked={radioValue === 'true'}\n              disabled={correction.isSaving}\n              onChange={(e) => {\n                if (e.target.checked) {\n                  updateEssayCorrection(\n                    questionKey,\n                    EssayCorrectionField.IsCorrect,\n                    true\n                  );\n                }\n              }}\n            />\n            <Radio\n              name={`isCorrect-${questionKey}`}\n              value=\"false\"\n              id={`correct-no-${questionKey}`}\n              label={labels.correctNo}\n              size=\"medium\"\n              checked={radioValue === 'false'}\n              disabled={correction.isSaving}\n              onChange={(e) => {\n                if (e.target.checked) {\n                  updateEssayCorrection(\n                    questionKey,\n                    EssayCorrectionField.IsCorrect,\n                    false\n                  );\n                }\n              }}\n            />\n          </div>\n        </div>\n\n        {/* Teacher feedback textarea */}\n        <div className=\"space-y-2\">\n          <Text className=\"text-sm font-semibold text-text-950\">\n            {labels.observationLabel}\n          </Text>\n          <TextArea\n            value={correction.teacherFeedback}\n            onChange={(e) => {\n              updateEssayCorrection(\n                questionKey,\n                EssayCorrectionField.TeacherFeedback,\n                e.target.value\n              );\n            }}\n            placeholder={labels.feedbackPlaceholder}\n            rows={4}\n            size=\"medium\"\n            disabled={correction.isSaving}\n          />\n        </div>\n\n        {/* Save button */}\n        <Button\n          size=\"small\"\n          onClick={() => handleSaveEssayCorrection(question)}\n          disabled={correction.isCorrect === null || correction.isSaving}\n        >\n          {correction.isSaving ? labels.saving : labels.saveCorrection}\n        </Button>\n      </div>\n    );\n  };\n\n  /**\n   * Render question accordion item inside an activity\n   */\n  const renderQuestionAccordionItem = (\n    question: LessonQuestion,\n    index: number\n  ) => {\n    const questionKey = getQuestionKey(question);\n\n    // Check if we have a local correction\n    const localCorrection = essayCorrections[questionKey];\n    const hasLocalSavedCorrection =\n      localCorrection?.isSaved && localCorrection?.isCorrect != null;\n\n    // Use local correction status if saved, otherwise use original\n    const displayIsCorrect = hasLocalSavedCorrection\n      ? localCorrection.isCorrect\n      : question.isCorrect;\n\n    return (\n      <CardAccordation\n        key={questionKey}\n        value={questionKey}\n        className=\"bg-background rounded-xl border border-border-50\"\n        triggerClassName=\"py-4 px-4\"\n        contentClassName=\"px-4 pb-4\"\n        trigger={\n          <div className=\"flex items-center justify-between flex-1\">\n            <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950\">\n              Questão {index + 1}\n            </Text>\n            <Badge\n              size=\"small\"\n              action={getBadgeAction(displayIsCorrect)}\n              variant=\"solid\"\n            >\n              {getBadgeLabel(displayIsCorrect, labels)}\n            </Badge>\n          </div>\n        }\n      >\n        <div className=\"flex flex-col gap-4\">\n          {/* Question statement */}\n          <HtmlMathRenderer\n            content={question.statement}\n            className=\"text-sm text-text-700\"\n          />\n\n          {/* Alternatives (for multiple choice questions) */}\n          {question.alternatives.length > 0 && (\n            <CardAccordation\n              value={`${questionKey}-alternatives`}\n              className=\"bg-background rounded-lg border border-border-50\"\n              triggerClassName=\"py-4 px-4\"\n              contentClassName=\"px-4 py-4\"\n              trigger={\n                <Text size=\"sm\" weight=\"medium\" className=\"text-text-800\">\n                  Alternativas\n                </Text>\n              }\n            >\n              <AlternativesList\n                mode=\"readonly\"\n                alternatives={mapAlternatives(question)}\n                selectedValue={getSelectedValue(question)}\n                layout=\"default\"\n              />\n            </CardAccordation>\n          )}\n\n          {/* Correction fields (only for essay questions) */}\n          {apiClient &&\n            question.questionType === 'DISSERTATIVA' &&\n            renderCorrectionFields(question)}\n        </div>\n      </CardAccordation>\n    );\n  };\n\n  /**\n   * Render activity accordion item\n   */\n  const renderActivityAccordionItem = (activity: PerformanceActivity) => (\n    <CardAccordation\n      key={activity.id}\n      value={activity.id}\n      className=\"bg-background rounded-xl border border-border-50\"\n      triggerClassName=\"py-4 px-4\"\n      contentClassName=\"px-4 pb-4\"\n      trigger={\n        <Text size=\"sm\" weight=\"semibold\" className=\"text-text-950\">\n          {activity.title}\n        </Text>\n      }\n    >\n      <AccordionGroup type=\"multiple\" className=\"flex flex-col gap-2\">\n        {activity.questions.map((question, index) =>\n          renderQuestionAccordionItem(question, index)\n        )}\n      </AccordionGroup>\n    </CardAccordation>\n  );\n\n  if (!data && !loading && !error) {\n    return null;\n  }\n\n  const renderContent = (): ReactNode => {\n    if (loading) {\n      return <LoadingSkeleton />;\n    }\n\n    if (error) {\n      return <ErrorContent message={error} />;\n    }\n\n    if (data) {\n      const formattedScore = data.score == null ? '-' : data.score.toFixed(1);\n\n      return (\n        <div className=\"flex flex-col gap-5\">\n          {/* Student name with icon */}\n          <div className=\"flex items-center gap-2\">\n            <Text\n              as=\"span\"\n              className=\"size-8 rounded-full bg-background-100 flex items-center justify-center\"\n            >\n              <UserIcon size={16} className=\"text-text-500\" />\n            </Text>\n            <Text size=\"md\" weight=\"medium\" className=\"text-text-950\">\n              {data.studentName}\n            </Text>\n          </div>\n\n          {/* Result title */}\n          <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n            {labels.resultTitle}\n          </Text>\n\n          {/* Top row: Score, Correct, Incorrect */}\n          <div className=\"grid grid-cols-3 gap-3\">\n            <StatCard\n              label={labels.scoreLabel}\n              value={formattedScore}\n              variant=\"score\"\n            />\n            <StatCard\n              label={labels.correctAnswersLabel}\n              value={data.correctAnswers}\n              variant=\"correct\"\n            />\n            <StatCard\n              label={labels.incorrectAnswersLabel}\n              value={data.incorrectAnswers}\n              variant=\"incorrect\"\n            />\n          </div>\n\n          {/* Bottom row: Time, Best Result, Hardest Topic */}\n          <div className=\"grid grid-cols-3 gap-3\">\n            <InfoCard\n              label={labels.completionTimeLabel}\n              value={data.completionTime}\n              variant=\"time\"\n            />\n            <InfoCard\n              label={labels.bestResultLabel}\n              value={data.bestResult}\n              variant=\"best\"\n            />\n            <InfoCard\n              label={labels.hardestTopicLabel}\n              value={data.hardestTopic}\n              variant=\"hardest\"\n            />\n          </div>\n\n          {/* Activities section */}\n          {data.activities.length > 0 && (\n            <div className=\"flex flex-col gap-3\">\n              <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n                {labels.activitiesTitle}\n              </Text>\n              <AccordionGroup type=\"single\" className=\"flex flex-col gap-2\">\n                {data.activities.map((activity) =>\n                  renderActivityAccordionItem(activity)\n                )}\n              </AccordionGroup>\n            </div>\n          )}\n\n          {/* Lessons section */}\n          {data.lessons && data.lessons.length > 0 && (\n            <div className=\"flex flex-col gap-3\">\n              <Text size=\"md\" weight=\"semibold\" className=\"text-text-950\">\n                {labels.lessonsTitle}\n              </Text>\n              <div className=\"flex flex-col gap-2\">\n                {data.lessons.map((lesson) => (\n                  <LessonItem key={lesson.id} lesson={lesson} />\n                ))}\n              </div>\n            </div>\n          )}\n        </div>\n      );\n    }\n\n    return null;\n  };\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      onClose={handleClose}\n      title={labels.title}\n      size=\"lg\"\n      contentClassName=\"max-h-[70vh] overflow-y-auto\"\n    >\n      {renderContent()}\n    </Modal>\n  );\n};\n\nexport default StudentActivityPerformanceModal;\n","import { useState, useCallback, useEffect } from 'react';\nimport Modal from '../../Modal/Modal';\nimport Text from '../../Text/Text';\nimport Button from '../../Button/Button';\nimport Badge from '../../Badge/Badge';\nimport Alert from '../../Alert/Alert';\nimport VideoPlayer from '../../VideoPlayer/VideoPlayer';\nimport { CardAudio, CardBase } from '../../Card/Card';\nimport Whiteboard from '../../Whiteboard/Whiteboard';\nimport { CardAccordation } from '../../Accordation';\nimport { Skeleton, SkeletonRounded } from '../../Skeleton/Skeleton';\nimport type {\n  LessonDetailsData,\n  RecommendedClassLessonsItem,\n} from '../../../types/recommendedLessons';\nimport type { Lesson } from '../../../types/lessons';\nimport type { BaseApiClient } from '../../../types/api';\nimport type { WhiteboardImage } from '../../Whiteboard/Whiteboard';\nimport {\n  GenericDisplayStatus,\n  getStatusBadgeAction,\n} from '../../../types/common';\nimport { formatDate } from '../utils/lessonDetailsUtils';\nimport { cn, getSubjectColorWithOpacity } from '../../../utils/utils';\nimport { useTheme } from '../../../hooks/useTheme';\n\n/**\n * Props for RecommendedLessonViewModal component\n */\nexport interface RecommendedLessonViewModalProps {\n  /** Whether the modal is open */\n  isOpen: boolean;\n  /** Callback to close the modal */\n  onClose: () => void;\n  /** Lesson details data */\n  data: LessonDetailsData;\n  /** API client for fetching full lesson data */\n  apiClient?: BaseApiClient;\n}\n\n/**\n * Derive display status from recommended class dates and progress\n */\nconst deriveRecommendedClassStatus = (\n  startDate: string | null,\n  finalDate: string | null,\n  progress: number\n): GenericDisplayStatus => {\n  // If progress is 100%, it's completed\n  if (progress >= 100) return GenericDisplayStatus.CONCLUIDA;\n\n  // Check if deadline has passed\n  if (finalDate) {\n    const deadline = new Date(finalDate);\n    if (deadline < new Date()) {\n      return GenericDisplayStatus.VENCIDA;\n    }\n  }\n\n  // Otherwise it's active\n  return GenericDisplayStatus.ATIVA;\n};\n\n/**\n * Loading skeleton for lesson content\n */\nconst LessonContentSkeleton = () => (\n  <div className=\"flex flex-col gap-4 p-4\">\n    <SkeletonRounded height={200} className=\"w-full\" />\n    <Skeleton variant=\"text\" width=\"80%\" height={20} />\n    <SkeletonRounded height={60} className=\"w-full\" />\n  </div>\n);\n\n/**\n * Lesson content component that fetches and displays full lesson data\n */\nconst LessonContent = ({\n  lessonId,\n  apiClient,\n  cachedLessons,\n  onLessonLoaded,\n}: {\n  lessonId: string;\n  apiClient?: BaseApiClient;\n  cachedLessons: Record<string, Lesson>;\n  onLessonLoaded: (lessonId: string, lesson: Lesson) => void;\n}) => {\n  const [loading, setLoading] = useState(!cachedLessons[lessonId]);\n  const [error, setError] = useState<string | null>(null);\n\n  const lesson = cachedLessons[lessonId];\n\n  useEffect(() => {\n    if (lesson || !apiClient) return;\n\n    const fetchLesson = async () => {\n      setLoading(true);\n      setError(null);\n      try {\n        const response = await apiClient.get<{ data: Lesson }>(\n          `/lesson/${lessonId}`\n        );\n        onLessonLoaded(lessonId, response.data.data);\n      } catch {\n        setError('Erro ao carregar dados da aula');\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchLesson();\n  }, [lessonId, apiClient, lesson, onLessonLoaded]);\n\n  if (loading) {\n    return <LessonContentSkeleton />;\n  }\n\n  if (error) {\n    return (\n      <div className=\"p-4\">\n        <Text size=\"sm\" className=\"text-error-700\">\n          {error}\n        </Text>\n      </div>\n    );\n  }\n\n  if (!lesson) {\n    return (\n      <div className=\"p-4\">\n        <Text size=\"sm\" className=\"text-text-500\">\n          Dados da aula não disponíveis\n        </Text>\n      </div>\n    );\n  }\n\n  const hasVideo = Boolean(lesson.urlVideo);\n  const hasPodcast = Boolean(lesson.urlPodCast);\n  const boardImages: WhiteboardImage[] = [];\n\n  if (lesson.urlInitialFrame) {\n    boardImages.push({ id: 'initial', imageUrl: lesson.urlInitialFrame });\n  }\n  if (lesson.urlFinalFrame) {\n    boardImages.push({ id: 'final', imageUrl: lesson.urlFinalFrame });\n  }\n\n  const hasBoards = boardImages.length > 0;\n\n  return (\n    <div className=\"flex flex-col gap-4\">\n      {hasVideo ? (\n        <VideoPlayer\n          src={lesson.urlVideo!}\n          poster={lesson.urlCover}\n          subtitles={lesson.urlSubtitle}\n          className=\"w-full rounded-lg\"\n        />\n      ) : (\n        <div className=\"p-4 bg-background-50 rounded-lg\">\n          <Text size=\"sm\" className=\"text-text-500\">\n            Vídeo não disponível para esta aula.\n          </Text>\n        </div>\n      )}\n\n      <Alert\n        action=\"info\"\n        variant=\"solid\"\n        description=\"Cada aula inclui questionários automáticos para o aluno praticar o conteúdo.\"\n        className=\"w-full\"\n      />\n\n      {hasPodcast && (\n        <div className=\"w-full\">\n          <Text size=\"md\" weight=\"bold\" className=\"pb-2\">\n            Podcast\n          </Text>\n          <CardAudio\n            src={lesson.urlPodCast!}\n            title={lesson.podCastTitle || 'Podcast da aula'}\n          />\n        </div>\n      )}\n\n      {hasBoards && (\n        <div className=\"w-full\">\n          <Text size=\"md\" weight=\"bold\" className=\"pb-2\">\n            Quadros da aula\n          </Text>\n          <div className=\"flex flex-wrap items-center justify-center gap-4\">\n            {boardImages.map((image) => (\n              <div\n                key={image.id}\n                className=\"flex flex-row rounded-xl bg-background-50\"\n              >\n                <Whiteboard\n                  images={[image]}\n                  showDownload={true}\n                  imagesPerRow={2}\n                  className=\"gap-4 w-full items-center border-border-50\"\n                />\n              </div>\n            ))}\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\n/**\n * Single lesson accordion item with colored header\n */\nconst LessonAccordionItem = ({\n  lessonItem,\n  apiClient,\n  cachedLessons,\n  onLessonLoaded,\n}: {\n  lessonItem: RecommendedClassLessonsItem;\n  apiClient?: BaseApiClient;\n  cachedLessons: Record<string, Lesson>;\n  onLessonLoaded: (lessonId: string, lesson: Lesson) => void;\n}) => {\n  const [isExpanded, setIsExpanded] = useState(false);\n  const { isDark } = useTheme();\n  const lesson = lessonItem.supLessonsProgress.lesson;\n  const lessonId = lesson.id;\n  const subjectColor = lesson.subject?.color;\n\n  const trigger = (\n    <div className=\"flex flex-col gap-1 py-3\">\n      <Text size=\"xs\" className=\"text-text-500\">\n        {lesson.topic?.name} • {lesson.subtopic?.name} • {lesson.content?.name}\n      </Text>\n      <Text size=\"md\" weight=\"medium\" className=\"text-text-950\">\n        {lesson.content?.name || lesson.videoTitle}\n      </Text>\n    </div>\n  );\n\n  return (\n    <div className=\"rounded-xl overflow-hidden border border-border-100\">\n      {/* Colored header bar */}\n      <div\n        className={cn(\n          'px-4 py-2',\n          subjectColor?.startsWith('bg-') && subjectColor\n        )}\n        style={\n          subjectColor && !subjectColor.startsWith('bg-')\n            ? {\n                backgroundColor: getSubjectColorWithOpacity(\n                  subjectColor,\n                  isDark\n                ),\n              }\n            : undefined\n        }\n      >\n        <Text size=\"xs\" weight=\"medium\" className=\"text-text-700\">\n          {lesson.subject?.name}\n        </Text>\n      </div>\n\n      <CardAccordation\n        trigger={trigger}\n        expanded={isExpanded}\n        onToggleExpanded={setIsExpanded}\n        value={lessonId}\n        contentClassName=\"p-0\"\n        className=\"border-0 rounded-none\"\n      >\n        {isExpanded && (\n          <LessonContent\n            lessonId={lessonId}\n            apiClient={apiClient}\n            cachedLessons={cachedLessons}\n            onLessonLoaded={onLessonLoaded}\n          />\n        )}\n      </CardAccordation>\n    </div>\n  );\n};\n\n/**\n * Modal component for viewing all lessons in a recommended class\n * Shows header with metadata and expandable accordion list of lessons\n */\nexport const RecommendedLessonViewModal = ({\n  isOpen,\n  onClose,\n  data,\n  apiClient,\n}: RecommendedLessonViewModalProps) => {\n  const [cachedLessons, setCachedLessons] = useState<Record<string, Lesson>>(\n    {}\n  );\n\n  const handleLessonLoaded = useCallback((lessonId: string, lesson: Lesson) => {\n    setCachedLessons((prev) => ({ ...prev, [lessonId]: lesson }));\n  }, []);\n\n  // Reset cache when modal closes\n  useEffect(() => {\n    if (!isOpen) {\n      setCachedLessons({});\n    }\n  }, [isOpen]);\n\n  const { recommendedClass } = data;\n  const lessons = recommendedClass.lessons || [];\n\n  const status = deriveRecommendedClassStatus(\n    recommendedClass.startDate,\n    recommendedClass.finalDate,\n    recommendedClass.progress\n  );\n  const badgeAction = getStatusBadgeAction(status);\n\n  const footer = (\n    <div className=\"flex justify-end\">\n      <Button variant=\"outline\" onClick={onClose}>\n        Fechar\n      </Button>\n    </div>\n  );\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      onClose={onClose}\n      title=\"Ver Aula\"\n      size=\"lg\"\n      footer={footer}\n      contentClassName=\"max-h-[70vh] overflow-y-auto\"\n    >\n      <div className=\"flex flex-col gap-6\">\n        {/* Header Card */}\n        <CardBase layout=\"vertical\" padding=\"medium\" className=\"bg-background\">\n          <div className=\"flex flex-col gap-2\">\n            <Text as=\"h2\" size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n              {recommendedClass.title}\n            </Text>\n            <div className=\"flex flex-wrap items-center gap-2\">\n              <Text size=\"sm\" className=\"text-text-600\">\n                Início: {formatDate(recommendedClass.startDate)}\n              </Text>\n              <Text size=\"sm\" className=\"text-text-400\">\n                •\n              </Text>\n              <Text size=\"sm\" className=\"text-text-600\">\n                Prazo: {formatDate(recommendedClass.finalDate)}\n              </Text>\n              <Text size=\"sm\" className=\"text-text-400\">\n                •\n              </Text>\n              <Badge action={badgeAction} size=\"small\">\n                {status}\n              </Badge>\n            </div>\n          </div>\n        </CardBase>\n\n        {/* Lessons Section */}\n        <div className=\"flex flex-col gap-4\">\n          <Text as=\"h3\" size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n            Aulas\n          </Text>\n\n          {lessons.length === 0 ? (\n            <div className=\"p-4 bg-background-50 rounded-lg\">\n              <Text size=\"sm\" className=\"text-text-500\">\n                Nenhuma aula encontrada.\n              </Text>\n            </div>\n          ) : (\n            <div className=\"flex flex-col gap-3\">\n              {lessons.map((lessonItem) => (\n                <LessonAccordionItem\n                  key={lessonItem.supLessonsProgress.lesson.id}\n                  lessonItem={lessonItem}\n                  apiClient={apiClient}\n                  cachedLessons={cachedLessons}\n                  onLessonLoaded={handleLessonLoaded}\n                />\n              ))}\n            </div>\n          )}\n        </div>\n      </div>\n    </Modal>\n  );\n};\n\nexport default RecommendedLessonViewModal;\n","import { ANSWER_STATUS } from '../../Quiz/useQuizStore';\nimport type {\n  LessonQuestion,\n  PerformanceActivity,\n  PerformanceLesson,\n  StudentActivityPerformanceData,\n} from '../types';\n\n/**\n * Answer data from the student answers API\n */\nexport interface StudentAnswerData {\n  id: string;\n  questionId: string;\n  answer: string | null;\n  selectedOptions: Array<{ optionId: string }>;\n  answerStatus: string;\n  statement: string;\n  questionType: string;\n  difficultyLevel: string;\n  solutionExplanation: string | null;\n  correctOption: string | null;\n  teacherFeedback: string | null;\n  attachment: string | null;\n  score: number | null;\n  options?: Array<{\n    id: string;\n    option: string;\n    isCorrect: boolean;\n  }>;\n  knowledgeMatrix: Array<{\n    areaKnowledge: { id: string; name: string };\n    subject: { id: string; name: string; color: string; icon: string };\n    topic: { id: string; name: string };\n    subtopic: { id: string; name: string };\n    content: { id: string; name: string };\n  }>;\n}\n\n/**\n * Activity statistics from the API\n */\nexport interface ActivityStatistics {\n  totalAnswered: number;\n  correctAnswers: number;\n  incorrectAnswers: number;\n  pendingAnswers: number;\n  score: number | null;\n  timeSpent: number;\n}\n\n/**\n * Activity data from the student answers API\n */\nexport interface StudentActivityData {\n  id: string;\n  title: string;\n  sequence: number;\n  answers: StudentAnswerData[];\n  statistics: ActivityStatistics;\n}\n\n/**\n * Lesson data from the student answers API\n */\nexport interface StudentLessonData {\n  id: string;\n  title: string;\n  sequence: number;\n  progress: number;\n  completedAt: string | null;\n  questionnaire: {\n    id: string;\n    answers: StudentAnswerData[];\n    statistics: ActivityStatistics;\n  } | null;\n}\n\n/**\n * Response from /recommended-class/{id}/student/{studentId}/answers\n */\nexport interface StudentAnswersResponse {\n  message: string;\n  data: {\n    activities: StudentActivityData[];\n    lessons: StudentLessonData[];\n  };\n}\n\n/**\n * Determine if answer is correct based on answer status\n * Returns null for pending/unevaluated answers\n */\nexport const getIsCorrectFromStatus = (\n  answerStatus: string\n): boolean | null => {\n  if (answerStatus === ANSWER_STATUS.RESPOSTA_CORRETA) return true;\n  if (answerStatus === ANSWER_STATUS.RESPOSTA_INCORRETA) return false;\n  // For pending, blank, or other statuses, return null (not yet evaluated)\n  return null;\n};\n\n/**\n * Convert answer data to LessonQuestion format\n */\nexport const convertAnswerToLessonQuestion = (\n  answer: StudentAnswerData,\n  index: number,\n  activityId: string\n): LessonQuestion => {\n  const isCorrect = getIsCorrectFromStatus(answer.answerStatus);\n\n  return {\n    id: answer.questionId,\n    answerId: answer.id,\n    activityId,\n    title: `Questão ${index + 1}`,\n    statement: answer.statement || '',\n    questionType: answer.questionType,\n    isCorrect,\n    teacherFeedback: answer.teacherFeedback,\n    alternatives: (answer.options || []).map((opt) => ({\n      id: opt.id,\n      text: opt.option,\n      isCorrect: opt.isCorrect ?? false,\n      isSelected:\n        answer.selectedOptions?.some((s) => s.optionId === opt.id) ?? false,\n    })),\n  };\n};\n\n/**\n * Convert activity data to PerformanceActivity format\n */\nexport const convertActivityToPerformance = (\n  activity: StudentActivityData\n): PerformanceActivity => {\n  const questions: LessonQuestion[] = activity.answers.map((answer, index) =>\n    convertAnswerToLessonQuestion(answer, index, activity.id)\n  );\n\n  return {\n    id: activity.id,\n    title: activity.title,\n    questions,\n  };\n};\n\n/**\n * Convert lesson data to PerformanceLesson format\n */\nexport const convertLessonToPerformance = (\n  lesson: StudentLessonData\n): PerformanceLesson => {\n  return {\n    id: lesson.id,\n    title: lesson.title,\n    progress: lesson.progress,\n  };\n};\n\n/**\n * Convert API response to StudentActivityPerformanceData\n */\nexport const convertStudentAnswersToPerformanceData = (\n  response: StudentAnswersResponse,\n  userInstitutionId: string,\n  userId: string,\n  studentName: string\n): StudentActivityPerformanceData => {\n  const { activities, lessons } = response.data;\n\n  // Convert activities\n  const performanceActivities = activities.map(convertActivityToPerformance);\n\n  // Convert lessons\n  const performanceLessons = lessons.map(convertLessonToPerformance);\n\n  // Aggregate statistics from all activities\n  const totalCorrect = activities.reduce(\n    (sum, a) => sum + a.statistics.correctAnswers,\n    0\n  );\n  const totalIncorrect = activities.reduce(\n    (sum, a) => sum + a.statistics.incorrectAnswers,\n    0\n  );\n  const scores = activities\n    .map((a) => a.statistics.score)\n    .filter((s): s is number => s != null);\n  const avgScore =\n    scores.length > 0\n      ? scores.reduce((sum, s) => sum + s, 0) / scores.length\n      : null;\n\n  return {\n    userInstitutionId,\n    userId,\n    studentName,\n    score: avgScore,\n    correctAnswers: totalCorrect,\n    incorrectAnswers: totalIncorrect,\n    completionTime: null,\n    bestResult: null,\n    hardestTopic: null,\n    activities: performanceActivities,\n    lessons: performanceLessons,\n  };\n};\n"],"mappings":"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","names":["useMemo","useState","useCallback","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","UserIcon","jsx","jsxs","LoadingSkeleton","UserIcon","useMemo","TrophyIcon","WarningIcon","UserIcon","WarningCircleIcon","jsx","jsxs","TrophyIcon","WarningIcon","getAlternativeStatus","mapAlternatives","getSelectedValue","LoadingSkeleton","ErrorContent","WarningCircleIcon","useMemo","UserIcon","useState","useCallback","useEffect","jsx","jsxs","useState","useEffect","LessonAccordionItem","useCallback","Fragment","jsx","jsxs","useMemo","useState","useCallback","performanceData"]}