mirror of
https://github.com/clash-verge-rev/clash-verge-rev
synced 2025-05-05 09:13:45 +08:00
feat: add export diagnostic info functionality (#2856)
This commit is contained in:
parent
277390e597
commit
aff504bddc
@ -14,6 +14,7 @@ pub mod clash;
|
|||||||
pub mod verge;
|
pub mod verge;
|
||||||
pub mod runtime;
|
pub mod runtime;
|
||||||
pub mod save_profile;
|
pub mod save_profile;
|
||||||
|
pub mod system;
|
||||||
|
|
||||||
// Re-export all command functions for backwards compatibility
|
// Re-export all command functions for backwards compatibility
|
||||||
pub use profile::*;
|
pub use profile::*;
|
||||||
@ -26,3 +27,4 @@ pub use clash::*;
|
|||||||
pub use verge::*;
|
pub use verge::*;
|
||||||
pub use runtime::*;
|
pub use runtime::*;
|
||||||
pub use save_profile::*;
|
pub use save_profile::*;
|
||||||
|
pub use system::*;
|
17
src-tauri/src/cmd/system.rs
Normal file
17
src-tauri/src/cmd/system.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
use super::CmdResult;
|
||||||
|
use crate::{core::handle, model::sysinfo::PlatformSpecification};
|
||||||
|
use tauri_plugin_clipboard_manager::ClipboardExt;
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn export_diagnostic_info() -> CmdResult<()> {
|
||||||
|
let sysinfo = PlatformSpecification::new();
|
||||||
|
let info = format!("{:?}", sysinfo);
|
||||||
|
|
||||||
|
let app_handle = handle::Handle::global().app_handle().unwrap();
|
||||||
|
let cliboard = app_handle.clipboard();
|
||||||
|
|
||||||
|
if let Err(_) = cliboard.write_text(info) {
|
||||||
|
log::error!(target: "app", "Failed to write to clipboard");
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -4,6 +4,8 @@ mod core;
|
|||||||
mod enhance;
|
mod enhance;
|
||||||
mod feat;
|
mod feat;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
mod model;
|
||||||
|
mod module;
|
||||||
use crate::core::hotkey;
|
use crate::core::hotkey;
|
||||||
use crate::utils::{resolve, resolve::resolve_scheme, server};
|
use crate::utils::{resolve, resolve::resolve_scheme, server};
|
||||||
use config::Config;
|
use config::Config;
|
||||||
@ -191,6 +193,8 @@ pub fn run() {
|
|||||||
cmd::list_webdav_backup,
|
cmd::list_webdav_backup,
|
||||||
cmd::delete_webdav_backup,
|
cmd::delete_webdav_backup,
|
||||||
cmd::restore_webdav_backup,
|
cmd::restore_webdav_backup,
|
||||||
|
// export diagnostic info for issue reporting
|
||||||
|
cmd::export_diagnostic_info,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
|
1
src-tauri/src/model/mod.rs
Normal file
1
src-tauri/src/model/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod sysinfo;
|
18
src-tauri/src/model/sysinfo.rs
Normal file
18
src-tauri/src/model/sysinfo.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
use std::fmt::{self, Debug, Formatter};
|
||||||
|
|
||||||
|
pub struct PlatformSpecification {
|
||||||
|
pub system_name: String,
|
||||||
|
pub system_version: String,
|
||||||
|
pub system_kernel_version: String,
|
||||||
|
pub system_arch: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Debug for PlatformSpecification {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"System Name: {}\nSystem Version: {}\nSystem kernel Version: {}\nSystem Arch: {}",
|
||||||
|
self.system_name, self.system_version, self.system_kernel_version, self.system_arch
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
1
src-tauri/src/module/mod.rs
Normal file
1
src-tauri/src/module/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod sysinfo;
|
19
src-tauri/src/module/sysinfo.rs
Normal file
19
src-tauri/src/module/sysinfo.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
use crate::model::sysinfo::PlatformSpecification;
|
||||||
|
|
||||||
|
use sysinfo::System;
|
||||||
|
|
||||||
|
impl PlatformSpecification {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let system_name = System::name().unwrap_or("Null".into());
|
||||||
|
let system_version = System::long_os_version().unwrap_or("Null".into());
|
||||||
|
let system_kernel_version = System::kernel_version().unwrap_or("Null".into());
|
||||||
|
let system_arch = std::env::consts::ARCH.to_string();
|
||||||
|
|
||||||
|
Self {
|
||||||
|
system_name,
|
||||||
|
system_version,
|
||||||
|
system_kernel_version,
|
||||||
|
system_arch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import { useRef } from "react";
|
import { useCallback, useRef } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { Typography } from "@mui/material";
|
import { Typography } from "@mui/material";
|
||||||
import {
|
import {
|
||||||
@ -7,6 +7,7 @@ import {
|
|||||||
openCoreDir,
|
openCoreDir,
|
||||||
openLogsDir,
|
openLogsDir,
|
||||||
openDevTools,
|
openDevTools,
|
||||||
|
exportDiagnosticInfo,
|
||||||
} from "@/services/cmds";
|
} from "@/services/cmds";
|
||||||
import { check as checkUpdate } from "@tauri-apps/plugin-updater";
|
import { check as checkUpdate } from "@tauri-apps/plugin-updater";
|
||||||
import { useVerge } from "@/hooks/use-verge";
|
import { useVerge } from "@/hooks/use-verge";
|
||||||
@ -21,6 +22,7 @@ import { LayoutViewer } from "./mods/layout-viewer";
|
|||||||
import { UpdateViewer } from "./mods/update-viewer";
|
import { UpdateViewer } from "./mods/update-viewer";
|
||||||
import { BackupViewer } from "./mods/backup-viewer";
|
import { BackupViewer } from "./mods/backup-viewer";
|
||||||
import { TooltipIcon } from "@/components/base/base-tooltip-icon";
|
import { TooltipIcon } from "@/components/base/base-tooltip-icon";
|
||||||
|
import { ContentCopyRounded } from "@mui/icons-material";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
onError?: (err: Error) => void;
|
onError?: (err: Error) => void;
|
||||||
@ -51,6 +53,11 @@ const SettingVergeAdvanced = ({ onError }: Props) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onExportDiagnosticInfo = useCallback(async () => {
|
||||||
|
await exportDiagnosticInfo();
|
||||||
|
Notice.success(t("Copy Success"), 1000);
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SettingList title={t("Verge Advanced Setting")}>
|
<SettingList title={t("Verge Advanced Setting")}>
|
||||||
<ThemeViewer ref={themeRef} />
|
<ThemeViewer ref={themeRef} />
|
||||||
@ -111,6 +118,16 @@ const SettingVergeAdvanced = ({ onError }: Props) => {
|
|||||||
label={t("Exit")}
|
label={t("Exit")}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<SettingItem
|
||||||
|
label={t("Export Diagnostic Info")}
|
||||||
|
extra={
|
||||||
|
<TooltipIcon
|
||||||
|
icon={ContentCopyRounded}
|
||||||
|
onClick={onExportDiagnosticInfo}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
></SettingItem>
|
||||||
|
|
||||||
<SettingItem label={t("Verge Version")}>
|
<SettingItem label={t("Verge Version")}>
|
||||||
<Typography sx={{ py: "7px", pr: 1 }}>v{version}</Typography>
|
<Typography sx={{ py: "7px", pr: 1 }}>v{version}</Typography>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
|
@ -349,6 +349,8 @@
|
|||||||
"Portable Updater Error": "The portable version does not support in-app updates. Please manually download and replace it",
|
"Portable Updater Error": "The portable version does not support in-app updates. Please manually download and replace it",
|
||||||
"Break Change Update Error": "This version is a major update and does not support in-app updates. Please uninstall it and manually download and install the new version",
|
"Break Change Update Error": "This version is a major update and does not support in-app updates. Please uninstall it and manually download and install the new version",
|
||||||
"Open Dev Tools": "Dev Tools",
|
"Open Dev Tools": "Dev Tools",
|
||||||
|
"Export Diagnostic Info": "Export Diagnostic Info",
|
||||||
|
"Export Diagnostic Info For Issue Reporting": "Export Diagnostic Info For Issue Reporting",
|
||||||
"Exit": "Exit",
|
"Exit": "Exit",
|
||||||
"Verge Version": "Verge Version",
|
"Verge Version": "Verge Version",
|
||||||
"ReadOnly": "ReadOnly",
|
"ReadOnly": "ReadOnly",
|
||||||
|
@ -191,6 +191,10 @@ export async function exitApp() {
|
|||||||
return invoke("exit_app");
|
return invoke("exit_app");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function exportDiagnosticInfo() {
|
||||||
|
return invoke("export_diagnostic_info");
|
||||||
|
}
|
||||||
|
|
||||||
export async function copyIconFile(
|
export async function copyIconFile(
|
||||||
path: string,
|
path: string,
|
||||||
name: "common" | "sysproxy" | "tun",
|
name: "common" | "sysproxy" | "tun",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user