import { zodResolver } from '@hookform/resolvers/zod'; import { Controller, useForm } from 'react-hook-form'; import { Pressable, Text, TextInput, View } from 'react-native'; import { z } from 'zod'; import { ListCard } from '@/src/components/list-card'; import { ScreenShell } from '@/src/components/screen-shell'; import { isLocalProxyBaseUrl } from '@/src/lib/admin-fetch'; import { queryClient } from '@/src/lib/query-client'; import { adminConfigState, logoutAdminAccount, removeAdminAccount, saveAdminConfig, setAdminAccountEnabled, switchAdminAccount, type AdminAccountProfile, } from '@/src/store/admin-config'; const { useSnapshot } = require('valtio/react'); const schema = z .object({ baseUrl: z.string().min(1, '请输入 Host'), adminApiKey: z.string(), }) .superRefine((values, ctx) => { if (!isLocalProxyBaseUrl(values.baseUrl.trim()) && !values.adminApiKey.trim()) { ctx.addIssue({ code: 'custom', path: ['adminApiKey'], message: '请输入 Admin Token', }); } }); type FormValues = z.infer; export default function SettingsScreen() { const config = useSnapshot(adminConfigState); const { control, handleSubmit, formState, reset } = useForm({ resolver: zodResolver(schema), values: { baseUrl: config.baseUrl, adminApiKey: config.adminApiKey, }, }); async function handleSwitch(account: AdminAccountProfile) { await switchAdminAccount(account.id); queryClient.clear(); reset({ baseUrl: account.baseUrl, adminApiKey: account.adminApiKey }); } async function handleDelete(account: AdminAccountProfile) { await removeAdminAccount(account.id); queryClient.clear(); reset({ baseUrl: adminConfigState.baseUrl, adminApiKey: adminConfigState.adminApiKey }); } async function handleLogout() { await logoutAdminAccount(); queryClient.clear(); reset({ baseUrl: '', adminApiKey: '' }); } async function handleToggleEnabled(account: AdminAccountProfile) { await setAdminAccountEnabled(account.id, account.enabled === false); queryClient.clear(); reset({ baseUrl: adminConfigState.baseUrl, adminApiKey: adminConfigState.adminApiKey }); } return ( 管理 Sub2API 连接。} variant="minimal" > {config.baseUrl || '当前没有激活服务器,可在下方直接新增或切换。'} { await saveAdminConfig(values); queryClient.clear(); })}> 保存并连接 退出当前 Host ( )} /> Admin Token ( )} /> 使用本地代理时可留空 token;直连上游时必须填写。 {(formState.errors.baseUrl || formState.errors.adminApiKey) ? ( {formState.errors.baseUrl?.message || formState.errors.adminApiKey?.message} ) : null} {config.accounts.map((account: AdminAccountProfile) => { const active = account.id === config.activeAccountId; const enabled = account.enabled !== false; return ( {account.label} {account.baseUrl} {active ? ( 当前 ) : !enabled ? ( 已禁用 ) : null} handleSwitch(account)} disabled={!enabled} > {active ? '使用中' : '启用连接'} handleToggleEnabled(account)}> {enabled ? '禁用' : '启用'} handleDelete(account)}> 删除 ); })} {config.accounts.length === 0 ? 还没有保存的服务器。 : null} ); }