Skip to content

Commit 57e0537

Browse files
committed
feat(useevent): make add and clear action ok
1 parent 76e000a commit 57e0537

File tree

1 file changed

+86
-8
lines changed

1 file changed

+86
-8
lines changed

packages/hooks/src/useEvent/index.ts

+86-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ export interface IEventQueue {
55
[_: string]: (() => void)[];
66
}
77

8+
export interface IActionAddPayload {
9+
eventName: string;
10+
handlers: (() => void)[];
11+
}
812
export interface IState {
913
eventQueue: IEventQueue;
1014
eventNameQueue: string[];
@@ -21,7 +25,7 @@ export enum IActionType {
2125

2226
export interface IAction {
2327
type: IActionType;
24-
payload: string | string[] | null;
28+
payload: string | string[] | IActionAddPayload | null;
2529
}
2630

2731
export const safeNamespace = ['__taro', 'at'];
@@ -34,7 +38,24 @@ const initState: IState = {
3438
function useEvent(namespace: string) {
3539
const { eventBus } = useContext(context);
3640

37-
const setListener = useCallback(() => {}, []);
41+
const setListener = useCallback(
42+
(eventName: string, ...handlers: (() => void)[]) => {
43+
if (!eventName || safeNamespace.some((v) => eventName.startsWith(v))) {
44+
console.warn('eventName not valid. listen failed');
45+
} else if (!handlers.length) {
46+
console.warn('you mast provide one handler to listen. add failed');
47+
} else {
48+
dispatch({
49+
type: IActionType.ADD,
50+
payload: {
51+
eventName,
52+
handlers,
53+
},
54+
});
55+
}
56+
},
57+
[],
58+
);
3859

3960
const removeListener = useCallback(() => {}, []);
4061

@@ -66,20 +87,77 @@ function useEvent(namespace: string) {
6687
}
6788
}, []);
6889

69-
const safeRemoveEvents = useCallback(() => {}, []);
90+
const safeRemoveEvents = useCallback(
91+
(eventNameQueue: string[], eventQueue): IEventQueue => {
92+
const removeEventName = eventNameQueue.filter(
93+
(v) => !safeNamespace.some((n) => v.startsWith(n)),
94+
);
95+
96+
removeEventName.forEach((v) => eventBus.off(v));
97+
const offQueue: IEventQueue = {};
98+
if (eventNameQueue.length === 1 && removeEventName.length) {
99+
Object.keys(eventQueue).forEach((key) => {
100+
if (!eventNameQueue.includes(key)) {
101+
offQueue[key] = eventQueue[key];
102+
}
103+
});
104+
}
105+
return offQueue;
106+
},
107+
[],
108+
);
70109

71110
const reducer = useCallback(
72111
(state: IState, { type, payload }: IAction): IState => {
73112
switch (type) {
74113
case IActionType.CLEAR:
75114
if (!payload) {
76-
eventBus.off();
115+
safeRemoveEvents(state.eventNameQueue, state.eventQueue);
116+
return {
117+
eventQueue: {},
118+
eventNameQueue: eventBus.display(),
119+
};
120+
} else {
121+
return {
122+
eventNameQueue: state.eventNameQueue.filter((v) => v !== payload),
123+
eventQueue: safeRemoveEvents(
124+
[payload as string],
125+
state.eventQueue,
126+
),
127+
};
128+
}
129+
case IActionType.ADD:
130+
if (
131+
!payload ||
132+
!(payload as IActionAddPayload).eventName ||
133+
!(payload as IActionAddPayload).handlers
134+
) {
135+
console.warn(
136+
'you mast provider eventName and one handler to listen',
137+
);
138+
return {
139+
...state,
140+
};
77141
} else {
78-
eventBus.off(payload as string);
142+
(payload as IActionAddPayload).handlers.forEach((handler) => {
143+
eventBus.on((payload as IActionAddPayload).eventName, handler);
144+
});
145+
return {
146+
eventNameQueue: [
147+
...new Set([
148+
...state.eventNameQueue,
149+
(payload as IActionAddPayload).eventName,
150+
]),
151+
],
152+
eventQueue: {
153+
...state.eventQueue,
154+
[(payload as IActionAddPayload).eventName]: [
155+
...state.eventQueue[(payload as IActionAddPayload).eventName],
156+
...(payload as IActionAddPayload).handlers,
157+
],
158+
},
159+
};
79160
}
80-
return {
81-
...state,
82-
};
83161
default:
84162
return state;
85163
}

0 commit comments

Comments
 (0)