module Gargantext.Components.ErrorsView (component) where

import Gargantext.Prelude

import Data.Array (deleteAt)
import Data.FunctorWithIndex (mapWithIndex)
import Data.Maybe (Maybe(..))
import Gargantext.Components.App.Store as AppStore
import Gargantext.Types (FrontendError(..))
import Gargantext.Utils.ReactBootstrap as RB
import Gargantext.Utils.Reactix as R2
import Reactix as R
import Reactix.DOM.HTML as H
import Toestand as T

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

component :: R2.Leaf ()
component = R2.leaf componentCpt

componentCpt :: R.Component ()
componentCpt = here.component "main" cpt
  where
  cpt _ _ = do
    -- | States
    -- |
    { errors } <- AppStore.use

    errors' <- R2.useLive' errors

    -- | Render
    -- |
    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