import { router } from 'expo-router'; import { zodResolver } from '@hookform/resolvers/zod'; import { Controller, useForm } from 'react-hook-form'; import { Pressable, RefreshControl, ScrollView, Text, TextInput, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useState } from 'react'; import { z } from 'zod'; import { getAdminSettings, getDashboardStats } from '@/src/services/admin'; import { queryClient } from '@/src/lib/query-client'; import { adminConfigState, removeAdminAccount, saveAdminConfig, switchAdminAccount, type AdminAccountProfile } from '@/src/store/admin-config'; const { useSnapshot } = require('valtio/react'); const schema = z .object({ baseUrl: z.string().min(1, '请输入服务器地址'), adminApiKey: z.string(), }) .refine((values) => values.adminApiKey.trim().length > 0, { path: ['adminApiKey'], message: '请输入 Admin Key', }); type FormValues = z.infer; type ConnectionState = 'idle' | 'checking' | 'success' | 'error'; const colors = { page: '#f4efe4', card: '#fbf8f2', mutedCard: '#f1ece2', primary: '#1d5f55', text: '#16181a', subtext: '#6f665c', border: '#e7dfcf', dangerBg: '#fbf1eb', danger: '#c25d35', successBg: '#e6f4ee', success: '#1d5f55', }; function getConnectionErrorMessage(error: unknown) { if (error instanceof Error && error.message) { switch (error.message) { case 'BASE_URL_REQUIRED': return '请先填写服务器地址。'; case 'ADMIN_API_KEY_REQUIRED': return '请先填写 Admin Key。'; case 'INVALID_SERVER_RESPONSE': return '当前地址返回的数据不正确,请确认它是可用的管理接口。'; default: return error.message; } } return '连接失败,请检查服务器地址、Admin Key 和网络连通性。'; } function ServerCard({ account, active, onSelect, onDelete, }: { account: AdminAccountProfile; active: boolean; onSelect: () => Promise; onDelete: () => Promise; }) { return ( {account.label} {account.baseUrl} 更新时间 {new Date(account.updatedAt).toLocaleString()} {active ? ( 当前使用 ) : null} {active ? '已选中' : '切换到此服务器'} 删除 ); } export default function SettingsScreen() { const config = useSnapshot(adminConfigState); const [showForm, setShowForm] = useState(config.accounts.length === 0); const [connectionState, setConnectionState] = useState('idle'); const [connectionMessage, setConnectionMessage] = useState(''); const [isRefreshing, setIsRefreshing] = useState(false); const [showAdminKey, setShowAdminKey] = useState(false); const { control, handleSubmit, formState, reset } = useForm({ resolver: zodResolver(schema), defaultValues: { baseUrl: '', adminApiKey: '', }, }); async function verifyAndEnter(successMessage: string) { setConnectionState('checking'); setConnectionMessage('正在检测当前服务是否可用...'); try { queryClient.clear(); await queryClient.fetchQuery({ queryKey: ['admin-settings'], queryFn: getAdminSettings }); await queryClient.prefetchQuery({ queryKey: ['monitor-stats'], queryFn: getDashboardStats }); setConnectionState('success'); setConnectionMessage(successMessage); router.replace('/monitor'); } catch (error) { setConnectionState('error'); setConnectionMessage(getConnectionErrorMessage(error)); } } async function handleAdd(values: FormValues) { await saveAdminConfig(values); reset({ baseUrl: '', adminApiKey: '' }); setShowForm(false); await verifyAndEnter('服务器已添加并切换成功。'); } async function handleSelect(account: AdminAccountProfile) { await switchAdminAccount(account.id); await verifyAndEnter(`已切换到 ${account.label}。`); } async function handleDelete(account: AdminAccountProfile) { await removeAdminAccount(account.id); queryClient.clear(); } async function handleRefresh() { if (!config.baseUrl.trim()) { return; } setIsRefreshing(true); setConnectionState('idle'); setConnectionMessage(''); try { await Promise.all([ queryClient.fetchQuery({ queryKey: ['admin-settings'], queryFn: getAdminSettings }), queryClient.prefetchQuery({ queryKey: ['monitor-stats'], queryFn: getDashboardStats }), ]); } catch (error) { setConnectionState('error'); setConnectionMessage(getConnectionErrorMessage(error)); } finally { setIsRefreshing(false); } } return ( void handleRefresh()} tintColor="#1d5f55" />} > 服务器 选择当前管理的服务器,或添加新的服务器。 { setShowForm((value) => !value); setConnectionState('idle'); setConnectionMessage(''); }} style={{ backgroundColor: colors.primary, borderRadius: 999, width: 42, height: 42, alignItems: 'center', justifyContent: 'center' }} > + {showForm ? ( 添加服务器 服务器地址 ( )} /> Admin Key ( setShowAdminKey((value) => !value)} style={{ backgroundColor: colors.border, borderRadius: 12, paddingHorizontal: 12, paddingVertical: 10 }} > {showAdminKey ? '隐藏' : '显示'} )} /> {formState.errors.baseUrl || formState.errors.adminApiKey ? ( {formState.errors.baseUrl?.message || formState.errors.adminApiKey?.message} ) : null} {connectionMessage ? ( {connectionMessage} ) : null} {connectionState === 'checking' ? '检测中...' : '保存并使用'} { setShowForm(false); setConnectionState('idle'); setConnectionMessage(''); reset({ baseUrl: '', adminApiKey: '' }); }} style={{ flex: 1, backgroundColor: colors.border, borderRadius: 16, paddingVertical: 14, alignItems: 'center' }} > 取消 ) : null} {config.accounts.map((account: AdminAccountProfile) => ( handleSelect(account)} onDelete={() => handleDelete(account)} /> ))} {config.accounts.length === 0 ? ( 还没有服务器 点击右上角 + 添加服务器,保存成功后会自动切换并进入概览。 ) : null} ); }