* AA-712: course_home_audit_access_expires and in_course_audit_access_expires * AA-712: course_home_welcome and in_course_welcome * AA-712: course_home_dates * AA-712: course_home_course_tools * AA-712: course_home_upgrade_shift_dates and dates_upgrade * AA-712: fixing up PR comments
135 lines
3.9 KiB
JavaScript
135 lines
3.9 KiB
JavaScript
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { Helmet } from 'react-helmet';
|
|
import { useDispatch } from 'react-redux';
|
|
import { getConfig } from '@edx/frontend-platform';
|
|
|
|
import { AlertList } from '../../generic/user-messages';
|
|
import useAccessExpirationAlert from '../../alerts/access-expiration-alert';
|
|
import useOfferAlert from '../../alerts/offer-alert';
|
|
|
|
import Sequence from './sequence';
|
|
|
|
import { CelebrationModal, shouldCelebrateOnSectionLoad } from './celebration';
|
|
import ContentTools from './content-tools';
|
|
import CourseBreadcrumbs from './CourseBreadcrumbs';
|
|
import CourseSock from '../../generic/course-sock';
|
|
import { useModel } from '../../generic/model-store';
|
|
|
|
/** [MM-P2P] Experiment */
|
|
import { initCoursewareMMP2P, MMP2PBlockModal } from '../../experiments/mm-p2p';
|
|
|
|
function Course({
|
|
courseId,
|
|
sequenceId,
|
|
unitId,
|
|
nextSequenceHandler,
|
|
previousSequenceHandler,
|
|
unitNavigationHandler,
|
|
}) {
|
|
const course = useModel('coursewareMeta', courseId);
|
|
const sequence = useModel('sequences', sequenceId);
|
|
const section = useModel('sections', sequence ? sequence.sectionId : null);
|
|
|
|
const pageTitleBreadCrumbs = [
|
|
sequence,
|
|
section,
|
|
course,
|
|
].filter(element => element != null).map(element => element.title);
|
|
|
|
const {
|
|
accessExpiration,
|
|
canShowUpgradeSock,
|
|
celebrations,
|
|
offer,
|
|
org,
|
|
userTimezone,
|
|
verifiedMode,
|
|
} = course;
|
|
|
|
// Below the tabs, above the breadcrumbs alerts (appearing in the order listed here)
|
|
const offerAlert = useOfferAlert(courseId, offer, org, userTimezone, 'course', 'in_course');
|
|
const accessExpirationAlert = useAccessExpirationAlert(accessExpiration, courseId, org, userTimezone, 'course', 'in_course');
|
|
|
|
const dispatch = useDispatch();
|
|
const celebrateFirstSection = celebrations && celebrations.firstSection;
|
|
const celebrationOpen = shouldCelebrateOnSectionLoad(
|
|
courseId, sequenceId, unitId, celebrateFirstSection, dispatch, celebrations,
|
|
);
|
|
|
|
/** [MM-P2P] Experiment */
|
|
const MMP2P = initCoursewareMMP2P(courseId, sequenceId, unitId);
|
|
|
|
return (
|
|
<>
|
|
<Helmet>
|
|
<title>{`${pageTitleBreadCrumbs.join(' | ')} | ${getConfig().SITE_NAME}`}</title>
|
|
</Helmet>
|
|
{ /** This conditional is for the [MM-P2P] Experiment */}
|
|
{ !MMP2P.state.isEnabled && (
|
|
<AlertList
|
|
className="my-3"
|
|
topic="course"
|
|
customAlerts={{
|
|
...accessExpirationAlert,
|
|
...offerAlert,
|
|
}}
|
|
/>
|
|
)}
|
|
<CourseBreadcrumbs
|
|
courseId={courseId}
|
|
sectionId={section ? section.id : null}
|
|
sequenceId={sequenceId}
|
|
//* * [MM-P2P] Experiment */
|
|
mmp2p={MMP2P}
|
|
/>
|
|
<AlertList topic="sequence" />
|
|
<Sequence
|
|
unitId={unitId}
|
|
sequenceId={sequenceId}
|
|
courseId={courseId}
|
|
unitNavigationHandler={unitNavigationHandler}
|
|
nextSequenceHandler={nextSequenceHandler}
|
|
previousSequenceHandler={previousSequenceHandler}
|
|
//* * [MM-P2P] Experiment */
|
|
mmp2p={MMP2P}
|
|
/>
|
|
{celebrationOpen && (
|
|
<CelebrationModal
|
|
courseId={courseId}
|
|
open
|
|
/>
|
|
)}
|
|
{canShowUpgradeSock && (
|
|
<CourseSock
|
|
courseId={courseId}
|
|
offer={offer}
|
|
orgKey={org}
|
|
pageLocation="Course Content Page"
|
|
verifiedMode={verifiedMode}
|
|
/>
|
|
)}
|
|
<ContentTools course={course} />
|
|
{ /** [MM-P2P] Experiment */ }
|
|
{ MMP2P.meta.modalLock && <MMP2PBlockModal options={MMP2P} /> }
|
|
</>
|
|
);
|
|
}
|
|
|
|
Course.propTypes = {
|
|
courseId: PropTypes.string,
|
|
sequenceId: PropTypes.string,
|
|
unitId: PropTypes.string,
|
|
nextSequenceHandler: PropTypes.func.isRequired,
|
|
previousSequenceHandler: PropTypes.func.isRequired,
|
|
unitNavigationHandler: PropTypes.func.isRequired,
|
|
};
|
|
|
|
Course.defaultProps = {
|
|
courseId: null,
|
|
sequenceId: null,
|
|
unitId: null,
|
|
};
|
|
|
|
export default Course;
|