module Gargantext.Components.ErrorsView where

import Gargantext.Prelude

import Data.Array (deleteAt)
import Data.FunctorWithIndex (mapWithIndex)
import Data.Maybe (Maybe(..))
import Reactix as R
import Reactix.DOM.HTML as H
import Toestand as T

import Gargantext.Types (FrontendError(..))
import Gargantext.Utils.ReactBootstrap as RB
import Gargantext.Utils.Reactix as R2

here :: R2.Here
here = R2.here "Gargantext.Components.ErrorsView"

type ErrorsProps =
  ( errors :: T.Box (Array FrontendError) )

errorsView :: R2.Component ErrorsProps
errorsView = R.createElement errorsViewCpt
errorsViewCpt :: R.Component ErrorsProps
errorsViewCpt = here.component "errorsView" cpt
  where
    cpt { errors } _ = do
      errors' <- T.useLive T.unequal errors

      pure $ H.div {}
        ( mapWithIndex (showError errors) errors' )
    showError errors i (FStringError { error }) =
      RB.alert { dismissible: true
               , onClose
               , variant: "danger" } [ H.text error ]
      where
        onClose = do
          here.error2 "click!" error
          T.modify_ (\es -> case deleteAt i es of
                       Nothing  -> es
                       Just es' -> es'
          ) errors
    showError errors i (FRESTError { error }) =
      RB.alert { dismissible: true
               , onClose
               , variant: "danger" } [ H.text $ show error ]
      where
        onClose = do
          here.error2 "click!" error
          T.modify_ (\es -> case deleteAt i es of
                       Nothing  -> es
                       Just es' -> es'
          ) errors
    showError errors i (FOtherError { error }) =
      RB.alert { dismissible: true
               , onClose
               , variant: "danger" } [ H.text $ show error ]
      where
        onClose = do
          here.error2 "click!" error
          T.modify_ (\es -> case deleteAt i es of
                       Nothing  -> es
                       Just es' -> es'
          ) errors
