Skip to content

Commit ea00671

Browse files
committed
feat(): new brick eo-batch-agent
1 parent 7c6ae95 commit ea00671

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { describe, test, expect, jest } from "@jest/globals";
2+
import { act } from "react-dom/test-utils";
3+
import "./";
4+
import type { EoBatchAgent } from "./index.js";
5+
6+
jest.mock("@next-core/theme", () => ({}));
7+
8+
describe("eo-batch-agent", () => {
9+
test("basic usage", async () => {
10+
const element = document.createElement("eo-batch-agent") as EoBatchAgent;
11+
12+
const onTrigger = jest.fn();
13+
element.addEventListener("trigger", (e) => {
14+
onTrigger((e as CustomEvent).detail);
15+
});
16+
17+
act(() => {
18+
document.body.appendChild(element);
19+
});
20+
21+
element.trigger("foo");
22+
element.trigger("bar");
23+
element.trigger("foo");
24+
expect(onTrigger).not.toHaveBeenCalled();
25+
26+
await Promise.resolve();
27+
expect(onTrigger).toHaveBeenCalledTimes(2);
28+
expect(onTrigger).toHaveBeenNthCalledWith(1, { type: "foo" });
29+
expect(onTrigger).toHaveBeenNthCalledWith(2, { type: "bar" });
30+
31+
element.trigger("bar");
32+
expect(onTrigger).toHaveBeenCalledTimes(2);
33+
await Promise.resolve();
34+
expect(onTrigger).toHaveBeenCalledTimes(3);
35+
expect(onTrigger).toHaveBeenNthCalledWith(3, { type: "bar" });
36+
37+
act(() => {
38+
document.body.removeChild(element);
39+
});
40+
});
41+
});
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import {
2+
createDecorators,
3+
NextElement,
4+
type EventEmitter,
5+
} from "@next-core/element";
6+
import styleText from "./styles.shadow.css";
7+
8+
const { defineElement, event, method } = createDecorators();
9+
10+
/**
11+
* 批处理事件代理。
12+
*
13+
* 当多次触发同一类型事件时,只会在当前宏任务结束后触发一次该类型事件。
14+
*/
15+
export
16+
@defineElement("eo-batch-agent", {
17+
styleTexts: [styleText],
18+
})
19+
class EoBatchAgent extends NextElement {
20+
#enqueued = new Set<string>();
21+
22+
/**
23+
* 事件被触发。
24+
*/
25+
@event({ type: "trigger" })
26+
accessor #triggerEvent!: EventEmitter<{ type: string }>;
27+
28+
/**
29+
* 触发事件。
30+
*/
31+
@method()
32+
trigger(type: string): void {
33+
if (this.#enqueued.has(type)) {
34+
return;
35+
}
36+
this.#enqueued.add(type);
37+
queueMicrotask(() => {
38+
this.#enqueued.delete(type);
39+
this.#triggerEvent.emit({ type });
40+
});
41+
}
42+
43+
protected _render() {
44+
// Do nothing
45+
}
46+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:host {
2+
display: none;
3+
}

0 commit comments

Comments
 (0)