Skip to content

Commit b35b401

Browse files
committed
Use WebAPI types in events
1 parent 826fed6 commit b35b401

File tree

5 files changed

+100
-92
lines changed

5 files changed

+100
-92
lines changed

package-lock.json

+7-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,6 @@
3737
"react-dom": ">=18.0.0"
3838
},
3939
"dependencies": {
40-
"@rescript/webapi": "^0.1.0-experimental-8ad0d94"
40+
"@rescript/webapi": "^0.1.0-experimental-82a7689"
4141
}
4242
}

src/ReactDOM.res

+14-11
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
calls and add the appropriate `require("react-dom")` in the file calling this `render` */
77

88
// Helper so that ReactDOM itself doesn't bring any runtime
9+
10+
open WebAPI
11+
912
@val @return(nullable)
10-
external querySelector: string => option<Dom.element> = "document.querySelector"
13+
external querySelector: string => option<DOMAPI.element> = "document.querySelector"
1114

1215
@module("react-dom")
1316
@deprecated(
1417
"ReactDOM.render is no longer supported in React 18. Use ReactDOM.Client.createRoot instead."
1518
)
16-
external render: (React.element, Dom.element) => unit = "render"
19+
external render: (React.element, DOMAPI.element) => unit = "render"
1720

1821
module Client = {
1922
module Root = {
@@ -25,37 +28,37 @@ module Client = {
2528
}
2629

2730
@module("react-dom/client")
28-
external createRoot: Dom.element => Root.t = "createRoot"
31+
external createRoot: DOMAPI.element => Root.t = "createRoot"
2932

3033
@module("react-dom/client")
31-
external hydrateRoot: (Dom.element, React.element) => Root.t = "hydrateRoot"
34+
external hydrateRoot: (DOMAPI.element, React.element) => Root.t = "hydrateRoot"
3235
}
3336

3437
@module("react-dom")
3538
@deprecated(
3639
"ReactDOM.hydrate is no longer supported in React 18. Use ReactDOM.Client.hydrateRoot instead."
3740
)
38-
external hydrate: (React.element, Dom.element) => unit = "hydrate"
41+
external hydrate: (React.element, DOMAPI.element) => unit = "hydrate"
3942

4043
@module("react-dom")
41-
external createPortal: (React.element, Dom.element) => React.element = "createPortal"
44+
external createPortal: (React.element, DOMAPI.element) => React.element = "createPortal"
4245

4346
@module("react-dom")
4447
@deprecated(
4548
"ReactDOM.unmountComponentAtNode is no longer supported in React 18. Use ReactDOM.Client.Root.unmount instead."
4649
)
47-
external unmountComponentAtNode: Dom.element => unit = "unmountComponentAtNode"
50+
external unmountComponentAtNode: DOMAPI.element => unit = "unmountComponentAtNode"
4851

49-
external domElementToObj: Dom.element => {..} = "%identity"
52+
external domElementToObj: DOMAPI.element => {..} = "%identity"
5053

5154
type style = ReactDOMStyle.t
5255

5356
type domRef = JsxDOM.domRef
5457

5558
module Ref = {
5659
type t = domRef
57-
type currentDomRef = React.ref<Js.nullable<Dom.element>>
58-
type callbackDomRef = Js.nullable<Dom.element> => unit
60+
type currentDomRef = React.ref<Js.nullable<DOMAPI.element>>
61+
type callbackDomRef = Js.nullable<DOMAPI.element> => unit
5962

6063
external domRef: currentDomRef => domRef = "%identity"
6164
external callbackDomRef: callbackDomRef => domRef = "%identity"
@@ -77,7 +80,7 @@ module Props = {
7780
@optional
7881
key: string,
7982
@optional
80-
ref: Js.nullable<Dom.element> => unit,
83+
ref: Js.nullable<DOMAPI.element> => unit,
8184
/* accessibility */
8285
/* https://www.w3.org/TR/wai-aria-1.1/ */
8386
/* https://accessibilityresources.org/<aria-tag> is a great resource for these */

src/ReactEvent.res

+19-16
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,43 @@ module MakeEventWithType = (
55
type t
66
},
77
) => {
8+
open WebAPI
9+
810
@get external bubbles: Type.t => bool = "bubbles"
911
@get external cancelable: Type.t => bool = "cancelable"
1012
@get
11-
external currentTarget: Type.t => {..} = "currentTarget" /* Should return Dom.eventTarget */
13+
external currentTarget: Type.t => DOMAPI.node = "currentTarget"
1214
@get external defaultPrevented: Type.t => bool = "defaultPrevented"
1315
@get external eventPhase: Type.t => int = "eventPhase"
1416
@get external isTrusted: Type.t => bool = "isTrusted"
15-
@get external nativeEvent: Type.t => {..} = "nativeEvent" /* Should return Dom.event */
17+
@get external nativeEvent: Type.t => EventAPI.event = "nativeEvent"
1618
@send external preventDefault: Type.t => unit = "preventDefault"
1719
@send
1820
external isDefaultPrevented: Type.t => bool = "isDefaultPrevented"
1921
@send external stopPropagation: Type.t => unit = "stopPropagation"
2022
@send
2123
external isPropagationStopped: Type.t => bool = "isPropagationStopped"
22-
@get external target: Type.t => {..} = "target" /* Should return Dom.eventTarget */
24+
@get external target: Type.t => DOMAPI.node = "target"
2325
@get external timeStamp: Type.t => float = "timeStamp"
2426
@get external type_: Type.t => string = "type"
2527
@send external persist: Type.t => unit = "persist"
2628
}
2729

30+
open WebAPI
31+
2832
module Synthetic = {
2933
type tag = JsxEvent.Synthetic.tag
3034
type t = synthetic<tag>
3135
@get external bubbles: synthetic<'a> => bool = "bubbles"
3236
@get external cancelable: synthetic<'a> => bool = "cancelable"
3337
@get
34-
external currentTarget: synthetic<'a> => {..} =
35-
"currentTarget" /* Should return Dom.eventTarget */
38+
external currentTarget: synthetic<'a> => DOMAPI.node = "currentTarget"
3639
@get
3740
external defaultPrevented: synthetic<'a> => bool = "defaultPrevented"
3841
@get external eventPhase: synthetic<'a> => int = "eventPhase"
3942
@get external isTrusted: synthetic<'a> => bool = "isTrusted"
4043
@get
41-
external nativeEvent: synthetic<'a> => {..} = "nativeEvent" /* Should return Dom.event */
44+
external nativeEvent: synthetic<'a> => EventAPI.event = "nativeEvent"
4245
@send
4346
external preventDefault: synthetic<'a> => unit = "preventDefault"
4447
@send
@@ -47,7 +50,7 @@ module Synthetic = {
4750
external stopPropagation: synthetic<'a> => unit = "stopPropagation"
4851
@send
4952
external isPropagationStopped: synthetic<'a> => bool = "isPropagationStopped"
50-
@get external target: synthetic<'a> => {..} = "target" /* Should return Dom.eventTarget */
53+
@get external target: synthetic<'a> => DOMAPI.node = "target"
5154
@get external timeStamp: synthetic<'a> => float = "timeStamp"
5255
@get external type_: synthetic<'a> => string = "type"
5356
@send external persist: synthetic<'a> => unit = "persist"
@@ -62,7 +65,7 @@ module Clipboard = {
6265
include MakeEventWithType({
6366
type t = t
6467
})
65-
@get external clipboardData: t => {..} = "clipboardData" /* Should return Dom.dataTransfer */
68+
@get external clipboardData: t => WebAPI.UIEventsAPI.dataTransfer = "clipboardData"
6669
}
6770

6871
module Composition = {
@@ -103,7 +106,7 @@ module Focus = {
103106
type t = t
104107
})
105108
@get @return(nullable)
106-
external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */
109+
external relatedTarget: t => option<EventAPI.eventTarget> = "relatedTarget"
107110
}
108111

109112
module Form = {
@@ -134,7 +137,7 @@ module Mouse = {
134137
@get external pageX: t => int = "pageX"
135138
@get external pageY: t => int = "pageY"
136139
@get @return(nullable)
137-
external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */
140+
external relatedTarget: t => option<EventAPI.eventTarget> = "relatedTarget"
138141
@get external screenX: t => int = "screenX"
139142
@get external screenY: t => int = "screenY"
140143
@get external shiftKey: t => bool = "shiftKey"
@@ -149,7 +152,7 @@ module Pointer = {
149152

150153
// UIEvent
151154
@get external detail: t => int = "detail"
152-
@get external view: t => Dom.window = "view" /* Should return DOMAbstractView/WindowProxy */
155+
@get external view: t => DOMAPI.window = "view"
153156

154157
// MouseEvent
155158
@get external screenX: t => int = "screenX"
@@ -172,7 +175,7 @@ module Pointer = {
172175
@get external buttons: t => int = "buttons"
173176

174177
@get @return(nullable)
175-
external relatedTarget: t => option<{..}> = "relatedTarget" /* Should return Dom.eventTarget */
178+
external relatedTarget: t => option<EventAPI.eventTarget> = "relatedTarget"
176179

177180
// PointerEvent
178181
@get external pointerId: t => Dom.eventPointerId = "pointerId"
@@ -202,14 +205,14 @@ module Touch = {
202205
type t = t
203206
})
204207
@get external altKey: t => bool = "altKey"
205-
@get external changedTouches: t => {..} = "changedTouches" /* Should return Dom.touchList */
208+
@get external changedTouches: t => UIEventsAPI.touchList = "changedTouches"
206209
@get external ctrlKey: t => bool = "ctrlKey"
207210
@send
208211
external getModifierState: (t, string) => bool = "getModifierState"
209212
@get external metaKey: t => bool = "metaKey"
210213
@get external shiftKey: t => bool = "shiftKey"
211-
@get external targetTouches: t => {..} = "targetTouches" /* Should return Dom.touchList */
212-
@get external touches: t => {..} = "touches" /* Should return Dom.touchList */
214+
@get external targetTouches: t => UIEventsAPI.touchList = "targetTouches"
215+
@get external touches: t => UIEventsAPI.touchList = "touches"
213216
}
214217

215218
module UI = {
@@ -219,7 +222,7 @@ module UI = {
219222
type t = t
220223
})
221224
@get external detail: t => int = "detail"
222-
@get external view: t => Dom.window = "view" /* Should return DOMAbstractView/WindowProxy */
225+
@get external view: t => DOMAPI.window = "view"
223226
}
224227

225228
module Wheel = {

0 commit comments

Comments
 (0)