module Halogen.HTML.Events where

import Data.Foreign
import Data.Row
import HPrelude
import Halogen.HTML.Core qualified as Core
import Halogen.HTML.Properties
import Halogen.Query.Input
import Web.Clipboard.ClipboardEvent
import Web.Clipboard.ClipboardEvent.EventTypes qualified as CET
import Web.Event.Event
import Web.Event.Event qualified as EE
import Web.HTML.Event.DragEvent
import Web.HTML.Event.DragEvent.EventTypes qualified as DET
import Web.HTML.Event.EventTypes qualified as ET
import Web.UIEvent.FocusEvent
import Web.UIEvent.FocusEvent.EventTypes qualified as FET
import Web.UIEvent.KeyboardEvent
import Web.UIEvent.KeyboardEvent.EventTypes qualified as KET
import Web.UIEvent.MouseEvent
import Web.UIEvent.MouseEvent.EventTypes qualified as MET
import Web.UIEvent.TouchEvent
import Web.UIEvent.WheelEvent
import Web.UIEvent.WheelEvent.EventTypes qualified as WET

handler :: forall r i. EventType -> (Event -> i) -> IProp r i
handler :: forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
et Event -> i
f = Prop (Input i) -> IProp r i
forall (r :: Row (*)) msg. Prop (Input msg) -> IProp r msg
IProp (Prop (Input i) -> IProp r i) -> Prop (Input i) -> IProp r i
forall a b. (a -> b) -> a -> b
$ EventType -> (Event -> Maybe (Input i)) -> Prop (Input i)
forall i. EventType -> (Event -> Maybe i) -> Prop i
Core.handler EventType
et (Input i -> Maybe (Input i)
forall a. a -> Maybe a
Just (Input i -> Maybe (Input i))
-> (Event -> Input i) -> Event -> Maybe (Input i)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i -> Input i
forall msg. msg -> Input msg
Action (i -> Input i) -> (Event -> i) -> Event -> Input i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> i
f)

handler' :: forall r i. EventType -> (Event -> Maybe i) -> IProp r i
handler' :: forall (r :: Row (*)) i.
EventType -> (Event -> Maybe i) -> IProp r i
handler' EventType
et Event -> Maybe i
f = Prop (Input i) -> IProp r i
forall (r :: Row (*)) msg. Prop (Input msg) -> IProp r msg
IProp (Prop (Input i) -> IProp r i) -> Prop (Input i) -> IProp r i
forall a b. (a -> b) -> a -> b
$ EventType -> (Event -> Maybe (Input i)) -> Prop (Input i)
forall i. EventType -> (Event -> Maybe i) -> Prop i
Core.handler EventType
et ((i -> Input i) -> Maybe i -> Maybe (Input i)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap i -> Input i
forall msg. msg -> Input msg
Action (Maybe i -> Maybe (Input i))
-> (Event -> Maybe i) -> Event -> Maybe (Input i)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> Maybe i
f)

onAbort :: forall r i. (HasType "onAbort" Event r) => (Event -> i) -> IProp r i
onAbort :: forall (r :: Row (*)) i.
HasType "onAbort" Event r =>
(Event -> i) -> IProp r i
onAbort = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"abort")

onError :: forall r i. (HasType "onError" Event r) => (Event -> i) -> IProp r i
onError :: forall (r :: Row (*)) i.
HasType "onError" Event r =>
(Event -> i) -> IProp r i
onError = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.error

onLoad :: forall r i. (HasType "onLoad" Event r) => (Event -> i) -> IProp r i
onLoad :: forall (r :: Row (*)) i.
HasType "onLoad" Event r =>
(Event -> i) -> IProp r i
onLoad = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.load

onScroll :: forall r i. (HasType "onScroll" Event r) => (Event -> i) -> IProp r i
onScroll :: forall (r :: Row (*)) i.
HasType "onScroll" Event r =>
(Event -> i) -> IProp r i
onScroll = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"scroll")

onChange :: forall r i. (HasType "onChange" Event r) => (Event -> i) -> IProp r i
onChange :: forall (r :: Row (*)) i.
HasType "onChange" Event r =>
(Event -> i) -> IProp r i
onChange = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.change

{-
onFileUpload
  :: forall r i t
   . HasType "onChange" Event r
  => Unfoldable t
  => (t File -> i)
  -> IProp r i
onFileUpload f = handler ET.change $
  ( Event.target
      >=> HTMLInputElement.fromEventTarget
      >=>
        HTMLInputElement.files >>> unsafePerformEffect
  )
    >>> maybe none items
    >>> f
-}

onInput :: forall r i. (HasType "onInput" Event r) => (Event -> i) -> IProp r i
onInput :: forall (r :: Row (*)) i.
HasType "onInput" Event r =>
(Event -> i) -> IProp r i
onInput = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.input

onInvalid :: forall r i. (HasType "onInvalid" Event r) => (Event -> i) -> IProp r i
onInvalid :: forall (r :: Row (*)) i.
HasType "onInvalid" Event r =>
(Event -> i) -> IProp r i
onInvalid = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.invalid

onReset :: forall r i. (HasType "onReset" Event r) => (Event -> i) -> IProp r i
onReset :: forall (r :: Row (*)) i.
HasType "onReset" Event r =>
(Event -> i) -> IProp r i
onReset = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"reset")

onSelect :: forall r i. (HasType "onSelect" Event r) => (Event -> i) -> IProp r i
onSelect :: forall (r :: Row (*)) i.
HasType "onSelect" Event r =>
(Event -> i) -> IProp r i
onSelect = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.select

onSubmit :: forall r i. (HasType "onSubmit" Event r) => (Event -> i) -> IProp r i
onSubmit :: forall (r :: Row (*)) i.
HasType "onSubmit" Event r =>
(Event -> i) -> IProp r i
onSubmit = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"submit")

onTransitionEnd :: forall r i. (HasType "onTransitionEnd" Event r) => (Event -> i) -> IProp r i
onTransitionEnd :: forall (r :: Row (*)) i.
HasType "onTransitionEnd" Event r =>
(Event -> i) -> IProp r i
onTransitionEnd = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"transitionend")

onCopy :: forall r i. (HasType "onCopy" ClipboardEvent r) => (ClipboardEvent -> i) -> IProp r i
onCopy :: forall (r :: Row (*)) i.
HasType "onCopy" ClipboardEvent r =>
(ClipboardEvent -> i) -> IProp r i
onCopy = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
CET.copy ((Event -> i) -> IProp r i)
-> ((ClipboardEvent -> i) -> Event -> i)
-> (ClipboardEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ClipboardEvent -> i) -> Event -> i
forall i. (ClipboardEvent -> i) -> Event -> i
clipboardHandler

onPaste :: forall r i. (HasType "onPaste" ClipboardEvent r) => (ClipboardEvent -> i) -> IProp r i
onPaste :: forall (r :: Row (*)) i.
HasType "onPaste" ClipboardEvent r =>
(ClipboardEvent -> i) -> IProp r i
onPaste = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
CET.paste ((Event -> i) -> IProp r i)
-> ((ClipboardEvent -> i) -> Event -> i)
-> (ClipboardEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ClipboardEvent -> i) -> Event -> i
forall i. (ClipboardEvent -> i) -> Event -> i
clipboardHandler

onCut :: forall r i. (HasType "onCut" ClipboardEvent r) => (ClipboardEvent -> i) -> IProp r i
onCut :: forall (r :: Row (*)) i.
HasType "onCut" ClipboardEvent r =>
(ClipboardEvent -> i) -> IProp r i
onCut = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
CET.cut ((Event -> i) -> IProp r i)
-> ((ClipboardEvent -> i) -> Event -> i)
-> (ClipboardEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ClipboardEvent -> i) -> Event -> i
forall i. (ClipboardEvent -> i) -> Event -> i
clipboardHandler

onAuxClick :: forall r i. (HasType "onAuxClick" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onAuxClick :: forall (r :: Row (*)) i.
HasType "onAuxClick" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onAuxClick = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.auxclick ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onClick :: forall r i. (HasType "onClick" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onClick :: forall (r :: Row (*)) i.
HasType "onClick" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onClick = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.click ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

-- onContextMenu :: forall r i. HasType "onContextMenu" MouseEvent r => (MouseEvent -> i) -> IProp r i
-- onContextMenu = handler ET.contextmenu . mouseHandler

onDoubleClick :: forall r i. (HasType "onDoubleClick" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onDoubleClick :: forall (r :: Row (*)) i.
HasType "onDoubleClick" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onDoubleClick = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.dblclick ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseDown :: forall r i. (HasType "onMouseDown" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseDown :: forall (r :: Row (*)) i.
HasType "onMouseDown" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseDown = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mousedown ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseEnter :: forall r i. (HasType "onMouseEnter" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseEnter :: forall (r :: Row (*)) i.
HasType "onMouseEnter" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseEnter = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mouseenter ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseLeave :: forall r i. (HasType "onMouseLeave" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseLeave :: forall (r :: Row (*)) i.
HasType "onMouseLeave" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseLeave = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mouseleave ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseMove :: forall r i. (HasType "onMouseMove" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseMove :: forall (r :: Row (*)) i.
HasType "onMouseMove" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseMove = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mousemove ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseOver :: forall r i. (HasType "onMouseOver" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseOver :: forall (r :: Row (*)) i.
HasType "onMouseOver" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseOver = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mouseover ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseOut :: forall r i. (HasType "onMouseOut" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseOut :: forall (r :: Row (*)) i.
HasType "onMouseOut" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseOut = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mouseout ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onMouseUp :: forall r i. (HasType "onMouseUp" MouseEvent r) => (MouseEvent -> i) -> IProp r i
onMouseUp :: forall (r :: Row (*)) i.
HasType "onMouseUp" MouseEvent r =>
(MouseEvent -> i) -> IProp r i
onMouseUp = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
MET.mouseup ((Event -> i) -> IProp r i)
-> ((MouseEvent -> i) -> Event -> i)
-> (MouseEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MouseEvent -> i) -> Event -> i
forall i. (MouseEvent -> i) -> Event -> i
mouseHandler

onWheel :: forall r i. (HasType "onWheel" WheelEvent r) => (WheelEvent -> i) -> IProp r i
onWheel :: forall (r :: Row (*)) i.
HasType "onWheel" WheelEvent r =>
(WheelEvent -> i) -> IProp r i
onWheel = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
WET.wheel ((Event -> i) -> IProp r i)
-> ((WheelEvent -> i) -> Event -> i)
-> (WheelEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (WheelEvent -> i) -> Event -> i
forall i. (WheelEvent -> i) -> Event -> i
wheelHandler

onKeyDown :: forall r i. (HasType "onKeyDown" KeyboardEvent r) => (KeyboardEvent -> i) -> IProp r i
onKeyDown :: forall (r :: Row (*)) i.
HasType "onKeyDown" KeyboardEvent r =>
(KeyboardEvent -> i) -> IProp r i
onKeyDown = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
KET.keydown ((Event -> i) -> IProp r i)
-> ((KeyboardEvent -> i) -> Event -> i)
-> (KeyboardEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (KeyboardEvent -> i) -> Event -> i
forall i. (KeyboardEvent -> i) -> Event -> i
keyHandler

-- onKeyPress :: forall r i. HasType "onKeyPress" KeyboardEvent r => (KeyboardEvent -> i) -> IProp r i
-- onKeyPress = handler KET.keypress . keyHandler

onKeyUp :: forall r i. (HasType "onKeyUp" KeyboardEvent r) => (KeyboardEvent -> i) -> IProp r i
onKeyUp :: forall (r :: Row (*)) i.
HasType "onKeyUp" KeyboardEvent r =>
(KeyboardEvent -> i) -> IProp r i
onKeyUp = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
KET.keyup ((Event -> i) -> IProp r i)
-> ((KeyboardEvent -> i) -> Event -> i)
-> (KeyboardEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (KeyboardEvent -> i) -> Event -> i
forall i. (KeyboardEvent -> i) -> Event -> i
keyHandler

onBlur :: forall r i. (HasType "onBlur" FocusEvent r) => (FocusEvent -> i) -> IProp r i
onBlur :: forall (r :: Row (*)) i.
HasType "onBlur" FocusEvent r =>
(FocusEvent -> i) -> IProp r i
onBlur = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
ET.blur ((Event -> i) -> IProp r i)
-> ((FocusEvent -> i) -> Event -> i)
-> (FocusEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FocusEvent -> i) -> Event -> i
forall i. (FocusEvent -> i) -> Event -> i
focusHandler

onFocus :: forall r i. (HasType "onFocus" FocusEvent r) => (FocusEvent -> i) -> IProp r i
onFocus :: forall (r :: Row (*)) i.
HasType "onFocus" FocusEvent r =>
(FocusEvent -> i) -> IProp r i
onFocus = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
FET.focus ((Event -> i) -> IProp r i)
-> ((FocusEvent -> i) -> Event -> i)
-> (FocusEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FocusEvent -> i) -> Event -> i
forall i. (FocusEvent -> i) -> Event -> i
focusHandler

onFocusIn :: forall r i. (HasType "onFocusIn" FocusEvent r) => (FocusEvent -> i) -> IProp r i
onFocusIn :: forall (r :: Row (*)) i.
HasType "onFocusIn" FocusEvent r =>
(FocusEvent -> i) -> IProp r i
onFocusIn = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
FET.focusin ((Event -> i) -> IProp r i)
-> ((FocusEvent -> i) -> Event -> i)
-> (FocusEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FocusEvent -> i) -> Event -> i
forall i. (FocusEvent -> i) -> Event -> i
focusHandler

onFocusOut :: forall r i. (HasType "onFocusOut" FocusEvent r) => (FocusEvent -> i) -> IProp r i
onFocusOut :: forall (r :: Row (*)) i.
HasType "onFocusOut" FocusEvent r =>
(FocusEvent -> i) -> IProp r i
onFocusOut = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
FET.focusout ((Event -> i) -> IProp r i)
-> ((FocusEvent -> i) -> Event -> i)
-> (FocusEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FocusEvent -> i) -> Event -> i
forall i. (FocusEvent -> i) -> Event -> i
focusHandler

onDrag :: forall r i. (HasType "onDrag" DragEvent r) => (DragEvent -> i) -> IProp r i
onDrag :: forall (r :: Row (*)) i.
HasType "onDrag" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDrag = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.drag ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDragEnd :: forall r i. (HasType "onDragEnd" DragEvent r) => (DragEvent -> i) -> IProp r i
onDragEnd :: forall (r :: Row (*)) i.
HasType "onDragEnd" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDragEnd = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.dragend ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDragExit :: forall r i. (HasType "onDragExit" DragEvent r) => (DragEvent -> i) -> IProp r i
onDragExit :: forall (r :: Row (*)) i.
HasType "onDragExit" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDragExit = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.dragexit ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDragEnter :: forall r i. (HasType "onDragEnter" DragEvent r) => (DragEvent -> i) -> IProp r i
onDragEnter :: forall (r :: Row (*)) i.
HasType "onDragEnter" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDragEnter = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.dragenter ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDragLeave :: forall r i. (HasType "onDragLeave" DragEvent r) => (DragEvent -> i) -> IProp r i
onDragLeave :: forall (r :: Row (*)) i.
HasType "onDragLeave" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDragLeave = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.dragleave ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDragOver :: forall r i. (HasType "onDragOver" DragEvent r) => (DragEvent -> i) -> IProp r i
onDragOver :: forall (r :: Row (*)) i.
HasType "onDragOver" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDragOver = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.dragover ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDragStart :: forall r i. (HasType "onDragStart" DragEvent r) => (DragEvent -> i) -> IProp r i
onDragStart :: forall (r :: Row (*)) i.
HasType "onDragStart" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDragStart = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.dragstart ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onDrop :: forall r i. (HasType "onDrop" DragEvent r) => (DragEvent -> i) -> IProp r i
onDrop :: forall (r :: Row (*)) i.
HasType "onDrop" DragEvent r =>
(DragEvent -> i) -> IProp r i
onDrop = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler EventType
DET.drop ((Event -> i) -> IProp r i)
-> ((DragEvent -> i) -> Event -> i)
-> (DragEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DragEvent -> i) -> Event -> i
forall i. (DragEvent -> i) -> Event -> i
dragHandler

onTouchCancel :: forall r i. (HasType "onTouchCancel" TouchEvent r) => (TouchEvent -> i) -> IProp r i
onTouchCancel :: forall (r :: Row (*)) i.
HasType "onTouchCancel" TouchEvent r =>
(TouchEvent -> i) -> IProp r i
onTouchCancel = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"touchcancel") ((Event -> i) -> IProp r i)
-> ((TouchEvent -> i) -> Event -> i)
-> (TouchEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TouchEvent -> i) -> Event -> i
forall i. (TouchEvent -> i) -> Event -> i
touchHandler

onTouchEnd :: forall r i. (HasType "onTouchEnd" TouchEvent r) => (TouchEvent -> i) -> IProp r i
onTouchEnd :: forall (r :: Row (*)) i.
HasType "onTouchEnd" TouchEvent r =>
(TouchEvent -> i) -> IProp r i
onTouchEnd = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"touchend") ((Event -> i) -> IProp r i)
-> ((TouchEvent -> i) -> Event -> i)
-> (TouchEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TouchEvent -> i) -> Event -> i
forall i. (TouchEvent -> i) -> Event -> i
touchHandler

onTouchEnter :: forall r i. (HasType "onTouchEnter" TouchEvent r) => (TouchEvent -> i) -> IProp r i
onTouchEnter :: forall (r :: Row (*)) i.
HasType "onTouchEnter" TouchEvent r =>
(TouchEvent -> i) -> IProp r i
onTouchEnter = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"touchenter") ((Event -> i) -> IProp r i)
-> ((TouchEvent -> i) -> Event -> i)
-> (TouchEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TouchEvent -> i) -> Event -> i
forall i. (TouchEvent -> i) -> Event -> i
touchHandler

onTouchLeave :: forall r i. (HasType "onTouchLeave" TouchEvent r) => (TouchEvent -> i) -> IProp r i
onTouchLeave :: forall (r :: Row (*)) i.
HasType "onTouchLeave" TouchEvent r =>
(TouchEvent -> i) -> IProp r i
onTouchLeave = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"touchleave") ((Event -> i) -> IProp r i)
-> ((TouchEvent -> i) -> Event -> i)
-> (TouchEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TouchEvent -> i) -> Event -> i
forall i. (TouchEvent -> i) -> Event -> i
touchHandler

onTouchMove :: forall r i. (HasType "onTouchMove" TouchEvent r) => (TouchEvent -> i) -> IProp r i
onTouchMove :: forall (r :: Row (*)) i.
HasType "onTouchMove" TouchEvent r =>
(TouchEvent -> i) -> IProp r i
onTouchMove = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"touchmove") ((Event -> i) -> IProp r i)
-> ((TouchEvent -> i) -> Event -> i)
-> (TouchEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TouchEvent -> i) -> Event -> i
forall i. (TouchEvent -> i) -> Event -> i
touchHandler

onTouchStart :: forall r i. (HasType "onTouchStart" TouchEvent r) => (TouchEvent -> i) -> IProp r i
onTouchStart :: forall (r :: Row (*)) i.
HasType "onTouchStart" TouchEvent r =>
(TouchEvent -> i) -> IProp r i
onTouchStart = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"touchstart") ((Event -> i) -> IProp r i)
-> ((TouchEvent -> i) -> Event -> i)
-> (TouchEvent -> i)
-> IProp r i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TouchEvent -> i) -> Event -> i
forall i. (TouchEvent -> i) -> Event -> i
touchHandler

onResize :: forall r i. (HasType "onResize" Event r) => (Event -> i) -> IProp r i
onResize :: forall (r :: Row (*)) i.
HasType "onResize" Event r =>
(Event -> i) -> IProp r i
onResize = EventType -> (Event -> i) -> IProp r i
forall (r :: Row (*)) i. EventType -> (Event -> i) -> IProp r i
handler (Text -> EventType
EventType Text
"resize")

keyHandler :: forall i. (KeyboardEvent -> i) -> Event -> i
keyHandler :: forall i. (KeyboardEvent -> i) -> Event -> i
keyHandler = (KeyboardEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

mouseHandler :: forall i. (MouseEvent -> i) -> Event -> i
mouseHandler :: forall i. (MouseEvent -> i) -> Event -> i
mouseHandler = (MouseEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

wheelHandler :: forall i. (WheelEvent -> i) -> Event -> i
wheelHandler :: forall i. (WheelEvent -> i) -> Event -> i
wheelHandler = (WheelEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

focusHandler :: forall i. (FocusEvent -> i) -> Event -> i
focusHandler :: forall i. (FocusEvent -> i) -> Event -> i
focusHandler = (FocusEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

dragHandler :: forall i. (DragEvent -> i) -> Event -> i
dragHandler :: forall i. (DragEvent -> i) -> Event -> i
dragHandler = (DragEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

clipboardHandler :: forall i. (ClipboardEvent -> i) -> Event -> i
clipboardHandler :: forall i. (ClipboardEvent -> i) -> Event -> i
clipboardHandler = (ClipboardEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

touchHandler :: forall i. (TouchEvent -> i) -> Event -> i
touchHandler :: forall i. (TouchEvent -> i) -> Event -> i
touchHandler = (TouchEvent -> i) -> Event -> i
forall a b. Coercible a b => a -> b
coerce

-- | Attaches event handler to event `key` with getting `prop` field as an
-- | argument of `handler`.
addForeignPropHandler :: forall value tag r i. EventType -> Text -> (Foreign tag -> Maybe value) -> (value -> i) -> IProp r i
addForeignPropHandler :: forall {k} value (tag :: k) (r :: Row (*)) i.
EventType
-> Text
-> (Foreign tag -> Maybe value)
-> (value -> i)
-> IProp r i
addForeignPropHandler EventType
key Text
prop_ Foreign tag -> Maybe value
reader_ value -> i
f =
  EventType -> (Event -> Maybe i) -> IProp r i
forall (r :: Row (*)) i.
EventType -> (Event -> Maybe i) -> IProp r i
handler' EventType
key ((Event -> Maybe i) -> IProp r i)
-> (Event -> Maybe i) -> IProp r i
forall a b. (a -> b) -> a -> b
$ Event -> Maybe EventTarget
EE.currentTarget (Event -> Maybe EventTarget)
-> (EventTarget -> Maybe i) -> Event -> Maybe i
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> EventTarget -> Maybe i
go
  where
    go :: EventTarget -> Maybe i
go EventTarget
a = value -> i
f (value -> i) -> Maybe value -> Maybe i
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text
-> (Foreign tag -> Maybe value)
-> Foreign (ZonkAny 1)
-> Maybe value
forall {k1} {k2} (tag :: k1) a (tag' :: k2).
Text -> (Foreign tag -> Maybe a) -> Foreign tag' -> Maybe a
readProp Text
prop_ Foreign tag -> Maybe value
reader_ (EventTarget -> Foreign (ZonkAny 1)
forall a b. Coercible a b => a -> b
coerce EventTarget
a)

-- | Attaches an event handler which will produce an input when the value of an
-- | input field changes.
onValueChange :: forall r i. (HasType "value" Text r, HasType "onChange" Event r) => (Text -> i) -> IProp r i
onValueChange :: forall (r :: Row (*)) i.
(HasType "value" Text r, HasType "onChange" Event r) =>
(Text -> i) -> IProp r i
onValueChange = EventType
-> Text
-> (Foreign (ZonkAny 3) -> Maybe Text)
-> (Text -> i)
-> IProp r i
forall {k} value (tag :: k) (r :: Row (*)) i.
EventType
-> Text
-> (Foreign tag -> Maybe value)
-> (value -> i)
-> IProp r i
addForeignPropHandler EventType
ET.change Text
"value" (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text)
-> (Foreign (ZonkAny 3) -> Text)
-> Foreign (ZonkAny 3)
-> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Foreign (ZonkAny 3) -> Text
forall {k} (tag :: k). Foreign tag -> Text
foreignToString)

--  | Reacts to the intermediate value change of the input element by checking the input value of event
onInputValueChange :: forall r i. (HasType "value" Text r, HasType "onInput" Event r) => (Text -> Maybe i) -> IProp r i
onInputValueChange :: forall (r :: Row (*)) i.
(HasType "value" Text r, HasType "onInput" Event r) =>
(Text -> Maybe i) -> IProp r i
onInputValueChange Text -> Maybe i
f = EventType -> (Event -> Maybe i) -> IProp r i
forall (r :: Row (*)) i.
EventType -> (Event -> Maybe i) -> IProp r i
handler' EventType
ET.input ((Event -> Maybe i) -> IProp r i)
-> (Event -> Maybe i) -> IProp r i
forall a b. (a -> b) -> a -> b
$ \Event
ev -> do
  trg <- EventTarget -> Foreign (ZonkAny 11)
forall a b. Coercible a b => a -> b
coerce (EventTarget -> Foreign (ZonkAny 11))
-> Maybe EventTarget -> Maybe (Foreign (ZonkAny 11))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe EventTarget
currentTarget Event
ev
  readProp "value" (f . foreignToString) trg

-- | Attaches an event handler which will produce an input when the seleced index of a
-- | `select` element changes.
onSelectedIndexChange :: forall r i. (HasType "selectedIndex" Int r, HasType "onChange" Event r) => (Int -> i) -> IProp r i
onSelectedIndexChange :: forall (r :: Row (*)) i.
(HasType "selectedIndex" Int r, HasType "onChange" Event r) =>
(Int -> i) -> IProp r i
onSelectedIndexChange = EventType
-> Text
-> (Foreign (ZonkAny 5) -> Maybe Int)
-> (Int -> i)
-> IProp r i
forall {k} value (tag :: k) (r :: Row (*)) i.
EventType
-> Text
-> (Foreign tag -> Maybe value)
-> (value -> i)
-> IProp r i
addForeignPropHandler EventType
ET.change Text
"selectedIndex" (Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Maybe Int)
-> (Foreign (ZonkAny 5) -> Int) -> Foreign (ZonkAny 5) -> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Foreign (ZonkAny 5) -> Int
forall {k} (tag :: k). Foreign tag -> Int
foreignToInt)

-- | Attaches an event handler which will fire on input.
onValueInput :: forall r i. (HasType "value" Text r, HasType "onInput" Event r) => (Text -> i) -> IProp r i
onValueInput :: forall (r :: Row (*)) i.
(HasType "value" Text r, HasType "onInput" Event r) =>
(Text -> i) -> IProp r i
onValueInput = EventType
-> Text
-> (Foreign (ZonkAny 7) -> Maybe Text)
-> (Text -> i)
-> IProp r i
forall {k} value (tag :: k) (r :: Row (*)) i.
EventType
-> Text
-> (Foreign tag -> Maybe value)
-> (value -> i)
-> IProp r i
addForeignPropHandler EventType
ET.input Text
"value" (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text)
-> (Foreign (ZonkAny 7) -> Text)
-> Foreign (ZonkAny 7)
-> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Foreign (ZonkAny 7) -> Text
forall {k} (tag :: k). Foreign tag -> Text
foreignToString)

-- | Attaches an event handler which will fire when a checkbox is checked or
-- | unchecked.
onChecked :: forall r i. (HasType "checked" Bool r, HasType "onChange" Event r) => (Bool -> i) -> IProp r i
onChecked :: forall (r :: Row (*)) i.
(HasType "checked" Bool r, HasType "onChange" Event r) =>
(Bool -> i) -> IProp r i
onChecked = EventType
-> Text
-> (Foreign (ZonkAny 9) -> Maybe Bool)
-> (Bool -> i)
-> IProp r i
forall {k} value (tag :: k) (r :: Row (*)) i.
EventType
-> Text
-> (Foreign tag -> Maybe value)
-> (value -> i)
-> IProp r i
addForeignPropHandler EventType
ET.change Text
"checked" (Bool -> Maybe Bool
forall a. a -> Maybe a
Just (Bool -> Maybe Bool)
-> (Foreign (ZonkAny 9) -> Bool)
-> Foreign (ZonkAny 9)
-> Maybe Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Foreign (ZonkAny 9) -> Bool
forall {k} (tag :: k). Foreign tag -> Bool
foreignToBool)