|
7 | 7 | unref,
|
8 | 8 | warn,
|
9 | 9 | } from '@vue/runtime-core';
|
10 |
| -import { NSVElement } from '../dom'; |
| 10 | +import { NSVElement, NSVRoot } from '../dom'; |
11 | 11 | import { createNativeView } from '../runtimeHelpers';
|
12 | 12 | import { isObject } from '@vue/shared';
|
13 | 13 |
|
@@ -74,29 +74,56 @@ export async function $showModal<T = any>(
|
74 | 74 |
|
75 | 75 | return new Promise((resolve) => {
|
76 | 76 | let isResolved = false;
|
77 |
| - let view = createNativeView(component, options.props); |
| 77 | + let isReloading = false; |
| 78 | + let root = new NSVRoot(); |
| 79 | + |
| 80 | + const reloadModal = () => { |
| 81 | + isReloading = true; |
| 82 | + closeModal(); |
| 83 | + // reopening is done in `closeCallback` |
| 84 | + }; |
| 85 | + |
| 86 | + let view = createNativeView(component, options.props, { |
| 87 | + reload: reloadModal, |
| 88 | + }); |
78 | 89 |
|
79 |
| - const closeModal = (...args: any[]) => modalContent.closeModal(...args); |
80 | 90 | const closeCallback = (data?: T) => {
|
81 | 91 | if (isResolved) return;
|
| 92 | + |
| 93 | + if (isReloading) { |
| 94 | + view.unmount(); |
| 95 | + view.mount(root); |
| 96 | + openModal({ |
| 97 | + // todo: for this to work nicely, we'd need to add `animated: false` to `closeModal` as well |
| 98 | + // but not currently possible without a core change. |
| 99 | + // animated: false, |
| 100 | + }); |
| 101 | + isReloading = false; |
| 102 | + |
| 103 | + return; |
| 104 | + } |
| 105 | + |
82 | 106 | isResolved = true;
|
83 | 107 | view.unmount();
|
84 | 108 | view = null;
|
85 | 109 |
|
86 | 110 | resolve(data);
|
87 | 111 | };
|
88 | 112 |
|
| 113 | + const openModal = (additionalOptions?: Partial<ShowModalOptions>) => { |
| 114 | + modalTarget.showModal(view.nativeView, { |
| 115 | + ...options, |
| 116 | + context: null, |
| 117 | + closeCallback, |
| 118 | + ...additionalOptions, |
| 119 | + }); |
| 120 | + }; |
| 121 | + const closeModal = (...args: any[]) => view.nativeView?.closeModal(...args); |
| 122 | + |
89 | 123 | view.context.config.globalProperties.$closeModal = closeModal;
|
90 | 124 | view.context.config.globalProperties.$modal = { close: closeModal };
|
91 | 125 |
|
92 |
| - view.mount(); |
93 |
| - |
94 |
| - const modalContent = view.nativeView; |
95 |
| - |
96 |
| - modalTarget.showModal(modalContent, { |
97 |
| - ...options, |
98 |
| - context: null, |
99 |
| - closeCallback, |
100 |
| - }); |
| 126 | + view.mount(root); |
| 127 | + openModal(); |
101 | 128 | });
|
102 | 129 | }
|
0 commit comments