添加供应商URL可点击功能:支持在默认浏览器中打开链接

This commit is contained in:
farion1231
2025-08-06 09:56:27 +08:00
parent b83652a162
commit 4540ad613f
5 changed files with 47 additions and 3 deletions

View File

@@ -1,4 +1,4 @@
import { app, BrowserWindow, ipcMain, dialog } from 'electron'
import { app, BrowserWindow, ipcMain, dialog, shell } from 'electron'
import path from 'path'
import Store from 'electron-store'
import { Provider, AppConfig } from '../shared/types'
@@ -134,3 +134,13 @@ ipcMain.handle('checkStatus', async (_, provider: Provider) => {
return false
}
})
ipcMain.handle('openExternal', async (_, url: string) => {
try {
await shell.openExternal(url)
return true
} catch (error) {
console.error('打开外部链接失败:', error)
return false
}
})

View File

@@ -10,5 +10,6 @@ contextBridge.exposeInMainWorld('electronAPI', {
checkStatus: (provider: Provider) => ipcRenderer.invoke('checkStatus', provider),
switchProvider: (providerId: string) => ipcRenderer.invoke('switchProvider', providerId),
getClaudeCodeConfigPath: () => ipcRenderer.invoke('getClaudeCodeConfigPath'),
selectConfigFile: () => ipcRenderer.invoke('selectConfigFile')
selectConfigFile: () => ipcRenderer.invoke('selectConfigFile'),
openExternal: (url: string) => ipcRenderer.invoke('openExternal', url)
})

View File

@@ -78,6 +78,18 @@
text-overflow: ellipsis;
}
.url-link {
color: #3498db;
text-decoration: none;
cursor: pointer;
transition: color 0.2s;
}
.url-link:hover {
color: #2980b9;
text-decoration: underline;
}
.provider-status {
display: flex;
align-items: center;

View File

@@ -17,6 +17,14 @@ const ProviderList: React.FC<ProviderListProps> = ({
onDelete,
onEdit
}) => {
const handleUrlClick = async (url: string) => {
try {
await window.electronAPI.openExternal(url)
} catch (error) {
console.error('打开链接失败:', error)
}
}
return (
<div className="provider-list">
{Object.values(providers).length === 0 ? (
@@ -45,7 +53,18 @@ const ProviderList: React.FC<ProviderListProps> = ({
<span>{provider.name}</span>
{isCurrent && <span className="current-badge">使</span>}
</div>
<div className="provider-url">{provider.apiUrl}</div>
<div className="provider-url">
<a
href="#"
onClick={(e) => {
e.preventDefault()
handleUrlClick(provider.apiUrl)
}}
className="url-link"
>
{provider.apiUrl}
</a>
</div>
</div>
<div className="provider-actions">

View File

@@ -22,6 +22,8 @@ declare global {
switchProvider: (providerId: string) => Promise<boolean>
getClaudeCodeConfigPath: () => Promise<string>
selectConfigFile: () => Promise<string | null>
checkStatus: (provider: Provider) => Promise<boolean>
openExternal: (url: string) => Promise<boolean>
}
}
}