-
Notifications
You must be signed in to change notification settings - Fork 198
Expand file tree
/
Copy pathCertificateBanner.jsx
More file actions
114 lines (105 loc) · 3.56 KB
/
CertificateBanner.jsx
File metadata and controls
114 lines (105 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* eslint-disable max-len */
import React, { useMemo } from 'react';
import PropTypes from 'prop-types';
import { MailtoLink, Hyperlink } from '@openedx/paragon';
import { CheckCircle } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import { baseAppUrl } from 'data/services/lms/urls';
import { useInitializeLearnerHome } from 'data/hooks';
import { utilHooks, useCourseData } from 'hooks';
import Banner from 'components/Banner';
import messages from './messages';
const { useFormatDate } = utilHooks;
export const CertificateBanner = ({ cardId }) => {
const { data: learnerHomeData } = useInitializeLearnerHome();
const courseData = useCourseData(cardId);
const {
certificate = {},
isVerified = false,
isAudit = false,
isPassing = false,
isArchived = false,
minPassingGrade = 0,
progressUrl = '',
} = useMemo(() => ({
isVerified: courseData?.enrollment?.isVerified,
isAudit: courseData?.enrollment?.isAudit,
certificate: courseData?.certificate || {},
isPassing: courseData?.gradeData?.isPassing,
isArchived: courseData?.courseRun?.isArchived,
minPassingGrade: Math.floor((courseData?.courseRun?.minPassingGrade ?? 0) * 100),
progressUrl: baseAppUrl(courseData?.courseRun?.progressUrl || ''),
}), [courseData]);
const { supportEmail, billingEmail } = useMemo(
() => ({
supportEmail: learnerHomeData?.platformSettings?.supportEmail,
billingEmail: learnerHomeData?.platformSettings?.billingEmail,
}),
[learnerHomeData],
);
const { formatMessage } = useIntl();
const formatDate = useFormatDate();
const emailLink = address => <MailtoLink to={address}>{address}</MailtoLink>;
if (certificate.isRestricted) {
return (
<Banner variant="danger">
{ supportEmail ? formatMessage(messages.certRestricted, { supportEmail: emailLink(supportEmail) }) : formatMessage(messages.certRestrictedNoEmail)}
{isVerified && ' '}
{isVerified && (billingEmail ? formatMessage(messages.certRefundContactBilling, { billingEmail: emailLink(billingEmail) }) : formatMessage(messages.certRefundContactBillingNoEmail))}
</Banner>
);
}
if (certificate.isDownloadable) {
return (
<Banner variant="success" icon={CheckCircle}>
{formatMessage(messages.certReady)}
{certificate.certPreviewUrl && (
<>
{' '}
<Hyperlink isInline destination={baseAppUrl(certificate.certPreviewUrl)}>
{formatMessage(messages.viewCertificate)}
</Hyperlink>
</>
)}
</Banner>
);
}
if (!isPassing) {
if (isAudit) {
return (
<Banner>
{formatMessage(messages.passingGrade, { minPassingGrade })}
</Banner>
);
}
if (isArchived) {
return (
<Banner variant="warning">
{formatMessage(messages.notEligibleForCert)}
{' '}
<Hyperlink isInline destination={progressUrl}>{formatMessage(messages.viewGrades)}</Hyperlink>
</Banner>
);
}
return (
<Banner variant="warning">
{formatMessage(messages.certMinGrade, { minPassingGrade })}
</Banner>
);
}
if (certificate.isEarned && new Date(certificate.availableDate) > new Date()) {
return (
<Banner>
{formatMessage(
messages.gradeAndCertReadyAfter,
{ availableDate: formatDate(certificate.availableDate) },
)}
</Banner>
);
}
return null;
};
CertificateBanner.propTypes = {
cardId: PropTypes.string.isRequired,
};
export default CertificateBanner;