aboutsummaryrefslogtreecommitdiff
path: root/client/src/Loadable.hs
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/Loadable.hs')
-rw-r--r--client/src/Loadable.hs62
1 files changed, 41 insertions, 21 deletions
diff --git a/client/src/Loadable.hs b/client/src/Loadable.hs
index 9a14b3f..4806b08 100644
--- a/client/src/Loadable.hs
+++ b/client/src/Loadable.hs
@@ -1,9 +1,9 @@
module Loadable
( Loadable (..)
- , Loadable2 (..)
+ , fromEither
, fromEvent
- , view
- , view2
+ , viewHideValueWhileLoading
+ , viewShowValueWhileLoading
) where
import qualified Data.Map as M
@@ -19,7 +19,7 @@ data Loadable t
= Loading
| Error Text
| Loaded t
- deriving Show
+ deriving (Eq, Show)
instance Functor Loadable where
fmap f Loading = Loading
@@ -40,6 +40,10 @@ instance Monad Loadable where
(Error e) >>= f = Error e
(Loaded x) >>= f = f x
+fromEither :: forall a b. Either Text b -> Loadable b
+fromEither (Left err) = Error err
+fromEither (Right value) = Loaded value
+
fromEvent :: forall t m a. MonadWidget t m => Event t (Either Text a) -> m (Dynamic t (Loadable a))
fromEvent =
R.foldDyn
@@ -49,24 +53,38 @@ fromEvent =
)
Loading
-view :: forall t m a b. MonadWidget t m => (a -> m b) -> Loadable a -> m (Maybe b)
-view _ Loading = (R.divClass "pageSpinner" $ R.divClass "spinner" $ R.blank) >> return Nothing
-view _ (Error e) = R.text e >> return Nothing
-view f (Loaded x) = Just <$> f x
+viewHideValueWhileLoading :: forall t m a b. MonadWidget t m => (a -> m b) -> Loadable a -> m (Maybe b)
+viewHideValueWhileLoading f loadable =
+ case loadable of
+ Loading ->
+ (R.divClass "pageSpinner" $ R.divClass "spinner" $ R.blank) >> return Nothing
-data Loadable2 t a = Loadable2
- { _loadable_isLoading :: Dynamic t Bool
- , _loadable_value :: Dynamic t (Maybe a)
- }
+ Error err ->
+ R.text err >> return Nothing
-view2 :: forall t m a b. MonadWidget t m => Loadable2 t a -> (a -> m b) -> m (Event t (Maybe b))
-view2 (Loadable2 isLoading value) f =
- withLoader isLoading $
- R.dyn . R.ffor value . viewMaybe $ f
+ Loaded x ->
+ Just <$> f x
- where
- viewMaybe _ Nothing = return Nothing
- viewMaybe f (Just x) = Just <$> f x
+viewShowValueWhileLoading
+ :: forall t m a b. (MonadWidget t m, Eq a)
+ => Dynamic t (Loadable a)
+ -> (a -> m b)
+ -> m (Event t (Maybe b))
+viewShowValueWhileLoading loadable f = do
+
+ value <-
+ (R.foldDyn
+ (\l v1 ->
+ case l of
+ Loaded v2 -> Just v2
+ _ -> v1)
+ Nothing
+ (R.updated loadable)) >>= R.holdUniqDyn
+
+ withLoader (fmap ((==) Loading) loadable) $
+ R.dyn . R.ffor value $ \case
+ Nothing -> return Nothing
+ Just x -> Just <$> f x
withLoader
:: forall t m a. MonadWidget t m
@@ -75,10 +93,12 @@ withLoader
-> m a
withLoader isLoading block =
R.divClass "g-Loadable" $ do
+ res <- R.elDynAttr "div" (blockAttrs <$> isLoading) $
+ block
R.elDynAttr "div" (spinnerAttrs <$> isLoading) $
R.divClass "spinner" R.blank
- R.elDynAttr "div" (blockAttrs <$> isLoading) $
- block
+ return res
+
where
spinnerAttrs l = M.singleton "class" $
"g-Loadable__Spinner"