import { useEffect, useState, useRef } from 'react'; import PropTypes from 'prop-types'; import { useIntl } from '@edx/frontend-platform/i18n'; import { useDispatch, useSelector } from 'react-redux'; import { ActionRow, Alert, Badge, Form, Hyperlink, ModalDialog, StatefulButton, } from '@openedx/paragon'; import { Info } from '@openedx/paragon/icons'; import { updateModel, useModel } from 'CourseAuthoring/generic/model-store'; import { RequestStatus } from 'CourseAuthoring/data/constants'; import FormSwitchGroup from 'CourseAuthoring/generic/FormSwitchGroup'; import Loading from 'CourseAuthoring/generic/Loading'; import PermissionDeniedAlert from 'CourseAuthoring/generic/PermissionDeniedAlert'; import ConnectionErrorAlert from 'CourseAuthoring/generic/ConnectionErrorAlert'; import { useAppSetting, useIsMobile } from 'CourseAuthoring/utils'; import { getLoadingStatus, getSavingStatus } from 'CourseAuthoring/pages-and-resources/data/selectors'; import { updateSavingStatus } from 'CourseAuthoring/pages-and-resources/data/slice'; import messages from './messages'; const ORASettings = ({ onClose }) => { const dispatch = useDispatch(); const { formatMessage } = useIntl(); const alertRef = useRef(null); const updateSettingsRequestStatus = useSelector(getSavingStatus); const loadingStatus = useSelector(getLoadingStatus); const isMobile = useIsMobile(); const modalVariant = isMobile ? 'dark' : 'default'; const appId = 'ora_settings'; const appInfo = useModel('courseApps', appId); const [enableFlexiblePeerGrade, saveSetting] = useAppSetting( 'forceOnFlexiblePeerOpenassessments', ); const initialFormValues = { enableFlexiblePeerGrade }; const [formValues, setFormValues] = useState(initialFormValues); const [saveError, setSaveError] = useState(false); const submitButtonState = updateSettingsRequestStatus === RequestStatus.IN_PROGRESS ? 'pending' : 'default'; const handleSettingsSave = (values) => saveSetting(values.enableFlexiblePeerGrade); const handleSubmit = async (event) => { let success = true; event.preventDefault(); success = success && await handleSettingsSave(formValues); setSaveError(!success); if ((initialFormValues.enableFlexiblePeerGrade !== formValues.enableFlexiblePeerGrade) && success) { // oxlint-disable-next-line @typescript-eslint/await-thenable - this dispatch() IS returning a promise. success = await dispatch(updateModel({ modelType: 'courseApps', model: { id: appId, enabled: formValues.enableFlexiblePeerGrade, }, })); } !success && alertRef?.current.scrollIntoView(); // eslint-disable-line @typescript-eslint/no-unused-expressions }; const handleChange = (e) => { setFormValues({ enableFlexiblePeerGrade: e.target.checked }); }; useEffect(() => { if (updateSettingsRequestStatus === RequestStatus.SUCCESSFUL) { dispatch(updateSavingStatus({ status: '' })); onClose(); } }, [updateSettingsRequestStatus]); const renderBody = () => { switch (loadingStatus) { case RequestStatus.SUCCESSFUL: return ( <> {saveError && ( {formatMessage(messages.errorSavingTitle)} {formatMessage(messages.errorSavingMessage)} )} {formatMessage(messages.enableFlexPeerGradeLabel)} {formValues.enableFlexiblePeerGrade && ( {formatMessage(messages.enabledBadgeLabel)} )} )} helpText={( {formatMessage(messages.enableFlexPeerGradeHelp)} {formatMessage(messages.ORASettingsHelpLink)} )} onChange={handleChange} checked={formValues.enableFlexiblePeerGrade} /> > ); case RequestStatus.DENIED: return ; case RequestStatus.FAILED: return ; default: return ; } }; return ( {formatMessage(messages.heading)} {renderBody()} {formatMessage(messages.cancelLabel)} ); }; ORASettings.propTypes = { onClose: PropTypes.func.isRequired, }; export default ORASettings;
{formatMessage(messages.enableFlexPeerGradeHelp)}