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;