Skip to content

Commit a9716e6

Browse files
committed
extract addOrUpdateEventListener to util
1 parent 11a10d0 commit a9716e6

File tree

2 files changed

+32
-27
lines changed

2 files changed

+32
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const listenedEvents = new WeakMap<Element, Map<string, EventListenerObject>>();
2+
3+
export default function addOrUpdateEventListener(
4+
node: Element,
5+
event: string,
6+
listener: ((event: Event) => void) | undefined,
7+
) {
8+
let nodeEvents = listenedEvents.get(node);
9+
if (nodeEvents === undefined) {
10+
nodeEvents = new Map();
11+
listenedEvents.set(node, nodeEvents);
12+
}
13+
14+
let handler = nodeEvents.get(event);
15+
if (listener !== undefined) {
16+
if (handler === undefined) {
17+
// If necessary, add listener and track handler
18+
handler = { handleEvent: listener };
19+
node.addEventListener(event, handler);
20+
nodeEvents.set(event, handler);
21+
} else {
22+
// Otherwise just update the listener with new value
23+
handler.handleEvent = listener;
24+
}
25+
} else if (handler !== undefined) {
26+
// Remove listener if one exists and value is undefined
27+
node.removeEventListener(event, handler);
28+
nodeEvents.delete(event);
29+
}
30+
}

packages/react-components/src/utils/createComponent.ts

+2-27
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { ThemePropertyMixinClass } from '@vaadin/vaadin-themable-mixin/vaad
22
import type React from 'react';
33
import { createElement, useLayoutEffect, useRef, type RefAttributes } from 'react';
44
import useMergedRefs from './useMergedRefs.js';
5+
import addOrUpdateEventListener from './addOrUpdateEventListener.js';
56

67
declare const __VERSION__: string;
78

@@ -82,30 +83,6 @@ type AllWebComponentProps<I extends HTMLElement, E extends EventNames = {}> = I
8283

8384
export type WebComponentProps<I extends HTMLElement, E extends EventNames = {}> = Partial<AllWebComponentProps<I, E>>;
8485

85-
const listenedEvents = new WeakMap<Element, Map<string, EventListenerObject>>();
86-
87-
function addOrUpdateEventListener(node: Element, event: string, listener: ((event: Event) => void) | undefined) {
88-
let events = listenedEvents.get(node);
89-
if (events === undefined) {
90-
listenedEvents.set(node, (events = new Map()));
91-
}
92-
let handler = events.get(event);
93-
if (listener !== undefined) {
94-
// If necessary, add listener and track handler
95-
if (handler === undefined) {
96-
events.set(event, (handler = { handleEvent: listener }));
97-
node.addEventListener(event, handler);
98-
// Otherwise just update the listener with new value
99-
} else {
100-
handler.handleEvent = listener;
101-
}
102-
// Remove listener if one exists and value is undefined
103-
} else if (handler !== undefined) {
104-
events.delete(event);
105-
node.removeEventListener(event, handler);
106-
}
107-
}
108-
10986
export function createComponent<I extends HTMLElement, E extends EventNames = {}>(
11087
options: Options<I, E>,
11188
): (props: WebComponentProps<I, E> & RefAttributes<I>) => React.ReactElement {
@@ -144,9 +121,7 @@ export function createComponent<I extends HTMLElement, E extends EventNames = {}
144121
};
145122
}, []);
146123

147-
const finalProps = Object.fromEntries(
148-
Object.entries(props).filter(([key]) => !eventsMap?.[key])
149-
);
124+
const finalProps = Object.fromEntries(Object.entries(props).filter(([key]) => !eventsMap?.[key]));
150125

151126
// Option 2 (initial property events are fired):
152127
// const finalProps = Object.fromEntries(

0 commit comments

Comments
 (0)