Skip to content

Commit 08d4afd

Browse files
review and update code
1 parent 9776889 commit 08d4afd

File tree

2 files changed

+94
-28
lines changed

2 files changed

+94
-28
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { test, expect, vi } from 'vitest'
2+
import { mount } from '@vue/test-utils'
3+
import { nextTick, reactive } from 'vue'
4+
import SPopoverWrappedTransition from './SPopoverWrappedTransition.vue'
5+
import { POPOVER_API_KEY } from './api'
6+
7+
function createPopoverApi() {
8+
return reactive({
9+
show: false,
10+
popper: null,
11+
addPopperRefOverride: vi.fn(),
12+
deletePopperRefOverride: vi.fn(),
13+
})
14+
}
15+
16+
test('forwards transition hook arguments including done callback', async () => {
17+
const enterSpy = vi.fn((_, done) => {
18+
expect(typeof done).toBe('function')
19+
if (typeof done === 'function') done()
20+
})
21+
const leaveSpy = vi.fn((_, done) => {
22+
expect(typeof done).toBe('function')
23+
if (typeof done === 'function') done()
24+
})
25+
26+
const api = createPopoverApi()
27+
28+
const wrapper = mount(SPopoverWrappedTransition, {
29+
attrs: {
30+
css: false,
31+
onEnter: enterSpy,
32+
onLeave: leaveSpy,
33+
},
34+
slots: {
35+
default: '<div>Content</div>',
36+
},
37+
global: {
38+
provide: {
39+
[POPOVER_API_KEY as symbol]: api,
40+
},
41+
stubs: {
42+
transition: false,
43+
},
44+
},
45+
})
46+
47+
await nextTick()
48+
49+
api.show = true
50+
await nextTick()
51+
await nextTick()
52+
53+
expect(enterSpy).toHaveBeenCalled()
54+
55+
api.show = false
56+
await nextTick()
57+
await nextTick()
58+
59+
expect(leaveSpy).toHaveBeenCalled()
60+
61+
wrapper.unmount()
62+
})

packages/ui/src/components/Popover/SPopoverWrappedTransition.vue

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -135,70 +135,74 @@ const transitionActiveClass = eagerComputed(() => {
135135
136136
const afterEnterPending = ref(false)
137137
138-
function handleBeforeEnter(el: Element) {
138+
function handleBeforeEnter(...args: [Element, ...any[]]) {
139+
const [el] = args
139140
afterEnterPending.value = true
140141
transitionProps.onBeforeEnter?.(el as any)
141-
invokeListener('onBeforeEnter', el)
142+
invokeListener('onBeforeEnter', ...args)
142143
}
143144
144-
function handleEnter(el: Element) {
145+
function handleEnter(...args: [Element, ...any[]]) {
145146
onEnter()
146-
invokeListener('onEnter', el)
147+
invokeListener('onEnter', ...args)
147148
}
148149
149-
function handleAfterEnter(el: Element) {
150+
function handleAfterEnter(...args: [Element, ...any[]]) {
151+
const [el] = args
150152
if (!afterEnterPending.value) return
151153
afterEnterPending.value = false
152-
invokeListener('onAfterEnter', el)
154+
invokeListener('onAfterEnter', ...args)
153155
}
154156
155-
function handleEnterCancelled(el: Element) {
157+
function handleEnterCancelled(...args: [Element, ...any[]]) {
156158
afterEnterPending.value = false
157-
invokeListener('onEnterCancelled', el)
159+
invokeListener('onEnterCancelled', ...args)
158160
}
159161
160-
function handleBeforeLeave(el: Element) {
161-
invokeListener('onBeforeLeave', el)
162+
function handleBeforeLeave(...args: [Element, ...any[]]) {
163+
invokeListener('onBeforeLeave', ...args)
162164
}
163165
164-
function handleLeave(el: Element) {
165-
invokeListener('onLeave', el)
166+
function handleLeave(...args: [Element, ...any[]]) {
167+
invokeListener('onLeave', ...args)
166168
}
167169
168-
function handleAfterLeave(el: Element) {
170+
function handleAfterLeave(...args: [Element, ...any[]]) {
171+
const [el] = args
169172
afterEnterPending.value = false
170173
transitionProps.onAfterLeave?.(el as any)
171-
invokeListener('onAfterLeave', el)
174+
invokeListener('onAfterLeave', ...args)
172175
}
173176
174-
function handleLeaveCancelled(el: Element) {
175-
invokeListener('onLeaveCancelled', el)
177+
function handleLeaveCancelled(...args: [Element, ...any[]]) {
178+
invokeListener('onLeaveCancelled', ...args)
176179
}
177180
178-
function handleBeforeAppear(el: Element) {
181+
function handleBeforeAppear(...args: [Element, ...any[]]) {
182+
const [el] = args
179183
afterEnterPending.value = true
180184
transitionProps.onBeforeEnter?.(el as any)
181-
invokeListener('onBeforeAppear', el)
182-
invokeListener('onBeforeEnter', el)
185+
invokeListener('onBeforeAppear', ...args)
186+
invokeListener('onBeforeEnter', ...args)
183187
}
184188
185-
function handleAppear(el: Element) {
189+
function handleAppear(...args: [Element, ...any[]]) {
186190
onEnter()
187-
invokeListener('onAppear', el)
188-
invokeListener('onEnter', el)
191+
invokeListener('onAppear', ...args)
192+
invokeListener('onEnter', ...args)
189193
}
190194
191-
function handleAfterAppear(el: Element) {
195+
function handleAfterAppear(...args: [Element, ...any[]]) {
192196
if (!afterEnterPending.value) return
193197
afterEnterPending.value = false
194-
invokeListener('onAfterAppear', el)
195-
invokeListener('onAfterEnter', el)
198+
invokeListener('onAfterAppear', ...args)
199+
invokeListener('onAfterEnter', ...args)
196200
}
197201
198-
function handleAppearCancelled(el: Element) {
202+
function handleAppearCancelled(...args: [Element, ...any[]]) {
199203
afterEnterPending.value = false
200-
invokeListener('onAppearCancelled', el)
201-
invokeListener('onEnterCancelled', el)
204+
invokeListener('onAppearCancelled', ...args)
205+
invokeListener('onEnterCancelled', ...args)
202206
}
203207
204208
watch([contentNormalized, transitionActiveClass, contentShow], () => {

0 commit comments

Comments
 (0)