Files
frontend-app-authoring/src/generic/saving-error-alert/SavingErrorAlert.jsx
Peter Kulko 7e4ecff4e8 feat: handle edit modals from advanced xblocks (#1445)
Adds new message types, updates message handlers, and implements a new modal iframe for legacy XBlock editing.
2025-02-20 17:05:48 -03:00

69 lines
1.8 KiB
JavaScript

import { useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import { Warning as WarningIcon } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import { RequestStatus } from '../../data/constants';
import AlertMessage from '../alert-message';
import messages from './messages';
const SavingErrorAlert = ({
savingStatus,
errorMessage,
}) => {
const intl = useIntl();
const [showAlert, setShowAlert] = useState(false);
const [isOnline, setIsOnline] = useState(window.navigator.onLine);
const isQueryFailed = savingStatus === RequestStatus.FAILED;
useEffect(() => {
const handleOnlineStatus = () => setIsOnline(window.navigator.onLine);
const events = ['online', 'offline'];
events.forEach((event) => {
window.addEventListener(event, handleOnlineStatus);
});
return () => {
events.forEach((event) => {
window.removeEventListener(event, handleOnlineStatus);
});
};
}, [isOnline]);
useEffect(() => {
setShowAlert((!isOnline && isQueryFailed) || isQueryFailed);
}, [isQueryFailed, isOnline]);
return (
<AlertMessage
show={showAlert}
variant="danger"
data-testid="saving-error-alert"
icon={WarningIcon}
title={intl.formatMessage(messages.warningTitle)}
description={
errorMessage || intl.formatMessage(messages.warningDescription)
}
aria-hidden="true"
aria-labelledby={intl.formatMessage(
messages.warningTitleAriaLabelledBy,
)}
aria-describedby={intl.formatMessage(
messages.warningDescriptionAriaDescribedBy,
)}
/>
);
};
SavingErrorAlert.defaultProps = {
errorMessage: undefined,
};
SavingErrorAlert.propTypes = {
savingStatus: PropTypes.string.isRequired,
errorMessage: PropTypes.string,
};
export default SavingErrorAlert;