11import { useParams } from 'react-router-dom' ;
22import { useIntl } from '@openedx/frontend-base' ;
3- import { Icon , Stack } from '@openedx/paragon' ;
3+ import { Alert , Icon , Skeleton , Stack } from '@openedx/paragon' ;
44import { EditNote , ViewDay } from '@openedx/paragon/icons' ;
55import { useOpenResponsesData } from '@src/openResponses/data/apiHook' ;
66import messages from '@src/openResponses/messages' ;
@@ -18,46 +18,59 @@ const summaryOrder = [
1818const OpenResponsesSummary = ( ) => {
1919 const intl = useIntl ( ) ;
2020 const { courseId = '' } = useParams < { courseId : string } > ( ) ;
21- const { data = { } } = useOpenResponsesData ( courseId ) ;
21+ const { data = { } , isLoading , isError , error } = useOpenResponsesData ( courseId ) ;
2222 const {
2323 totalUnits = 0 ,
2424 totalAssessments = 0 ,
2525 } = data ;
2626
2727 return (
2828 < >
29+ < Alert variant = "danger" show = { isError } className = "my-3" dismissible >
30+ { error instanceof Object && 'message' in error ? String ( error . message ) : String ( error ) }
31+ </ Alert >
2932 < h3 className = "text-primary-700" > { intl . formatMessage ( messages . summaryTitle ) } </ h3 >
3033 < Stack direction = "horizontal" gap = { 3 } >
3134 < div >
3235 < div className = "x-small text-gray-500" >
3336 < p className = "mb-0" > { intl . formatMessage ( messages . totalUnits ) } </ p >
3437 </ div >
35- < div className = "d-flex align-items-center lead" >
36- < Icon src = { ViewDay } />
37- < p className = "ml-2 mb-0 text-primary-500" > { totalUnits } </ p >
38- </ div >
38+ { isLoading ? < Skeleton className = "lead" />
39+ : (
40+ < div className = "d-flex align-items-center lead" >
41+ < Icon src = { ViewDay } aria-hidden = "true" />
42+ < p className = "ml-2 mb-0 text-primary-500" > { totalUnits } </ p >
43+ </ div >
44+ ) }
3945 </ div >
4046 < div >
4147 < div className = "x-small text-gray-500" >
4248 < p className = "mb-0" > { intl . formatMessage ( messages . totalAssessments ) } </ p >
4349 </ div >
44- < div className = "d-flex align-items-center lead" >
45- < Icon src = { EditNote } size = "lg" />
46- < p className = "ml-2 mb-0 text-primary-500" > { totalAssessments } </ p >
47- </ div >
50+ { isLoading ? < Skeleton className = "lead" />
51+ : (
52+ < div className = "d-flex align-items-center lead" >
53+ < Icon src = { EditNote } size = "lg" aria-hidden = "true" />
54+ < p className = "ml-2 mb-0 text-primary-500" > { totalAssessments } </ p >
55+ </ div >
56+ ) }
4857 </ div >
4958 </ Stack >
5059 < div className = "mt-3 row w-md-75 w-lg-50 align-items-end" >
5160 {
5261 summaryOrder . map ( ( key ) => (
5362 < div className = "col" key = { key } >
5463 < div className = "x-small text-gray-500" >
55- < p className = "mb-2 " > { intl . formatMessage ( messages [ key as keyof typeof messages ] ) } </ p >
64+ < p className = "mb-0 " > { intl . formatMessage ( messages [ key as keyof typeof messages ] ) } </ p >
5665 </ div >
5766 < div className = "lead text-primary-500" >
58- < p >
59- { data [ key as keyof typeof data ] ?? 0 }
60- </ p >
67+ { isLoading ? (
68+ < Skeleton />
69+ ) : (
70+ < p >
71+ { data [ key as keyof typeof data ] ?? 0 }
72+ </ p >
73+ ) }
6174 </ div >
6275 </ div >
6376 ) )
0 commit comments