From 3ab5b0bdbb9ba8cf92a0db851d34114977b0218d Mon Sep 17 00:00:00 2001
From: Dawn <2439646234@qq.com>
Date: Mon, 18 Aug 2025 21:08:35 +0800
Subject: [PATCH] =?UTF-8?q?feat(shortcut):=20=E2=9C=A8=20add=20shortcut=20?=
=?UTF-8?q?keys,=20screenshots=20and=20voice,=20video=20calls?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitattributes | 49 +-
biome.json | 13 +-
package.json | 6 +-
pnpm-lock.yaml | 424 ++---
public/icon.js | 2 +-
scripts/check-dependencies.js | 4 +-
src-tauri/.env | 3 +
src-tauri/Info.plist | 4 +
src-tauri/capabilities/desktop.json | 14 +-
src-tauri/gen/schemas/capabilities.json | 2 +-
src-tauri/src/configuration.rs | 1 +
src-tauri/src/desktops/common_cmd.rs | 87 +-
src-tauri/src/lib.rs | 35 +-
src-tauri/tauri.macos.conf.json | 20 +-
src-tauri/tauri.windows.conf.json | 7 +-
src/App.vue | 15 +-
src/components/common/Screenshot.vue | 1366 +++++++++++++++--
src/components/rightBox/ApplyList.vue | 29 +-
.../rightBox/chatBox/ChatFooter.vue | 27 +-
.../rightBox/chatBox/ChatHeader.vue | 14 +-
src/components/rightBox/chatBox/ChatMain.vue | 14 +-
.../rightBox/chatBox/ChatSidebar.vue | 2 +-
src/components/windows/ActionBar.vue | 40 +-
src/enums/index.ts | 2 -
src/hooks/useCanvasTool.ts | 28 +-
src/hooks/useGlobalShortcut.ts | 331 ++++
src/hooks/useLogin.ts | 4 +
src/hooks/useTauriListener.ts | 11 +-
src/hooks/useWebRtc.ts | 2 -
src/layout/center/index.vue | 3 +-
src/layout/right/index.vue | 8 +-
src/mobile/mobile-client/IosAdapter.ts | 8 +-
src/router/index.ts | 5 +
src/services/apis.ts | 8 +-
src/services/translate.ts | 2 +-
src/services/urls.ts | 11 +-
src/services/webSocketAdapter.ts | 1 +
src/services/webSocketRust.ts | 454 ++++--
src/stores/chat.ts | 5 +-
src/stores/contacts.ts | 63 +-
src/stores/setting.ts | 25 +
src/stores/videoViewer.ts | 2 +-
src/strategy/MessageStrategy.ts | 2 +-
src/typings/stores.d.ts | 7 +
src/utils/ImageUtils.ts | 2 +-
src/views/Notify.vue | 12 +
src/views/callWindow/index.vue | 299 ++--
src/views/moreWindow/settings/General.vue | 15 +-
src/views/moreWindow/settings/Shortcut.vue | 411 +++++
src/views/moreWindow/settings/config.ts | 5 +
src/views/videoViewerWindow/index.vue | 4 +-
51 files changed, 3064 insertions(+), 844 deletions(-)
create mode 100644 src-tauri/.env
create mode 100644 src/hooks/useGlobalShortcut.ts
create mode 100644 src/views/moreWindow/settings/Shortcut.vue
diff --git a/.gitattributes b/.gitattributes
index a6865f03..5813ba45 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -25,32 +25,39 @@
# 代码统计设置 - 只统计 Vue、TypeScript 和 Rust 文件
# 排除 JavaScript 文件
-"*.js" linguist-vendored
-"*.jsx" linguist-vendored
-"*.cjs" linguist-vendored
-"*.mjs" linguist-vendored
+*.js linguist-vendored
+*.jsx linguist-vendored
+*.cjs linguist-vendored
+*.mjs linguist-vendored
# 排除样式文件
-"*.css" linguist-vendored
-"*.scss" linguist-vendored
-"*.sass" linguist-vendored
-"*.less" linguist-vendored
-"*.styl" linguist-vendored
+*.css linguist-vendored
+*.scss linguist-vendored
+*.sass linguist-vendored
+*.less linguist-vendored
+*.styl linguist-vendored
# 排除配置和文档文件
-"*.json" linguist-vendored
-"*.html" linguist-vendored
-"*.md" linguist-documentation
-"*.yml" linguist-vendored
-"*.yaml" linguist-vendored
+*.json linguist-vendored
+*.html linguist-vendored
+*.md linguist-documentation
+*.yml linguist-vendored
+*.yaml linguist-vendored
# 排除其他语言文件
-"*.kt" linguist-vendored
-"*.java" linguist-vendored
-"*.py" linguist-vendored
+*.kt linguist-vendored
+*.java linguist-vendored
+*.py linguist-vendored
# 确保构建目录和依赖目录不被统计
-"**/target/**" linguist-vendored
-"/node_modules/**" linguist-vendored
-"/scripts/**" linguist-vendored
-"/build/**" linguist-vendored
+**/target/** linguist-vendored
+**/node_modules/** linguist-vendored
+scripts/** linguist-vendored
+**/build/** linguist-vendored
+**/dist/** linguist-vendored
+
+# 确保主要代码文件被正确识别
+*.vue linguist-detectable
+*.ts linguist-detectable
+*.tsx linguist-detectable
+*.rs linguist-detectable
diff --git a/biome.json b/biome.json
index e47f14b9..1453ad17 100644
--- a/biome.json
+++ b/biome.json
@@ -5,12 +5,12 @@
"ignoreUnknown": false,
"includes": [
"**/*.{js,jsx,ts,tsx,vue,json}",
- "!.*/**",
- "!public/**",
+ "!.*",
+ "!public/*",
"!src/typings/*.d.ts",
- "!src-tauri/**",
- "!node_modules/**",
- "!dist/**"
+ "!src-tauri/*",
+ "!node_modules/*",
+ "!dist/*"
]
},
"formatter": {
@@ -58,7 +58,8 @@
"noAssignInExpressions": "off",
"noImplicitAnyLet": "off",
"noConfusingVoidType": "off",
- "noArrayIndexKey": "off"
+ "noArrayIndexKey": "off",
+ "useIterableCallbackReturn": "off"
}
}
},
diff --git a/package.json b/package.json
index 8ab41593..e41f3aff 100644
--- a/package.json
+++ b/package.json
@@ -77,6 +77,7 @@
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
"@tauri-apps/plugin-dialog": "^2.3.2",
"@tauri-apps/plugin-fs": "^2.4.1",
+ "@tauri-apps/plugin-global-shortcut": "^2.3.0",
"@tauri-apps/plugin-http": "2.5.1",
"@tauri-apps/plugin-log": "^2.6.0",
"@tauri-apps/plugin-notification": "^2.3.0",
@@ -113,10 +114,9 @@
"vue-router": "^4.5.1"
},
"devDependencies": {
- "@biomejs/biome": "^2.1.4",
+ "@biomejs/biome": "^2.2.0",
"@commitlint/cli": "^19.6.0",
"@commitlint/config-conventional": "^19.6.0",
- "@iconify/vue": "^5.0.0",
"@release-it/bumper": "^6.0.1",
"@release-it/conventional-changelog": "8.0.2",
"@rollup/plugin-terser": "^0.4.4",
@@ -147,7 +147,7 @@
"typescript": "^5.9.2",
"unplugin-auto-import": "^19.3.0",
"unplugin-vue-components": "^28.8.0",
- "vite": "7.1.1",
+ "vite": "7.1.2",
"vite-plugin-vue-setup-extend": "^0.4.0",
"vitest": "^3.2.4",
"vue-tsc": "^3.0.5"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f55a0476..883aa710 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -32,6 +32,9 @@ importers:
'@tauri-apps/plugin-fs':
specifier: ^2.4.1
version: 2.4.1
+ '@tauri-apps/plugin-global-shortcut':
+ specifier: ^2.3.0
+ version: 2.3.0
'@tauri-apps/plugin-http':
specifier: 2.5.1
version: 2.5.1
@@ -136,17 +139,14 @@ importers:
version: 4.5.1(vue@3.5.18(typescript@5.9.2))
devDependencies:
'@biomejs/biome':
- specifier: ^2.1.4
- version: 2.1.4
+ specifier: ^2.2.0
+ version: 2.2.0
'@commitlint/cli':
specifier: ^19.6.0
version: 19.6.1(@types/node@24.0.10)(typescript@5.9.2)
'@commitlint/config-conventional':
specifier: ^19.6.0
version: 19.6.0
- '@iconify/vue':
- specifier: ^5.0.0
- version: 5.0.0(vue@3.5.18(typescript@5.9.2))
'@release-it/bumper':
specifier: ^6.0.1
version: 6.0.1(release-it@17.11.0(typescript@5.9.2))
@@ -182,13 +182,13 @@ importers:
version: 66.4.2
'@unocss/vite':
specifier: ^66.4.2
- version: 66.4.2(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
+ version: 66.4.2(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@vitejs/plugin-vue':
specifier: ^6.0.1
- version: 6.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))
+ version: 6.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))
'@vitejs/plugin-vue-jsx':
specifier: ^5.0.1
- version: 5.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))
+ version: 5.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))
'@vitest/coverage-v8':
specifier: ^3.2.4
version: 3.2.4(vitest@3.2.4)
@@ -238,11 +238,11 @@ importers:
specifier: ^28.8.0
version: 28.8.0(@babel/parser@7.28.0)(@nuxt/kit@3.17.5(magicast@0.3.5))(vue@3.5.18(typescript@5.9.2))
vite:
- specifier: 7.1.1
- version: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ specifier: 7.1.2
+ version: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
vite-plugin-vue-setup-extend:
specifier: ^0.4.0
- version: 0.4.0(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
+ version: 0.4.0(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
vitest:
specifier: ^3.2.4
version: 3.2.4(@types/node@24.0.10)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
@@ -417,59 +417,59 @@ packages:
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
- '@biomejs/biome@2.1.4':
- resolution: {integrity: sha512-QWlrqyxsU0FCebuMnkvBIkxvPqH89afiJzjMl+z67ybutse590jgeaFdDurE9XYtzpjRGTI1tlUZPGWmbKsElA==}
+ '@biomejs/biome@2.2.0':
+ resolution: {integrity: sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==}
engines: {node: '>=14.21.3'}
hasBin: true
- '@biomejs/cli-darwin-arm64@2.1.4':
- resolution: {integrity: sha512-sCrNENE74I9MV090Wq/9Dg7EhPudx3+5OiSoQOkIe3DLPzFARuL1dOwCWhKCpA3I5RHmbrsbNSRfZwCabwd8Qg==}
+ '@biomejs/cli-darwin-arm64@2.2.0':
+ resolution: {integrity: sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [darwin]
- '@biomejs/cli-darwin-x64@2.1.4':
- resolution: {integrity: sha512-gOEICJbTCy6iruBywBDcG4X5rHMbqCPs3clh3UQ+hRKlgvJTk4NHWQAyHOXvaLe+AxD1/TNX1jbZeffBJzcrOw==}
+ '@biomejs/cli-darwin-x64@2.2.0':
+ resolution: {integrity: sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [darwin]
- '@biomejs/cli-linux-arm64-musl@2.1.4':
- resolution: {integrity: sha512-nYr7H0CyAJPaLupFE2cH16KZmRC5Z9PEftiA2vWxk+CsFkPZQ6dBRdcC6RuS+zJlPc/JOd8xw3uCCt9Pv41WvQ==}
+ '@biomejs/cli-linux-arm64-musl@2.2.0':
+ resolution: {integrity: sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@biomejs/cli-linux-arm64@2.1.4':
- resolution: {integrity: sha512-juhEkdkKR4nbUi5k/KRp1ocGPNWLgFRD4NrHZSveYrD6i98pyvuzmS9yFYgOZa5JhaVqo0HPnci0+YuzSwT2fw==}
+ '@biomejs/cli-linux-arm64@2.2.0':
+ resolution: {integrity: sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@biomejs/cli-linux-x64-musl@2.1.4':
- resolution: {integrity: sha512-lvwvb2SQQHctHUKvBKptR6PLFCM7JfRjpCCrDaTmvB7EeZ5/dQJPhTYBf36BE/B4CRWR2ZiBLRYhK7hhXBCZAg==}
+ '@biomejs/cli-linux-x64-musl@2.2.0':
+ resolution: {integrity: sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@biomejs/cli-linux-x64@2.1.4':
- resolution: {integrity: sha512-Eoy9ycbhpJVYuR+LskV9s3uyaIkp89+qqgqhGQsWnp/I02Uqg2fXFblHJOpGZR8AxdB9ADy87oFVxn9MpFKUrw==}
+ '@biomejs/cli-linux-x64@2.2.0':
+ resolution: {integrity: sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@biomejs/cli-win32-arm64@2.1.4':
- resolution: {integrity: sha512-3WRYte7orvyi6TRfIZkDN9Jzoogbv+gSvR+b9VOXUg1We1XrjBg6WljADeVEaKTvOcpVdH0a90TwyOQ6ue4fGw==}
+ '@biomejs/cli-win32-arm64@2.2.0':
+ resolution: {integrity: sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [win32]
- '@biomejs/cli-win32-x64@2.1.4':
- resolution: {integrity: sha512-tBc+W7anBPSFXGAoQW+f/+svkpt8/uXfRwDzN1DvnatkRMt16KIYpEi/iw8u9GahJlFv98kgHcIrSsZHZTR0sw==}
+ '@biomejs/cli-win32-x64@2.2.0':
+ resolution: {integrity: sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [win32]
@@ -580,8 +580,8 @@ packages:
cpu: [ppc64]
os: [aix]
- '@esbuild/aix-ppc64@0.25.8':
- resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==}
+ '@esbuild/aix-ppc64@0.25.9':
+ resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
@@ -592,8 +592,8 @@ packages:
cpu: [arm64]
os: [android]
- '@esbuild/android-arm64@0.25.8':
- resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==}
+ '@esbuild/android-arm64@0.25.9':
+ resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
@@ -604,8 +604,8 @@ packages:
cpu: [arm]
os: [android]
- '@esbuild/android-arm@0.25.8':
- resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==}
+ '@esbuild/android-arm@0.25.9':
+ resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
@@ -616,8 +616,8 @@ packages:
cpu: [x64]
os: [android]
- '@esbuild/android-x64@0.25.8':
- resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==}
+ '@esbuild/android-x64@0.25.9':
+ resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
@@ -628,8 +628,8 @@ packages:
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-arm64@0.25.8':
- resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==}
+ '@esbuild/darwin-arm64@0.25.9':
+ resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
@@ -640,8 +640,8 @@ packages:
cpu: [x64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.8':
- resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==}
+ '@esbuild/darwin-x64@0.25.9':
+ resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
@@ -652,8 +652,8 @@ packages:
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-arm64@0.25.8':
- resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==}
+ '@esbuild/freebsd-arm64@0.25.9':
+ resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
@@ -664,8 +664,8 @@ packages:
cpu: [x64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.8':
- resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==}
+ '@esbuild/freebsd-x64@0.25.9':
+ resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
@@ -676,8 +676,8 @@ packages:
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm64@0.25.8':
- resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==}
+ '@esbuild/linux-arm64@0.25.9':
+ resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
@@ -688,8 +688,8 @@ packages:
cpu: [arm]
os: [linux]
- '@esbuild/linux-arm@0.25.8':
- resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==}
+ '@esbuild/linux-arm@0.25.9':
+ resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
@@ -700,8 +700,8 @@ packages:
cpu: [ia32]
os: [linux]
- '@esbuild/linux-ia32@0.25.8':
- resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==}
+ '@esbuild/linux-ia32@0.25.9':
+ resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
@@ -712,8 +712,8 @@ packages:
cpu: [loong64]
os: [linux]
- '@esbuild/linux-loong64@0.25.8':
- resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==}
+ '@esbuild/linux-loong64@0.25.9':
+ resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
@@ -724,8 +724,8 @@ packages:
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-mips64el@0.25.8':
- resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==}
+ '@esbuild/linux-mips64el@0.25.9':
+ resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
@@ -736,8 +736,8 @@ packages:
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-ppc64@0.25.8':
- resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==}
+ '@esbuild/linux-ppc64@0.25.9':
+ resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
@@ -748,8 +748,8 @@ packages:
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.8':
- resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==}
+ '@esbuild/linux-riscv64@0.25.9':
+ resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
@@ -760,8 +760,8 @@ packages:
cpu: [s390x]
os: [linux]
- '@esbuild/linux-s390x@0.25.8':
- resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==}
+ '@esbuild/linux-s390x@0.25.9':
+ resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
@@ -772,14 +772,14 @@ packages:
cpu: [x64]
os: [linux]
- '@esbuild/linux-x64@0.25.8':
- resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==}
+ '@esbuild/linux-x64@0.25.9':
+ resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.25.8':
- resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==}
+ '@esbuild/netbsd-arm64@0.25.9':
+ resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
@@ -790,8 +790,8 @@ packages:
cpu: [x64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.8':
- resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==}
+ '@esbuild/netbsd-x64@0.25.9':
+ resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
@@ -802,8 +802,8 @@ packages:
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-arm64@0.25.8':
- resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==}
+ '@esbuild/openbsd-arm64@0.25.9':
+ resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
@@ -814,14 +814,14 @@ packages:
cpu: [x64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.8':
- resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==}
+ '@esbuild/openbsd-x64@0.25.9':
+ resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.25.8':
- resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==}
+ '@esbuild/openharmony-arm64@0.25.9':
+ resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
@@ -832,8 +832,8 @@ packages:
cpu: [x64]
os: [sunos]
- '@esbuild/sunos-x64@0.25.8':
- resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==}
+ '@esbuild/sunos-x64@0.25.9':
+ resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
@@ -844,8 +844,8 @@ packages:
cpu: [arm64]
os: [win32]
- '@esbuild/win32-arm64@0.25.8':
- resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==}
+ '@esbuild/win32-arm64@0.25.9':
+ resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
@@ -856,8 +856,8 @@ packages:
cpu: [ia32]
os: [win32]
- '@esbuild/win32-ia32@0.25.8':
- resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==}
+ '@esbuild/win32-ia32@0.25.9':
+ resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
@@ -868,8 +868,8 @@ packages:
cpu: [x64]
os: [win32]
- '@esbuild/win32-x64@0.25.8':
- resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==}
+ '@esbuild/win32-x64@0.25.9':
+ resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -888,14 +888,6 @@ packages:
'@iarna/toml@2.2.5':
resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
- '@iconify/types@2.0.0':
- resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
-
- '@iconify/vue@5.0.0':
- resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==}
- peerDependencies:
- vue: '>=3'
-
'@img/sharp-darwin-arm64@0.33.5':
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -1028,10 +1020,16 @@ packages:
'@jridgewell/gen-mapping@0.3.12':
resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -1049,12 +1047,18 @@ packages:
'@jridgewell/sourcemap-codec@1.5.4':
resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==}
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@jridgewell/trace-mapping@0.3.29':
resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==}
+ '@jridgewell/trace-mapping@0.3.30':
+ resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
+
'@juggle/resize-observer@3.4.0':
resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
@@ -1499,6 +1503,9 @@ packages:
'@tauri-apps/plugin-fs@2.4.1':
resolution: {integrity: sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ==}
+ '@tauri-apps/plugin-global-shortcut@2.3.0':
+ resolution: {integrity: sha512-WbAz0ElhpP+0kzQZRScdCC7UQ7OPH8PAn//fsBNu7+ywihsnVSVOg1L9YhieAtLNtAlnmFI69Yl5AGaA3ge5IQ==}
+
'@tauri-apps/plugin-http@2.5.1':
resolution: {integrity: sha512-SpQ1azXEdQI0UB2NZTIPljJTDEe0bIaKzHYR/k4UQp6yzRYGLC/ktmIgEfQ2RvKAWus8GcYgGr5K6LJPbo/NZw==}
@@ -2448,8 +2455,8 @@ packages:
engines: {node: '>=18'}
hasBin: true
- esbuild@0.25.8:
- resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==}
+ esbuild@0.25.9:
+ resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==}
engines: {node: '>=18'}
hasBin: true
@@ -2550,6 +2557,15 @@ packages:
picomatch:
optional: true
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
fflate@0.8.2:
resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==}
@@ -4108,6 +4124,10 @@ packages:
resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==}
engines: {node: '>=18.12.0'}
+ unplugin@2.3.6:
+ resolution: {integrity: sha512-+/MdXl8bLTXI2lJF22gUBeCFqZruEpL/oM9f8wxCuKh9+Mw9qeul3gTqgbKpMeOFlusCzc0s7x2Kax2xKW+FQg==}
+ engines: {node: '>=18.12.0'}
+
untyped@2.0.0:
resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==}
hasBin: true
@@ -4147,8 +4167,8 @@ packages:
peerDependencies:
vite: '>=2.0.0'
- vite@7.1.1:
- resolution: {integrity: sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ==}
+ vite@7.1.2:
+ resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -4587,39 +4607,39 @@ snapshots:
'@bcoe/v8-coverage@1.0.2': {}
- '@biomejs/biome@2.1.4':
+ '@biomejs/biome@2.2.0':
optionalDependencies:
- '@biomejs/cli-darwin-arm64': 2.1.4
- '@biomejs/cli-darwin-x64': 2.1.4
- '@biomejs/cli-linux-arm64': 2.1.4
- '@biomejs/cli-linux-arm64-musl': 2.1.4
- '@biomejs/cli-linux-x64': 2.1.4
- '@biomejs/cli-linux-x64-musl': 2.1.4
- '@biomejs/cli-win32-arm64': 2.1.4
- '@biomejs/cli-win32-x64': 2.1.4
+ '@biomejs/cli-darwin-arm64': 2.2.0
+ '@biomejs/cli-darwin-x64': 2.2.0
+ '@biomejs/cli-linux-arm64': 2.2.0
+ '@biomejs/cli-linux-arm64-musl': 2.2.0
+ '@biomejs/cli-linux-x64': 2.2.0
+ '@biomejs/cli-linux-x64-musl': 2.2.0
+ '@biomejs/cli-win32-arm64': 2.2.0
+ '@biomejs/cli-win32-x64': 2.2.0
- '@biomejs/cli-darwin-arm64@2.1.4':
+ '@biomejs/cli-darwin-arm64@2.2.0':
optional: true
- '@biomejs/cli-darwin-x64@2.1.4':
+ '@biomejs/cli-darwin-x64@2.2.0':
optional: true
- '@biomejs/cli-linux-arm64-musl@2.1.4':
+ '@biomejs/cli-linux-arm64-musl@2.2.0':
optional: true
- '@biomejs/cli-linux-arm64@2.1.4':
+ '@biomejs/cli-linux-arm64@2.2.0':
optional: true
- '@biomejs/cli-linux-x64-musl@2.1.4':
+ '@biomejs/cli-linux-x64-musl@2.2.0':
optional: true
- '@biomejs/cli-linux-x64@2.1.4':
+ '@biomejs/cli-linux-x64@2.2.0':
optional: true
- '@biomejs/cli-win32-arm64@2.1.4':
+ '@biomejs/cli-win32-arm64@2.2.0':
optional: true
- '@biomejs/cli-win32-x64@2.1.4':
+ '@biomejs/cli-win32-x64@2.2.0':
optional: true
'@breezystack/lamejs@1.2.7': {}
@@ -4760,151 +4780,151 @@ snapshots:
'@esbuild/aix-ppc64@0.23.1':
optional: true
- '@esbuild/aix-ppc64@0.25.8':
+ '@esbuild/aix-ppc64@0.25.9':
optional: true
'@esbuild/android-arm64@0.23.1':
optional: true
- '@esbuild/android-arm64@0.25.8':
+ '@esbuild/android-arm64@0.25.9':
optional: true
'@esbuild/android-arm@0.23.1':
optional: true
- '@esbuild/android-arm@0.25.8':
+ '@esbuild/android-arm@0.25.9':
optional: true
'@esbuild/android-x64@0.23.1':
optional: true
- '@esbuild/android-x64@0.25.8':
+ '@esbuild/android-x64@0.25.9':
optional: true
'@esbuild/darwin-arm64@0.23.1':
optional: true
- '@esbuild/darwin-arm64@0.25.8':
+ '@esbuild/darwin-arm64@0.25.9':
optional: true
'@esbuild/darwin-x64@0.23.1':
optional: true
- '@esbuild/darwin-x64@0.25.8':
+ '@esbuild/darwin-x64@0.25.9':
optional: true
'@esbuild/freebsd-arm64@0.23.1':
optional: true
- '@esbuild/freebsd-arm64@0.25.8':
+ '@esbuild/freebsd-arm64@0.25.9':
optional: true
'@esbuild/freebsd-x64@0.23.1':
optional: true
- '@esbuild/freebsd-x64@0.25.8':
+ '@esbuild/freebsd-x64@0.25.9':
optional: true
'@esbuild/linux-arm64@0.23.1':
optional: true
- '@esbuild/linux-arm64@0.25.8':
+ '@esbuild/linux-arm64@0.25.9':
optional: true
'@esbuild/linux-arm@0.23.1':
optional: true
- '@esbuild/linux-arm@0.25.8':
+ '@esbuild/linux-arm@0.25.9':
optional: true
'@esbuild/linux-ia32@0.23.1':
optional: true
- '@esbuild/linux-ia32@0.25.8':
+ '@esbuild/linux-ia32@0.25.9':
optional: true
'@esbuild/linux-loong64@0.23.1':
optional: true
- '@esbuild/linux-loong64@0.25.8':
+ '@esbuild/linux-loong64@0.25.9':
optional: true
'@esbuild/linux-mips64el@0.23.1':
optional: true
- '@esbuild/linux-mips64el@0.25.8':
+ '@esbuild/linux-mips64el@0.25.9':
optional: true
'@esbuild/linux-ppc64@0.23.1':
optional: true
- '@esbuild/linux-ppc64@0.25.8':
+ '@esbuild/linux-ppc64@0.25.9':
optional: true
'@esbuild/linux-riscv64@0.23.1':
optional: true
- '@esbuild/linux-riscv64@0.25.8':
+ '@esbuild/linux-riscv64@0.25.9':
optional: true
'@esbuild/linux-s390x@0.23.1':
optional: true
- '@esbuild/linux-s390x@0.25.8':
+ '@esbuild/linux-s390x@0.25.9':
optional: true
'@esbuild/linux-x64@0.23.1':
optional: true
- '@esbuild/linux-x64@0.25.8':
+ '@esbuild/linux-x64@0.25.9':
optional: true
- '@esbuild/netbsd-arm64@0.25.8':
+ '@esbuild/netbsd-arm64@0.25.9':
optional: true
'@esbuild/netbsd-x64@0.23.1':
optional: true
- '@esbuild/netbsd-x64@0.25.8':
+ '@esbuild/netbsd-x64@0.25.9':
optional: true
'@esbuild/openbsd-arm64@0.23.1':
optional: true
- '@esbuild/openbsd-arm64@0.25.8':
+ '@esbuild/openbsd-arm64@0.25.9':
optional: true
'@esbuild/openbsd-x64@0.23.1':
optional: true
- '@esbuild/openbsd-x64@0.25.8':
+ '@esbuild/openbsd-x64@0.25.9':
optional: true
- '@esbuild/openharmony-arm64@0.25.8':
+ '@esbuild/openharmony-arm64@0.25.9':
optional: true
'@esbuild/sunos-x64@0.23.1':
optional: true
- '@esbuild/sunos-x64@0.25.8':
+ '@esbuild/sunos-x64@0.25.9':
optional: true
'@esbuild/win32-arm64@0.23.1':
optional: true
- '@esbuild/win32-arm64@0.25.8':
+ '@esbuild/win32-arm64@0.25.9':
optional: true
'@esbuild/win32-ia32@0.23.1':
optional: true
- '@esbuild/win32-ia32@0.25.8':
+ '@esbuild/win32-ia32@0.25.9':
optional: true
'@esbuild/win32-x64@0.23.1':
optional: true
- '@esbuild/win32-x64@0.25.8':
+ '@esbuild/win32-x64@0.25.9':
optional: true
'@fastify/busboy@2.1.1': {}
@@ -4917,13 +4937,6 @@ snapshots:
'@iarna/toml@2.2.5': {}
- '@iconify/types@2.0.0': {}
-
- '@iconify/vue@5.0.0(vue@3.5.18(typescript@5.9.2))':
- dependencies:
- '@iconify/types': 2.0.0
- vue: 3.5.18(typescript@5.9.2)
-
'@img/sharp-darwin-arm64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.4
@@ -5017,12 +5030,24 @@ snapshots:
'@jridgewell/sourcemap-codec': 1.5.4
'@jridgewell/trace-mapping': 0.3.29
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.30
+ optional: true
+
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.30
+ optional: true
+
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
@@ -5036,6 +5061,9 @@ snapshots:
'@jridgewell/sourcemap-codec@1.5.4': {}
+ '@jridgewell/sourcemap-codec@1.5.5':
+ optional: true
+
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
@@ -5046,6 +5074,12 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.4
+ '@jridgewell/trace-mapping@0.3.30':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+ optional: true
+
'@juggle/resize-observer@3.4.0': {}
'@lokesh.dhakar/quantize@1.4.0': {}
@@ -5421,6 +5455,10 @@ snapshots:
dependencies:
'@tauri-apps/api': 2.7.0
+ '@tauri-apps/plugin-global-shortcut@2.3.0':
+ dependencies:
+ '@tauri-apps/api': 2.7.0
+
'@tauri-apps/plugin-http@2.5.1':
dependencies:
'@tauri-apps/api': 2.7.0
@@ -5557,7 +5595,7 @@ snapshots:
dependencies:
'@unocss/core': 66.4.2
- '@unocss/vite@66.4.2(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
+ '@unocss/vite@66.4.2(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
dependencies:
'@ampproject/remapping': 2.3.0
'@unocss/config': 66.4.2
@@ -5568,23 +5606,23 @@ snapshots:
pathe: 2.0.3
tinyglobby: 0.2.14
unplugin-utils: 0.2.5
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
- '@vitejs/plugin-vue-jsx@5.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))':
+ '@vitejs/plugin-vue-jsx@5.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))':
dependencies:
'@babel/core': 7.28.0
'@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0)
'@rolldown/pluginutils': 1.0.0-beta.31
'@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0)
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
vue: 3.5.18(typescript@5.9.2)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-vue@6.0.1(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))':
+ '@vitejs/plugin-vue@6.0.1(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(vue@3.5.18(typescript@5.9.2))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.29
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
vue: 3.5.18(typescript@5.9.2)
'@vitest/coverage-v8@3.2.4(vitest@3.2.4)':
@@ -5614,13 +5652,13 @@ snapshots:
chai: 5.2.1
tinyrainbow: 2.0.0
- '@vitest/mocker@3.2.4(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
+ '@vitest/mocker@3.2.4(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -6507,34 +6545,34 @@ snapshots:
'@esbuild/win32-x64': 0.23.1
optional: true
- esbuild@0.25.8:
+ esbuild@0.25.9:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.8
- '@esbuild/android-arm': 0.25.8
- '@esbuild/android-arm64': 0.25.8
- '@esbuild/android-x64': 0.25.8
- '@esbuild/darwin-arm64': 0.25.8
- '@esbuild/darwin-x64': 0.25.8
- '@esbuild/freebsd-arm64': 0.25.8
- '@esbuild/freebsd-x64': 0.25.8
- '@esbuild/linux-arm': 0.25.8
- '@esbuild/linux-arm64': 0.25.8
- '@esbuild/linux-ia32': 0.25.8
- '@esbuild/linux-loong64': 0.25.8
- '@esbuild/linux-mips64el': 0.25.8
- '@esbuild/linux-ppc64': 0.25.8
- '@esbuild/linux-riscv64': 0.25.8
- '@esbuild/linux-s390x': 0.25.8
- '@esbuild/linux-x64': 0.25.8
- '@esbuild/netbsd-arm64': 0.25.8
- '@esbuild/netbsd-x64': 0.25.8
- '@esbuild/openbsd-arm64': 0.25.8
- '@esbuild/openbsd-x64': 0.25.8
- '@esbuild/openharmony-arm64': 0.25.8
- '@esbuild/sunos-x64': 0.25.8
- '@esbuild/win32-arm64': 0.25.8
- '@esbuild/win32-ia32': 0.25.8
- '@esbuild/win32-x64': 0.25.8
+ '@esbuild/aix-ppc64': 0.25.9
+ '@esbuild/android-arm': 0.25.9
+ '@esbuild/android-arm64': 0.25.9
+ '@esbuild/android-x64': 0.25.9
+ '@esbuild/darwin-arm64': 0.25.9
+ '@esbuild/darwin-x64': 0.25.9
+ '@esbuild/freebsd-arm64': 0.25.9
+ '@esbuild/freebsd-x64': 0.25.9
+ '@esbuild/linux-arm': 0.25.9
+ '@esbuild/linux-arm64': 0.25.9
+ '@esbuild/linux-ia32': 0.25.9
+ '@esbuild/linux-loong64': 0.25.9
+ '@esbuild/linux-mips64el': 0.25.9
+ '@esbuild/linux-ppc64': 0.25.9
+ '@esbuild/linux-riscv64': 0.25.9
+ '@esbuild/linux-s390x': 0.25.9
+ '@esbuild/linux-x64': 0.25.9
+ '@esbuild/netbsd-arm64': 0.25.9
+ '@esbuild/netbsd-x64': 0.25.9
+ '@esbuild/openbsd-arm64': 0.25.9
+ '@esbuild/openbsd-x64': 0.25.9
+ '@esbuild/openharmony-arm64': 0.25.9
+ '@esbuild/sunos-x64': 0.25.9
+ '@esbuild/win32-arm64': 0.25.9
+ '@esbuild/win32-ia32': 0.25.9
+ '@esbuild/win32-x64': 0.25.9
escalade@3.2.0: {}
@@ -6640,7 +6678,7 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
- fdir@6.4.6(picomatch@4.0.3):
+ fdir@6.5.0(picomatch@4.0.3):
optionalDependencies:
picomatch: 4.0.3
@@ -8164,7 +8202,7 @@ snapshots:
acorn: 8.15.0
estree-walker: 3.0.3
magic-string: 0.30.17
- unplugin: 2.3.5
+ unplugin: 2.3.6
optional: true
undici-types@7.8.0: {}
@@ -8206,7 +8244,7 @@ snapshots:
scule: 1.3.0
strip-literal: 3.0.0
tinyglobby: 0.2.14
- unplugin: 2.3.5
+ unplugin: 2.3.6
unplugin-utils: 0.2.5
optional: true
@@ -8263,6 +8301,14 @@ snapshots:
picomatch: 4.0.2
webpack-virtual-modules: 0.6.2
+ unplugin@2.3.6:
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ acorn: 8.15.0
+ picomatch: 4.0.3
+ webpack-virtual-modules: 0.6.2
+ optional: true
+
untyped@2.0.0:
dependencies:
citty: 0.1.6
@@ -8311,7 +8357,7 @@ snapshots:
debug: 4.4.1
es-module-lexer: 1.7.0
pathe: 2.0.3
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
transitivePeerDependencies:
- '@types/node'
- jiti
@@ -8326,16 +8372,16 @@ snapshots:
- tsx
- yaml
- vite-plugin-vue-setup-extend@0.4.0(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)):
+ vite-plugin-vue-setup-extend@0.4.0(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)):
dependencies:
'@vue/compiler-sfc': 3.5.13
magic-string: 0.25.9
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
- vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1):
+ vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1):
dependencies:
- esbuild: 0.25.8
- fdir: 6.4.6(picomatch@4.0.3)
+ esbuild: 0.25.9
+ fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.46.2
@@ -8353,7 +8399,7 @@ snapshots:
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(vite@7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
+ '@vitest/mocker': 3.2.4(vite@7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
@@ -8371,7 +8417,7 @@ snapshots:
tinyglobby: 0.2.14
tinypool: 1.1.1
tinyrainbow: 2.0.0
- vite: 7.1.1(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ vite: 7.1.2(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
vite-node: 3.2.4(@types/node@24.0.10)(jiti@2.5.1)(sass@1.90.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
why-is-node-running: 2.3.0
optionalDependencies:
diff --git a/public/icon.js b/public/icon.js
index 15e2fb86..d424d98d 100644
--- a/public/icon.js
+++ b/public/icon.js
@@ -1 +1 @@
-!function(e){var t,n,d,o,i,a,r='';function c(){i||(i=!0,d())}t=function(){var e,t,n;(n=document.createElement("div")).innerHTML=r,r=null,(t=n.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(n=document.body).firstChild?(t=n.firstChild).parentNode.insertBefore(e,t):n.appendChild(e))},document.addEventListener?["complete","loaded","interactive"].indexOf(document.readyState)>-1?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(d=t,o=e.document,i=!1,(a=function(){try{o.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}c()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,c())})}(window);
\ No newline at end of file
+!function(e){var t,n,d,o,i,a,r='';function c(){i||(i=!0,d())}t=function(){var e,t,n;(n=document.createElement("div")).innerHTML=r,r=null,(t=n.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(n=document.body).firstChild?(t=n.firstChild).parentNode.insertBefore(e,t):n.appendChild(e))},document.addEventListener?["complete","loaded","interactive"].indexOf(document.readyState)>-1?setTimeout(t,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),t()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(d=t,o=e.document,i=!1,(a=function(){try{o.documentElement.doScroll("left")}catch(e){return void setTimeout(a,50)}c()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,c())})}(window);
diff --git a/scripts/check-dependencies.js b/scripts/check-dependencies.js
index 7c2b532b..46d89744 100644
--- a/scripts/check-dependencies.js
+++ b/scripts/check-dependencies.js
@@ -103,8 +103,8 @@ const compareVersions = (version1, version2) => {
const v2 = version2.replace(/[^0-9.]/g, '').split('.')
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
- const num1 = parseInt(v1[i] || '0')
- const num2 = parseInt(v2[i] || '0')
+ const num1 = parseInt(v1[i] || '0', 10)
+ const num2 = parseInt(v2[i] || '0', 10)
if (num1 > num2) return 1
if (num1 < num2) return -1
}
diff --git a/src-tauri/.env b/src-tauri/.env
new file mode 100644
index 00000000..7339d3a7
--- /dev/null
+++ b/src-tauri/.env
@@ -0,0 +1,3 @@
+RUST_BACKTRACE=1
+# APP_ENVIRONMENT=local
+APP_ENVIRONMENT=local
diff --git a/src-tauri/Info.plist b/src-tauri/Info.plist
index e7486ea9..6b55545a 100644
--- a/src-tauri/Info.plist
+++ b/src-tauri/Info.plist
@@ -6,5 +6,9 @@
Request camera access for WebRTC
NSMicrophoneUsageDescription
Request microphone access for WebRTC
+ NSScreenCaptureUsageDescription
+ HuLa needs screen recording permission to enable screenshot functionality
+ NSAccessibilityUsageDescription
+ HuLa needs accessibility permission to capture screen content
diff --git a/src-tauri/capabilities/desktop.json b/src-tauri/capabilities/desktop.json
index cc44c13b..5e2df6c9 100644
--- a/src-tauri/capabilities/desktop.json
+++ b/src-tauri/capabilities/desktop.json
@@ -1,6 +1,16 @@
{
"identifier": "desktop-capability",
"platforms": ["macOS", "windows", "linux"],
- "windows": ["home", "login", "update", "checkupdate"],
- "permissions": ["updater:default", "updater:allow-check", "updater:allow-download", "updater:allow-install"]
+ "windows": ["home", "login", "update", "checkupdate", "capture", "settings", "tray"],
+ "permissions": [
+ "updater:default",
+ "updater:allow-check",
+ "updater:allow-download",
+ "updater:allow-install",
+ "global-shortcut:allow-is-registered",
+ "global-shortcut:allow-register",
+ "global-shortcut:allow-register-all",
+ "global-shortcut:allow-unregister",
+ "global-shortcut:allow-unregister-all"
+ ]
}
diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json
index deef03fd..83b1a6c7 100644
--- a/src-tauri/gen/schemas/capabilities.json
+++ b/src-tauri/gen/schemas/capabilities.json
@@ -1 +1 @@
-{"default-capability":{"identifier":"default-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:window:default","core:window:allow-create","core:window:allow-start-dragging","core:window:allow-close","core:window:allow-hide","core:window:allow-center","core:window:allow-show","core:window:allow-maximize","core:window:allow-minimize","core:window:allow-destroy","core:window:allow-is-focused","core:window:allow-is-fullscreen","core:window:allow-set-focus","core:window:allow-set-position","core:window:allow-scale-factor","core:window:allow-unminimize","core:window:allow-set-always-on-top","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-unmaximize","core:window:allow-set-fullscreen","core:window:allow-request-user-attention","core:window:allow-set-enabled","core:webview:allow-create-webview","core:webview:allow-create-webview-window","core:webview:allow-internal-toggle-devtools","core:webview:allow-set-webview-size","core:webview:allow-webview-size","core:event:default","core:event:allow-listen","core:image:default","core:image:allow-rgba","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","process:default","process:allow-exit","clipboard-manager:allow-clear","clipboard-manager:allow-read-image","clipboard-manager:allow-read-text","clipboard-manager:allow-write-html","clipboard-manager:allow-write-image","clipboard-manager:allow-write-text","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","core:tray:default","core:tray:allow-get-by-id","autostart:allow-enable","autostart:allow-disable","autostart:allow-is-enabled","dialog:default","dialog:allow-open","dialog:allow-confirm","dialog:allow-save","dialog:allow-ask","dialog:allow-message","core:resources:allow-close","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","shell:default","shell:allow-open","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","opener:default","opener:allow-reveal-item-in-dir","opener:allow-open-path","mic-recorder:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["macOS","windows","linux"]},"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["home","login","update","checkupdate"],"permissions":["updater:default","updater:allow-check","updater:allow-download","updater:allow-install"],"platforms":["macOS","windows","linux"]},"mobile-capability":{"identifier":"mobile-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:webview:allow-internal-toggle-devtools","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","safe-area-insets:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["iOS","android"]}}
\ No newline at end of file
+{"default-capability":{"identifier":"default-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:window:default","core:window:allow-create","core:window:allow-start-dragging","core:window:allow-close","core:window:allow-hide","core:window:allow-center","core:window:allow-show","core:window:allow-maximize","core:window:allow-minimize","core:window:allow-destroy","core:window:allow-is-focused","core:window:allow-is-fullscreen","core:window:allow-set-focus","core:window:allow-set-position","core:window:allow-scale-factor","core:window:allow-unminimize","core:window:allow-set-always-on-top","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-unmaximize","core:window:allow-set-fullscreen","core:window:allow-request-user-attention","core:window:allow-set-enabled","core:webview:allow-create-webview","core:webview:allow-create-webview-window","core:webview:allow-internal-toggle-devtools","core:webview:allow-set-webview-size","core:webview:allow-webview-size","core:event:default","core:event:allow-listen","core:image:default","core:image:allow-rgba","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","process:default","process:allow-exit","clipboard-manager:allow-clear","clipboard-manager:allow-read-image","clipboard-manager:allow-read-text","clipboard-manager:allow-write-html","clipboard-manager:allow-write-image","clipboard-manager:allow-write-text","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","core:tray:default","core:tray:allow-get-by-id","autostart:allow-enable","autostart:allow-disable","autostart:allow-is-enabled","dialog:default","dialog:allow-open","dialog:allow-confirm","dialog:allow-save","dialog:allow-ask","dialog:allow-message","core:resources:allow-close","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","shell:default","shell:allow-open","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","opener:default","opener:allow-reveal-item-in-dir","opener:allow-open-path","mic-recorder:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["macOS","windows","linux"]},"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["home","login","update","checkupdate","capture","settings","tray"],"permissions":["updater:default","updater:allow-check","updater:allow-download","updater:allow-install","global-shortcut:allow-is-registered","global-shortcut:allow-register","global-shortcut:allow-register-all","global-shortcut:allow-unregister","global-shortcut:allow-unregister-all"],"platforms":["macOS","windows","linux"]},"mobile-capability":{"identifier":"mobile-capability","description":"Capability for the main window","local":true,"windows":["*"],"permissions":["core:default","core:webview:allow-internal-toggle-devtools","http:allow-fetch","http:allow-fetch-cancel","http:allow-fetch-read-body","http:allow-fetch-send","os:default","os:allow-os-type","os:allow-arch","os:allow-version","os:allow-hostname","sql:allow-load","sql:allow-execute","sql:allow-select","sql:allow-close","notification:allow-is-permission-granted","notification:allow-request-permission","notification:allow-notify","notification:allow-register-action-types","notification:allow-register-listener","notification:allow-cancel","notification:allow-get-pending","notification:allow-remove-active","notification:allow-get-active","notification:allow-check-permissions","notification:allow-show","notification:allow-batch","notification:allow-list-channels","notification:allow-delete-channel","notification:allow-create-channel","notification:allow-permission-state","safe-area-insets:default","log:default","log:allow-log",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"powershell","name":"powershell"},{"args":["-c",{"validator":"\\S+"}],"cmd":"cmd","name":"systemPath"}]},{"identifier":"fs:write-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-mkdir","allow":[{"path":"**"}]},{"identifier":"fs:read-dirs","allow":[{"path":"**"}]},{"identifier":"fs:read-files","allow":[{"path":"**"}]},{"identifier":"fs:allow-copy-file","allow":[{"path":"**"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"**"}]},{"identifier":"http:default","allow":[{"url":"http://**"},{"url":"https://**"},{"url":"http://*:*"},{"url":"https://*:*"}]}],"platforms":["iOS","android"]}}
\ No newline at end of file
diff --git a/src-tauri/src/configuration.rs b/src-tauri/src/configuration.rs
index 4ce0a6de..8b5328fb 100644
--- a/src-tauri/src/configuration.rs
+++ b/src-tauri/src/configuration.rs
@@ -157,6 +157,7 @@ pub fn get_configuration(app_handle: &AppHandle) -> Result Result<(), String> {
///
/// # 参数
/// * `window_label` - 窗口的标签名称
+/// * `hide_close_button` - 可选参数,是否隐藏关闭按钮,默认为false(不隐藏)
/// * `handle` - Tauri应用句柄
///
/// # 返回
/// * `Result<(), String>` - 成功返回Ok(()), 失败返回错误信息
#[tauri::command]
#[cfg(target_os = "macos")]
-pub fn hide_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<(), String> {
+pub fn hide_title_bar_buttons(
+ window_label: &str,
+ hide_close_button: Option,
+ handle: AppHandle,
+) -> Result<(), String> {
#[cfg(target_os = "macos")]
#[allow(deprecated)]
{
@@ -219,6 +224,11 @@ pub fn hide_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<(
hide_button(ns_window, NSWindowButton::NSWindowMiniaturizeButton);
hide_button(ns_window, NSWindowButton::NSWindowZoomButton);
+ // 根据参数决定是否隐藏关闭按钮
+ if hide_close_button.unwrap_or(false) {
+ hide_button(ns_window, NSWindowButton::NSWindowCloseButton);
+ }
+
// 设置窗口不可拖动
let _: () = msg_send![ns_window, setMovable: NO];
}
@@ -226,6 +236,54 @@ pub fn hide_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<(
Ok(())
}
+/// 恢复Mac窗口的标题栏按钮显示
+///
+/// # 参数
+/// * `window_label` - 窗口的标签名称
+/// * `handle` - Tauri应用句柄
+///
+/// # 返回
+/// * `Result<(), String>` - 成功返回Ok(()), 失败返回错误信息
+#[tauri::command]
+#[cfg(target_os = "macos")]
+pub fn show_title_bar_buttons(window_label: &str, handle: AppHandle) -> Result<(), String> {
+ #[cfg(target_os = "macos")]
+ #[allow(deprecated)]
+ {
+ use cocoa::appkit::NSWindowButton;
+ use cocoa::base::{NO, YES, id};
+ use objc::{msg_send, sel, sel_impl};
+
+ let webview_window = handle
+ .get_webview_window(window_label)
+ .ok_or_else(|| format!("Window '{}' not found", window_label))?;
+
+ let ns_window = webview_window
+ .ns_window()
+ .map_err(|e| format!("Failed to get NSWindow: {}", e))? as id;
+
+ unsafe {
+ // 显示标题栏按钮的辅助函数
+ let show_button = |window: id, button_type: NSWindowButton| {
+ let btn = window.standardWindowButton_(button_type);
+ if !btn.is_null() {
+ let _: () = msg_send![btn, setHidden: NO];
+ }
+ };
+
+ // 显示所有标题栏按钮
+ show_button(ns_window, NSWindowButton::NSWindowCloseButton);
+ show_button(ns_window, NSWindowButton::NSWindowMiniaturizeButton);
+ show_button(ns_window, NSWindowButton::NSWindowZoomButton);
+ show_button(ns_window, NSWindowButton::NSWindowFullScreenButton);
+
+ // 恢复窗口可拖动
+ let _: () = msg_send![ns_window, setMovable: YES];
+ }
+ }
+ Ok(())
+}
+
#[tauri::command]
pub async fn push_window_payload(
label: String,
@@ -323,3 +381,30 @@ pub fn set_badge_count(count: Option, handle: AppHandle) -> Result<(), Stri
}
}
}
+
+/// 设置 macOS 窗口级别为屏幕保护程序级别,以覆盖菜单栏
+#[tauri::command]
+#[cfg(target_os = "macos")]
+pub fn set_window_level_above_menubar(window_label: &str, handle: AppHandle) -> Result<(), String> {
+ #[cfg(target_os = "macos")]
+ #[allow(deprecated)]
+ {
+ use cocoa::base::id;
+ use objc::{msg_send, sel, sel_impl};
+
+ let webview_window = handle
+ .get_webview_window(window_label)
+ .ok_or_else(|| format!("Window '{}' not found", window_label))?;
+
+ let ns_window = webview_window
+ .ns_window()
+ .map_err(|e| format!("Failed to get NSWindow: {}", e))? as id;
+
+ unsafe {
+ // 设置窗口级别为屏幕保护程序级别 (1000),高于菜单栏
+ let screen_saver_level: i32 = 1000;
+ let _: () = msg_send![ns_window, setLevel: screen_saver_level];
+ }
+ }
+ Ok(())
+}
diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs
index dbba53f8..e5ca701d 100644
--- a/src-tauri/src/lib.rs
+++ b/src-tauri/src/lib.rs
@@ -3,14 +3,14 @@
mod desktops;
#[cfg(desktop)]
use common::init::CustomInit;
-#[cfg(target_os = "macos")]
-use common_cmd::hide_title_bar_buttons;
#[cfg(desktop)]
use common_cmd::{
audio, default_window_icon, get_files_meta, get_window_payload, push_window_payload,
screenshot, set_height,
};
#[cfg(target_os = "macos")]
+use common_cmd::{hide_title_bar_buttons, set_window_level_above_menubar, show_title_bar_buttons};
+#[cfg(target_os = "macos")]
use desktops::app_event;
#[cfg(desktop)]
use desktops::{common_cmd, directory_scanner, init, tray, video_thumbnail::get_video_thumbnail};
@@ -239,20 +239,35 @@ fn setup_logout_listener(app_handle: tauri::AppHandle) {
app_handle.listen("logout", move |_event| {
let app_handle = app_handle_clone.clone();
tauri::async_runtime::spawn(async move {
- tracing::info!("[LOGOUT] Starting to close all non-login windows");
+ tracing::info!("[LOGOUT] Starting to close windows and preserve capture/checkupdate windows");
let all_windows = app_handle.webview_windows();
tracing::info!("[LOGOUT] Found {} windows", all_windows.len());
- // 收集需要关闭的窗口
+ // 收集需要关闭的窗口和需要隐藏的窗口
let mut windows_to_close = Vec::new();
+ let mut windows_to_hide = Vec::new();
for (label, window) in all_windows {
- // 跳过 login 窗口,不关闭它
- if label != "login" && label != "tray" {
- windows_to_close.push((label, window));
+ match label.as_str() {
+ // 这些窗口完全不处理
+ "login" | "tray" => {},
+ // 这些窗口只隐藏,不销毁
+ "capture" | "checkupdate" => {
+ windows_to_hide.push((label, window));
+ },
+ // 其他窗口需要关闭
+ _ => {
+ windows_to_close.push((label, window));
+ }
}
}
+ // 先隐藏需要保持的窗口
+ for (label, window) in windows_to_hide {
+ tracing::info!("[LOGOUT] Hiding window (preserving): {}", label);
+ let _ = window.hide();
+ }
+
// 逐个关闭窗口,添加小延迟以避免并发关闭导致的错误
for (label, window) in windows_to_close {
tracing::info!("[LOGOUT] Closing window: {}", label);
@@ -282,7 +297,7 @@ fn setup_logout_listener(app_handle: tauri::AppHandle) {
}
}
- tracing::info!("[LOGOUT] All non-login windows closed successfully");
+ tracing::info!("[LOGOUT] Logout completed - windows closed and capture/checkupdate windows preserved");
});
});
}
@@ -369,6 +384,10 @@ fn get_invoke_handlers() -> impl Fn(tauri::ipc::Invoke) -> bool + Se
get_video_thumbnail,
#[cfg(target_os = "macos")]
hide_title_bar_buttons,
+ #[cfg(target_os = "macos")]
+ show_title_bar_buttons,
+ #[cfg(target_os = "macos")]
+ set_window_level_above_menubar,
#[cfg(desktop)]
push_window_payload,
#[cfg(desktop)]
diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json
index 5cd6aaed..86d41259 100644
--- a/src-tauri/tauri.macos.conf.json
+++ b/src-tauri/tauri.macos.conf.json
@@ -10,16 +10,9 @@
"devUrl": "http://127.0.0.1:6130"
},
"bundle": {
- "resources": [
- "tray",
- "configuration",
- "Info.plist"
- ],
+ "resources": ["tray", "configuration", "Info.plist"],
"active": true,
- "targets": [
- "app",
- "dmg"
- ],
+ "targets": ["app", "dmg"],
"icon": [
"icons/macos/light/32x32.png",
"icons/macos/light/128x128.png",
@@ -82,9 +75,14 @@
"fullscreen": false,
"transparent": true,
"resizable": false,
- "skipTaskbar": false,
+ "skipTaskbar": true,
"decorations": false,
- "visible": false
+ "visible": false,
+ "hiddenTitle": true,
+ "alwaysOnTop": true,
+ "focus": true,
+ "titleBarStyle": "Overlay",
+ "visibleOnAllWorkspaces": true
},
{
"label": "checkupdate",
diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json
index 3691c37f..b220343c 100644
--- a/src-tauri/tauri.windows.conf.json
+++ b/src-tauri/tauri.windows.conf.json
@@ -96,12 +96,13 @@
{
"label": "capture",
"url": "/capture",
- "fullscreen": false,
+ "fullscreen": true,
"transparent": true,
"resizable": false,
- "skipTaskbar": false,
+ "skipTaskbar": true,
"decorations": false,
- "visible": false
+ "visible": false,
+ "hiddenTitle": true
},
{
"label": "checkupdate",
diff --git a/src/App.vue b/src/App.vue
index 65d1b169..3577a9b4 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -13,6 +13,7 @@ import { WebviewWindow } from '@tauri-apps/api/webviewWindow'
import { type } from '@tauri-apps/plugin-os'
import { useStorage } from '@vueuse/core'
import { MittEnum, StoresEnum, ThemeEnum } from '@/enums'
+import { useGlobalShortcut } from '@/hooks/useGlobalShortcut.ts'
import { useLogin } from '@/hooks/useLogin.ts'
import { useMitt } from '@/hooks/useMitt.ts'
import { useWindow } from '@/hooks/useWindow.ts'
@@ -29,6 +30,8 @@ const { resetLoginState, logout } = useLogin()
const token = useStorage('TOKEN', null)
const refreshToken = useStorage('REFRESH_TOKEN', null)
const { addListener } = useTauriListener()
+// 全局快捷键管理
+const { initializeGlobalShortcut, cleanupGlobalShortcut } = useGlobalShortcut()
/** 不需要锁屏的页面 */
const LockExclusion = new Set(['/login', '/tray', '/qrCode', '/about', '/onlineStatus'])
@@ -123,6 +126,11 @@ onMounted(async () => {
}
document.documentElement.dataset.theme = themes.value.content
window.addEventListener('dragstart', preventDrag)
+
+ // 只在主窗口中初始化全局快捷键
+ if (appWindow.label === 'home') {
+ await initializeGlobalShortcut()
+ }
/** 开发环境不禁止 */
if (process.env.NODE_ENV !== 'development') {
/** 禁用浏览器默认的快捷键 */
@@ -171,9 +179,14 @@ onMounted(async () => {
)
})
-onUnmounted(() => {
+onUnmounted(async () => {
window.removeEventListener('contextmenu', (e) => e.preventDefault(), false)
window.removeEventListener('dragstart', preventDrag)
+
+ // 只在主窗口中清理全局快捷键
+ if (appWindow.label === 'home') {
+ await cleanupGlobalShortcut()
+ }
})
diff --git a/src/components/rightBox/ApplyList.vue b/src/components/rightBox/ApplyList.vue
index db0c271a..2622f624 100644
--- a/src/components/rightBox/ApplyList.vue
+++ b/src/components/rightBox/ApplyList.vue
@@ -128,9 +128,9 @@ const isAccepted = (targetId: string) => {
const applyList = computed(() => {
return contactStore.requestFriendsList.filter((item) => {
if (props.type === 'friend') {
- return item.type === 1
- } else {
return item.type === 2
+ } else {
+ return item.type === 1
}
})
})
@@ -194,11 +194,16 @@ const loadMoreFriendRequests = async () => {
const handleAgree = async (applyId: string) => {
loadingMap.value[applyId] = true
- contactStore.onAcceptFriend(applyId).then(() => {
- setTimeout(() => {
- loadingMap.value[applyId] = false
- }, 600)
- })
+ contactStore
+ .onHandleInvite({
+ applyId,
+ state: 2
+ })
+ .then(() => {
+ setTimeout(() => {
+ loadingMap.value[applyId] = false
+ }, 600)
+ })
}
// 处理好友请求操作(拒绝或忽略)
@@ -206,9 +211,15 @@ const handleFriendAction = async (action: string, applyId: string) => {
loadingMap.value[applyId] = true
try {
if (action === 'reject') {
- await contactStore.onRejectFriend(applyId)
+ await contactStore.onHandleInvite({
+ applyId,
+ state: 0
+ })
} else if (action === 'ignore') {
- await contactStore.onIgnoreFriend(applyId)
+ await contactStore.onHandleInvite({
+ applyId,
+ state: 3
+ })
}
} finally {
setTimeout(() => {
diff --git a/src/components/rightBox/chatBox/ChatFooter.vue b/src/components/rightBox/chatBox/ChatFooter.vue
index 8ba815c8..3ca5adb0 100644
--- a/src/components/rightBox/chatBox/ChatFooter.vue
+++ b/src/components/rightBox/chatBox/ChatFooter.vue
@@ -115,7 +115,8 @@
diff --git a/src/views/moreWindow/settings/config.ts b/src/views/moreWindow/settings/config.ts
index 12d3f1c1..e6c89a9b 100644
--- a/src/views/moreWindow/settings/config.ts
+++ b/src/views/moreWindow/settings/config.ts
@@ -16,6 +16,11 @@ const sideOptions = ref([
label: '存储管理',
icon: 'mini-sd-card'
},
+ {
+ url: '/shortcut',
+ label: '快捷键管理',
+ icon: 'enter-the-keyboard'
+ },
{
url: '/loginSetting',
label: '登录设置',
diff --git a/src/views/videoViewerWindow/index.vue b/src/views/videoViewerWindow/index.vue
index b89a6879..620042a6 100644
--- a/src/views/videoViewerWindow/index.vue
+++ b/src/views/videoViewerWindow/index.vue
@@ -275,7 +275,7 @@ const previousVideo = async () => {
// 如果是本地视频,从文件夹获取视频列表
const folderVideos = await getVideosFromCurrentFolder(currentVideoPath)
if (folderVideos.length > 0) {
- const currentVideoIndex = folderVideos.findIndex((path) => path === currentVideoPath)
+ const currentVideoIndex = folderVideos.indexOf(currentVideoPath)
if (currentVideoIndex > 0) {
const previousVideoPath = folderVideos[currentVideoIndex - 1]
videoList.value[currentIndex.value] = previousVideoPath
@@ -323,7 +323,7 @@ const nextVideo = async () => {
// 如果是本地视频,从文件夹获取视频列表
const folderVideos = await getVideosFromCurrentFolder(currentVideoPath)
if (folderVideos.length > 0) {
- const currentVideoIndex = folderVideos.findIndex((path) => path === currentVideoPath)
+ const currentVideoIndex = folderVideos.indexOf(currentVideoPath)
if (currentVideoIndex < folderVideos.length - 1) {
const nextVideoPath = folderVideos[currentVideoIndex + 1]
videoList.value[currentIndex.value] = nextVideoPath