Files
frontend-app-learning/src/courseware/course/sequence/sequence-navigation/UnitNavigation.jsx
Rodrigo Martin 06e5fb5a44 feat: Update previous and next unit navigation buttons design (#1617)
* feat: Update previous and next unit navigation buttons design

* feat: add unit test

* feat: move unit navigation to be inline with unit title
2025-03-04 11:05:39 -03:00

105 lines
2.7 KiB
JavaScript

import classNames from 'classnames';
import PropTypes from 'prop-types';
import { useIntl } from '@edx/frontend-platform/i18n';
import { GetCourseExitNavigation } from '../../course-exit';
import { useSequenceNavigationMetadata } from './hooks';
import messages from './messages';
import PreviousButton from './generic/PreviousButton';
import NextButton from './generic/NextButton';
import { NextUnitTopNavTriggerSlot } from '../../../../plugin-slots/NextUnitTopNavTriggerSlot';
const UnitNavigation = ({
sequenceId,
unitId,
onClickPrevious,
onClickNext,
isAtTop,
courseId,
}) => {
const intl = useIntl();
const {
isFirstUnit, isLastUnit, nextLink, previousLink,
} = useSequenceNavigationMetadata(sequenceId, unitId);
const renderPreviousButton = () => {
const buttonStyle = `previous-button ${isAtTop ? 'text-dark mr-3' : 'justify-content-center'}`;
return (
<PreviousButton
isFirstUnit={isFirstUnit}
variant="outline-secondary"
buttonLabel={intl.formatMessage(messages.previousButton)}
buttonStyle={buttonStyle}
onClick={onClickPrevious}
previousLink={previousLink}
isAtTop={isAtTop}
/>
);
};
const renderNextButton = () => {
const { exitActive, exitText } = GetCourseExitNavigation(courseId, intl);
const buttonText = (isLastUnit && exitText) ? exitText : intl.formatMessage(messages.nextButton);
const disabled = isLastUnit && !exitActive;
const variant = 'outline-primary';
const buttonStyle = `next-button ${isAtTop ? 'text-dark' : 'justify-content-center'}`;
if (isAtTop) {
return (
<NextUnitTopNavTriggerSlot
{...{
variant,
buttonStyle,
buttonText,
disabled,
sequenceId,
nextLink,
onClickHandler: onClickNext,
isAtTop,
}}
/>
);
}
return (
<NextButton
variant={variant}
buttonStyle={buttonStyle}
onClickHandler={onClickNext}
disabled={disabled}
buttonText={buttonText}
nextLink={nextLink}
hasEffortEstimate
/>
);
};
return (
<div className={classNames('d-flex', {
'unit-navigation': !isAtTop,
'top-unit-navigation': isAtTop,
})}
>
{renderPreviousButton()}
{renderNextButton()}
</div>
);
};
UnitNavigation.propTypes = {
courseId: PropTypes.string.isRequired,
sequenceId: PropTypes.string.isRequired,
unitId: PropTypes.string,
onClickPrevious: PropTypes.func.isRequired,
onClickNext: PropTypes.func.isRequired,
isAtTop: PropTypes.bool,
};
UnitNavigation.defaultProps = {
unitId: null,
isAtTop: false,
};
export default UnitNavigation;