/** @format */

import React, { ReactNode, ReactElement } from 'react'

type ErrorBoundaryProps = {
  children: ReactNode
  renderFallbackComponent: (props: { error?: unknown }) => ReactElement
}

type ErrorBoundaryState = { error: null | unknown }

export default class ErrorBoundary extends React.Component<
  ErrorBoundaryProps,
  ErrorBoundaryState
> {
  constructor(props: ErrorBoundaryProps) {
    super(props)
    this.state = { error: null }
  }

  static getDerivedStateFromError(error: unknown) {
    return { error }
  }

  render() {
    if (this.state.error) {
      return this.props.renderFallbackComponent({ error: this.state.error })
    }
    return this.props.children
  }
}
