import React from 'react' import PropTypes from 'prop-types' import { useTranslation } 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() // 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 'rate-limit-hit': return ( {t('too_many_files_uploaded_throttled_short_period')} ) case 'not-logged-in': return ( ) 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 ( Invalid Request. Please correct the data and try again. ) case 403: return ( Session error. Please check you have cookies enabled. If the problem persists, try clearing your cache and cookies. ) case 429: return ( Too many attempts. Please wait for a while and try again. ) default: return ( Something went wrong talking to the server :(. Please try again. ) } } // 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 }