diff --git a/src-electron/main.js b/src-electron/main.js index de9d26f6..9041f52c 100644 --- a/src-electron/main.js +++ b/src-electron/main.js @@ -11,6 +11,7 @@ const { nativeImage } = require('electron'); const { spawn, spawnSync } = require('child_process'); +const { clipboard } = require('electron'); const fs = require('fs'); const https = require('https'); @@ -262,6 +263,9 @@ ipcMain.handle( ipcMain.handle('app:getArch', () => { return process.arch.toString(); }); +ipcMain.handle('app:getClipboardText', () => { + return clipboard.readText(); +}); ipcMain.handle('app:getNoUpdater', () => { return noUpdater; diff --git a/src-electron/preload.js b/src-electron/preload.js index b16dd8a1..204585fd 100644 --- a/src-electron/preload.js +++ b/src-electron/preload.js @@ -23,6 +23,7 @@ const validChannels = ['launch-command']; contextBridge.exposeInMainWorld('electron', { getArch: () => ipcRenderer.invoke('app:getArch'), + getClipboardText: () => ipcRenderer.invoke('app:getClipboardText'), getNoUpdater: () => ipcRenderer.invoke('app:getNoUpdater'), setTrayIconNotification: (notify) => ipcRenderer.invoke('app:setTrayIconNotification', notify), diff --git a/src/components/NavMenu.vue b/src/components/NavMenu.vue index 608b4e9b..954a350f 100644 --- a/src/components/NavMenu.vue +++ b/src/components/NavMenu.vue @@ -198,7 +198,7 @@ diff --git a/src/stores/search.js b/src/stores/search.js index bacdd460..5dfed15b 100644 --- a/src/stores/search.js +++ b/src/stores/search.js @@ -31,6 +31,8 @@ export const useSearchStore = defineStore('Search', () => { const quickSearchItems = ref([]); const friendsListSearch = ref(''); + const directAccessPrompt = ref(null); + const stringComparer = computed(() => Intl.Collator(appearanceSettingsStore.appLanguage.replace('_', '-'), { usage: 'search', @@ -217,12 +219,21 @@ export const useSearchStore = defineStore('Search', () => { return results; } - function directAccessPaste() { - AppApi.GetClipboard().then((clipboard) => { - if (!directAccessParse(clipboard.trim())) { - promptOmniDirectDialog(); - } - }); + async function directAccessPaste() { + let cbText = ''; + if (LINUX) { + cbText = await window.electron.getClipboardText(); + } else { + cbText = await AppApi.GetClipboard().catch((e) => { + console.log(e); + return ''; + }); + } + + let trimemd = cbText.trim(); + if (!directAccessParse(trimemd)) { + promptOmniDirectDialog(); + } } function directAccessParse(input) { @@ -335,8 +346,10 @@ export const useSearchStore = defineStore('Search', () => { return false; } - function promptOmniDirectDialog() { - ElMessageBox.prompt( + async function promptOmniDirectDialog() { + if (directAccessPrompt.value) return; + + directAccessPrompt.value = ElMessageBox.prompt( t('prompt.direct_access_omni.description'), t('prompt.direct_access_omni.header'), { @@ -346,21 +359,24 @@ export const useSearchStore = defineStore('Search', () => { inputPattern: /\S+/, inputErrorMessage: t('prompt.direct_access_omni.input_error') } - ) - .then(({ value, action }) => { - if (action === 'confirm' && value) { - const input = value.trim(); - if (!directAccessParse(input)) { - ElMessage({ - message: t( - 'prompt.direct_access_omni.message.error' - ), - type: 'error' - }); - } + ); + + try { + const { value, action } = await directAccessPrompt.value; + + if (action === 'confirm' && value) { + const input = value.trim(); + if (!directAccessParse(input)) { + ElMessage({ + message: t('prompt.direct_access_omni.message.error'), + type: 'error' + }); } - }) - .catch(() => {}); + } + } catch { + } finally { + directAccessPrompt.value = null; + } } function showGroupDialogShortCode(shortCode) { diff --git a/src/types/globals.d.ts b/src/types/globals.d.ts index 772ad9a0..b5eec862 100644 --- a/src/types/globals.d.ts +++ b/src/types/globals.d.ts @@ -36,6 +36,7 @@ declare global { }; electron: { getArch: () => Promise; + getClipboardText: () => Promise; getNoUpdater: () => Promise; setTrayIconNotification: (notify: boolean) => Promise; openFileDialog: () => Promise;