UNPKG

analytica-frontend-lib

Version:

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

1 lines 18.2 kB
{"version":3,"sources":["../src/components/StudentLessonProgressModal/StudentLessonProgressModal.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from 'react';\nimport {\n MagnifyingGlassIcon,\n XCircleIcon,\n MedalIcon,\n SealWarningIcon,\n} from '@phosphor-icons/react';\nimport { CaretRightIcon } from '@phosphor-icons/react/dist/csr/CaretRight';\nimport Modal from '../Modal/Modal';\nimport Text from '../Text/Text';\nimport ProgressBar from '../ProgressBar/ProgressBar';\nimport ProgressCircle from '../ProgressCircle/ProgressCircle';\nimport { CardActivitiesResults } from '../Card/Card';\nimport {\n Skeleton,\n SkeletonCircle,\n SkeletonRounded,\n} from '../Skeleton/Skeleton';\nimport type {\n StudentLessonProgressModalProps,\n StudentLessonProgressData,\n StudentLessonProgressLabels,\n TopicProgressItem,\n SubtopicProgressItem,\n ContentProgressItem,\n} from './types';\nimport { DEFAULT_LESSON_PROGRESS_LABELS } from './types';\nimport { cn } from '../../utils/utils';\n\n/**\n * Content item accordion (deepest level - individual lessons)\n */\nconst ContentAccordionItem = ({\n item,\n noDataMessage,\n}: {\n item: ContentProgressItem;\n noDataMessage: string;\n}) => {\n const hasNoData = item.progress === 0 && !item.isCompleted;\n\n return (\n <div className=\"flex items-center justify-between p-4 border-t border-border-50\">\n <Text size=\"sm\" className=\"text-text-950\">\n {item.content.name}\n </Text>\n {hasNoData ? (\n <Text size=\"xs\" className=\"text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className=\"text-text-500 whitespace-nowrap\"\n >\n {Math.round(item.progress)}%\n </Text>\n )}\n </div>\n );\n};\n\n/**\n * Subtopic accordion item (middle level)\n */\nconst SubtopicAccordionItem = ({\n item,\n noDataMessage,\n}: {\n item: SubtopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.contents && item.contents.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n onClick={() => hasChildren && setIsExpanded(!isExpanded)}\n disabled={!hasChildren}\n className={cn(\n 'w-full flex items-center justify-between gap-3 p-4 text-left transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-inset rounded-xl',\n 'border-t border-border-50',\n hasChildren && 'cursor-pointer hover:bg-background-50',\n !hasChildren && 'cursor-default'\n )}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n <div className=\"flex items-center justify-between flex-1 min-w-0\">\n <Text size=\"md\" weight=\"medium\" className=\"text-text-950\">\n {item.subtopic.name}\n </Text>\n {!hasNoData && (\n <Text\n size=\"xs\"\n weight=\"medium\"\n className=\"text-text-500 whitespace-nowrap\"\n >\n {Math.round(item.progress)}%\n </Text>\n )}\n </div>\n\n {hasChildren && (\n <CaretRightIcon\n size={20}\n className={cn(\n 'transition-transform duration-200 flex-shrink-0 text-text-700',\n isExpanded ? 'rotate-90' : 'rotate-0'\n )}\n />\n )}\n </button>\n\n {hasChildren && (\n <div\n data-testid={`accordion-content-subtopic-${item.subtopic.id}`}\n data-expanded={isExpanded}\n className={cn(\n 'transition-all duration-300 ease-in-out overflow-hidden',\n isExpanded ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n )}\n >\n <div className=\"pl-4\">\n {item.contents.map((content) => (\n <ContentAccordionItem\n key={content.content.id}\n item={content}\n noDataMessage={noDataMessage}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Topic accordion item (top level)\n */\nconst TopicAccordionItem = ({\n item,\n noDataMessage,\n}: {\n item: TopicProgressItem;\n noDataMessage: string;\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const hasChildren = item.subtopics && item.subtopics.length > 0;\n const hasNoData = item.status === 'no_data';\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n onClick={() => hasChildren && setIsExpanded(!isExpanded)}\n disabled={!hasChildren}\n className={cn(\n 'w-full flex items-center justify-between gap-3 p-4 text-left transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-primary-950 focus:ring-inset rounded-xl',\n hasChildren && 'cursor-pointer hover:bg-background-50',\n !hasChildren && 'cursor-default'\n )}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n <div className=\"flex flex-col gap-2 flex-1 min-w-0\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {item.topic.name}\n </Text>\n {hasNoData ? (\n <Text size=\"xs\" className=\"text-text-500\">\n {noDataMessage}\n </Text>\n ) : (\n <div className=\"flex flex-row items-center gap-2\">\n <div className=\"flex-1\">\n <ProgressBar\n value={item.progress}\n variant=\"green\"\n size=\"medium\"\n />\n </div>\n <Text\n size=\"xs\"\n weight=\"medium\"\n className=\"text-text-950 whitespace-nowrap\"\n >\n {Math.round(item.progress)}%\n </Text>\n </div>\n )}\n </div>\n\n {hasChildren && (\n <CaretRightIcon\n size={20}\n className={cn(\n 'transition-transform duration-200 flex-shrink-0 text-text-700',\n isExpanded ? 'rotate-90' : 'rotate-0'\n )}\n />\n )}\n </button>\n\n {hasChildren && (\n <div\n data-testid={`accordion-content-${item.topic.id}`}\n data-expanded={isExpanded}\n className={cn(\n 'transition-all duration-300 ease-in-out overflow-hidden',\n isExpanded ? 'max-h-[2000px] opacity-100' : 'max-h-0 opacity-0'\n )}\n >\n <div className=\"pl-4\">\n {item.subtopics.map((subtopic) => (\n <SubtopicAccordionItem\n key={subtopic.subtopic.id}\n item={subtopic}\n noDataMessage={noDataMessage}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Loading skeleton for the modal content\n */\nconst LoadingSkeleton = () => (\n <div data-testid=\"lesson-progress-skeleton\" className=\"flex flex-col gap-4\">\n <Skeleton variant=\"text\" width=\"12rem\" height={24} />\n <div className=\"flex flex-row gap-3\">\n <SkeletonCircle width={107} height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n <SkeletonRounded className=\"flex-1\" height={107} />\n </div>\n <Skeleton variant=\"text\" width=\"9rem\" height={24} className=\"mt-4\" />\n <div className=\"flex flex-col gap-2\">\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n <SkeletonRounded height={80} />\n </div>\n </div>\n);\n\n/**\n * Error state component\n */\nconst ErrorContent = ({\n message,\n prefix,\n}: {\n message: string;\n prefix?: string;\n}) => (\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 <XCircleIcon size={24} className=\"text-error-700\" weight=\"fill\" />\n </Text>\n <Text size=\"md\" className=\"text-error-700 text-center\">\n {prefix ? `${prefix}: ${message}` : message}\n </Text>\n </div>\n);\n\n/**\n * Progress content when data is available\n */\nconst ProgressContent = ({\n data,\n labels,\n}: {\n data: StudentLessonProgressData;\n labels: StudentLessonProgressLabels;\n}) => (\n <div className=\"flex flex-col gap-4\">\n {/* Student name with search icon */}\n <div className=\"flex items-center gap-2 pt-2\">\n <Text\n as=\"span\"\n className=\"size-6 rounded-full bg-primary-100 flex items-center justify-center\"\n >\n <MagnifyingGlassIcon\n size={14}\n className=\"text-primary-800\"\n weight=\"bold\"\n />\n </Text>\n <Text size=\"md\" className=\"text-text-950\">\n {data.name}\n </Text>\n </div>\n\n {/* Stats cards row */}\n <div className=\"grid grid-cols-3 gap-3\">\n <div className=\"flex items-center justify-center\">\n <ProgressCircle\n value={data.overallCompletionRate}\n variant=\"green\"\n size=\"small\"\n label={labels.completionRateLabel}\n showPercentage\n />\n </div>\n\n <CardActivitiesResults\n icon={\n <MedalIcon size={16} weight=\"regular\" className=\"text-text-950\" />\n }\n title={labels.bestResultLabel}\n subTitle={data.bestResult || '-'}\n header=\"\"\n action=\"success\"\n />\n\n <CardActivitiesResults\n icon={\n <SealWarningIcon size={16} weight=\"regular\" className=\"text-white\" />\n }\n title={labels.biggestDifficultyLabel}\n subTitle={data.biggestDifficulty || '-'}\n header=\"\"\n action=\"error\"\n />\n </div>\n\n {/* Lesson progress section */}\n {data.lessonProgress.length > 0 && (\n <div className=\"flex flex-col gap-4 pt-4\">\n <Text size=\"lg\" weight=\"bold\" className=\"text-text-950\">\n {labels.lessonProgressTitle}\n </Text>\n <div className=\"flex flex-col gap-2\">\n {data.lessonProgress.map((topic) => (\n <div\n key={topic.topic.id}\n data-testid={`lesson-item-${topic.topic.id}`}\n className=\"bg-background rounded-xl border border-border-50\"\n >\n <TopicAccordionItem\n item={topic}\n noDataMessage={labels.noDataMessage}\n />\n </div>\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: StudentLessonProgressData | null,\n labels: StudentLessonProgressLabels\n): ReactNode => {\n if (loading) {\n return <LoadingSkeleton />;\n }\n\n if (error) {\n return <ErrorContent message={error} prefix={labels.errorMessagePrefix} />;\n }\n\n if (data) {\n return <ProgressContent data={data} labels={labels} />;\n }\n\n return null;\n};\n\n/**\n * StudentLessonProgressModal component\n *\n * Displays a modal with student lesson progress information including:\n * - Student name with profile icon\n * - Completion rate circle\n * - Best result and biggest difficulty highlight cards\n * - Expandable nested list of lesson progress by topic\n */\nexport const StudentLessonProgressModal = ({\n isOpen,\n onClose,\n data,\n loading = false,\n error = null,\n labels: customLabels,\n}: StudentLessonProgressModalProps) => {\n const labels = useMemo(\n () => ({ ...DEFAULT_LESSON_PROGRESS_LABELS, ...customLabels }),\n [customLabels]\n );\n\n const content = renderModalContent(loading, error, data, labels);\n\n if (!content) {\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-[80vh] overflow-y-auto\"\n >\n {content}\n </Modal>\n );\n};\n\nexport default StudentLessonProgressModal;\n"],"mappings":"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","names":[]}