diff --git a/src/containers/CourseCard/components/Banners/CertificateBanner.jsx b/src/containers/CourseCard/components/Banners/CertificateBanner.jsx index 879a2d2..3f02001 100644 --- a/src/containers/CourseCard/components/Banners/CertificateBanner.jsx +++ b/src/containers/CourseCard/components/Banners/CertificateBanner.jsx @@ -61,23 +61,12 @@ export const CertificateBanner = ({ cardId }) => { ); } if (certificate.isDownloadable) { - if (certificate.certPreviewUrl) { - return ( - - {formatMessage(messages.certReady)} - {' '} - - {formatMessage(messages.viewCertificate)} - - - ); - } return ( {formatMessage(messages.certReady)} {' '} - - {formatMessage(messages.downloadCertificate)} + + {formatMessage(messages.viewCertificate)} ); diff --git a/src/containers/CourseCard/components/CourseCardDetails/hooks.js b/src/containers/CourseCard/components/CourseCardDetails/hooks.js index 2646b2a..93d361e 100644 --- a/src/containers/CourseCard/components/CourseCardDetails/hooks.js +++ b/src/containers/CourseCard/components/CourseCardDetails/hooks.js @@ -8,6 +8,9 @@ export const useAccessMessage = ({ cardId }) => { const { formatMessage, formatDate } = useIntl(); const enrollment = appHooks.useCardEnrollmentData(cardId); const courseRun = appHooks.useCardCourseRunData(cardId); + if (!courseRun.isStarted) { + return formatMessage(messages.courseStarts, { startDate: courseRun.startDate }); + } if (enrollment.isEnrolled) { if (enrollment.isAudit) { const { diff --git a/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js b/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js index 8c34bdc..ebfd6cc 100644 --- a/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js +++ b/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js @@ -80,8 +80,10 @@ describe('CourseCardDetails hooks', () => { isAuditAccessExpired: false, }; const courseRunData = { + isStarted: true, isFinished: false, - endDate: '10/20/1000', + startDate: '10/10/1000', + endDate: '10/20/2000', }; const runHook = ({ enrollment = {}, courseRun = {} }) => { appHooks.useCardCourseRunData.mockReturnValueOnce({ @@ -101,6 +103,19 @@ describe('CourseCardDetails hooks', () => { expect(appHooks.useCardEnrollmentData).toHaveBeenCalledWith(cardId); }); + describe('if not started yet', () => { + it('returns accessExpired message with accessExpirationDate from cardData', () => { + runHook({ + enrollment: { isAudit: true, isAuditAccessExpired: true }, + courseRun: { isStarted: false }, + }); + expect(out).toEqual(formatMessage( + messages.courseStarts, + { startDate: dateFormatter(formatDate, courseRunData.startDate) }, + )); + }); + }); + describe('if audit, and expired', () => { it('returns accessExpired message with accessExpirationDate from cardData', () => { runHook({ enrollment: { isAudit: true, isAuditAccessExpired: true } }); diff --git a/src/containers/CourseCard/components/CourseCardDetails/messages.js b/src/containers/CourseCard/components/CourseCardDetails/messages.js index 13738e4..3e5ee85 100644 --- a/src/containers/CourseCard/components/CourseCardDetails/messages.js +++ b/src/containers/CourseCard/components/CourseCardDetails/messages.js @@ -21,6 +21,11 @@ export const messages = StrictDict({ description: 'Course ending message on course card.', defaultMessage: 'Course ends {endDate}', }, + courseStarts: { + id: 'learner-dash.courseCard.CourseCardDetails.courseStarts', + description: 'Course start date message on course card.', + defaultMessage: 'Course starts {startDate}', + }, unknownProviderName: { id: 'learner-dash.courseCard.CourseCardDetails.unknownProviderName', description: 'Provider name display when name is unknown', diff --git a/src/containers/RelatedProgramsModal/components/ProgramCard.jsx b/src/containers/RelatedProgramsModal/components/ProgramCard.jsx index 19a5085..16e6ddd 100644 --- a/src/containers/RelatedProgramsModal/components/ProgramCard.jsx +++ b/src/containers/RelatedProgramsModal/components/ProgramCard.jsx @@ -21,10 +21,6 @@ export const ProgramCard = ({ data }) => { messages.courses, { numCourses: data.numberOfCourses }, ); - const durationMessage = formatMessage( - messages.duration, - { numWeeks: data.estimatedNumberOfWeeks }, - ); return ( { {data.programType}
- {numCoursesMessage} • {durationMessage} + {numCoursesMessage}
@@ -55,7 +51,6 @@ export const ProgramCard = ({ data }) => { ProgramCard.propTypes = { data: PropTypes.shape({ bannerUrl: PropTypes.string, - estimatedNumberOfWeeks: PropTypes.number, logoUrl: PropTypes.string, numberOfCourses: PropTypes.number, programType: PropTypes.string, diff --git a/src/containers/RelatedProgramsModal/components/ProgramCard.test.jsx b/src/containers/RelatedProgramsModal/components/ProgramCard.test.jsx index ea50d21..5bed634 100644 --- a/src/containers/RelatedProgramsModal/components/ProgramCard.test.jsx +++ b/src/containers/RelatedProgramsModal/components/ProgramCard.test.jsx @@ -5,7 +5,6 @@ import ProgramCard from './ProgramCard'; const props = { data: { - estimatedNumberOfWeeks: 1, numberOfCourses: 2, bannerUrl: 'props.data.bannerUrl', logoUrl: 'props.data.logoUrl', diff --git a/src/containers/RelatedProgramsModal/components/__snapshots__/ProgramCard.test.jsx.snap b/src/containers/RelatedProgramsModal/components/__snapshots__/ProgramCard.test.jsx.snap index d2b54c0..23e3e0a 100644 --- a/src/containers/RelatedProgramsModal/components/__snapshots__/ProgramCard.test.jsx.snap +++ b/src/containers/RelatedProgramsModal/components/__snapshots__/ProgramCard.test.jsx.snap @@ -50,8 +50,6 @@ exports[`RelatedProgramsModal ProgramCard snapshot 1`] = ` className="program-summary mt-2" > 2 Courses - • - 1 Weeks diff --git a/src/data/redux/app/selectors.js b/src/data/redux/app/selectors.js index 056c67d..d4a6e3e 100644 --- a/src/data/redux/app/selectors.js +++ b/src/data/redux/app/selectors.js @@ -48,8 +48,6 @@ dateSixMonthsFromNow.setDate(dateSixMonthsFromNow.getDate() + 180); export const courseCard = StrictDict({ certificates: mkCardSelector(({ certificates }) => ({ availableDate: certificates.availableDate, - certDownloadUrl: certificates.certDownloadUrl, - honorCertDownloadUrl: certificates.honorCertDownloadUrl, certPreviewUrl: certificates.certPreviewUrl, isDownloadable: certificates.isDownloadable, isEarnedButUnavailable: certificates.isEarned && !certificates.isAvailable, @@ -68,6 +66,7 @@ export const courseCard = StrictDict({ isStarted: courseRun.isStarted, isFinished: courseRun.isFinished, minPassingGrade: courseRun.minPassingGrade, + startDate: courseRun.startDate, })), enrollment: mkCardSelector(({ enrollment }) => { if (enrollment == null) { @@ -111,7 +110,6 @@ export const courseCard = StrictDict({ relatedPrograms: mkCardSelector(({ relatedPrograms }) => ({ list: relatedPrograms.map(program => ({ bannerUrl: program.bannerUrl, - estimatedNumberOfWeeks: program.estimatedNumberOfWeeks, logoUrl: program.logoUrl, numberOfCourses: program.numberOfCourses, programType: program.programType, diff --git a/src/data/services/lms/api.js b/src/data/services/lms/api.js index 3a6b0fa..459137e 100644 --- a/src/data/services/lms/api.js +++ b/src/data/services/lms/api.js @@ -1,26 +1,9 @@ -import fakeData from 'data/services/lms/fakeData/courses'; -/* -import { StrictDict } from 'utils'; -import { locationId } from 'data/constants/app'; -import { paramKeys } from './constants'; +import { get } from './utils'; import urls from './urls'; -import { - client, - get, - post, - stringifyUrl, -} from './utils'; -*/ /********************************************************************************* * GET Actions *********************************************************************************/ -const initializeList = () => Promise.resolve({ - courses: [ - ...fakeData.courseRunData, - ...fakeData.entitlementData, - ], - ...fakeData.globalData, -}); +const initializeList = () => get(urls.init).then(({ data }) => data); export default { initializeList }; diff --git a/src/data/services/lms/fakeData/courses.js b/src/data/services/lms/fakeData/courses.js index 6e38551..58c1bc1 100644 --- a/src/data/services/lms/fakeData/courses.js +++ b/src/data/services/lms/fakeData/courses.js @@ -22,7 +22,6 @@ export const relatedPrograms = [ programUrl: 'www.edx/my-program', programType: 'MicroBachelors Program', numberOfCourses: 3, - estimatedNumberOfWeeks: 4, }, { provider: 'University of Maryland', @@ -33,7 +32,6 @@ export const relatedPrograms = [ programType: 'MicroBachelors Program', programTypeUrl: 'www.edx/my-program-type', numberOfCourses: 3, - estimatedNumberOfWeeks: 4, }, ]; @@ -48,8 +46,10 @@ const logos = { science: 'https://courses.edx.org/asset-v1:HarvardX+PH525.5x+3T2020+type@thumbnail+block@course_image-375x200.jpg', }; +const farPastDate = '11/11/1900'; const pastDate = '11/11/2000'; const futureDate = '11/11/3030'; +const farFutureDate = '11/11/4040'; const soonDate = new Date(); soonDate.setDate(soonDate.getDate() + 60); const soonDateStr = soonDate.toDateString(); @@ -102,7 +102,8 @@ const globalData = { export const genCourseRunData = (data = {}) => ({ isStarted: false, isArchived: false, - endDate: futureDate, + startDate: data.isStarted ? farPastDate : futureDate, + endDate: farFutureDate, minPassingGrade: 70, homeUrl: 'edx.com/courses/my-course-url/home', marketingUrl: 'edx.com/courses/my-course-url/marketing', @@ -319,7 +320,6 @@ export const courseRuns = [ isAvailable: true, isDownloadable: true, availableDate: pastDate, - certDownloadUrl: logos.social, certPreviewUrl: logos.edx, }, }, @@ -339,7 +339,6 @@ export const courseRuns = [ isAvailable: true, isDownloadable: true, availableDate: pastDate, - certDownloadUrl: logos.social, }, }, // verified, course archived, learner finished, cert earned, downloadable (web + link) @@ -359,7 +358,6 @@ export const courseRuns = [ isAvailable: true, isDownloadable: true, availableDate: pastDate, - certDownloadUrl: logos.social, certPreviewUrl: logos.edx, }, }, @@ -471,7 +469,6 @@ export const courseRuns = [ isAvailable: true, isDownloadable: true, availableDate: pastDate, - certDownloadUrl: logos.social, certPreviewUrl: logos.edx, }, }, @@ -523,7 +520,6 @@ export const courseRuns = [ isAvailable: true, isDownloadable: true, availableDate: pastDate, - certDownloadUrl: logos.social, certPreviewUrl: logos.edx, }, }, diff --git a/src/data/services/lms/urls.js b/src/data/services/lms/urls.js index 3594167..1da9122 100644 --- a/src/data/services/lms/urls.js +++ b/src/data/services/lms/urls.js @@ -4,7 +4,9 @@ import { configuration } from 'config'; const baseUrl = `${configuration.LMS_BASE_URL}`; const api = `${baseUrl}/api/`; +const init = `${api}/learner_home/mock/init`; export default StrictDict({ api, + init, }); diff --git a/src/test/app.test.jsx b/src/test/app.test.jsx index 4b48031..3e01e41 100644 --- a/src/test/app.test.jsx +++ b/src/test/app.test.jsx @@ -155,8 +155,8 @@ describe('ESG app integration tests', () => { [ courseData.provider.name, courseData.course.courseNumber, - appMessages.withValues.CourseCardDetails.accessExpires({ - accessExpirationDate: courseData.enrollment.accessExpirationDate, + appMessages.withValues.CourseCardDetails.courseStarts({ + startDate: courseData.courseRun.startDate, }), ].forEach(value => inspector.verifyTextIncludes(cardDetails, value)); });