{"version":3,"file":"use-template-promise.mjs","sources":["../../../../packages/hooks/use-template-promise.tsx"],"sourcesContent":["// 参考 https://github.com/vueuse/vueuse/blob/main/packages/core/createTemplatePromise/index.ts\n\nimport type {\n  DefineComponent,\n  Ref,\n  TransitionProps,\n  VNode,\n  SetupContext,\n} from 'vue'\nimport {\n  defineComponent,\n  ref,\n  shallowReactive,\n  Transition,\n  Fragment,\n  h,\n  createApp,\n  getCurrentInstance,\n  render as vRender,\n  markRaw,\n  withDirectives,\n  vShow,\n  nextTick,\n} from 'vue'\n\nexport interface TemplatePromiseOptions {\n  // 过渡\n  transition?: TransitionProps\n  // 是否销毁\n  destroy?: boolean\n  //   自定义渲染\n  render?: (props, ctx: SetupContext) => VNode\n  // class 名\n  class?: string\n}\nexport type TemplatePromise<\n  Return,\n  Args extends any[] = [],\n> = DefineComponent<object> & {\n  //   new (): {\n  //     $slots: {\n  //       default: (_: TemplatePromiseProps<Return, Args>) => any\n  //     }\n  //   }\n} & {\n  open: (...args: Args) => Promise<Return>\n}\nexport interface TemplatePromiseProps<Return, Args extends any[] = []> {\n  promise: Promise<Return> | undefined\n  resolve: (v: Return) => void\n  reject: (v: any) => void\n  args: Args\n  options: TemplatePromiseOptions\n  isResolving: boolean\n  isVisible: boolean\n  key: number\n}\nexport const useTemplatePromise = <Return, Args extends any[] = []>(\n  options: TemplatePromiseOptions = {},\n): TemplatePromise<Return, Args> => {\n  const {\n    destroy = false,\n    render,\n    transition = {\n      name: 'fade',\n      appear: true,\n    },\n  } = options\n  const instances = ref([]) as Ref<TemplatePromiseProps<Return, Args>[]>\n  let index = 0\n\n  const create = (...args: Args) => {\n    const key = index++\n    const props = shallowReactive<TemplatePromiseProps<Return, Args>>({\n      key,\n      args,\n      promise: undefined,\n      resolve: () => {},\n      reject: () => {},\n      isResolving: false,\n      isVisible: true,\n      options,\n    })\n    instances.value.push(props)\n    props.promise = new Promise<Return>((_resolve, _reject) => {\n      props.resolve = (v) => {\n        props.isResolving = true\n        return _resolve(v)\n      }\n      props.reject = _reject\n    }).finally(() => {\n      if (destroy) {\n        props.promise = undefined\n        const index = instances.value.indexOf(props)\n        if (index !== -1) instances.value.splice(index, 1)\n      } else {\n        props.isVisible = false\n        // const wrapper = document.querySelector(\n        //   '.ep-template-promise',\n        // ) as HTMLElement\n        // if (wrapper.style['zIndex']) {\n        //   return\n        // }\n        // const dialog = wrapper?.querySelector('.el-modal-dialog') as HTMLElement\n        // const zIndex = dialog ? dialog.style['z-index'] : ''\n        // if (zIndex && wrapper) {\n        //   wrapper.style.zIndex = zIndex\n        // }\n      }\n    })\n    return props.promise\n  }\n  const open = (...args: Args) => {\n    instances.value = []\n    const com = create(...args)\n    nextTick(() => {\n      const wrapper = document.querySelector(\n        '.ep-template-promise.is-init',\n      ) as HTMLElement\n      if (wrapper) {\n        const dialog = wrapper?.querySelector('.el-modal-dialog') as HTMLElement\n        const zIndex = dialog ? dialog.style['z-index'] : ''\n        if (zIndex && wrapper) {\n          wrapper.style.zIndex = zIndex\n        }\n        // 删除is-init的class\n        wrapper.classList.remove('is-init')\n      }\n    })\n    return com\n  }\n  const component = defineComponent((_, ctx) => {\n    const { slots } = ctx\n    const renderList = () =>\n      instances.value.map((props) => {\n        return withDirectives(\n          h(\n            'div',\n            {\n              // key: props.key,\n              class: `ep-template-promise is-init ${options.class || ''}`,\n            },\n            render ? render(props, ctx) : slots.default?.(props),\n          ),\n          [[vShow, props.isVisible]],\n        )\n      })\n    if (transition)\n      return () => <Transition {...transition}>{renderList()}</Transition>\n\n    return renderList\n  })\n  // @ts-expect-error There's a breaking type change in Vue 3.3 <https://github.com/vuejs/core/pull/7963>\n  component.open = open\n  return markRaw(component as TemplatePromise<Return, Args>)\n}\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","useTemplatePromise","options","destroy","render","transition","name","appear","instances","ref","index","create","args","key","props","shallowReactive","promise","undefined","resolve","reject","isResolving","isVisible","value","push","Promise","_resolve","_reject","v","finally","indexOf","splice","open","com","nextTick","wrapper","document","querySelector","dialog","zIndex","style","classList","remove","component","defineComponent","_","ctx","slots","renderList","map","withDirectives","h","class","default","vShow","_slot","_createVNode","Transition","markRaw"],"mappings":"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"}