-
Notifications
You must be signed in to change notification settings - Fork 252
/
Copy pathdispatchEvent.ts
73 lines (63 loc) · 1.8 KB
/
dispatchEvent.ts
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
import {type Instance} from '../setup'
import {EventType, EventTypeInit} from './types'
import {behavior, BehaviorPlugin} from './behavior'
import {wrapEvent} from './wrapEvent'
import {isKeyboardEvent, isMouseEvent} from './eventMap'
import {createEvent} from './createEvent'
export function dispatchUIEvent<K extends EventType>(
this: Instance,
target: Element,
type: K,
init?: EventTypeInit<K>,
preventDefault: boolean = false,
) {
if (isMouseEvent(type) || isKeyboardEvent(type)) {
init = {
...init,
...this.system.getUIEventModifiers(),
} as EventTypeInit<K>
}
const event = createEvent(type, target, init)
return dispatchEvent.call(this, target, event, preventDefault)
}
export function dispatchEvent(
this: Instance,
target: Element,
event: Event,
preventDefault: boolean = false,
) {
const type = event.type as EventType
const behaviorImplementation = preventDefault
? () => {}
: (behavior[type] as BehaviorPlugin<EventType> | undefined)?.(
event,
target,
this,
)
if (behaviorImplementation) {
event.preventDefault()
let defaultPrevented = false
Object.defineProperty(event, 'defaultPrevented', {
get: () => defaultPrevented,
})
Object.defineProperty(event, 'preventDefault', {
value: () => {
defaultPrevented = event.cancelable
},
})
wrapEvent(() => target.dispatchEvent(event), target)
if (!defaultPrevented as boolean) {
behaviorImplementation()
}
return !defaultPrevented
}
return wrapEvent(() => target.dispatchEvent(event), target)
}
export function dispatchDOMEvent<K extends EventType>(
target: Element,
type: K,
init?: EventTypeInit<K>,
) {
const event = createEvent(type, target, init)
wrapEvent(() => target.dispatchEvent(event), target)
}