Skip to content

Commit c9d3709

Browse files
committed
Updated useEmitter
1 parent 214806e commit c9d3709

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "js-element",
3-
"version": "0.0.223",
3+
"version": "0.0.224",
44
"description": "",
55
"license": "LGPL-3.0",
66
"main": "./index.js",

src/main/js-element-hooks.ts

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { intercept, Ctrl, Ctx } from 'js-element'
1+
import { intercept, Ctrl, Ctx, Listener } from 'js-element'
22

33
// === data ==========================================================
44

@@ -211,22 +211,52 @@ export const useStyles = hook('useStyles', (...styles: string[]) => {
211211

212212
// === useEmitter ======================================================
213213

214-
export const useEmitter = hook('useEmitter', function (): <
215-
E extends CustomEvent<any>
216-
>(
217-
ev: E,
218-
handler?: (ev: E) => void
219-
) => void {
220-
const host = currentCtrl!.getHost()
214+
function useEmitterFn(): (ev: CustomEvent<any>) => void
215+
function useEmitterFn<D = void>(type: string): (detail: D) => void
216+
function useEmitterFn<T extends string, D>(
217+
type: T,
218+
getEventProp: () => Listener<CustomEvent<D> & { type: T }> | undefined
219+
): (detail: D) => void
221220

222-
return (ev, handler?) => {
223-
host.dispatchEvent(ev)
221+
function useEmitterFn(type?: string, getEventProp?: Function) {
222+
const host = useHost()
223+
224+
if (arguments.length > 0 && typeof type !== 'string') {
225+
throw new Error('[useEmitter] Invalid type of first argument')
226+
}
227+
228+
if (type === undefined) {
229+
return (ev: CustomEvent<any>) => host.dispatchEvent(ev)
230+
}
224231

225-
if (handler) {
226-
handler(ev)
232+
if (getEventProp) {
233+
const eventListener = (ev: Event) => {
234+
const eventProp = getEventProp()
235+
236+
eventProp && eventProp(ev)
227237
}
238+
239+
useAfterMount(() => {
240+
host.addEventListener(type, eventListener)
241+
242+
return () => host.removeEventListener(type, eventListener)
243+
})
228244
}
229-
})
245+
246+
return <D>(detail: D, options?: CustomEventInit<D>) => {
247+
const ev = new CustomEvent<D>(type, {
248+
bubbles: true,
249+
composed: true,
250+
cancelable: true,
251+
...options,
252+
detail
253+
})
254+
255+
host.dispatchEvent(ev)
256+
}
257+
}
258+
259+
export const useEmitter = hook('useEmitter', useEmitterFn)
230260

231261
// === useMemo =========================================================
232262

0 commit comments

Comments
 (0)