{"version":3,"file":"suggestion.mjs","sources":["../../../../../../../packages/components/editor/src/mention/suggestion.ts"],"sourcesContent":["import { computed, h, ref, watchEffect } from 'vue'\nimport { ElTooltip, useNamespace } from 'element-plus'\nimport { VueRenderer } from '@tiptap/vue-3'\nimport { Editor } from '@tiptap/core'\nimport { SuggestionKeyDownProps, SuggestionProps } from '@tiptap/suggestion'\nimport { SuggestionOptions } from '../types'\nimport { filterOption } from '../helper'\nimport MentionList from './mention-list.vue'\n\nconst Popup = {\n  name: 'Popup',\n  props: {\n    visible: {\n      type: Boolean,\n      default: false,\n    },\n    clientRect: {\n      type: Function,\n      required: true,\n    },\n    slots: {\n      type: Object,\n    },\n    hiddenPopup: {\n      type: Function,\n      required: true,\n    },\n  },\n  setup(props: any, { attrs, expose }: any) {\n    const ns = useNamespace('editor-popup')\n\n    const listRef = ref()\n\n    const innerVisible = ref(false)\n\n    watchEffect(() => {\n      innerVisible.value = props.visible\n    })\n\n    const virtualRef = computed(() => {\n      return {\n        getBoundingClientRect: props.clientRect,\n      }\n    })\n\n    const onKeyDown = (props: SuggestionProps) => {\n      return listRef.value?.onKeyDown?.(props)\n    }\n\n    expose({\n      onKeyDown,\n    })\n\n    return () => {\n      return h(\n        ElTooltip,\n        {\n          showArrow: false,\n          placement: 'bottom-start',\n          popperClass: ns.b(),\n          effect: 'light',\n          ...attrs.tooltipProps,\n          Key: props.visible,\n          trigger: 'click',\n          virtualTriggering: true,\n          visible: props.visible,\n          virtualRef: virtualRef.value,\n        },\n        {\n          content: () => {\n            return h(\n              MentionList,\n              {\n                items: attrs.items,\n                command: attrs.command,\n                ref: listRef,\n                range: attrs.range,\n                editor: attrs.editor,\n                hiddenPopup: props.hiddenPopup,\n              },\n              {\n                ...props.slots,\n              }\n            )\n          },\n        }\n      )\n    }\n  },\n}\n\nexport const useSuggestion = (opts: SuggestionOptions) => {\n  const visible = ref<boolean>(false)\n  let component: InstanceType<typeof VueRenderer>\n\n  const hiddenPopup = () => {\n    if (component) {\n      visible.value = false\n      component.updateProps({\n        visible: visible.value,\n      })\n    }\n  }\n\n  const destroy = () => {\n    hiddenPopup()\n    component && component.destroy()\n  }\n\n  const getVisible = () => visible.value\n\n  const suggestion = {\n    char: opts?.char ?? '@',\n\n    allowedPrefixes: null,\n\n    items: ({ query }: { query: string; editor: Editor }) => {\n      const { options } = opts\n\n      const getOptions =\n        typeof options === 'function' ? options : () => Promise.resolve(options)\n\n      return getOptions({ query })\n        .then((options) => {\n          const filter = opts.filterOption ?? filterOption\n          return options.filter((option) => filter(query, option))\n        })\n        .catch(() => [])\n    },\n\n    render: () => {\n      return {\n        onStart: (props: SuggestionProps) => {\n          if (!props.clientRect) {\n            return\n          }\n\n          visible.value = true\n          component = new VueRenderer(Popup, {\n            props: {\n              ...props,\n              visible: visible.value,\n              slots: opts.slots ?? {},\n              hiddenPopup,\n              tooltipProps: opts.tooltipProps ?? {},\n            },\n            editor: props.editor,\n          })\n        },\n\n        onUpdate(props: SuggestionProps) {\n          if (!props.clientRect) {\n            return\n          }\n          const hasOptions = !!opts.options.length\n          visible.value = hasOptions\n            ? props.items.length\n              ? true\n              : false\n            : visible.value\n\n          component?.updateProps({\n            ...props,\n            visible: visible.value,\n            slots: opts.slots ?? {},\n            hiddenPopup,\n            tooltipProps: opts.tooltipProps ?? {},\n          })\n        },\n\n        onKeyDown(suggestionKeyDownProps: SuggestionKeyDownProps) {\n          const hasOptions = !!opts.options.length\n          if (hasOptions) {\n            if (suggestionKeyDownProps.event.key === 'Escape') {\n              hiddenPopup()\n              return true\n            }\n            return component?.ref?.onKeyDown?.(suggestionKeyDownProps)\n          }\n        },\n\n        onExit() {\n          destroy()\n        },\n      }\n    },\n  }\n\n  return {\n    destroy,\n    suggestion,\n    hiddenPopup,\n    getVisible,\n  }\n}\n"],"names":["props","options","_a"],"mappings":"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"}