import PropTypes from 'prop-types' import { useTranslation, Trans } from 'react-i18next' import { FetchError } from '../../../../infrastructure/fetch-json' import RedirectToLogin from './redirect-to-login' import { BlockedFilenameError, DuplicateFilenameError, InvalidFilenameError, } from '../../errors' import DangerMessage from './danger-message' export default function ErrorMessage({ error }) { const { t } = useTranslation() const fileNameLimit = 150 // the error is a string // TODO: translate? always? is this a key or a message? if (typeof error === 'string') { switch (error) { case 'name-exists': return {t('file_already_exists')} case 'too-many-files': return {t('project_has_too_many_files')} case 'remote-service-error': return {t('remote_service_error')} case 'invalid_filename': return ( ) case 'rate-limit-hit': return ( {t('too_many_files_uploaded_throttled_short_period')} ) case 'not-logged-in': return ( ) case 'linked-project-compile-error': return ( {t('generic_linked_file_compile_error')} ) default: // TODO: convert error.response.data to an error key and try again? // return error return ( {t('generic_something_went_wrong')} ) } } // the error is an object // TODO: error.name? switch (error.constructor) { case FetchError: { const message = error.data?.message if (message) { return {message.text || message} } // TODO: translations switch (error.response?.status) { case 400: return {t('invalid_request')} case 403: return {t('session_error')} case 429: return {t('too_many_attempts')} default: return ( {t('something_went_wrong_server')} ) } } // these are handled by the filename input component case DuplicateFilenameError: case InvalidFilenameError: case BlockedFilenameError: return null // a generic error message default: // return error.message return {t('generic_something_went_wrong')} } } ErrorMessage.propTypes = { error: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired, }