From 81188ae30f85a6de8dbd25a1412287b148416e7a Mon Sep 17 00:00:00 2001 From: daphneli-chen <47010279+daphneli-chen@users.noreply.github.com> Date: Fri, 14 Aug 2020 13:50:10 -0700 Subject: [PATCH] AA-274: Created credit requirements banner (#168) Co-authored-by: Daphne Li-Chen --- .../progress-tab/CertificateBanner.jsx | 1 + .../progress-tab/CreditRequirements.jsx | 151 ++++++++++++++++++ src/course-home/progress-tab/ProgressTab.jsx | 2 + src/course-home/progress-tab/messages.js | 62 ++++++- 4 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 src/course-home/progress-tab/CreditRequirements.jsx diff --git a/src/course-home/progress-tab/CertificateBanner.jsx b/src/course-home/progress-tab/CertificateBanner.jsx index b44d0bdb..fb5537ba 100644 --- a/src/course-home/progress-tab/CertificateBanner.jsx +++ b/src/course-home/progress-tab/CertificateBanner.jsx @@ -17,6 +17,7 @@ function CertificateBanner({ intl }) { certificateData, enrollmentMode, } = useModel('progress', courseId); + if (certificateData === null || enrollmentMode === 'audit') { return null; } const { certUrl, certDownloadUrl } = certificateData; const dispatch = useDispatch(); diff --git a/src/course-home/progress-tab/CreditRequirements.jsx b/src/course-home/progress-tab/CreditRequirements.jsx new file mode 100644 index 00000000..c74448a5 --- /dev/null +++ b/src/course-home/progress-tab/CreditRequirements.jsx @@ -0,0 +1,151 @@ +import React from 'react'; +import { useSelector } from 'react-redux'; + +import { + FormattedDate, FormattedTime, injectIntl, intlShape, +} from '@edx/frontend-platform/i18n'; + +import { useModel } from '../../generic/model-store'; +import messages from './messages'; + +function CreditRequirements({ intl }) { + const { + courseId, + } = useSelector(state => state.courseHome); + + const { + creditCourseRequirements, + creditSupportUrl, + verificationData, + userTimezone, + } = useModel('progress', courseId); + + if (creditCourseRequirements === null) { return null; } + const timezoneFormatArgs = userTimezone ? { timeZone: userTimezone } : {}; + const eligibility = creditCourseRequirements.eligibilityStatus; + let message; + switch (eligibility) { + case 'not_eligible': + message = intl.formatMessage(messages.creditNotEligible); + break; + case 'eligible': + message = intl.formatMessage(messages.creditEligible); + break; + case 'partial_eligible': + message = intl.formatMessage(messages.creditPartialEligible); + break; + default: + break; + } + + const completed = `✓ ${intl.formatMessage(messages.completed)} `; + + const { status } = verificationData; + let verificationMessage; + let verificationLinkMessage = ''; + + switch (status) { + case 'none': + case 'expired': + verificationMessage = `${intl.formatMessage(messages.notStarted)}; `; + verificationLinkMessage = intl.formatMessage(messages.notStarted); + break; + case 'approved': + verificationMessage = completed; + break; + case 'pending': + verificationMessage = intl.formatMessage(messages.pending); + break; + case 'must_reverify': + verificationMessage = `${intl.formatMessage(messages.rejected)}; `; + verificationLinkMessage = intl.formatMessage(messages.tryAgain); + break; + default: + break; + } + return ( +
+
+
+ {intl.formatMessage(messages.courseCreditHeader)} +
+
{message}
+ {creditCourseRequirements.requirements.map((requirement) => ( +
+
+ {requirement.displayName} + {requirement.minGrade && ( + {` ${requirement.minGrade}%`} + )} +
+
+ {!requirement.status && ( + intl.formatMessage(messages.notMet) + )} + {(requirement.status === 'failed' || requirement.status === 'declined') && ( + intl.formatMessage(messages.failed) + )} + {requirement.status === 'submitted' && ( + intl.formatMessage(messages.submitted) + )} + {requirement.status === 'satisfied' && ( + + {completed} + {requirement.statusDate && ( + + + + )} + + )} +
+
+ ))} +
+
Verification Status
+
+ {verificationMessage} + {verificationLinkMessage && ( + {verificationLinkMessage} + )} + {status === 'approved' && verificationData.statusDate && ( + + + + )} +
+
+ {eligibility === 'eligible' && ( +
+ {intl.formatMessage(messages.purchaseCredit)} +
+ )} +
+ {intl.formatMessage(messages.learnMoreCredit)} +
+
+
+ ); +} + +CreditRequirements.propTypes = { + intl: intlShape.isRequired, +}; + +export default injectIntl(CreditRequirements); diff --git a/src/course-home/progress-tab/ProgressTab.jsx b/src/course-home/progress-tab/ProgressTab.jsx index 78b5645e..53f5201b 100644 --- a/src/course-home/progress-tab/ProgressTab.jsx +++ b/src/course-home/progress-tab/ProgressTab.jsx @@ -6,6 +6,7 @@ import { useModel } from '../../generic/model-store'; import Chapter from './Chapter'; import CertificateBanner from './CertificateBanner'; import messages from './messages'; +import CreditRequirements from './CreditRequirements'; function ProgressTab({ intl }) { const { @@ -29,6 +30,7 @@ function ProgressTab({ intl }) { )} + {coursewareSummary.map((chapter) => (