Skip to content

Commit cc5c8c6

Browse files
committed
bug fix
1 parent d46e074 commit cc5c8c6

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

packages/vue/src/vue-component-lib/overlays.ts

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineComponent, h, ref } from 'vue';
1+
import { defineComponent, h, ref, VNode } from 'vue';
22

33
export 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

Comments
 (0)