import React from 'react'
import { WithTranslation } from 'react-i18next'
import { StyleSheet, Text, View } from 'react-native'
import { connect } from 'react-redux'
import { hideAlert } from 'src/alert/actions'
import { ErrorDisplayType } from 'src/alert/reducer'
import { ErrorMessages } from 'src/app/ErrorMessages'
import { withTranslation } from 'src/i18n'
import { RootState } from 'src/redux/reducers'
import colors from 'src/styles/colors'
import { typeScale } from 'src/styles/fonts'
const DISMISS_DEFAULT = 5
interface StateProps {
displayMethod: ErrorDisplayType | null
}
interface OwnProps {
error?: ErrorMessages | null
dismissAfter?: number
}
interface DispatchProps {
hideAlert: typeof hideAlert
}
const mapStateToProps = (state: RootState): StateProps => {
const displayMethod = state.alert ? state.alert.displayMethod : null
return {
displayMethod,
}
}
const mapDispatchToProps = {
hideAlert,
}
type Props = DispatchProps & OwnProps & WithTranslation & StateProps
function ErrorMessageInline(props: Props) {
const { error, displayMethod, dismissAfter, t } = props
// Want to initiate/cleanup a timer for each new error
React.useEffect(() => {
const timer = window.setTimeout(props.hideAlert, (dismissAfter || DISMISS_DEFAULT) * 1000)
return () => window.clearTimeout(timer)
}, [error])
// Keep the space empty when there isn't an inline error
// displayMethod lives in redux store and we want to be able to use this component
// without populating it so much check if other types are already displayed
// rather than if INLINE is
if (!error || displayMethod === ErrorDisplayType.BANNER) {
return
}
return (
{t(error)}
)
}
const styles = StyleSheet.create({
errorContainer: {
height: 64,
},
errorMessage: {
...typeScale.bodySmall,
color: colors.errorPrimary,
},
})
export default connect(
(state: RootState) => mapStateToProps,
mapDispatchToProps
)(withTranslation()(ErrorMessageInline))