|
1 | 1 | import React from 'react'; |
2 | | -import PropTypes from 'prop-types'; |
3 | | -import { useLocation } from 'react-router-dom'; |
4 | | -import classNames from 'classnames'; |
5 | 2 |
|
6 | 3 | import { useIntl } from '@edx/frontend-platform/i18n'; |
7 | | -import { Navbar, Nav, Icon } from '@edx/paragon'; |
8 | | -import { Locked, CheckCircle, Error } from '@edx/paragon/icons'; |
| 4 | +import { Navbar } from '@edx/paragon'; |
9 | 5 |
|
10 | 6 | import { |
11 | | - useAssessmentStepConfig, |
12 | | - useProgressData, |
| 7 | + useAssessmentStepOrder, |
13 | 8 | useIsPageDataLoaded, |
14 | 9 | } from 'data/services/lms/hooks/selectors'; |
| 10 | +import { stepNames } from 'data/services/lms/constants'; |
| 11 | + |
| 12 | +import ProgressStep from './ProgressStep'; |
15 | 13 |
|
16 | 14 | import messages from './messages'; |
17 | 15 | import './index.scss'; |
18 | 16 |
|
19 | | -export const ProgressStep = ({ |
20 | | - children, |
21 | | - href, |
22 | | - isActive, |
23 | | - isEnabled, |
24 | | - isComplete, |
25 | | - isError, |
26 | | - number, |
27 | | -}) => { |
28 | | - let icon = <Icon className="nav-icon" src={Locked} />; |
29 | | - if (isComplete) { |
30 | | - icon = <Icon className="nav-icon" src={CheckCircle} />; |
31 | | - } else if (isError) { |
32 | | - icon = <Icon className="nav-icon text-danger-300" src={Error} />; |
33 | | - } else if (number) { |
34 | | - icon = <span className="nav-icon number-icon">{number}</span>; |
35 | | - } |
36 | | - return ( |
37 | | - <Nav.Link |
38 | | - href={href} |
39 | | - disabled={!isEnabled} |
40 | | - className={classNames( |
41 | | - 'ora-progress-nav', |
42 | | - 'px-4', |
43 | | - { 'is-active': isActive }, |
44 | | - )} |
45 | | - > |
46 | | - {icon} |
47 | | - {children} |
48 | | - </Nav.Link> |
49 | | - ); |
50 | | -}; |
51 | | -ProgressStep.defaultProps = { |
52 | | - href: '#', |
53 | | - isActive: false, |
54 | | - isEnabled: false, |
55 | | - isComplete: false, |
56 | | - isError: false, |
57 | | - number: null, |
58 | | -}; |
59 | | -ProgressStep.propTypes = { |
60 | | - children: PropTypes.node.isRequired, |
61 | | - href: PropTypes.string, |
62 | | - isActive: PropTypes.bool, |
63 | | - isEnabled: PropTypes.bool, |
64 | | - isError: PropTypes.bool, |
65 | | - isComplete: PropTypes.bool, |
66 | | - number: PropTypes.number, |
| 17 | +export const stepLabels = { |
| 18 | + [stepNames.submission]: messages.createSubmission, |
| 19 | + [stepNames.peer]: messages.peerAssess, |
| 20 | + [stepNames.studentTraining]: messages.studentTraining, |
| 21 | + [stepNames.self]: messages.selfAssess, |
| 22 | + [stepNames.myGrades]: messages.myGrade, |
67 | 23 | }; |
68 | 24 |
|
69 | | -export const SubmissionStep = () => { |
70 | | - const { formatMessage } = useIntl(); |
71 | | - return ( |
72 | | - <ProgressStep>{formatMessage(messages.createSubmission)}</ProgressStep> |
73 | | - ); |
| 25 | +export const stepCanRevisit = { |
| 26 | + [stepNames.submission]: true, |
| 27 | + [stepNames.peer]: true, |
| 28 | + [stepNames.studentTraining]: false, |
| 29 | + [stepNames.self]: false, |
| 30 | + [stepNames.myGrades]: false, |
74 | 31 | }; |
75 | 32 |
|
76 | | -export const TrainingStep = () => { |
77 | | - const { formatMessage } = useIntl(); |
78 | | - return ( |
79 | | - <ProgressStep>{formatMessage(messages.practice)}</ProgressStep> |
80 | | - ); |
81 | | -}; |
82 | | - |
83 | | -export const SelfAssessStep = () => { |
84 | | - const { formatMessage } = useIntl(); |
85 | | - return ( |
86 | | - <ProgressStep>{formatMessage(messages.selfAssess)}</ProgressStep> |
87 | | - ); |
88 | | -}; |
89 | | - |
90 | | -export const PeerAssessStep = () => { |
91 | | - const { formatMessage } = useIntl(); |
92 | | - return ( |
93 | | - <ProgressStep>{formatMessage(messages.peerAssess)}</ProgressStep> |
94 | | - ); |
95 | | -}; |
| 33 | +export const ProgressBar = () => { |
| 34 | + const isLoaded = useIsPageDataLoaded(); |
96 | 35 |
|
97 | | -export const MyGradeStep = () => { |
| 36 | + const stepOrder = useAssessmentStepOrder(); |
98 | 37 | const { formatMessage } = useIntl(); |
99 | | - return ( |
100 | | - <ProgressStep>{formatMessage(messages.myGrade)}</ProgressStep> |
101 | | - ); |
102 | | -}; |
103 | 38 |
|
104 | | -export const ProgressBar = () => { |
105 | | - const stepConfig = useAssessmentStepConfig(); |
106 | | - const progress = useProgressData(); |
107 | | - const isLoaded = useIsPageDataLoaded(); |
108 | | - const location = useLocation(); |
109 | 39 | if (!isLoaded) { |
110 | 40 | return null; |
111 | 41 | } |
112 | | - console.log({ |
113 | | - stepConfig, progress, location, |
114 | | - }); |
| 42 | + |
| 43 | + const stepEl = (step) => ( |
| 44 | + stepLabels[step] |
| 45 | + ? ( |
| 46 | + <ProgressStep |
| 47 | + step={step} |
| 48 | + key={step} |
| 49 | + label={formatMessage(stepLabels[step])} |
| 50 | + canRevisit={stepCanRevisit[step]} |
| 51 | + /> |
| 52 | + ) : null |
| 53 | + ); |
| 54 | + |
115 | 55 | return ( |
116 | 56 | <Navbar> |
117 | 57 | <Navbar.Collapse className="ora-progress-nav-group"> |
118 | 58 | <hr className="ora-progress-divider" /> |
119 | | - <SubmissionStep /> |
120 | | - {stepConfig.order.map(step => { |
121 | | - if (step === 'peer') { |
122 | | - return <PeerAssessStep key="peer" />; |
123 | | - } |
124 | | - if (step === 'training') { |
125 | | - return <TrainingStep key="training" />; |
126 | | - } |
127 | | - if (step === 'self') { |
128 | | - return <SelfAssessStep key="self" />; |
129 | | - } |
130 | | - return null; |
131 | | - })} |
132 | | - <MyGradeStep /> |
| 59 | + {stepEl(stepNames.submission)} |
| 60 | + {stepOrder.map(stepEl)} |
| 61 | + {stepEl(stepNames.myGrades)} |
133 | 62 | </Navbar.Collapse> |
134 | 63 | </Navbar> |
135 | 64 | ); |
|
0 commit comments