import { useEffect } from 'react'; import PropTypes from 'prop-types'; import { useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; import { Alert, Container, Layout, Button, TransitionReplace, } from '@openedx/paragon'; import { useIntl } from '@edx/frontend-platform/i18n'; import { Warning as WarningIcon, CheckCircle as CheckCircleIcon, } from '@openedx/paragon/icons'; import { CourseAuthoringUnitSidebarSlot } from '../plugin-slots/CourseAuthoringUnitSidebarSlot'; import { getProcessingNotification } from '../generic/processing-notification/data/selectors'; import SubHeader from '../generic/sub-header/SubHeader'; import { RequestStatus } from '../data/constants'; import getPageHeadTitle from '../generic/utils'; import AlertMessage from '../generic/alert-message'; import { PasteComponent } from '../generic/clipboard'; import ProcessingNotification from '../generic/processing-notification'; import { SavingErrorAlert } from '../generic/saving-error-alert'; import ConnectionErrorAlert from '../generic/ConnectionErrorAlert'; import Loading from '../generic/Loading'; import AddComponent from './add-component/AddComponent'; import HeaderTitle from './header-title/HeaderTitle'; import Breadcrumbs from './breadcrumbs/Breadcrumbs'; import Sequence from './course-sequence'; import { useCourseUnit, useLayoutGrid, useScrollToLastPosition } from './hooks'; import messages from './messages'; import { PasteNotificationAlert } from './clipboard'; import XBlockContainerIframe from './xblock-container-iframe'; import MoveModal from './move-modal'; import IframePreviewLibraryXBlockChanges from './preview-changes'; import CourseUnitHeaderActionsSlot from '../plugin-slots/CourseUnitHeaderActionsSlot'; const CourseUnit = ({ courseId }) => { const { blockId } = useParams(); const intl = useIntl(); const { courseUnit, isLoading, sequenceId, unitTitle, unitCategory, errorMessage, sequenceStatus, savingStatus, isTitleEditFormOpen, isUnitVerticalType, isUnitLibraryType, isSplitTestType, staticFileNotices, currentlyVisibleToStudents, unitXBlockActions, sharedClipboardData, showPasteXBlock, showPasteUnit, handleTitleEditSubmit, headerNavigationsActions, handleTitleEdit, handleCreateNewCourseXBlock, handleConfigureSubmit, courseVerticalChildren, canPasteComponent, isMoveModalOpen, openMoveModal, closeMoveModal, movedXBlockParams, handleRollbackMovedXBlock, handleCloseXBlockMovedAlert, handleNavigateToTargetUnit, addComponentTemplateData, } = useCourseUnit({ courseId, blockId }); const layoutGrid = useLayoutGrid(unitCategory, isUnitLibraryType); const readOnly = !!courseUnit.readOnly; useEffect(() => { document.title = getPageHeadTitle('', unitTitle); }, [unitTitle]); useScrollToLastPosition(); const { isShow: isShowProcessingNotification, title: processingNotificationTitle, } = useSelector(getProcessingNotification); if (isLoading) { return ; } if (sequenceStatus === RequestStatus.FAILED) { return ( ); } return ( <>
{movedXBlockParams.isSuccess ? ( {intl.formatMessage(messages.undoMoveButton)} , , ]} onClose={handleCloseXBlockMovedAlert} /> ) : null} {courseUnit.upstreamInfo?.upstreamLink && ( {intl.formatMessage(messages.alertLibraryUnitReadOnlyLinkText)} ), }, )} variant="info" /> )} )} breadcrumbs={( )} headerActions={( )} /> {isUnitVerticalType && ( )} {currentlyVisibleToStudents && ( )} {staticFileNotices && ( )} {!readOnly && ( )} {!readOnly && showPasteXBlock && canPasteComponent && isUnitVerticalType && ( handleCreateNewCourseXBlock({ stagedContent: 'clipboard', parentLocator: blockId }) } text={intl.formatMessage(messages.pasteButtonText)} /> )}
); }; CourseUnit.propTypes = { courseId: PropTypes.string.isRequired, }; export default CourseUnit;