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 ( <> {`${pageTitleBreadCrumbs.join(' | ')} | ${getConfig().SITE_NAME}`} { /** This conditional is for the [MM-P2P] Experiment */} { !MMP2P.state.isEnabled && ( )} {celebrationOpen && ( )} {canShowUpgradeSock && ( )} { /** [MM-P2P] Experiment */ } { MMP2P.meta.modalLock && } ); } 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;