refactor(hooks): improve config state hooks for codex and gemini

- Improve type safety in config state management
- Better error handling for config parsing
This commit is contained in:
YoVinchen
2026-01-25 03:45:19 +08:00
parent 86cfa452e9
commit 628a659c0e
2 changed files with 32 additions and 22 deletions
@@ -1,4 +1,5 @@
import { useState, useCallback, useEffect, useRef } from "react";
import { useTranslation } from "react-i18next";
import {
extractCodexBaseUrl,
setCodexBaseUrl as setCodexBaseUrlInConfig,
@@ -18,6 +19,7 @@ interface UseCodexConfigStateProps {
* Codex 配置包含两部分:auth.json (JSON) 和 config.toml (TOML 字符串)
*/
export function useCodexConfigState({ initialData }: UseCodexConfigStateProps) {
const { t } = useTranslation();
const [codexAuth, setCodexAuthState] = useState("");
const [codexConfig, setCodexConfigState] = useState("");
const [codexApiKey, setCodexApiKey] = useState("");
@@ -109,18 +111,21 @@ export function useCodexConfigState({ initialData }: UseCodexConfigStateProps) {
}, [codexAuth, codexApiKey]);
// 验证 Codex Auth JSON
const validateCodexAuth = useCallback((value: string): string => {
if (!value.trim()) return "";
try {
const parsed = JSON.parse(value);
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
return "Auth JSON must be an object";
const validateCodexAuth = useCallback(
(value: string): string => {
if (!value.trim()) return "";
try {
const parsed = JSON.parse(value);
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
return t("providerForm.authJsonRequired");
}
return "";
} catch {
return t("providerForm.authJsonError");
}
return "";
} catch {
return "Invalid JSON format";
}
}, []);
},
[t],
);
// 设置 auth 并验证
const setCodexAuth = useCallback(
@@ -1,4 +1,5 @@
import { useState, useCallback, useEffect } from "react";
import { useTranslation } from "react-i18next";
interface UseGeminiConfigStateProps {
initialData?: {
@@ -13,6 +14,7 @@ interface UseGeminiConfigStateProps {
export function useGeminiConfigState({
initialData,
}: UseGeminiConfigStateProps) {
const { t } = useTranslation();
const [geminiEnv, setGeminiEnvState] = useState("");
const [geminiConfig, setGeminiConfigState] = useState("");
const [geminiApiKey, setGeminiApiKey] = useState("");
@@ -119,18 +121,21 @@ export function useGeminiConfigState({
}, [geminiEnv, envStringToObj, geminiApiKey, geminiBaseUrl, geminiModel]);
// 验证 Gemini Config JSON
const validateGeminiConfig = useCallback((value: string): string => {
if (!value.trim()) return ""; // 空值允许
try {
const parsed = JSON.parse(value);
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return "";
const validateGeminiConfig = useCallback(
(value: string): string => {
if (!value.trim()) return ""; // 空值允许
try {
const parsed = JSON.parse(value);
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return "";
}
return t("providerForm.configJsonError");
} catch {
return t("providerForm.configJsonError");
}
return "Config must be a JSON object";
} catch {
return "Invalid JSON format";
}
}, []);
},
[t],
);
// 设置 env
const setGeminiEnv = useCallback((value: string) => {