1- import { defineComponent , h , ref } from 'vue' ;
1+ import { defineComponent , h , ref , VNode } from 'vue' ;
22
33export interface OverlayProps {
44 isOpen ?: boolean ;
@@ -21,28 +21,61 @@ export const defineOverlayContainer = <Props extends object>(name: string, compo
2121 isOpen && ( await present ( props ) )
2222 }
2323
24- const onVnodeUpdated = async ( ) => {
25- const isOpen = props . isOpen ;
24+ const onVnodeUpdated = async ( node : VNode , prevNode : VNode ) => {
25+ const isOpen = node . props ! . isOpen ;
26+ const prevIsOpen = prevNode . props ! . isOpen ;
27+
28+ /**
29+ * Do not do anything if this prop
30+ * did not change.
31+ */
32+ if ( isOpen === prevIsOpen ) return ;
33+
2634 if ( isOpen ) {
27- await overlay . value ?. present ( ) || present ( props ) ;
35+ await present ( props ) ;
2836 } else {
29- await overlay . value ?. dismiss ( ) ;
30- overlay . value = undefined ;
37+ await dismiss ( ) ;
3138 }
3239 }
3340
3441 const onVnodeBeforeUnmount = async ( ) => {
35- await overlay . value ?. dismiss ( ) ;
42+ await dismiss ( ) ;
43+ }
44+
45+ const dismiss = async ( ) => {
46+ if ( ! overlay . value ) return ;
47+
48+ await overlay . value ;
49+
50+ overlay . value = overlay . value . dismiss ( ) ;
51+
52+ await overlay . value ;
53+
3654 overlay . value = undefined ;
3755 }
3856
3957 const present = async ( props : Readonly < Props > ) => {
58+ /**
59+ * Do not open another instance
60+ * if one is already opened.
61+ */
62+ if ( overlay . value ) {
63+ await overlay . value ;
64+ }
65+
66+ if ( overlay . value ?. present ) {
67+ await overlay . value . present ( ) ;
68+ return ;
69+ }
70+
4071 const component = slots . default && slots . default ( ) [ 0 ] ;
41- overlay . value = await controller . create ( {
72+ overlay . value = controller . create ( {
4273 ...props ,
4374 component
4475 } ) ;
4576
77+ overlay . value = await overlay . value ;
78+
4679 eventListeners . forEach ( eventListener => {
4780 overlay . value . addEventListener ( eventListener . componentEv , ( ) => {
4881 emit ( eventListener . frameworkEv ) ;
@@ -59,7 +92,8 @@ export const defineOverlayContainer = <Props extends object>(name: string, compo
5992 style : { display : 'none' } ,
6093 onVnodeMounted,
6194 onVnodeUpdated,
62- onVnodeBeforeUnmount
95+ onVnodeBeforeUnmount,
96+ isOpen : props . isOpen
6397 }
6498 ) ;
6599 }
0 commit comments