1
- import { defineComponent , h , ref , VNode } from 'vue' ;
1
+ import { defineComponent , h , ref , VNode , getCurrentInstance } from 'vue' ;
2
+ import { needsKebabCase } from '../utils' ;
2
3
3
4
export interface OverlayProps {
4
5
isOpen ?: boolean ;
5
6
}
6
7
7
8
export const defineOverlayContainer = < Props extends object > ( name : string , componentProps : string [ ] = [ ] , controller : any ) => {
8
- // TODO
9
+ /**
10
+ * Vue 3.0.6 fixed a bug where events on custom elements
11
+ * were always converted to lower case, so "ionRefresh"
12
+ * became "ionRefresh". We need to account for the old
13
+ * issue as well as the new behavior where "ionRefresh"
14
+ * is converted to "ion-refresh".
15
+ * See https://github.com/vuejs/vue-next/pull/2847
16
+ */
9
17
const eventPrefix = name . toLowerCase ( ) . split ( '-' ) . join ( '' ) ;
10
- const eventListeners = [
18
+ const lowerCaseListeners = [
11
19
{ componentEv : `${ eventPrefix } willpresent` , frameworkEv : 'onWillPresent' } ,
12
20
{ componentEv : `${ eventPrefix } didpresent` , frameworkEv : 'onDidPresent' } ,
13
21
{ componentEv : `${ eventPrefix } willdismiss` , frameworkEv : 'onWillDismiss' } ,
14
22
{ componentEv : `${ eventPrefix } diddismiss` , frameworkEv : 'onDidDismiss' } ,
15
23
] ;
24
+ const kebabCaseListeners = [
25
+ { componentEv : `${ name } -will-present` , frameworkEv : 'onWillPresent' } ,
26
+ { componentEv : `${ name } -did-present` , frameworkEv : 'onDidPresent' } ,
27
+ { componentEv : `${ name } -will-dismiss` , frameworkEv : 'onWillDismiss' } ,
28
+ { componentEv : `${ name } -did-dismiss` , frameworkEv : 'onDidDismiss' } ,
29
+ ] ;
16
30
17
31
const Container = defineComponent < Props & OverlayProps > ( ( props , { slots, emit } ) => {
32
+ const instance = getCurrentInstance ( ) ;
33
+ const adjustedEventListeners = needsKebabCase ( instance . appContext . app . version ) ? kebabCaseListeners : lowerCaseListeners ;
34
+
18
35
const overlay = ref ( ) ;
19
36
const onVnodeMounted = async ( ) => {
20
37
const isOpen = props . isOpen ;
@@ -76,7 +93,7 @@ export const defineOverlayContainer = <Props extends object>(name: string, compo
76
93
77
94
overlay . value = await overlay . value ;
78
95
79
- eventListeners . forEach ( eventListener => {
96
+ adjustedEventListeners . forEach ( eventListener => {
80
97
overlay . value . addEventListener ( eventListener . componentEv , ( ) => {
81
98
emit ( eventListener . frameworkEv ) ;
82
99
} ) ;
@@ -101,7 +118,7 @@ export const defineOverlayContainer = <Props extends object>(name: string, compo
101
118
102
119
Container . displayName = name ;
103
120
Container . props = [ ...componentProps , 'isOpen' ] ;
104
- Container . emits = eventListeners . map ( ev => ev . frameworkEv ) ;
121
+ Container . emits = [ ... lowerCaseListeners . map ( ev => ev . frameworkEv ) , ... kebabCaseListeners . map ( ev => ev . frameworkEv ) ] ;
105
122
106
123
return Container ;
107
124
}
0 commit comments