| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import { isRef, unref, watch, Ref, ComputedRef } from 'vue';
- import Clipboard from 'clipboard';
- import { ModalOptionsEx, useMessage } from '/@/hooks/web/useMessage';
- /** 带复制按钮的弹窗 */
- interface IOptions extends ModalOptionsEx {
- // 要复制的文本,可以是一个 ref 对象,动态更新
- copyText: string | Ref<string> | ComputedRef<string>;
- }
- const COPY_CLASS = 'copy-this-text';
- const CLIPBOARD_TEXT = 'data-clipboard-text';
- export function useCopyModal() {
- return { createCopyModal };
- }
- const { createMessage, createConfirm } = useMessage();
- /** 创建复制弹窗 */
- function createCopyModal(options: Partial<IOptions>) {
- let modal = createConfirm({
- ...options,
- iconType: options.iconType ?? 'info',
- width: options.width ?? 500,
- title: options.title ?? '复制',
- maskClosable: options.maskClosable ?? true,
- okText: options.okText ?? '复制',
- okButtonProps: {
- ...options.okButtonProps,
- class: COPY_CLASS,
- [CLIPBOARD_TEXT]: unref(options.copyText),
- } as any,
- onOk() {
- return new Promise((resolve: any) => {
- const clipboard = new Clipboard('.' + COPY_CLASS);
- clipboard.on('success', () => {
- clipboard.destroy();
- createMessage.success('复制成功');
- resolve();
- });
- clipboard.on('error', () => {
- createMessage.error('该浏览器不支持自动复制');
- clipboard.destroy();
- resolve();
- });
- });
- },
- });
- // 动态更新 copyText
- if (isRef(options.copyText)) {
- watch(options.copyText, (copyText) => {
- modal.update({
- okButtonProps: {
- ...options.okButtonProps,
- class: COPY_CLASS,
- [CLIPBOARD_TEXT]: copyText,
- } as any,
- });
- });
- }
- return modal;
- }
|