|
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