Browse Source

react router update

pull/1/head
piq9117 3 years ago
parent
commit
7684eca3de
21 changed files with 154 additions and 126 deletions
  1. +0
    -0
      react-context-router/.gitignore
  2. +0
    -0
      react-context-router/LICENSE
  3. +0
    -0
      react-context-router/Makefile
  4. +1
    -7
      react-context-router/README.md
  5. +0
    -0
      react-context-router/html/index.html
  6. +0
    -0
      react-context-router/package-lock.json
  7. +0
    -0
      react-context-router/package.json
  8. +0
    -0
      react-context-router/packages.dhall
  9. +1
    -0
      react-context-router/spago.dhall
  10. +66
    -0
      react-context-router/src/Component/Router.purs
  11. +24
    -0
      react-context-router/src/Component/Store.purs
  12. +26
    -0
      react-context-router/src/Main.purs
  13. +15
    -0
      react-context-router/src/Page/About.purs
  14. +15
    -0
      react-context-router/src/Page/Home.purs
  15. +2
    -3
      react-context-router/src/Service/Navigate.purs
  16. +4
    -5
      react-context-router/src/Service/Route.purs
  17. +0
    -0
      react-context-router/test/Main.purs
  18. +0
    -52
      react-routing/src/Component/Router.purs
  19. +0
    -32
      react-routing/src/Main.purs
  20. +0
    -14
      react-routing/src/Page/About.purs
  21. +0
    -13
      react-routing/src/Page/Home.purs

react-routing/.gitignore → react-context-router/.gitignore View File


react-routing/LICENSE → react-context-router/LICENSE View File


react-routing/Makefile → react-context-router/Makefile View File


react-routing/README.md → react-context-router/README.md View File

@@ -1,12 +1,6 @@
# React Routing
# spago-react-scaffold

Build the project

Build and install all spago and npm packages
``` sh
make build-all
```
Build and install spago packages
``` sh
make build
```

react-routing/html/index.html → react-context-router/html/index.html View File


react-routing/package-lock.json → react-context-router/package-lock.json View File


react-routing/package.json → react-context-router/package.json View File


react-routing/packages.dhall → react-context-router/packages.dhall View File


react-routing/spago.dhall → react-context-router/spago.dhall View File

@@ -7,6 +7,7 @@ You can edit this file as you like.
[ "console"
, "effect"
, "exceptions"
, "generics-rep"
, "psci-support"
, "react-basic"
, "react-basic-hooks"

+ 66
- 0
react-context-router/src/Component/Router.purs View File

@@ -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
}
]
}

+ 24
- 0
react-context-router/src/Component/Store.purs View File

@@ -0,0 +1,24 @@
module Component.Store where

import Prelude
import Data.Maybe ( Maybe(..) )
-- Internal Service
import Service.Route
-- Effect
import Effect ( Effect )
-- Routing
import Routing.Hash ( matchesWith )
import Routing.Duplex ( parse )
-- React
import React.Basic.Hooks ( ReactComponent, ReactContext, (/\), JSX )
import React.Basic.Hooks as React

mkRouteStore :: ReactContext Route -> Effect ( ReactComponent { content :: Array JSX } )
mkRouteStore context =
React.component "Store" \props -> React.do
r <- React.useContext context
route /\ setRoute <- React.useState r
React.useEffect route $ matchesWith ( parse routeCodec ) \mOld new -> do
when ( mOld /= Just new ) $ setRoute $ const new
pure
$ React.provider context route props.content

+ 26
- 0
react-context-router/src/Main.purs View File

@@ -0,0 +1,26 @@
module Main where

import Prelude
import Data.Maybe ( Maybe(..) )
-- Web
import Web.DOM.NonElementParentNode ( getElementById )
import Web.HTML.HTMLDocument ( toNonElementParentNode )
import Web.HTML.Window ( document )
import Web.HTML ( window )
-- Internal
import Component.Router as Router
-- Effect
import Effect ( Effect )
import Effect.Exception ( throw )
-- React
import React.Basic.Hooks ( element )
import React.Basic.DOM as R

main :: Effect Unit
main = do
mApp <- getElementById "app" =<< ( map toNonElementParentNode $ document =<< window )
case mApp of
Nothing -> throw "App element not found."
Just app -> do
mainComponent <- Router.mkComponent
R.render ( element mainComponent {} ) app

+ 15
- 0
react-context-router/src/Page/About.purs View File

@@ -0,0 +1,15 @@
module Page.About where

import Prelude

-- Effect
import Effect ( Effect )
-- React
import React.Basic.Hooks ( ReactComponent )
import React.Basic.Hooks as React
import React.Basic.DOM as RD

mkComponent :: Effect ( ReactComponent {} )
mkComponent =
React.component "About" $ const $ do
pure $ RD.h1 { children: [ RD.text "About" ] }

+ 15
- 0
react-context-router/src/Page/Home.purs View File

@@ -0,0 +1,15 @@
module Page.Home where

import Prelude

-- Effect
import Effect ( Effect )
-- React
import React.Basic.Hooks ( ReactComponent )
import React.Basic.Hooks as React
import React.Basic.DOM as RD

mkComponent :: Effect ( ReactComponent {} )
mkComponent =
React.component "Home" $ const $ do
pure $ RD.h1 { children: [ RD.text "Home" ] }

react-routing/src/Service/Navigate.purs → react-context-router/src/Service/Navigate.purs View File

@@ -6,12 +6,11 @@ import Service.Route
-- Effect
import Effect ( Effect )
-- Routing
import Routing.Duplex
import Routing.Hash
import Routing.Hash ( setHash )
import Routing.Duplex ( print )

class Monad m <= Navigate m where
navigate :: Route -> m Unit

instance navigateEffect :: Navigate Effect where
navigate :: Route -> Effect Unit
navigate = setHash <<< print routeCodec

react-routing/src/Service/Route.purs → react-context-router/src/Service/Route.purs View File

@@ -1,14 +1,13 @@
module Service.Route where

import Prelude hiding ((/))

import Prelude hiding ( (/) )
-- Generic
import Data.Generic.Rep ( class Generic )
import Data.Generic.Rep.Show ( genericShow )
-- Routing
import Routing.Duplex
import Routing.Duplex.Generic
import Routing.Duplex.Generic.Syntax ( (/) )
import Routing.Duplex ( root, RouteDuplex' )
import Routing.Duplex.Generic ( noArgs, sum )
import Routing.Duplex.Generic.Syntax ((/))

data Route
= Home

react-routing/test/Main.purs → react-context-router/test/Main.purs View File


+ 0
- 52
react-routing/src/Component/Router.purs View File

@@ -1,57 +0,0 @@
module Component.Router where

import Prelude
import Data.Maybe ( fromMaybe )
import Data.Either ( hush )
import Page.Home as Home
import Page.About as About
import Service.Route
import Service.Navigate
import Effect.Class ( class MonadEffect, liftEffect )
import Routing.Duplex
import Routing.Hash
import React.Basic.Hooks ( ReactComponent, createContext, component, element )
import React.Basic.Hooks as React
import React.Basic.DOM as R
import React.Basic.Events as RE
import React.Basic.DOM.Events as RE

mkRouter :: forall m. MonadEffect m => Navigate m => m ( ReactComponent { route :: Route } )
mkRouter = liftEffect $ do
initialRoute <- hush <<< ( parse routeCodec ) <$> getHash
navigate $ fromMaybe Home initialRoute
home <- Home.mkPage
about <- About.mkPage
component "Router" $ \props -> React.do
pure
$ React.fragment
[ R.button
{ children: [ R.text "Home" ]
, onClick: RE.handler
( RE.preventDefault >>> RE.targetValue ) $ const $ navigate Home
, className: isActiveClass $ props.route == Home
}
, R.button
{ children: [ R.text "About" ]
, onClick: RE.handler
( RE.preventDefault >>> RE.targetValue ) $ const $ navigate About
, className: isActiveClass $ props.route == About
}
-- Matching route
, R.div
{ children: pure $ case props.route of
Home -> element home {}
About -> element about {}
}
]
where
isActiveClass :: Boolean -> String
isActiveClass con =
if con
then "is-active"
else ""

+ 0
- 32
react-routing/src/Main.purs View File

@@ -1,38 +0,0 @@
module Main where

import Prelude
import Data.Maybe ( Maybe(..) )
import Service.Route
import Service.Navigate ( navigate )
import Component.Router as Router
import Web.DOM.NonElementParentNode ( getElementById )
import Web.HTML.HTMLDocument ( toNonElementParentNode )
import Web.HTML.Window ( document )
import Web.HTML ( window )
import Effect ( Effect )
import Effect.Exception ( throw )
import Routing.Duplex ( parse )
import Routing.Hash ( getHash, matchesWith )
import React.Basic.Hooks ( element, ReactComponent, component )
import React.Basic.DOM as R

main :: Effect Unit
main = do
mApp <- getElementById "app" =<< ( map toNonElementParentNode $ document =<< window )
case mApp of
Nothing -> throw "App element not found."
Just app -> do
-- Component is initialized
rootComponent <- Router.mkRouter
-- Watches for route change
void $ matchesWith ( parse routeCodec ) \mOld new ->
-- When it matches the old or previous route it will not do anything.
-- Therefore not wasting a re-render.
when ( mOld /= Just new ) do
R.render ( element rootComponent { route: new } ) app

+ 0
- 14
react-routing/src/Page/About.purs View File

@@ -1,16 +0,0 @@
module Page.About where

import Prelude

import Effect ( Effect )
import React.Basic.Hooks ( ReactComponent, component )
import React.Basic.DOM as R

mkPage :: Effect ( ReactComponent {} )
mkPage = do
component "About" $ const $ React.do
pure
$ R.h1_
[ R.text "About" ]

+ 0
- 13
react-routing/src/Page/Home.purs View File

@@ -1,15 +0,0 @@
module Page.Home where

import Prelude

import Effect ( Effect )
import React.Basic.Hooks ( ReactComponent, component )
import React.Basic.DOM as R

mkPage :: Effect ( ReactComponent {} )
mkPage = do
component "Home" $ const $ React.do
pure
$ R.h1_ [ R.text "Home" ]

Loading…
Cancel
Save