module View.Income.Income ( init , view , IncomeIn(..) ) where import Prelude hiding (init) import Reflex.Dom (Dynamic, MonadWidget) import qualified Reflex.Dom as R import Common.Model (Currency) import Model.Loadable (Loadable (..)) import qualified Model.Loadable as Loadable import qualified Util.Ajax as AjaxUtil import View.Income.Header (HeaderIn (..), HeaderOut (..)) import qualified View.Income.Header as Header import View.Income.Init (Init (..)) import View.Income.Table (IncomeTableIn (..)) import qualified View.Income.Table as Table data IncomeIn t = IncomeIn { _incomeIn_currency :: Currency , _incomeIn_init :: Dynamic t (Loadable Init) } init :: forall t m. MonadWidget t m => m (Dynamic t (Loadable Init)) init = do postBuild <- R.getPostBuild usersEvent <- AjaxUtil.get (R.tag (R.constant "api/users") postBuild) users <- Loadable.fromEvent usersEvent incomesEvent <- AjaxUtil.get (R.tag (R.constant "api/incomes") postBuild) incomes <- Loadable.fromEvent incomesEvent paymentsEvent <- AjaxUtil.get (R.tag (R.constant "api/payments") postBuild) payments <- Loadable.fromEvent paymentsEvent return $ do us <- users is <- incomes ps <- payments return $ Init <$> us <*> is <*> ps view :: forall t m. MonadWidget t m => IncomeIn t -> m () view incomeIn = do R.dyn . R.ffor (_incomeIn_init incomeIn) . Loadable.view $ \init -> R.elClass "main" "income" $ do rec incomes <- R.foldDyn (:) (_init_incomes init) (_headerOut_addIncome header) header <- Header.view $ HeaderIn { _headerIn_init = init , _headerIn_currency = _incomeIn_currency incomeIn , _headerIn_incomes = incomes } Table.view $ IncomeTableIn { _tableIn_init = init , _tableIn_currency = _incomeIn_currency incomeIn , _tableIn_incomes = incomes } return () return ()