Skip to content

Commit 2be51e8

Browse files
authored
Support multiple arguments in event listeners (#598)
1 parent 834c9d2 commit 2be51e8

File tree

4 files changed

+63
-4
lines changed

4 files changed

+63
-4
lines changed

.changeset/rare-toys-develop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@remote-dom/core': minor
3+
---
4+
5+
Add support for multiple arguments in event listners

packages/core/source/elements/RemoteElement.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -884,11 +884,11 @@ function getRemoteEventRecord(
884884
property,
885885
definition,
886886
listeners: new Set(),
887-
dispatch: (arg: any) => {
887+
dispatch: (...args: any[]) => {
888888
const event =
889-
definition?.dispatchEvent?.call(this, arg) ??
889+
definition?.dispatchEvent?.apply(this, args) ??
890890
new RemoteEvent(type, {
891-
detail: arg,
891+
detail: args[0],
892892
bubbles: definition?.bubbles,
893893
});
894894

packages/core/source/elements/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export interface RemoteElementAttributeDefinition {}
99
export interface RemoteElementEventListenerDefinition {
1010
bubbles?: boolean;
1111
property?: boolean | string;
12-
dispatchEvent?(this: Element, arg: any): Event | undefined | void;
12+
dispatchEvent?(this: Element, ...args: any[]): Event | undefined | void;
1313
}
1414

1515
/**

packages/core/source/tests/elements.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,60 @@ describe('RemoteElement', () => {
991991
);
992992
});
993993

994+
it('passes all arguments to a custom event provided by a `dispatchEvent()` event listener description', async () => {
995+
class CustomRemoteEvent extends RemoteEvent {}
996+
997+
const dispatchListener = vi.fn();
998+
999+
const ButtonElement = createRemoteElement({
1000+
events: {
1001+
press: {
1002+
dispatchEvent(...args: any[]) {
1003+
dispatchListener(this, ...args);
1004+
1005+
return new CustomRemoteEvent('press', {
1006+
detail: args,
1007+
});
1008+
},
1009+
},
1010+
},
1011+
});
1012+
1013+
const {element, receiver} = createAndConnectRemoteElement(ButtonElement);
1014+
1015+
const listener = vi.fn();
1016+
1017+
element.addEventListener('press', listener);
1018+
1019+
expect(receiver.connection.mutate).toHaveBeenLastCalledWith([
1020+
[
1021+
MUTATION_TYPE_UPDATE_PROPERTY,
1022+
remoteId(element),
1023+
'press',
1024+
expect.any(Function),
1025+
UPDATE_PROPERTY_TYPE_EVENT_LISTENER,
1026+
],
1027+
]);
1028+
1029+
const dispatchFunction = receiver.get<RemoteReceiverElement>({
1030+
id: remoteId(element),
1031+
})?.eventListeners.press;
1032+
await dispatchFunction?.('Hello', 'world', '!');
1033+
1034+
expect(dispatchListener).toHaveBeenCalledWith(
1035+
element,
1036+
'Hello',
1037+
'world',
1038+
'!',
1039+
);
1040+
expect(listener).toHaveBeenCalledWith(expect.any(CustomRemoteEvent));
1041+
expect(listener).toHaveBeenCalledWith(
1042+
expect.objectContaining({
1043+
detail: ['Hello', 'world', '!'],
1044+
}),
1045+
);
1046+
});
1047+
9941048
it('removes an event listener when the last event listener is removed', () => {
9951049
const ButtonElement = createRemoteElement({
9961050
events: ['press'],

0 commit comments

Comments
 (0)