/
Events.purs
122 lines (101 loc) · 4.92 KB
/
Events.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
module Pha.Events (onclick, onclick',
onmouseup, onmouseup', onmousedown, onmousedown', onmouseenter, onmouseenter', onmouseleave, onmouseleave',
onpointerup, onpointerup', onpointerdown, onpointerdown', onpointerenter, onpointerenter', onpointerleave, onpointerleave',
oncontextmenu, oncontextmenu',
onvaluechange, onchecked,
on, on', custom, preventDefaultOn, stopPropagationOn, releasePointerCaptureOn) where
import Prelude hiding (div)
import Effect (Effect)
import Pha (Prop, Event, on_, unsafeOnWithEffect)
import Data.Maybe (Maybe(..))
import Data.Tuple (Tuple(..))
import Pha.Events.Decoder (Decoder, always, currentTargetChecked, currentTargetValue)
import Foreign (unsafeToForeign)
import Data.Either (Either(..))
import Control.Monad.Except (runExcept)
import Web.Event.Event as E
on ∷ ∀msg. String → Decoder msg → Prop msg
on eventname decoder = on' eventname (decoder >>> map(Just))
on' ∷ ∀msg. String → Decoder (Maybe msg) → Prop msg
on' eventname decoder = on_ eventname handler where
handler ev =
case runExcept (decoder (unsafeToForeign ev)) of
Right a → a
_ → Nothing
foreign import setPointerCaptureE ∷ Event → Effect Unit
foreign import releasePointerCaptureE ∷ Event → Effect Unit
custom ∷ ∀msg. String → Decoder {message ∷ Maybe msg, stopPropagation ∷ Boolean, preventDefault ∷ Boolean} → Prop msg
custom eventname decoder = unsafeOnWithEffect eventname handler where
handler ev =
case runExcept (decoder (unsafeToForeign ev)) of
Right {message, stopPropagation, preventDefault} →
{ effect: do
when stopPropagation (E.stopPropagation ev)
when preventDefault (E.preventDefault ev)
, msg: message
}
_ → {effect: pure unit, msg: Nothing}
preventDefaultOn ∷ ∀msg. String → Decoder (Tuple (Maybe msg) Boolean) → Prop msg
preventDefaultOn eventname decoder = custom eventname (decoder >>> map \(Tuple msg prev) → {
message: msg,
preventDefault: prev,
stopPropagation: false
})
stopPropagationOn ∷ ∀msg. String → Decoder (Tuple (Maybe msg) Boolean) → Prop msg
stopPropagationOn eventname decoder = custom eventname (decoder >>> map \(Tuple msg stop) → {
message: msg,
preventDefault: false,
stopPropagation: stop
})
releasePointerCaptureOn ∷ ∀msg. String → Decoder (Maybe msg) → Prop msg
releasePointerCaptureOn eventname decoder = unsafeOnWithEffect eventname handler where
handler ev =
case runExcept (decoder (unsafeToForeign ev)) of
Right msg → {msg, effect: releasePointerCaptureE ev}
_ → {effect: pure unit, msg: Nothing}
onclick ∷ ∀msg. msg → Prop msg
onclick = on "click" <<< always
onclick' ∷ ∀msg. Maybe msg → Prop msg
onclick' = on' "click" <<< always
onmouseup ∷ ∀msg. msg → Prop msg
onmouseup = on "mouseup" <<< always
onmouseup' ∷ ∀msg. Maybe msg → Prop msg
onmouseup' = on' "mouseup" <<< always
onmousedown ∷ ∀msg. msg → Prop msg
onmousedown = on "mousedown" <<< always
onmousedown' ∷ ∀msg. Maybe msg → Prop msg
onmousedown' = on' "mousedown" <<< always
onmouseenter ∷ ∀msg. msg → Prop msg
onmouseenter = on "mouseenter" <<< always
onmouseenter' ∷ ∀msg. Maybe msg → Prop msg
onmouseenter' = on' "mousenter" <<< always
onmouseleave ∷ ∀msg. msg → Prop msg
onmouseleave = on "mouseleave" <<< always
onmouseleave' ∷ ∀msg. Maybe msg → Prop msg
onmouseleave' = on' "mouseleave" <<< always
onpointerup ∷ ∀msg. msg → Prop msg
onpointerup = on "pointerup" <<< always
onpointerup' ∷ ∀msg. Maybe msg → Prop msg
onpointerup' = on' "pointerup" <<< always
onpointerdown ∷ ∀msg. msg → Prop msg
onpointerdown = on "pointerdown" <<< always
onpointerdown' ∷ ∀msg. Maybe msg → Prop msg
onpointerdown' = on' "pointerdown" <<< always
onpointerenter ∷ ∀msg. msg → Prop msg
onpointerenter = on "pointerenter" <<< always
onpointerenter' ∷ ∀msg. Maybe msg → Prop msg
onpointerenter' = on' "pointerenter" <<< always
onpointerleave ∷ ∀msg. msg → Prop msg
onpointerleave = on "pointerleave" <<< always
onpointerleave' ∷ ∀msg. Maybe msg → Prop msg
onpointerleave' = on' "pointerleave" <<< always
-- | note: trigger preventDefault
oncontextmenu ∷ ∀msg. msg → Prop msg
oncontextmenu msg = preventDefaultOn "contextmenu" $ always (Tuple (Just msg) true)
-- | note: trigger preventDefault
oncontextmenu' ∷ ∀msg. (Maybe msg) → Prop msg
oncontextmenu' msg = preventDefaultOn "contextmenu" $ always (Tuple msg true)
onvaluechange ∷ ∀msg. (String → msg) → Prop msg
onvaluechange f = on "change" (currentTargetValue >>> map f)
onchecked ∷ ∀msg. (Boolean → msg) → Prop msg
onchecked f = on "change" (currentTargetChecked >>> map f)