module View.Income.Reducer ( perPage , reducer , In(..) ) where import Data.Text (Text) import qualified Data.Text as T import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import Common.Model (IncomePage) import Loadable (Loadable (..)) import qualified Loadable as Loadable import qualified Util.Ajax as AjaxUtil import qualified Util.Either as EitherUtil perPage :: Int perPage = 7 data In t a b c = In { _in_page :: Event t Int , _in_addIncome :: Event t a , _in_editIncome :: Event t b , _in_deleteIncome :: Event t c } reducer :: forall t m a b c. MonadWidget t m => In t a b c -> m (Dynamic t (Loadable IncomePage)) reducer input = do postBuild <- R.getPostBuild currentPage <- R.holdDyn 1 (_in_page input) let loadPage = R.leftmost [ 1 <$ postBuild , _in_page input , 1 <$ _in_addIncome input , R.tag (R.current currentPage) (_in_editIncome input) , R.tag (R.current currentPage) (_in_deleteIncome input) ] getResult <- AjaxUtil.get $ fmap pageUrl loadPage R.holdDyn Loading (R.leftmost [ Loading <$ loadPage , Loadable.fromEither <$> getResult ]) where pageUrl p = "api/incomes?page=" <> (T.pack . show $ p) <> "&perPage=" <> (T.pack . show $ perPage)