From 13fb9473736386bfe64efdd3e4f71d01e59da05d Mon Sep 17 00:00:00 2001 From: MatteoGabriele Date: Mon, 4 May 2026 07:38:10 +0200 Subject: [PATCH] refactor(ui): use new useClipboard with async --- app/composables/useClipboardAsync.ts | 41 ---------------------------- app/pages/package/[[org]]/[name].vue | 25 +++++++++++------ package.json | 2 +- pnpm-lock.yaml | 32 ++++++++++++++++++++-- 4 files changed, 47 insertions(+), 53 deletions(-) delete mode 100644 app/composables/useClipboardAsync.ts diff --git a/app/composables/useClipboardAsync.ts b/app/composables/useClipboardAsync.ts deleted file mode 100644 index 46fe4e5ba7..0000000000 --- a/app/composables/useClipboardAsync.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { ShallowRef } from 'vue' - -type UseClipboardAsyncReturn = { - copy: () => void - copied: ShallowRef -} - -type UseClipboardAsyncOptions = { - copiedDuring: number -} - -export function useClipboardAsync( - fn: () => Promise, - options?: UseClipboardAsyncOptions, -): UseClipboardAsyncReturn { - const copied = shallowRef(false) - const timeout = useTimeoutFn(() => (copied.value = false), options?.copiedDuring ?? 0, { - immediate: false, - }) - - async function copy() { - const asyncClipboard = new ClipboardItem({ - 'text/plain': fn().then(text => { - return new Blob([text], { type: 'text/plain' }) - }), - }) - - try { - await navigator.clipboard.write([asyncClipboard]) - copied.value = true - timeout.start() - } catch { - copied.value = false - } - } - - return { - copy, - copied, - } -} diff --git a/app/pages/package/[[org]]/[name].vue b/app/pages/package/[[org]]/[name].vue index 934d81e471..1ba0190fc7 100644 --- a/app/pages/package/[[org]]/[name].vue +++ b/app/pages/package/[[org]]/[name].vue @@ -108,15 +108,20 @@ const { ) //copy README file as Markdown -const { copied: copiedReadme, copy: copyReadme } = useClipboardAsync( - async () => { +const { + copied: copiedReadme, + copy, + copyPending: copyReadmePending, +} = useClipboard({ + copiedDuring: 2000, +}) + +function copyReadme() { + copy(async () => { await fetchReadmeMarkdown() return readmeMarkdownData.value?.markdown ?? '' - }, - { - copiedDuring: 2000, - }, -) + }) +} function prefetchReadmeMarkdown() { if (readmeMarkdownStatus.value === 'idle') { @@ -1040,7 +1045,11 @@ const showSkeleton = shallowRef(false) " :classicon="copiedReadme ? 'i-lucide:check' : 'i-simple-icons:markdown'" > - {{ copiedReadme ? $t('common.copied') : $t('common.copy') }} + {{ copiedReadme ? $t('common.copied') : $t('common.copy') }} +