diff --git a/packages/vue/src/ionic-vue.ts b/packages/vue/src/ionic-vue.ts index fd3d196d45..f2ca76262a 100644 --- a/packages/vue/src/ionic-vue.ts +++ b/packages/vue/src/ionic-vue.ts @@ -1,8 +1,7 @@ import { App, Plugin } from 'vue'; import { IonicConfig, setupConfig } from '@ionic/core'; import { applyPolyfills, defineCustomElements } from '@ionic/core/loader'; - -const needsKebabCase = (version: string) => !['3.0.0', '3.0.1', '3.0.2', '3.0.3', '3.0.4', '3.0.5'].includes(version); +import { needsKebabCase } from './utils'; /** * We need to make sure that the web component fires an event diff --git a/packages/vue/src/utils.ts b/packages/vue/src/utils.ts index 9cb505d110..bbcbcf1f40 100644 --- a/packages/vue/src/utils.ts +++ b/packages/vue/src/utils.ts @@ -57,3 +57,5 @@ export const getConfig = (): CoreConfig | null => { } return null; }; + +export const needsKebabCase = (version: string) => !['3.0.0', '3.0.1', '3.0.2', '3.0.3', '3.0.4', '3.0.5'].includes(version); diff --git a/packages/vue/src/vue-component-lib/overlays.ts b/packages/vue/src/vue-component-lib/overlays.ts index c058edb06e..5dd39d23e7 100644 --- a/packages/vue/src/vue-component-lib/overlays.ts +++ b/packages/vue/src/vue-component-lib/overlays.ts @@ -1,20 +1,37 @@ -import { defineComponent, h, ref, VNode } from 'vue'; +import { defineComponent, h, ref, VNode, getCurrentInstance } from 'vue'; +import { needsKebabCase } from '../utils'; export interface OverlayProps { isOpen?: boolean; } export const defineOverlayContainer = (name: string, componentProps: string[] = [], controller: any) => { - // TODO + /** + * Vue 3.0.6 fixed a bug where events on custom elements + * were always converted to lower case, so "ionRefresh" + * became "ionRefresh". We need to account for the old + * issue as well as the new behavior where "ionRefresh" + * is converted to "ion-refresh". + * See https://github.com/vuejs/vue-next/pull/2847 + */ const eventPrefix = name.toLowerCase().split('-').join(''); - const eventListeners = [ + const lowerCaseListeners = [ { componentEv: `${eventPrefix}willpresent`, frameworkEv: 'onWillPresent' }, { componentEv: `${eventPrefix}didpresent`, frameworkEv: 'onDidPresent' }, { componentEv: `${eventPrefix}willdismiss`, frameworkEv: 'onWillDismiss' }, { componentEv: `${eventPrefix}diddismiss`, frameworkEv: 'onDidDismiss' }, ]; + const kebabCaseListeners = [ + { componentEv: `${name}-will-present`, frameworkEv: 'onWillPresent' }, + { componentEv: `${name}-did-present`, frameworkEv: 'onDidPresent' }, + { componentEv: `${name}-will-dismiss`, frameworkEv: 'onWillDismiss' }, + { componentEv: `${name}-did-dismiss`, frameworkEv: 'onDidDismiss' }, + ]; const Container = defineComponent((props, { slots, emit }) => { + const instance = getCurrentInstance(); + const adjustedEventListeners = needsKebabCase(instance.appContext.app.version) ? kebabCaseListeners : lowerCaseListeners; + const overlay = ref(); const onVnodeMounted = async () => { const isOpen = props.isOpen; @@ -76,7 +93,7 @@ export const defineOverlayContainer = (name: string, compo overlay.value = await overlay.value; - eventListeners.forEach(eventListener => { + adjustedEventListeners.forEach(eventListener => { overlay.value.addEventListener(eventListener.componentEv, () => { emit(eventListener.frameworkEv); }); @@ -101,7 +118,7 @@ export const defineOverlayContainer = (name: string, compo Container.displayName = name; Container.props = [...componentProps, 'isOpen']; - Container.emits = eventListeners.map(ev => ev.frameworkEv); + Container.emits = [...lowerCaseListeners.map(ev => ev.frameworkEv), ...kebabCaseListeners.map(ev => ev.frameworkEv)]; return Container; } diff --git a/packages/vue/test-app/src/components/ModalContent.vue b/packages/vue/test-app/src/components/ModalContent.vue index b69172383e..e39b80f15a 100644 --- a/packages/vue/test-app/src/components/ModalContent.vue +++ b/packages/vue/test-app/src/components/ModalContent.vue @@ -3,7 +3,7 @@ - Dismiss + Dismiss Modal diff --git a/packages/vue/test-app/src/views/Overlays.vue b/packages/vue/test-app/src/views/Overlays.vue index cdf5c0a445..b0689930b5 100644 --- a/packages/vue/test-app/src/views/Overlays.vue +++ b/packages/vue/test-app/src/views/Overlays.vue @@ -1,5 +1,5 @@