From bdfa31e4b6130e88da4a9e5b833bb160327d21ba Mon Sep 17 00:00:00 2001 From: Lykin <137850705+tiny-craft@users.noreply.github.com> Date: Wed, 19 Jun 2024 14:39:37 +0800 Subject: [PATCH] fix: copy text not work for non-ascii text (#246) --- .../content_value/ContentMonitor.vue | 14 ++++------- .../content_value/ContentToolbar.vue | 13 +++------- .../content_value/ContentValueHash.vue | 12 +++------- .../content_value/ContentValueJson.vue | 13 +++------- .../content_value/ContentValueList.vue | 12 +++------- .../content_value/ContentValueSet.vue | 12 +++------- .../content_value/ContentValueStream.vue | 12 +++------- .../content_value/ContentValueString.vue | 13 +++------- .../content_value/ContentValueZSet.vue | 12 +++------- .../src/components/sidebar/BrowserTree.vue | 24 ++++--------------- 10 files changed, 33 insertions(+), 104 deletions(-) diff --git a/frontend/src/components/content_value/ContentMonitor.vue b/frontend/src/components/content_value/ContentMonitor.vue index 1b85f1e..45bd55a 100644 --- a/frontend/src/components/content_value/ContentMonitor.vue +++ b/frontend/src/components/content_value/ContentMonitor.vue @@ -7,12 +7,13 @@ import useBrowserStore from 'stores/browser.js' import Play from '@/components/icons/Play.vue' import Pause from '@/components/icons/Pause.vue' import { ExportLog, StartMonitor, StopMonitor } from 'wailsjs/go/services/monitorService.js' -import { ClipboardSetText, EventsOff, EventsOn } from 'wailsjs/runtime/runtime.js' +import { EventsOff, EventsOn } from 'wailsjs/runtime/runtime.js' import Copy from '@/components/icons/Copy.vue' import Export from '@/components/icons/Export.vue' import Delete from '@/components/icons/Delete.vue' import IconButton from '@/components/common/IconButton.vue' import Bottom from '@/components/icons/Bottom.vue' +import copy from 'copy-text-to-clipboard' const themeVars = useThemeVars() @@ -95,15 +96,8 @@ const onStopMonitor = async () => { } const onCopyLog = async () => { - try { - const content = join(data.list, '\n') - const succ = await ClipboardSetText(content) - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - } catch (e) { - $message.error(e.message) - } + copy(join(data.list, '\n')) + $message.success(i18n.t('interface.copy_succ')) } const onExportLog = () => { diff --git a/frontend/src/components/content_value/ContentToolbar.vue b/frontend/src/components/content_value/ContentToolbar.vue index 6c2972e..7a2d4eb 100644 --- a/frontend/src/components/content_value/ContentToolbar.vue +++ b/frontend/src/components/content_value/ContentToolbar.vue @@ -9,12 +9,12 @@ import RedisTypeTag from '@/components/common/RedisTypeTag.vue' import { useI18n } from 'vue-i18n' import IconButton from '@/components/common/IconButton.vue' import Copy from '@/components/icons/Copy.vue' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { computed, onMounted, onUnmounted, reactive, watch } from 'vue' import { NIcon, useThemeVars } from 'naive-ui' import { timeout } from '@/utils/promise.js' import AutoRefreshForm from '@/components/common/AutoRefreshForm.vue' import { toHumanReadable } from '@/utils/date.js' +import copy from 'copy-text-to-clipboard' const props = defineProps({ server: String, @@ -139,15 +139,8 @@ const onToggleRefresh = (on) => { } const onCopyKey = () => { - ClipboardSetText(props.keyPath) - .then((succ) => { - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - }) - .catch((e) => { - $message.error(e.message) - }) + copy(props.keyPath) + $message.success(i18n.t('interface.copy_succ')) } const onTTL = () => { diff --git a/frontend/src/components/content_value/ContentValueHash.vue b/frontend/src/components/content_value/ContentValueHash.vue index d681c26..dad78f9 100644 --- a/frontend/src/components/content_value/ContentValueHash.vue +++ b/frontend/src/components/content_value/ContentValueHash.vue @@ -17,8 +17,8 @@ import Edit from '@/components/icons/Edit.vue' import FormatSelector from '@/components/content_value/FormatSelector.vue' import { decodeRedisKey } from '@/utils/key_convert.js' import ContentSearchInput from '@/components/content_value/ContentSearchInput.vue' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const i18n = useI18n() const themeVars = useThemeVars() @@ -230,14 +230,8 @@ const actionColumn = { } }, onCopy: async () => { - try { - const succ = await ClipboardSetText(row.v) - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - } catch (e) { - $message.error(e.message) - } + copy(row.v) + $message.success(i18n.t('interface.copy_succ')) }, onEdit: () => startEdit(index + 1, row.k, row.v), onDelete: async () => { diff --git a/frontend/src/components/content_value/ContentValueJson.vue b/frontend/src/components/content_value/ContentValueJson.vue index 45fa123..ac41a46 100644 --- a/frontend/src/components/content_value/ContentValueJson.vue +++ b/frontend/src/components/content_value/ContentValueJson.vue @@ -5,13 +5,13 @@ import Copy from '@/components/icons/Copy.vue' import Save from '@/components/icons/Save.vue' import { useThemeVars } from 'naive-ui' import { types as redisTypes } from '@/consts/support_redis_type.js' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { isEmpty, toLower } from 'lodash' import useBrowserStore from 'stores/browser.js' import { decodeRedisKey } from '@/utils/key_convert.js' import ContentEditor from '@/components/content_value/ContentEditor.vue' import { decodeTypes, formatTypes } from '@/consts/value_view_type.js' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const props = defineProps({ name: String, @@ -62,15 +62,8 @@ const showMemoryUsage = computed(() => { * Copy value */ const onCopyValue = () => { - ClipboardSetText(displayValue.value) - .then((succ) => { - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - }) - .catch((e) => { - $message.error(e.message) - }) + copy(displayValue.value) + $message.success(i18n.t('interface.copy_succ')) } /** diff --git a/frontend/src/components/content_value/ContentValueList.vue b/frontend/src/components/content_value/ContentValueList.vue index 33f4644..91acbdd 100644 --- a/frontend/src/components/content_value/ContentValueList.vue +++ b/frontend/src/components/content_value/ContentValueList.vue @@ -16,8 +16,8 @@ import ContentEntryEditor from '@/components/content_value/ContentEntryEditor.vu import FormatSelector from '@/components/content_value/FormatSelector.vue' import Edit from '@/components/icons/Edit.vue' import ContentSearchInput from '@/components/content_value/ContentSearchInput.vue' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const i18n = useI18n() const themeVars = useThemeVars() @@ -180,14 +180,8 @@ const actionColumn = { editing: false, bindKey: `#${index + 1}`, onCopy: async () => { - try { - const succ = await ClipboardSetText(row.v) - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - } catch (e) { - $message.error(e.message) - } + copy(row.v) + $message.success(i18n.t('interface.copy_succ')) }, onEdit: () => { startEdit(index + 1, row.v) diff --git a/frontend/src/components/content_value/ContentValueSet.vue b/frontend/src/components/content_value/ContentValueSet.vue index e390db0..3cefce7 100644 --- a/frontend/src/components/content_value/ContentValueSet.vue +++ b/frontend/src/components/content_value/ContentValueSet.vue @@ -16,8 +16,8 @@ import Edit from '@/components/icons/Edit.vue' import ContentEntryEditor from '@/components/content_value/ContentEntryEditor.vue' import FormatSelector from '@/components/content_value/FormatSelector.vue' import ContentSearchInput from '@/components/content_value/ContentSearchInput.vue' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const i18n = useI18n() const themeVars = useThemeVars() @@ -177,14 +177,8 @@ const actionColumn = { editing: false, bindKey: `#${index + 1}`, onCopy: async () => { - try { - const succ = await ClipboardSetText(row.v) - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - } catch (e) { - $message.error(e.message) - } + copy(row.v) + $message.success(i18n.t('interface.copy_succ')) }, onEdit: () => { startEdit(index + 1, row.v) diff --git a/frontend/src/components/content_value/ContentValueStream.vue b/frontend/src/components/content_value/ContentValueStream.vue index bf2d814..9e1e3ba 100644 --- a/frontend/src/components/content_value/ContentValueStream.vue +++ b/frontend/src/components/content_value/ContentValueStream.vue @@ -13,8 +13,8 @@ import LoadList from '@/components/icons/LoadList.vue' import LoadAll from '@/components/icons/LoadAll.vue' import IconButton from '@/components/common/IconButton.vue' import ContentSearchInput from '@/components/content_value/ContentSearchInput.vue' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const i18n = useI18n() const themeVars = useThemeVars() @@ -108,14 +108,8 @@ const actionColumn = { bindKey: row.id, readonly: true, onCopy: async () => { - try { - const succ = await ClipboardSetText(JSON.stringify(row.v)) - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - } catch (e) { - $message.error(e.message) - } + copy(JSON.stringify(row.v)) + $message.success(i18n.t('interface.copy_succ')) }, onDelete: async () => { try { diff --git a/frontend/src/components/content_value/ContentValueString.vue b/frontend/src/components/content_value/ContentValueString.vue index 553b96c..6ba48e0 100644 --- a/frontend/src/components/content_value/ContentValueString.vue +++ b/frontend/src/components/content_value/ContentValueString.vue @@ -6,13 +6,13 @@ import Save from '@/components/icons/Save.vue' import { useThemeVars } from 'naive-ui' import { formatTypes } from '@/consts/value_view_type.js' import { types as redisTypes } from '@/consts/support_redis_type.js' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { isEmpty, toLower } from 'lodash' import useBrowserStore from 'stores/browser.js' import { decodeRedisKey } from '@/utils/key_convert.js' import FormatSelector from '@/components/content_value/FormatSelector.vue' import ContentEditor from '@/components/content_value/ContentEditor.vue' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const props = defineProps({ name: String, @@ -121,15 +121,8 @@ const onFormatChanged = async (decode = '', format = '') => { * Copy value */ const onCopyValue = () => { - ClipboardSetText(displayValue.value) - .then((succ) => { - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - }) - .catch((e) => { - $message.error(e.message) - }) + copy(displayValue.value) + $message.success(i18n.t('interface.copy_succ')) } /** diff --git a/frontend/src/components/content_value/ContentValueZSet.vue b/frontend/src/components/content_value/ContentValueZSet.vue index 9657595..1c8ee86 100644 --- a/frontend/src/components/content_value/ContentValueZSet.vue +++ b/frontend/src/components/content_value/ContentValueZSet.vue @@ -16,8 +16,8 @@ import ContentEntryEditor from '@/components/content_value/ContentEntryEditor.vu import FormatSelector from '@/components/content_value/FormatSelector.vue' import Edit from '@/components/icons/Edit.vue' import ContentSearchInput from '@/components/content_value/ContentSearchInput.vue' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import { formatBytes } from '@/utils/byte_convert.js' +import copy from 'copy-text-to-clipboard' const i18n = useI18n() const themeVars = useThemeVars() @@ -224,14 +224,8 @@ const actionColumn = { editing: false, bindKey: row.v, onCopy: async () => { - try { - const succ = await ClipboardSetText(row.v) - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - } catch (e) { - $message.error(e.message) - } + copy(row.v) + $message.success(i18n.t('interface.copy_succ')) }, onEdit: () => startEdit(index + 1, row.s, row.v), onDelete: async () => { diff --git a/frontend/src/components/sidebar/BrowserTree.vue b/frontend/src/components/sidebar/BrowserTree.vue index 6eba7e4..df8bd93 100644 --- a/frontend/src/components/sidebar/BrowserTree.vue +++ b/frontend/src/components/sidebar/BrowserTree.vue @@ -13,7 +13,6 @@ import Add from '@/components/icons/Add.vue' import Layer from '@/components/icons/Layer.vue' import Delete from '@/components/icons/Delete.vue' import useDialogStore from 'stores/dialog.js' -import { ClipboardSetText } from 'wailsjs/runtime/runtime.js' import useConnectionStore from 'stores/connections.js' import useTabStore from 'stores/tab.js' import IconButton from '@/components/common/IconButton.vue' @@ -27,6 +26,7 @@ import usePreferencesStore from 'stores/preferences.js' import { typesIconStyle } from '@/consts/support_redis_type.js' import { nativeRedisKey } from '@/utils/key_convert.js' import { isMacOS } from '@/utils/platform.js' +import copy from 'copy-text-to-clipboard' const props = defineProps({ server: String, @@ -321,15 +321,8 @@ const handleKeyCopy = () => { } if (node.type === ConnectionType.RedisValue) { - ClipboardSetText(nativeRedisKey(node.redisKeyCode || node.redisKey)) - .then((succ) => { - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - }) - .catch((e) => { - $message.error(e.message) - }) + copy(nativeRedisKey(node.redisKeyCode || node.redisKey)) + $message.success(i18n.t('interface.copy_succ')) } } @@ -413,15 +406,8 @@ const handleSelectContextMenu = (action) => { break case 'key_copy': case 'value_copy': - ClipboardSetText(nativeRedisKey(redisKey)) - .then((succ) => { - if (succ) { - $message.success(i18n.t('interface.copy_succ')) - } - }) - .catch((e) => { - $message.error(e.message) - }) + copy(nativeRedisKey(redisKey)) + $message.success(i18n.t('interface.copy_succ')) break case 'db_loadall': if (node != null && !!!node.loading) {