(data: Record<string, any> = {})
| 4 | import { sleep } from "@/tools/common"; |
| 5 | |
| 6 | export function useMountComponent(data: Record<string, any> = {}) { |
| 7 | let isOpen = false; |
| 8 | const mount = <T>(component: Component) => { |
| 9 | if (isOpen) return; |
| 10 | isOpen = true; |
| 11 | return new Promise<T>((resolve) => { |
| 12 | const div = document.createElement("div"); |
| 13 | document.body.appendChild(div); |
| 14 | const app = createApp(component, { |
| 15 | ...data, |
| 16 | async destroyComponent(delay = 1000) { |
| 17 | await sleep(delay); |
| 18 | app.unmount(); |
| 19 | div.remove(); |
| 20 | isOpen = false; |
| 21 | }, |
| 22 | emitResult(data: T) { |
| 23 | isOpen = false; |
| 24 | resolve(data); |
| 25 | } |
| 26 | }); |
| 27 | app.mount(div); |
| 28 | }); |
| 29 | }; |
| 30 | |
| 31 | const load = <T extends Component>(component: Component): T => { |
| 32 | const { component: mountedComponent } = loadApp<T>(component); |
| 33 | return mountedComponent; |
| 34 | }; |
| 35 | |
| 36 | const loadApp = <T extends Component>( |
| 37 | component: Component |
| 38 | ): { component: T; app: App; div: HTMLDivElement; destroyFc: () => void } => { |
| 39 | const div = document.createElement("div"); |
| 40 | document.body.appendChild(div); |
| 41 | const app = createApp(component, { |
| 42 | ...data, |
| 43 | async destroyComponent(delay = 1000) { |
| 44 | await sleep(delay); |
| 45 | app.unmount(); |
| 46 | div.remove(); |
| 47 | } |
| 48 | }); |
| 49 | const mountedComponent = app.mount(div); |
| 50 | return { |
| 51 | component: mountedComponent as any, |
| 52 | app: app, |
| 53 | div, |
| 54 | destroyFc: () => { |
| 55 | app.unmount(); |
| 56 | div.remove(); |
| 57 | } |
| 58 | }; |
| 59 | }; |
| 60 | |
| 61 | return { |
| 62 | mount, |
| 63 | load, |
no outgoing calls
no test coverage detected