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,
}