diff --git a/src/renderer/components/AddProviderModal.tsx b/src/renderer/components/AddProviderModal.tsx index 4eff714..88a9c51 100644 --- a/src/renderer/components/AddProviderModal.tsx +++ b/src/renderer/components/AddProviderModal.tsx @@ -1,102 +1,111 @@ -import React, { useState } from 'react' -import { Provider } from '../../shared/types' -import { inferWebsiteUrl } from '../../shared/utils' -import './AddProviderModal.css' +import React, { useState } from "react"; +import { Provider } from "../../shared/types"; +import { inferWebsiteUrl } from "../../shared/utils"; +import "./AddProviderModal.css"; interface AddProviderModalProps { - onAdd: (provider: Omit) => void - onClose: () => void + onAdd: (provider: Omit) => void; + onClose: () => void; } -const AddProviderModal: React.FC = ({ onAdd, onClose }) => { +const AddProviderModal: React.FC = ({ + onAdd, + onClose, +}) => { const [formData, setFormData] = useState({ - name: '', - apiUrl: '', - apiKey: '', - websiteUrl: '' - }) - const [showPassword, setShowPassword] = useState(false) - const [error, setError] = useState('') + name: "", + apiUrl: "", + apiKey: "", + websiteUrl: "", + }); + const [showPassword, setShowPassword] = useState(false); + const [error, setError] = useState(""); const handleSubmit = (e: React.FormEvent) => { - e.preventDefault() - setError('') - + e.preventDefault(); + setError(""); + if (!formData.name || !formData.apiUrl || !formData.apiKey) { - setError('请填写所有必填字段') - return + setError("请填写所有必填字段"); + return; } - onAdd(formData) - } + onAdd(formData); + }; - const handleChange = (e: React.ChangeEvent) => { - const { name, value } = e.target + const handleChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; const newFormData = { ...formData, - [name]: value - } - + [name]: value, + }; + // 如果修改的是API地址,自动推测网站地址 - if (name === 'apiUrl') { - newFormData.websiteUrl = inferWebsiteUrl(value) + if (name === "apiUrl") { + newFormData.websiteUrl = inferWebsiteUrl(value); } - - setFormData(newFormData) - } + + setFormData(newFormData); + }; const handleApiUrlBlur = (e: React.FocusEvent) => { - const apiUrl = e.target.value.trim() + const apiUrl = e.target.value.trim(); if (apiUrl) { - let normalizedApiUrl = apiUrl - + let normalizedApiUrl = apiUrl; + // 如果没有协议,添加 https:// if (!normalizedApiUrl.match(/^https?:\/\//)) { - normalizedApiUrl = 'https://' + normalizedApiUrl + normalizedApiUrl = "https://" + normalizedApiUrl; } - - setFormData(prev => ({ + + setFormData((prev) => ({ ...prev, apiUrl: normalizedApiUrl, - websiteUrl: inferWebsiteUrl(normalizedApiUrl) - })) + websiteUrl: inferWebsiteUrl(normalizedApiUrl), + })); } - } + }; // 预设的供应商配置 const presets = [ { - name: 'YesCode', - apiUrl: 'https://co.yes.vg' + name: "Anthropic 官方", + apiUrl: "https://api.anthropic.com", }, { - name: 'PackyCode', - apiUrl: 'https://api.packycode.com' - } - ] + name: "PackyCode", + apiUrl: "https://api.packycode.com", + }, + { + name: "YesCode", + apiUrl: "https://co.yes.vg", + }, + { + name: "AnyRouter", + apiUrl: "https://anyrouter.top", + }, + ]; - const applyPreset = (preset: typeof presets[0]) => { + const applyPreset = (preset: (typeof presets)[0]) => { const newFormData = { ...formData, name: preset.name, - apiUrl: preset.apiUrl - } + apiUrl: preset.apiUrl, + }; // 应用预设时也自动推测网站地址 - newFormData.websiteUrl = inferWebsiteUrl(preset.apiUrl) - setFormData(newFormData) - } + newFormData.websiteUrl = inferWebsiteUrl(preset.apiUrl); + setFormData(newFormData); + }; return ( -
-
e.stopPropagation()}> +
+

添加新供应商

- - {error && ( -
- {error} -
- )} - + + {error &&
{error}
} +
@@ -151,7 +160,9 @@ const AddProviderModal: React.FC = ({ onAdd, onClose }) = onChange={handleChange} placeholder="https://example.com(可选)" /> - 用于在面板中显示可访问的网站链接,留空则显示API地址 + + 用于在面板中显示可访问的网站链接,留空则显示API地址 +
@@ -163,7 +174,7 @@ const AddProviderModal: React.FC = ({ onAdd, onClose }) = name="apiKey" value={formData.apiKey} onChange={handleChange} - placeholder={formData.name === 'YesCode' ? 'cr_...' : 'sk-...'} + placeholder={formData.name === "YesCode" ? "cr_..." : "sk-..."} required />
- ) -} + ); +}; -export default AddProviderModal \ No newline at end of file +export default AddProviderModal; diff --git a/src/renderer/components/EditProviderModal.tsx b/src/renderer/components/EditProviderModal.tsx index 5a52024..f86ee14 100644 --- a/src/renderer/components/EditProviderModal.tsx +++ b/src/renderer/components/EditProviderModal.tsx @@ -77,8 +77,8 @@ const EditProviderModal: React.FC = ({ provider, onSave, } return ( -
-
e.stopPropagation()}> +
+

编辑供应商

{error && (