Skip to content

Commit dd30838

Browse files
committed
fix(core): custom renderer timing
1 parent 7e7932e commit dd30838

File tree

5 files changed

+83
-37
lines changed

5 files changed

+83
-37
lines changed

packages/core/playground/vite.config.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,10 @@ export default defineConfig({
132132
type: 'action',
133133
icon: `material-symbols:counter-${count}`,
134134
title: `Counter ${count}`,
135-
// TODO: HMR
136-
action: ctx.utils.createSimpleClientScript(() => {
137-
// eslint-disable-next-line no-alert
138-
alert(`Counter ${count}`)
139-
}),
135+
// TODO: HMR?
136+
action: ctx.utils.createSimpleClientScript(`() => {
137+
alert('Counter ${count}')
138+
}`),
140139
})
141140
}, 1000)
142141
},

packages/core/src/client/webcomponents/state/context.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export async function createDocksContext(
5555
const entry = dockEntries.value.find(e => e.id === id)
5656
if (!entry)
5757
return false
58-
selectedId.value = entry.id
5958

6059
// If has import script, run it
6160
if (

packages/core/src/client/webcomponents/state/docks.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,22 @@ export function createDockEntryState(
3232

3333
watch(() => selected.value?.id, (newSelectedId) => {
3434
if (newSelectedId === entry.id) {
35-
events.emit('entry:activated')
35+
events.emitOnce('entry:activated')
3636
}
3737
else {
38-
events.emit('entry:deactivated')
38+
events.emitOnce('entry:deactivated')
3939
}
40-
})
40+
}, { immediate: true })
4141

4242
watch(() => state.domElements.iframe, (newIframe) => {
4343
if (newIframe)
44-
events.emit('dom:iframe:mounted', newIframe)
45-
})
44+
events.emitOnce('dom:iframe:mounted', newIframe)
45+
}, { immediate: true })
4646

4747
watch(() => state.domElements.panel, (newPanel) => {
4848
if (newPanel)
49-
events.emit('dom:panel:mounted', newPanel)
50-
})
49+
events.emitOnce('dom:panel:mounted', newPanel)
50+
}, { immediate: true })
5151

5252
return state
5353
}

packages/kit/src/types/events.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@ export interface EventEmitter<Events extends EventsMap> {
1818
* @param args The arguments for listeners.
1919
*/
2020
emit: <K extends keyof Events>(
21-
this: this,
21+
event: K,
22+
...args: Parameters<Events[K]>
23+
) => void
24+
25+
/**
26+
* Calls the listeners for a given event once and then removes the listener.
27+
*
28+
* @param event The event name.
29+
* @param args The arguments for listeners.
30+
*/
31+
emitOnce: <K extends keyof Events>(
2232
event: K,
2333
...args: Parameters<Events[K]>
2434
) => void
@@ -47,5 +57,23 @@ export interface EventEmitter<Events extends EventsMap> {
4757
* @param cb The listener function.
4858
* @returns Unbind listener from event.
4959
*/
50-
on: <K extends keyof Events>(this: this, event: K, cb: Events[K]) => EventUnsubscribe
60+
on: <K extends keyof Events>(event: K, cb: Events[K]) => EventUnsubscribe
61+
/**
62+
* Add a listener for a given event once.
63+
*
64+
* ```js
65+
* const unbind = ee.once('tick', (tickType, tickDuration) => {
66+
* count += 1
67+
* })
68+
*
69+
* disable () {
70+
* unbind()
71+
* }
72+
* ```
73+
*
74+
* @param event The event name.
75+
* @param cb The listener function.
76+
* @returns Unbind listener from event.
77+
*/
78+
once: <K extends keyof Events>(event: K, cb: Events[K]) => EventUnsubscribe
5179
}

packages/kit/src/utils/events.ts

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,49 @@ export function createEventEmitter<
88
>(): EventEmitter<Events> {
99
const _listeners: Partial<{ [E in keyof Events]: Events[E][] }> = {}
1010

11+
function emit<K extends keyof Events>(
12+
event: K,
13+
...args: Parameters<Events[K]>
14+
) {
15+
const callbacks = _listeners[event] || []
16+
for (let i = 0, length = callbacks.length; i < length; i++) {
17+
const callback = callbacks[i]
18+
if (callback)
19+
callback(...args)
20+
}
21+
}
22+
function emitOnce<K extends keyof Events>(
23+
event: K,
24+
...args: Parameters<Events[K]>
25+
) {
26+
emit(event, ...args)
27+
delete _listeners[event]
28+
}
29+
function on<K extends keyof Events>(
30+
event: K,
31+
cb: Events[K],
32+
): EventUnsubscribe {
33+
;(_listeners[event] ||= [] as Events[K][]).push(cb)
34+
return () => {
35+
_listeners[event] = _listeners[event]?.filter(i => cb !== i) as Events[K][] | undefined
36+
}
37+
}
38+
function once<K extends keyof Events>(
39+
event: K,
40+
cb: Events[K],
41+
) {
42+
const unsubscribe = on(event, ((...args: Parameters<Events[K]>) => {
43+
unsubscribe()
44+
return cb(...args)
45+
}) as Events[K])
46+
return unsubscribe
47+
}
48+
1149
return {
12-
emit<K extends keyof Events>(
13-
this: EventEmitter<Events>,
14-
event: K,
15-
...args: Parameters<Events[K]>
16-
) {
17-
const callbacks = _listeners[event] || []
18-
for (let i = 0, length = callbacks.length; i < length; i++) {
19-
const callback = callbacks[i]
20-
if (callback)
21-
callback(...args)
22-
}
23-
},
2450
_listeners,
25-
on<K extends keyof Events>(
26-
this: EventEmitter<Events>,
27-
event: K,
28-
cb: Events[K],
29-
): EventUnsubscribe {
30-
;(_listeners[event] ||= [] as Events[K][]).push(cb)
31-
return () => {
32-
_listeners[event] = _listeners[event]?.filter(i => cb !== i) as Events[K][] | undefined
33-
}
34-
},
51+
emit,
52+
emitOnce,
53+
on,
54+
once,
3555
}
3656
}

0 commit comments

Comments
 (0)