import { Loading } from 'bill/index' import { defineAsyncComponent } from 'vue' import type { AsyncComponentLoader, Component } from 'vue' export const loadPack = Promise>(fn: K | Promise): Promise => { Loading.show() const ret = typeof fn === 'function' ? fn() : fn if (ret.finally) { ret.finally(() => Loading.hide()) } else { ret.then(() => Loading.hide()) ret.catch(() => Loading.hide()) } return ret } export const createLoadPack = Promise>(fn: K): K => ((...args) => loadPack(() => fn(...args))) as K export const loadComponent = (loader: AsyncComponentLoader) => defineAsyncComponent(createLoadPack(loader)) export const showLoad = () => Loading.show() export const hideLoad = () => Loading.hide()