Skip to content

Commit db14c2c

Browse files
feat: handle error and loading
1 parent 73d9f18 commit db14c2c

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

src/openResponses/components/OpenResponsesSummary.tsx

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useParams } from 'react-router-dom';
22
import { useIntl } from '@openedx/frontend-base';
3-
import { Icon, Stack } from '@openedx/paragon';
3+
import { Alert, Icon, Skeleton, Stack } from '@openedx/paragon';
44
import { EditNote, ViewDay } from '@openedx/paragon/icons';
55
import { useOpenResponsesData } from '@src/openResponses/data/apiHook';
66
import messages from '@src/openResponses/messages';
@@ -18,46 +18,59 @@ const summaryOrder = [
1818
const 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

Comments
 (0)