Advertisement
Guest User

Shpadoinkle Navigation

a guest
Apr 8th, 2021
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE DeriveAnyClass             #-}
  2. {-# LANGUAGE DeriveGeneric              #-}
  3. {-# LANGUAGE DerivingStrategies         #-}
  4. {-# LANGUAGE ExtendedDefaultRules       #-}
  5. {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  6. {-# LANGUAGE OverloadedLabels           #-}
  7. {-# LANGUAGE OverloadedStrings          #-}
  8. {-# OPTIONS_GHC -fno-warn-type-defaults #-}
  9.  
  10. module Main where
  11.  
  12. import           Shpadoinkle                 (Html, JSM, NFData, shpadoinkle)
  13. import           GHC.Generics                (Generic)
  14. import           Shpadoinkle.Backend.ParDiff (runParDiff)
  15. import           Shpadoinkle.Html
  16. import           Shpadoinkle.Run             (live, runJSorWarp, simple)
  17. import           Shpadoinkle.Backend.Snabbdom  (runSnabbdom, stage)
  18. import           Shpadoinkle.Html.LocalStorage (manageLocalStorage)
  19. import           Data.Text
  20. import           Control.Lens                  hiding (view)
  21. import           Data.Generics.Labels          ()
  22.  
  23. data Model = Model
  24.     { mdlPages :: Int
  25.     , mdlHeader :: Text
  26.     , mdlContent :: Text
  27.     } deriving (Generic, Show, Read, Eq, NFData)
  28.  
  29. initialModel :: Model
  30. initialModel = Model {
  31.     mdlHeader = "Hello!"
  32.   , mdlContent = "Click on a button!"
  33.   , mdlPages = 2
  34. }
  35.  
  36. setPage :: Text -> Text -> Model -> Model
  37. setPage newHeader newContent m = m
  38.     & #mdlHeader .~ newHeader
  39.     & #mdlContent .~ newContent
  40.  
  41. viewControls :: Model -> Html m Model
  42. viewControls m = do
  43.     let nPg = m & mdlPages
  44.     let predIfPositive n = if n > 0 then pred n else 0
  45.     div_ [
  46.         button [onClick $ \m -> m & #mdlPages %~ succ]
  47.                ["Add page"]
  48.       , button [onClick $ \m -> m & #mdlPages %~ predIfPositive]
  49.                ["Remove page"]
  50.       ]
  51.  
  52. viewNavigation :: Model -> Html m Model
  53. viewNavigation m = div_ $ fmap mkBtn [0..(m & mdlPages)-1]
  54.     where mkBtn i =
  55.             button [onClick $ setPage (pageHdr i) (pageCont i)] [(pageName i)]
  56.           pageHdr i = pack $ "Page " <> (show i) <> " header"
  57.           pageCont i = pack $ "Page " <> (show i) <> " content"
  58.           pageName i = text . pack $ "Page " <> (show i)
  59.  
  60. view :: Model -> Html m Model
  61. view m = do
  62.         div_ [
  63.             viewControls m
  64.          ,  viewNavigation m
  65.          ,  h1_ [text $ m & mdlHeader]
  66.          ,  p_ [text $ m & mdlContent]
  67.          ]
  68.    
  69.  
  70. app :: JSM ()
  71. app = do
  72.     model <- manageLocalStorage "pages" initialModel
  73.     shpadoinkle id runSnabbdom model view stage
  74.  
  75. dev :: IO ()
  76. dev = live 8082 app
  77.  
  78. main :: IO ()
  79. main = runJSorWarp 8082 app
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement