import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; import { getConfig } from '@edx/frontend-platform'; import { FormattedMessage } from '@edx/frontend-platform/i18n'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faHome } from '@fortawesome/free-solid-svg-icons'; import { useSelector } from 'react-redux'; import { useModel } from '../../generic/model-store'; /** [MM-P2P] Experiment */ import { MMP2PFlyoverTrigger } from '../../experiments/mm-p2p'; function CourseBreadcrumb({ url, children, withSeparator, ...attrs }) { return ( <> {withSeparator && (
  • /
  • )}
  • {children}
  • ); } CourseBreadcrumb.propTypes = { url: PropTypes.string.isRequired, children: PropTypes.node.isRequired, withSeparator: PropTypes.bool, }; CourseBreadcrumb.defaultProps = { withSeparator: false, }; export default function CourseBreadcrumbs({ courseId, sectionId, sequenceId, /** [MM-P2P] Experiment */ mmp2p, }) { const course = useModel('coursewareMeta', courseId); const sequence = useModel('sequences', sequenceId); const section = useModel('sections', sectionId); const courseStatus = useSelector(state => state.courseware.courseStatus); const sequenceStatus = useSelector(state => state.courseware.sequenceStatus); const links = useMemo(() => { if (courseStatus === 'loaded' && sequenceStatus === 'loaded') { return [section, sequence].filter(node => !!node).map((node) => ({ id: node.id, label: node.title, url: `${getConfig().LMS_BASE_URL}/courses/${course.id}/course/#${node.id}`, })); } return []; }, [courseStatus, sequenceStatus]); return ( ); } CourseBreadcrumbs.propTypes = { courseId: PropTypes.string.isRequired, sectionId: PropTypes.string, sequenceId: PropTypes.string, /** [MM-P2P] Experiment */ mmp2p: PropTypes.shape({ state: PropTypes.shape({ isEnabled: PropTypes.bool.isRequired, }), }), }; CourseBreadcrumbs.defaultProps = { sectionId: null, sequenceId: null, /** [MM-P2P] Experiment */ mmp2p: {}, };