module View.Payment.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 (PaymentPage) import Loadable (Loadable (..)) import qualified Loadable as Loadable import qualified Util.Ajax as AjaxUtil perPage :: Int perPage = 7 data In t a b c = In { _in_newPage :: Event t Int , _in_currentPage :: Dynamic t Int , _in_addPayment :: Event t a , _in_editPayment :: Event t b , _in_deletePayment :: Event t c } data Action = LoadPage Int | GetResult (Either Text PaymentPage) reducer :: forall t m a b c. MonadWidget t m => In t a b c -> m (Dynamic t (Loadable PaymentPage)) reducer input = do postBuild <- R.getPostBuild let loadPage = R.leftmost [ 1 <$ postBuild , _in_newPage input , 1 <$ _in_addPayment input , R.tag (R.current $ _in_currentPage input) (_in_editPayment input) , R.tag (R.current $ _in_currentPage input) (_in_deletePayment input) ] getResult <- AjaxUtil.get $ fmap pageUrl loadPage R.foldDyn (\action _ -> case action of LoadPage _ -> Loading GetResult (Left err) -> Error err GetResult (Right payments) -> Loaded payments ) Loading (R.leftmost [ LoadPage <$> loadPage , GetResult <$> getResult ]) where pageUrl p = "api/payments?page=" <> (T.pack . show $ p) <> "&perPage=" <> (T.pack . show $ perPage)