diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/InputCopyable.vue | 19 | ||||
-rw-r--r-- | src/components/SpanCopyable.vue | 15 | ||||
-rw-r--r-- | src/components/TextareaCopyable.vue | 20 | ||||
-rw-r--r-- | src/composable/copy.ts | 18 | ||||
-rw-r--r-- | src/tools/benchmark-builder/benchmark-builder.vue | 5 | ||||
-rw-r--r-- | src/tools/mac-address-lookup/mac-address-lookup.vue | 2 | ||||
-rw-r--r-- | src/tools/otp-code-generator-and-validator/token-display.vue | 8 | ||||
-rw-r--r-- | src/tools/roman-numeral-converter/roman-numeral-converter.vue | 2 | ||||
-rw-r--r-- | src/tools/string-obfuscator/string-obfuscator.vue | 2 | ||||
-rw-r--r-- | src/tools/uuid-generator/uuid-generator.vue | 2 |
10 files changed, 40 insertions, 53 deletions
diff --git a/src/components/InputCopyable.vue b/src/components/InputCopyable.vue index db26f45..ed67895 100644 --- a/src/components/InputCopyable.vue +++ b/src/components/InputCopyable.vue @@ -1,22 +1,13 @@ <script setup lang="ts"> -import { useClipboard, useVModel } from '@vueuse/core'; +import { useVModel } from '@vueuse/core'; +import { useCopy } from '@/composable/copy'; const props = defineProps<{ value: string }>(); const emit = defineEmits(['update:value']); const value = useVModel(props, 'value', emit); -const tooltipText = ref('Copy to clipboard'); - -const { copy } = useClipboard({ source: value }); - -function onCopyClicked() { - copy(); - tooltipText.value = 'Copied!'; - - setTimeout(() => { - tooltipText.value = 'Copy to clipboard'; - }, 2000); -} +const { copy, isJustCopied } = useCopy({ source: value, createToast: false }); +const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : 'Copy to clipboard'); </script> <template> @@ -24,7 +15,7 @@ function onCopyClicked() { <template #suffix> <n-tooltip trigger="hover"> <template #trigger> - <c-button circle variant="text" size="small" @click="onCopyClicked"> + <c-button circle variant="text" size="small" @click="copy()"> <icon-mdi-content-copy /> </c-button> </template> diff --git a/src/components/SpanCopyable.vue b/src/components/SpanCopyable.vue index 17b1a59..7ab3a1d 100644 --- a/src/components/SpanCopyable.vue +++ b/src/components/SpanCopyable.vue @@ -1,26 +1,19 @@ <script setup lang="ts"> -import { useClipboard } from '@vueuse/core'; +import { useCopy } from '@/composable/copy'; const props = withDefaults(defineProps<{ value?: string }>(), { value: '' }); const { value } = toRefs(props); const initialText = 'Copy to clipboard'; -const tooltipText = ref(initialText); -const { copy } = useClipboard({ source: value }); - -function handleClick() { - copy(); - tooltipText.value = 'Copied!'; - - setTimeout(() => (tooltipText.value = initialText), 1000); -} +const { copy, isJustCopied } = useCopy({ source: value, createToast: false }); +const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : initialText); </script> <template> <n-tooltip trigger="hover"> <template #trigger> - <span class="value" @click="handleClick">{{ value }}</span> + <span class="value" @click="copy()">{{ value }}</span> </template> {{ tooltipText }} </n-tooltip> diff --git a/src/components/TextareaCopyable.vue b/src/components/TextareaCopyable.vue index e0c4d8f..b349d04 100644 --- a/src/components/TextareaCopyable.vue +++ b/src/components/TextareaCopyable.vue @@ -1,12 +1,13 @@ <script setup lang="ts"> import { Copy } from '@vicons/tabler'; -import { useClipboard, useElementSize } from '@vueuse/core'; +import { useElementSize } from '@vueuse/core'; import hljs from 'highlight.js/lib/core'; import jsonHljs from 'highlight.js/lib/languages/json'; import sqlHljs from 'highlight.js/lib/languages/sql'; import xmlHljs from 'highlight.js/lib/languages/xml'; import yamlHljs from 'highlight.js/lib/languages/yaml'; import iniHljs from 'highlight.js/lib/languages/ini'; +import { useCopy } from '@/composable/copy'; const props = withDefaults( defineProps<{ @@ -33,17 +34,8 @@ hljs.registerLanguage('toml', iniHljs); const { value, language, followHeightOf, copyPlacement, copyMessage } = toRefs(props); const { height } = followHeightOf.value ? useElementSize(followHeightOf) : { height: ref(null) }; -const { copy } = useClipboard({ source: value }); -const tooltipText = ref(copyMessage.value); - -function onCopyClicked() { - copy(); - tooltipText.value = 'Copied !'; - - setTimeout(() => { - tooltipText.value = copyMessage.value; - }, 2000); -} +const { copy, isJustCopied } = useCopy({ source: value, createToast: false }); +const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.value); </script> <template> @@ -61,7 +53,7 @@ function onCopyClicked() { <n-tooltip v-if="value" trigger="hover"> <template #trigger> <div class="copy-button" :class="[copyPlacement]"> - <c-button circle important:h-10 important:w-10 @click="onCopyClicked"> + <c-button circle important:h-10 important:w-10 @click="copy()"> <n-icon size="22" :component="Copy" /> </c-button> </div> @@ -70,7 +62,7 @@ function onCopyClicked() { </n-tooltip> </c-card> <div v-if="copyPlacement === 'outside'" mt-4 flex justify-center> - <c-button @click="onCopyClicked"> + <c-button @click="copy()"> {{ tooltipText }} </c-button> </div> diff --git a/src/composable/copy.ts b/src/composable/copy.ts index dcaed84..5f853ba 100644 --- a/src/composable/copy.ts +++ b/src/composable/copy.ts @@ -1,11 +1,19 @@ -import { type MaybeRef, get, useClipboard } from '@vueuse/core'; +// eslint-disable-next-line no-restricted-imports +import { useClipboard } from '@vueuse/core'; import { useMessage } from 'naive-ui'; +import type { MaybeRefOrGetter } from 'vue'; + +export function useCopy({ source, text = 'Copied to the clipboard', createToast = true }: { source?: MaybeRefOrGetter<string>; text?: string; createToast?: boolean } = {}) { + const { copy, copied, ...rest } = useClipboard({ + source, + legacy: true, + }); -export function useCopy({ source, text = 'Copied to the clipboard' }: { source?: MaybeRef<unknown>; text?: string } = {}) { - const { copy } = useClipboard(source ? { source: computed(() => String(get(source))) } : {}); const message = useMessage(); return { + ...rest, + isJustCopied: copied, async copy(content?: string, { notificationMessage }: { notificationMessage?: string } = {}) { if (source) { await copy(); @@ -14,7 +22,9 @@ export function useCopy({ source, text = 'Copied to the clipboard' }: { source?: await copy(content); } - message.success(notificationMessage ?? text); + if (createToast) { + message.success(notificationMessage ?? text); + } }, }; } diff --git a/src/tools/benchmark-builder/benchmark-builder.vue b/src/tools/benchmark-builder/benchmark-builder.vue index 91f3155..7922791 100644 --- a/src/tools/benchmark-builder/benchmark-builder.vue +++ b/src/tools/benchmark-builder/benchmark-builder.vue @@ -1,10 +1,11 @@ <script setup lang="ts"> import { Plus, Trash } from '@vicons/tabler'; -import { useClipboard, useStorage } from '@vueuse/core'; +import { useStorage } from '@vueuse/core'; import _ from 'lodash'; import { arrayToMarkdownTable, computeAverage, computeVariance } from './benchmark-builder.models'; import DynamicValues from './dynamic-values.vue'; +import { useCopy } from '@/composable/copy'; const suites = useStorage('benchmark-builder:suites', [ { title: 'Suite 1', data: [5, 10] }, @@ -47,7 +48,7 @@ const results = computed(() => { }); }); -const { copy } = useClipboard(); +const { copy } = useCopy({ createToast: false }); const header = { title: 'Suite', diff --git a/src/tools/mac-address-lookup/mac-address-lookup.vue b/src/tools/mac-address-lookup/mac-address-lookup.vue index ef0927d..8262880 100644 --- a/src/tools/mac-address-lookup/mac-address-lookup.vue +++ b/src/tools/mac-address-lookup/mac-address-lookup.vue @@ -8,7 +8,7 @@ const getVendorValue = (address: string) => address.trim().replace(/[.:-]/g, '') const macAddress = ref('20:37:06:12:34:56'); const details = computed<string | undefined>(() => db[getVendorValue(macAddress.value)]); -const { copy } = useCopy({ source: details, text: 'Vendor info copied to the clipboard' }); +const { copy } = useCopy({ source: () => details.value ?? '', text: 'Vendor info copied to the clipboard' }); </script> <template> diff --git a/src/tools/otp-code-generator-and-validator/token-display.vue b/src/tools/otp-code-generator-and-validator/token-display.vue index a40c9af..5313b0b 100644 --- a/src/tools/otp-code-generator-and-validator/token-display.vue +++ b/src/tools/otp-code-generator-and-validator/token-display.vue @@ -1,10 +1,10 @@ <script setup lang="ts"> -import { useClipboard } from '@vueuse/core'; +import { useCopy } from '@/composable/copy'; const props = defineProps<{ tokens: { previous: string; current: string; next: string } }>(); -const { copy: copyPrevious, copied: previousCopied } = useClipboard(); -const { copy: copyCurrent, copied: currentCopied } = useClipboard(); -const { copy: copyNext, copied: nextCopied } = useClipboard(); +const { copy: copyPrevious, isJustCopied: previousCopied } = useCopy({ createToast: false }); +const { copy: copyCurrent, isJustCopied: currentCopied } = useCopy({ createToast: false }); +const { copy: copyNext, isJustCopied: nextCopied } = useCopy({ createToast: false }); const { tokens } = toRefs(props); </script> diff --git a/src/tools/roman-numeral-converter/roman-numeral-converter.vue b/src/tools/roman-numeral-converter/roman-numeral-converter.vue index d365cc5..498c340 100644 --- a/src/tools/roman-numeral-converter/roman-numeral-converter.vue +++ b/src/tools/roman-numeral-converter/roman-numeral-converter.vue @@ -36,7 +36,7 @@ const validationRoman = useValidation({ }); const { copy: copyRoman } = useCopy({ source: outputRoman, text: 'Roman number copied to the clipboard' }); -const { copy: copyArabic } = useCopy({ source: outputNumeral, text: 'Arabic number copied to the clipboard' }); +const { copy: copyArabic } = useCopy({ source: () => String(outputNumeral), text: 'Arabic number copied to the clipboard' }); </script> <template> diff --git a/src/tools/string-obfuscator/string-obfuscator.vue b/src/tools/string-obfuscator/string-obfuscator.vue index 0f11fca..512d378 100644 --- a/src/tools/string-obfuscator/string-obfuscator.vue +++ b/src/tools/string-obfuscator/string-obfuscator.vue @@ -39,7 +39,7 @@ const { copy } = useCopy({ source: obfuscatedString }); {{ obfuscatedString }} </div> - <c-button @click="copy"> + <c-button @click="copy()"> <icon-mdi:content-copy /> </c-button> </c-card> diff --git a/src/tools/uuid-generator/uuid-generator.vue b/src/tools/uuid-generator/uuid-generator.vue index a393781..e9f55e6 100644 --- a/src/tools/uuid-generator/uuid-generator.vue +++ b/src/tools/uuid-generator/uuid-generator.vue @@ -34,7 +34,7 @@ const { copy } = useCopy({ source: uuids, text: 'UUIDs copied to the clipboard' /> <div flex justify-center gap-3> - <c-button autofocus @click="copy"> + <c-button autofocus @click="copy()"> Copy </c-button> <c-button @click="refreshUUIDs"> |