Skip to content

Commit e4b8e3d

Browse files
authored
add a loading state to DashboardCard (#2216)
* add a loading state to DashboardCard * properly check if startDate is set on the run
1 parent b7148ea commit e4b8e3d

File tree

2 files changed

+74
-67
lines changed

2 files changed

+74
-67
lines changed

frontends/main/src/app-pages/DashboardPage/CoursewareDisplay/DashboardCard.tsx

Lines changed: 68 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import React from "react"
2-
import { styled, Link, SimpleMenu, SimpleMenuItem, Stack } from "ol-components"
2+
import {
3+
styled,
4+
Link,
5+
SimpleMenu,
6+
SimpleMenuItem,
7+
Stack,
8+
Skeleton,
9+
} from "ol-components"
310
import NextLink from "next/link"
411
import { EnrollmentStatus, EnrollmentMode } from "./types"
512
import type { DashboardCourse } from "./types"
@@ -247,6 +254,7 @@ type DashboardCardProps = {
247254
courseNoun?: string
248255
offerUpgrade?: boolean
249256
contextMenuItems?: SimpleMenuItem[]
257+
isLoading?: boolean
250258
}
251259
const DashboardCard: React.FC<DashboardCardProps> = ({
252260
dashboardResource,
@@ -256,10 +264,62 @@ const DashboardCard: React.FC<DashboardCardProps> = ({
256264
courseNoun = "Course",
257265
offerUpgrade = true,
258266
contextMenuItems = [],
267+
isLoading = false,
259268
}) => {
260269
const { title, marketingUrl, enrollment, run } = dashboardResource
270+
const titleSection = isLoading ? (
271+
<>
272+
<Skeleton variant="text" width="95%" height={16} />
273+
<Skeleton variant="text" width={120} height={16} />
274+
<Skeleton variant="text" width={120} height={16} />
275+
</>
276+
) : (
277+
<>
278+
<TitleLink size="medium" color="black" href={marketingUrl}>
279+
{title}
280+
</TitleLink>
281+
{enrollment?.status === EnrollmentStatus.Completed ? (
282+
<SubtitleLink href="#">
283+
{<RiAwardLine size="16px" />}
284+
View Certificate
285+
</SubtitleLink>
286+
) : null}
287+
{enrollment?.mode !== EnrollmentMode.Verified && offerUpgrade ? (
288+
<UpgradeBanner
289+
data-testid="upgrade-root"
290+
canUpgrade={run.canUpgrade}
291+
certificateUpgradeDeadline={run.certificateUpgradeDeadline}
292+
certificateUpgradePrice={run.certificateUpgradePrice}
293+
/>
294+
) : null}
295+
</>
296+
)
297+
const buttonSection = isLoading ? (
298+
<Skeleton variant="rectangular" width={120} height={32} />
299+
) : (
300+
<>
301+
<EnrollmentStatusIndicator
302+
status={enrollment?.status}
303+
showNotComplete={showNotComplete}
304+
/>
305+
<CoursewareButton
306+
data-testid="courseware-button"
307+
startDate={run.startDate}
308+
href={run.coursewareUrl}
309+
endDate={run.endDate}
310+
courseNoun={courseNoun}
311+
/>
312+
</>
313+
)
314+
const startDateSection = isLoading ? (
315+
<Skeleton variant="text" width={100} height={24} />
316+
) : run.startDate ? (
317+
<CourseStartCountdown startDate={run.startDate} />
318+
) : null
261319
const menuItems = contextMenuItems.concat(getDefaultContextMenuItems(title))
262-
const contextMenu = (
320+
const contextMenu = isLoading ? (
321+
<Skeleton variant="rectangular" width={12} height={24} />
322+
) : (
263323
<SimpleMenu
264324
items={menuItems}
265325
trigger={
@@ -277,42 +337,14 @@ const DashboardCard: React.FC<DashboardCardProps> = ({
277337
className={className}
278338
>
279339
<Stack justifyContent="start" alignItems="stretch" gap="8px" flex={1}>
280-
<TitleLink size="medium" color="black" href={marketingUrl}>
281-
{title}
282-
</TitleLink>
283-
{enrollment?.status === EnrollmentStatus.Completed ? (
284-
<SubtitleLink href="#">
285-
{<RiAwardLine size="16px" />}
286-
View Certificate
287-
</SubtitleLink>
288-
) : null}
289-
{enrollment?.mode !== EnrollmentMode.Verified && offerUpgrade ? (
290-
<UpgradeBanner
291-
data-testid="upgrade-root"
292-
canUpgrade={run.canUpgrade}
293-
certificateUpgradeDeadline={run.certificateUpgradeDeadline}
294-
certificateUpgradePrice={run.certificateUpgradePrice}
295-
/>
296-
) : null}
340+
{titleSection}
297341
</Stack>
298342
<Stack gap="8px">
299343
<Stack direction="row" gap="8px" alignItems="center">
300-
<EnrollmentStatusIndicator
301-
status={enrollment?.status}
302-
showNotComplete={showNotComplete}
303-
/>
304-
<CoursewareButton
305-
data-testid="courseware-button"
306-
startDate={run.startDate}
307-
href={run.coursewareUrl}
308-
endDate={run.endDate}
309-
courseNoun={courseNoun}
310-
/>
344+
{buttonSection}
311345
{contextMenu}
312346
</Stack>
313-
{run.startDate ? (
314-
<CourseStartCountdown startDate={run.startDate} />
315-
) : null}
347+
{startDateSection}
316348
</Stack>
317349
</CardRoot>
318350
)
@@ -332,23 +364,7 @@ const DashboardCard: React.FC<DashboardCardProps> = ({
332364
width="100%"
333365
>
334366
<Stack direction="column" gap="8px" flex={1}>
335-
<TitleLink size="medium" color="black" href={marketingUrl}>
336-
{title}
337-
</TitleLink>
338-
{enrollment?.status === EnrollmentStatus.Completed ? (
339-
<SubtitleLink href="#">
340-
{<RiAwardLine size="16px" />}
341-
View Certificate
342-
</SubtitleLink>
343-
) : null}
344-
{enrollment?.mode !== EnrollmentMode.Verified && offerUpgrade ? (
345-
<UpgradeBanner
346-
data-testid="upgrade-root"
347-
canUpgrade={run.canUpgrade}
348-
certificateUpgradeDeadline={run.certificateUpgradeDeadline}
349-
certificateUpgradePrice={run.certificateUpgradePrice}
350-
/>
351-
) : null}
367+
{titleSection}
352368
</Stack>
353369
{contextMenu}
354370
</Stack>
@@ -358,23 +374,9 @@ const DashboardCard: React.FC<DashboardCardProps> = ({
358374
justifyContent="space-between"
359375
width="100%"
360376
>
361-
{run.startDate ? (
362-
<Stack justifyContent="start">
363-
<CourseStartCountdown startDate={run.startDate} />
364-
</Stack>
365-
) : null}
377+
{startDateSection}
366378
<Stack direction="row" gap="8px" alignItems="center">
367-
<EnrollmentStatusIndicator
368-
status={enrollment?.status}
369-
showNotComplete={showNotComplete}
370-
/>
371-
<CoursewareButton
372-
data-testid="courseware-button"
373-
startDate={run.startDate}
374-
href={run.coursewareUrl}
375-
endDate={run.endDate}
376-
courseNoun={courseNoun}
377-
/>
379+
{buttonSection}
378380
</Stack>
379381
</Stack>
380382
</CardRoot>

frontends/main/src/app-pages/DashboardPage/CoursewareDisplay/EnrollmentDisplay.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,13 @@ const sortEnrollments = (resources: DashboardCourse[]) => {
118118
interface EnrollmentExpandCollapseProps {
119119
shownEnrollments: DashboardCourse[]
120120
hiddenEnrollments: DashboardCourse[]
121+
isLoading?: boolean
121122
}
122123

123124
const EnrollmentExpandCollapse: React.FC<EnrollmentExpandCollapseProps> = ({
124125
shownEnrollments,
125126
hiddenEnrollments,
127+
isLoading,
126128
}) => {
127129
const [shown, setShown] = React.useState(false)
128130

@@ -140,6 +142,7 @@ const EnrollmentExpandCollapse: React.FC<EnrollmentExpandCollapseProps> = ({
140142
Component="li"
141143
dashboardResource={course}
142144
showNotComplete={false}
145+
isLoading={isLoading}
143146
/>
144147
))}
145148
</EnrollmentsList>
@@ -151,6 +154,7 @@ const EnrollmentExpandCollapse: React.FC<EnrollmentExpandCollapseProps> = ({
151154
Component="li"
152155
dashboardResource={course}
153156
showNotComplete={false}
157+
isLoading={isLoading}
154158
/>
155159
))}
156160
</HiddenEnrollmentsList>
@@ -165,7 +169,7 @@ const EnrollmentExpandCollapse: React.FC<EnrollmentExpandCollapseProps> = ({
165169
}
166170

167171
const EnrollmentDisplay = () => {
168-
const { data: enrolledCourses } = useQuery({
172+
const { data: enrolledCourses, isLoading } = useQuery({
169173
...enrollmentQueries.coursesList(),
170174
select: mitxonlineEnrollments,
171175
})
@@ -192,6 +196,7 @@ const EnrollmentDisplay = () => {
192196
<EnrollmentExpandCollapse
193197
shownEnrollments={shownEnrollments}
194198
hiddenEnrollments={expired}
199+
isLoading={isLoading}
195200
/>
196201
</Wrapper>
197202
)

0 commit comments

Comments
 (0)