BREAKING CHANGE: slot ids have been changed for consistency * `sequence_container_plugin` -> `sequence_container_slot` * `unit_title_plugin` -> `unit_title_slot` Co-authored-by: Brian Smith <112954497+brian-smith-tcril@users.noreply.github.com>
81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
import PropTypes from 'prop-types';
|
|
import React from 'react';
|
|
|
|
import { AppContext } from '@edx/frontend-platform/react';
|
|
import { useIntl } from '@edx/frontend-platform/i18n';
|
|
|
|
import { useModel } from '@src/generic/model-store';
|
|
import { usePluginsCallback } from '@src/generic/plugin-store';
|
|
|
|
import BookmarkButton from '../../bookmark/BookmarkButton';
|
|
import messages from '../messages';
|
|
import ContentIFrame from './ContentIFrame';
|
|
import UnitSuspense from './UnitSuspense';
|
|
import { modelKeys, views } from './constants';
|
|
import { useExamAccess, useShouldDisplayHonorCode } from './hooks';
|
|
import { getIFrameUrl } from './urls';
|
|
import UnitTitleSlot from '../../../../plugin-slots/UnitTitleSlot';
|
|
|
|
const Unit = ({
|
|
courseId,
|
|
format,
|
|
onLoaded,
|
|
id,
|
|
}) => {
|
|
const { formatMessage } = useIntl();
|
|
const { authenticatedUser } = React.useContext(AppContext);
|
|
const examAccess = useExamAccess({ id });
|
|
const shouldDisplayHonorCode = useShouldDisplayHonorCode({ courseId, id });
|
|
const unit = useModel(modelKeys.units, id);
|
|
const isProcessing = unit.bookmarkedUpdateState === 'loading';
|
|
const view = authenticatedUser ? views.student : views.public;
|
|
|
|
const getUrl = usePluginsCallback('getIFrameUrl', () => getIFrameUrl({
|
|
id,
|
|
view,
|
|
format,
|
|
examAccess,
|
|
}));
|
|
|
|
const iframeUrl = getUrl();
|
|
|
|
return (
|
|
<div className="unit">
|
|
<div className="mb-0">
|
|
<h3 className="h3">{unit.title}</h3>
|
|
<UnitTitleSlot courseId={courseId} unitId={id} />
|
|
</div>
|
|
<h2 className="sr-only">{formatMessage(messages.headerPlaceholder)}</h2>
|
|
<BookmarkButton
|
|
unitId={unit.id}
|
|
isBookmarked={unit.bookmarked}
|
|
isProcessing={isProcessing}
|
|
/>
|
|
<UnitSuspense {...{ courseId, id }} />
|
|
<ContentIFrame
|
|
elementId="unit-iframe"
|
|
id={id}
|
|
iframeUrl={iframeUrl}
|
|
loadingMessage={formatMessage(messages.loadingSequence)}
|
|
onLoaded={onLoaded}
|
|
shouldShowContent={!shouldDisplayHonorCode && !examAccess.blockAccess}
|
|
title={unit.title}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
Unit.propTypes = {
|
|
courseId: PropTypes.string.isRequired,
|
|
format: PropTypes.string,
|
|
id: PropTypes.string.isRequired,
|
|
onLoaded: PropTypes.func,
|
|
};
|
|
|
|
Unit.defaultProps = {
|
|
format: null,
|
|
onLoaded: undefined,
|
|
};
|
|
|
|
export default Unit;
|