diff --git a/src/module.ts b/src/module.ts index 4c2ecadaf7..92a49b6440 100644 --- a/src/module.ts +++ b/src/module.ts @@ -183,6 +183,7 @@ export default defineNuxtModule({ }) addPlugin(resolve(runtimeDir, 'plugins', 'toast.client')) + addPlugin(resolve(runtimeDir, 'plugins', 'clipboard.client')) addComponentsDir({ path: resolve(runtimeDir, 'components', 'elements'), diff --git a/src/runtime/plugins/clipboard.client.ts b/src/runtime/plugins/clipboard.client.ts new file mode 100644 index 0000000000..374fcf4fc9 --- /dev/null +++ b/src/runtime/plugins/clipboard.client.ts @@ -0,0 +1,33 @@ +import { defineNuxtPlugin } from '#app' +import { ClipboardPlugin } from '../types/clipboard' + +export default defineNuxtPlugin((nuxtApp) => { + function copy (text: string, success: { title?: string, description?: string } = {}, failure: { title?: string, description?: string } = {}) { + if (!navigator?.clipboard) { + return + } + + navigator.clipboard.writeText(text).then(() => { + if (!success.title && !success.description) { + return + } + + nuxtApp.$toast.success(success) + }, function (e) { + nuxtApp.$toast.error({ + ...failure, + description: failure.description || e.message + }) + }) + } + + nuxtApp.provide('clipboard', { + copy + }) +}) + +declare module '#app' { + interface NuxtApp { + $clipboard: ClipboardPlugin + } +} diff --git a/src/runtime/types/clipboard.d.ts b/src/runtime/types/clipboard.d.ts new file mode 100644 index 0000000000..21028ce529 --- /dev/null +++ b/src/runtime/types/clipboard.d.ts @@ -0,0 +1,3 @@ +export interface ClipboardPlugin { + copy: (text: string, success?: { title?: string, description?: string }, failure?: { title?: string, description?: string }) => void +}