|
|
@@ -0,0 +1,66 @@ |
|
|
|
module Component.Router where |
|
|
|
|
|
|
|
import Prelude |
|
|
|
import Data.Either ( hush ) |
|
|
|
import Data.Maybe ( fromMaybe ) |
|
|
|
-- Internal Page |
|
|
|
import Page.Home as Home |
|
|
|
import Page.About as About |
|
|
|
-- Internal Service |
|
|
|
import Service.Route |
|
|
|
import Service.Navigate |
|
|
|
-- Internal Component |
|
|
|
import Component.Store ( mkRouteStore ) |
|
|
|
-- Effect |
|
|
|
import Effect ( Effect ) |
|
|
|
-- Routing |
|
|
|
import Routing.Duplex ( parse ) |
|
|
|
import Routing.Hash ( getHash ) |
|
|
|
-- React |
|
|
|
import React.Basic.Hooks ( ReactComponent, ReactContext ) |
|
|
|
import React.Basic.Hooks as React |
|
|
|
import React.Basic.DOM as RD |
|
|
|
import React.Basic.Events as RE |
|
|
|
|
|
|
|
mkComponent :: Effect ( ReactComponent {} ) |
|
|
|
mkComponent = do |
|
|
|
mInitialRoute <- hush <<< ( parse routeCodec ) <$> getHash |
|
|
|
routeContext <- React.createContext ( fromMaybe Home mInitialRoute ) |
|
|
|
store <- mkRouteStore routeContext |
|
|
|
router <- mkRouter routeContext |
|
|
|
React.component "RouterContainer" \props -> do |
|
|
|
pure $ React.element store { content: [ React.element router {} ]} |
|
|
|
|
|
|
|
mkRouter |
|
|
|
:: ReactContext Route |
|
|
|
-> Effect ( ReactComponent {} ) |
|
|
|
mkRouter routeContext = do |
|
|
|
home <- Home.mkComponent |
|
|
|
about <- About.mkComponent |
|
|
|
navbar <- mkNavbar |
|
|
|
React.component "Router" \props -> React.do |
|
|
|
route <- React.useContext routeContext |
|
|
|
pure |
|
|
|
$ React.fragment |
|
|
|
[ React.element navbar {} |
|
|
|
, case route of |
|
|
|
Home -> React.element home {} |
|
|
|
About -> React.element about {} |
|
|
|
] |
|
|
|
|
|
|
|
mkNavbar :: Effect ( ReactComponent {} ) |
|
|
|
mkNavbar = |
|
|
|
React.component "Navbar" $ const $ do |
|
|
|
pure |
|
|
|
$ RD.nav |
|
|
|
{ children: |
|
|
|
[ RD.button |
|
|
|
{ children: [ RD.text "Home" ] |
|
|
|
, onClick: RE.handler_ $ navigate Home |
|
|
|
} |
|
|
|
, RD.button |
|
|
|
{ children: [ RD.text "About" ] |
|
|
|
, onClick: RE.handler_ $ navigate About |
|
|
|
} |
|
|
|
] |
|
|
|
} |