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
}