import { Redirect, router } from 'expo-router'; import { zodResolver } from '@hookform/resolvers/zod'; import { Controller, useForm } from 'react-hook-form'; import { Pressable, ScrollView, Text, TextInput, View } from 'react-native'; import { useState } from 'react'; import { SafeAreaView } from 'react-native-safe-area-context'; import { z } from 'zod'; import { getAdminSettings, getDashboardStats } from '@/src/services/admin'; import { queryClient } from '@/src/lib/query-client'; import { adminConfigState, saveAdminConfig } 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' | 'error'; const colors = { page: '#f4efe4', card: '#fbf8f2', mutedCard: '#f1ece2', primary: '#1d5f55', text: '#16181a', subtext: '#6f665c', border: '#e7dfcf', dangerBg: '#fbf1eb', danger: '#c25d35', }; 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 和网络连通性。'; } export default function LoginScreen() { const config = useSnapshot(adminConfigState); const hasAccount = Boolean(config.baseUrl.trim()); const { control, handleSubmit, formState } = useForm({ resolver: zodResolver(schema), defaultValues: { baseUrl: config.baseUrl, adminApiKey: config.adminApiKey, }, }); const [connectionState, setConnectionState] = useState('idle'); const [connectionMessage, setConnectionMessage] = useState(''); if (hasAccount) { return ; } return ( 管理员入口 首次进入请填写服务器地址和 Admin Key。连接成功后即可进入应用,并在“服务器”页管理多个服务器。 服务器地址 ( { if (connectionState !== 'idle') { setConnectionState('idle'); setConnectionMessage(''); } onChange(text); }} placeholder="例如:https://api.example.com" placeholderTextColor="#9b9081" autoCapitalize="none" autoCorrect={false} style={{ backgroundColor: colors.mutedCard, borderRadius: 16, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, color: colors.text }} /> )} /> Admin Key ( { if (connectionState !== 'idle') { setConnectionState('idle'); setConnectionMessage(''); } onChange(text); }} placeholder="admin-xxxxxxxx" placeholderTextColor="#9b9081" autoCapitalize="none" autoCorrect={false} style={{ backgroundColor: colors.mutedCard, borderRadius: 16, paddingHorizontal: 16, paddingVertical: 14, fontSize: 16, color: colors.text }} /> )} /> {formState.errors.baseUrl || formState.errors.adminApiKey ? ( {formState.errors.baseUrl?.message || formState.errors.adminApiKey?.message} ) : null} {connectionMessage ? ( {connectionMessage} ) : null} { setConnectionState('checking'); setConnectionMessage('正在验证服务器连接...'); try { await saveAdminConfig(values); queryClient.clear(); await queryClient.fetchQuery({ queryKey: ['admin-settings'], queryFn: getAdminSettings }); await queryClient.prefetchQuery({ queryKey: ['monitor-stats'], queryFn: getDashboardStats }); router.replace('/monitor'); } catch (error) { setConnectionState('error'); setConnectionMessage(getConnectionErrorMessage(error)); } })} > {connectionState === 'checking' ? '连接中...' : '进入应用'} ); }