feat: parse pasted JSON to auto-fill provider form fields

This commit is contained in:
程序员阿江(Relakkes) 2026-04-07 14:03:50 +08:00
parent b49a8b6c9b
commit f4dce4985d

View File

@ -1,4 +1,4 @@
import { useState, useEffect } from 'react'
import { useState, useEffect, useRef } from 'react'
import { useSettingsStore } from '../stores/settingsStore'
import { useProviderStore } from '../stores/providerStore'
import { useUIStore } from '../stores/uiStore'
@ -232,9 +232,15 @@ function ProviderFormModal({ open, onClose, mode, provider }: ProviderFormProps)
const [isTesting, setIsTesting] = useState(false)
const [settingsJson, setSettingsJson] = useState('')
const [settingsJsonError, setSettingsJsonError] = useState<string | null>(null)
const jsonPastedRef = useRef(false)
// Load current settings.json and merge provider env vars
useEffect(() => {
// Skip if JSON was just populated by user paste
if (jsonPastedRef.current) {
jsonPastedRef.current = false
return
}
import('../api/settings').then(({ settingsApi }) => {
settingsApi.getUser().then((settings) => {
const merged = {
@ -423,10 +429,36 @@ function ProviderFormModal({ open, onClose, mode, provider }: ProviderFormProps)
<textarea
value={settingsJson}
onChange={(e) => {
setSettingsJson(e.target.value)
const raw = e.target.value
setSettingsJson(raw)
try {
JSON.parse(e.target.value)
const parsed = JSON.parse(raw)
setSettingsJsonError(null)
// Auto-fill form fields from parsed JSON env
const env = parsed.env as Record<string, string> | undefined
if (env) {
if (env.ANTHROPIC_BASE_URL) {
setBaseUrl(env.ANTHROPIC_BASE_URL)
// Auto-switch to matching preset or Custom
if (mode === 'create') {
const matchedPreset = availablePresets.find((p) => p.id !== 'custom' && p.baseUrl === env.ANTHROPIC_BASE_URL)
const targetPreset = matchedPreset || availablePresets.find((p) => p.id === 'custom')!
if (targetPreset.id !== selectedPreset.id) {
jsonPastedRef.current = true
setSelectedPreset(targetPreset)
}
}
}
if (env.ANTHROPIC_AUTH_TOKEN && env.ANTHROPIC_AUTH_TOKEN !== '(your API key)') setApiKey(env.ANTHROPIC_AUTH_TOKEN)
const newModels: Partial<ModelMapping> = {}
if (env.ANTHROPIC_MODEL) newModels.main = env.ANTHROPIC_MODEL
if (env.ANTHROPIC_DEFAULT_HAIKU_MODEL) newModels.haiku = env.ANTHROPIC_DEFAULT_HAIKU_MODEL
if (env.ANTHROPIC_DEFAULT_SONNET_MODEL) newModels.sonnet = env.ANTHROPIC_DEFAULT_SONNET_MODEL
if (env.ANTHROPIC_DEFAULT_OPUS_MODEL) newModels.opus = env.ANTHROPIC_DEFAULT_OPUS_MODEL
if (Object.keys(newModels).length > 0) {
setModels((prev) => ({ ...prev, ...newModels }))
}
}
} catch (err) {
setSettingsJsonError(err instanceof Error ? err.message : 'Invalid JSON')
}