/ frontend / src / LocalStorage.hs
LocalStorage.hs
 1  module LocalStorage (load, save) where
 2  
 3  import Common.Model
 4    ( Config (..),
 5      Owner (..),
 6      Repo (..),
 7      Token (..),
 8      darkMode,
 9      owner,
10      repo,
11      token,
12    )
13  import Control.Lens ((^.), _Wrapped)
14  import Data.Functor (($>))
15  import Data.Maybe (fromMaybe)
16  import Data.Text (Text)
17  import qualified JSDOM.Storage.Extra as JSDOM
18  import Language.Javascript.JSaddle (liftJSM)
19  import Reflex.Dom.Core
20  import Reflex.Extra (onClient)
21  
22  load ::
23    forall m t.
24    ( Prerender t m,
25      DomBuilder t m
26    ) =>
27    m (Event t (Maybe Config))
28  load =
29    onClient $ do
30      ev <- getPostBuild
31      performEvent
32        ( ev
33            $> liftJSM
34              ( do
35                  mbOwner <- fmap MkOwner <$> JSDOM.load ownerTag
36                  mbRepo <- fmap MkRepo <$> JSDOM.load repoTag
37                  mbToken <- fmap MkToken <$> JSDOM.load tokenTag
38                  darkMode' <- fromMaybe False <$> JSDOM.load darkModeTag
39                  pure $
40                    MkConfig
41                      <$> mbOwner <*> mbRepo <*> pure mbToken <*> pure darkMode'
42              )
43        )
44  
45  save ::
46    forall m t.
47    ( Prerender t m,
48      Applicative m
49    ) =>
50    Event t Config ->
51    m (Event t Config)
52  save ev =
53    onClient . performEvent . ffor ev $ \config ->
54      liftJSM $ do
55        JSDOM.save ownerTag $ config ^. owner . _Wrapped
56        JSDOM.save repoTag $ config ^. repo . _Wrapped
57        case config ^. token of
58          Just token' -> JSDOM.save tokenTag $ token' ^. _Wrapped
59          Nothing -> JSDOM.clear tokenTag
60        JSDOM.save darkModeTag $ config ^. darkMode
61        pure config
62  
63  ownerTag :: Text
64  ownerTag = "owner"
65  
66  repoTag :: Text
67  repoTag = "repo"
68  
69  tokenTag :: Text
70  tokenTag = "token"
71  
72  darkModeTag :: Text
73  darkModeTag = "dark"