Skip to content

Commit fb42a11

Browse files
authored
Add TimeReactHooks (#165)
1 parent d01b2c6 commit fb42a11

File tree

7 files changed

+122
-0
lines changed

7 files changed

+122
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,5 @@ Running a web-compatible recipe:
118118
| | :heavy_check_mark: | [TextFieldsHalogenHooks](recipes/TextFieldsHalogenHooks) | A Halogen port of the ["User Interface - Text Fields" Elm Example](https://elm-lang.org/examples). |
119119
| | :heavy_check_mark: | [TextFieldsReactHooks](recipes/TextFieldsReactHooks) | A React port of the ["User Interface - Text Fields" Elm Example](https://elm-lang.org/examples/text-fields). |
120120
| | :heavy_check_mark: | [TimeHalogenHooks](recipes/TimeHalogenHooks) | A Halogen port of the ["Time - Time" Elm Example](https://elm-lang.org/examples). |
121+
| | :heavy_check_mark: | [TimeReactHooks](recipes/TimeReactHooks) | A React port of the ["User Interface - Time" Elm Example](https://elm-lang.org/examples/time). |
121122
| | :heavy_check_mark: | [WindowPropertiesJs](recipes/WindowPropertiesJs) | This recipe shows how to get and print various properties in the browser's `window` object. |

recipes/TimeReactHooks/.gitignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/bower_components/
2+
/node_modules/
3+
/.pulp-cache/
4+
/output/
5+
/generated-docs/
6+
/.psc-package/
7+
/.psc*
8+
/.purs*
9+
/.psa*
10+
/.spago
11+
/.cache/
12+
/dist/
13+
/web-dist/
14+
/prod-dist/
15+
/prod/

recipes/TimeReactHooks/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# TimeReactHooks
2+
3+
A React port of the ["User Interface - Time" Elm Example](https://elm-lang.org/examples/time).
4+
5+
## Expected Behavior:
6+
7+
### Browser
8+
9+
The browser will display the current time in hours, minutes and seconds, updating every second.
10+
11+
## Dependencies Used:
12+
13+
[react](https://www.npmjs.com/package/react)
14+
[react-dom](https://www.npmjs.com/package/react-dom)

recipes/TimeReactHooks/spago.dhall

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{ name = "TimeReactHooks"
2+
, dependencies =
3+
[ "console"
4+
, "datetime"
5+
, "effect"
6+
, "js-timers"
7+
, "now"
8+
, "psci-support"
9+
, "react-basic-hooks"
10+
]
11+
, packages = ../../packages.dhall
12+
, sources = [ "recipes/TimeReactHooks/src/**/*.purs" ]
13+
}

recipes/TimeReactHooks/src/Main.purs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
module TimeReactHooks.Main where
2+
3+
import Prelude
4+
import Data.Array (intercalate)
5+
import Data.Enum (fromEnum)
6+
import Data.Maybe (Maybe(..))
7+
import Data.Newtype (class Newtype)
8+
import Data.Time (Time)
9+
import Data.Time as Time
10+
import Effect (Effect)
11+
import Effect.Exception (throw)
12+
import Effect.Now (nowTime)
13+
import Effect.Timer (clearInterval, setInterval)
14+
import React.Basic.DOM (render)
15+
import React.Basic.DOM as R
16+
import React.Basic.Hooks (Component, Hook, UseEffect, UseState, coerceHook, component, useEffectOnce, useState', (/\))
17+
import React.Basic.Hooks as React
18+
import Web.DOM.NonElementParentNode (getElementById)
19+
import Web.HTML (window)
20+
import Web.HTML.HTMLDocument (toNonElementParentNode)
21+
import Web.HTML.Window (document)
22+
23+
main :: Effect Unit
24+
main = do
25+
container <- getElementById "root" =<< map toNonElementParentNode (document =<< window)
26+
case container of
27+
Nothing -> throw "Root element not found."
28+
Just c -> do
29+
time <- mkTime
30+
render (time {}) c
31+
32+
mkTime :: Component {}
33+
mkTime = do
34+
now <- nowTime
35+
component "Time" \_ -> React.do
36+
currentTime <- useCurrentTime now
37+
let
38+
hour = fromEnum (Time.hour currentTime)
39+
40+
minute = fromEnum (Time.minute currentTime)
41+
42+
second = fromEnum (Time.second currentTime)
43+
pure
44+
$ R.h1_
45+
[ R.text
46+
$ intercalate ":"
47+
[ show hour
48+
, show minute
49+
, show second
50+
]
51+
]
52+
53+
newtype UseCurrentTime hooks
54+
= UseCurrentTime (UseEffect Unit (UseState Time hooks))
55+
56+
derive instance ntUseCurrentTime :: Newtype (UseCurrentTime hooks) _
57+
58+
useCurrentTime :: Time -> Hook UseCurrentTime Time
59+
useCurrentTime initialTime =
60+
coerceHook React.do
61+
currentTime /\ setCurrentTime <- useState' initialTime
62+
useEffectOnce do
63+
intervalId <- setInterval 1000 (nowTime >>= setCurrentTime)
64+
pure (clearInterval intervalId)
65+
pure currentTime

recipes/TimeReactHooks/web/index.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8" />
5+
<title>TimeReactHooks</title>
6+
</head>
7+
8+
<body>
9+
<div id="root"></div>
10+
<script src="./index.js"></script>
11+
</body>
12+
</html>

recipes/TimeReactHooks/web/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"use strict";
2+
require("../../../output/TimeReactHooks.Main/index.js").main();

0 commit comments

Comments
 (0)