Skip to content

Commit 903ce0e

Browse files
committed
feat(async-event): add test and type to async-event-collection
1 parent 31616cb commit 903ce0e

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,12 @@ export function findParent<T = Element>(
176176
export function dispatchEvent<
177177
T extends HTMLElement,
178178
U extends keyof CustomEvents<T>,
179-
>(target: T, eventName: U, detail: CustomEvents<T>[U]) {
179+
>(target: T, eventName: U, detail: CustomEvents<T>[U]): Promise<unknown>[] {
180180
target.dispatchEvent(
181181
new CustomEvent(eventName as string, { detail: detail }),
182182
);
183+
184+
return [];
183185
}
184186

185187
export function prop() {

test/async.test.tsx

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { expect } from "@esm-bundle/chai";
2+
import { createComponent, mount, dispatchEvent } from "@plusnew/webcomponent";
3+
import { signal } from "@preact/signals-core";
4+
5+
describe("webcomponent", () => {
6+
let container: HTMLElement;
7+
8+
beforeEach(() => {
9+
container = document.createElement("div");
10+
document.body.appendChild(container);
11+
});
12+
13+
afterEach(() => {
14+
container.remove();
15+
});
16+
17+
it("async event", async () => {
18+
const abortController = new AbortController();
19+
20+
const Component = createComponent(
21+
"test-nested",
22+
class Component extends HTMLElement {
23+
onfoo: (evt: CustomEvent<null>) => void;
24+
25+
#loading = signal(false);
26+
render(this: Component) {
27+
return (
28+
<span
29+
className={this.#loading.value === true ? "loading" : ""}
30+
onclick={async () => {
31+
this.#loading.value = true;
32+
try {
33+
await Promise.all(dispatchEvent(this, "foo", null));
34+
} catch (_err) {}
35+
this.#loading.value = false;
36+
}}
37+
/>
38+
);
39+
}
40+
},
41+
);
42+
43+
mount(
44+
container,
45+
<Component
46+
onfoo={() =>
47+
new Promise((resolve) => {
48+
abortController.signal.addEventListener("abort", () => {
49+
resolve("done");
50+
});
51+
})
52+
}
53+
/>,
54+
);
55+
56+
expect(container.childNodes.length).to.equal(1);
57+
58+
const component = container.childNodes[0] as HTMLElement;
59+
const element = component.shadowRoot?.childNodes[0] as HTMLSpanElement;
60+
61+
expect(element.classList.contains("loading")).to.eql(false);
62+
63+
element.dispatchEvent(new MouseEvent("click"));
64+
65+
expect(element.classList.contains("loading")).to.eql(true);
66+
67+
await Promise.resolve();
68+
69+
expect(element.classList.contains("loading")).to.eql(true);
70+
71+
abortController.abort("abort");
72+
73+
expect(element.classList.contains("loading")).to.eql(false);
74+
});
75+
});

0 commit comments

Comments
 (0)