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"