import { router } from 'expo-router'; import { zodResolver } from '@hookform/resolvers/zod'; import { Globe, KeyRound } from 'lucide-react-native'; 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 { useScreenInteractive } from '@/src/hooks/use-screen-interactive'; import { isLocalProxyBaseUrl } from '@/src/lib/admin-fetch'; import { queryClient } from '@/src/lib/query-client'; import { adminConfigState, 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 LoginScreen() { useScreenInteractive('login_interactive'); const config = useSnapshot(adminConfigState); const { control, handleSubmit, formState } = useForm({ resolver: zodResolver(schema), defaultValues: { baseUrl: config.baseUrl, adminApiKey: config.adminApiKey, }, }); return ( 添加、切换或恢复 Sub2API 账号。} variant="minimal" > {config.accounts.length > 0 ? ( {config.accounts.map((account: AdminAccountProfile) => { const active = account.id === config.activeAccountId; const enabled = account.enabled !== false; return ( {account.label} {account.baseUrl} { await switchAdminAccount(account.id); queryClient.clear(); router.replace('/monitor'); }} disabled={!enabled} > {active ? '使用中' : '切换账号'} { await setAdminAccountEnabled(account.id, account.enabled === false); }} > {enabled ? '禁用' : '启用'} { await removeAdminAccount(account.id); }} > 删除 ); })} ) : null} ( )} /> ( )} /> {(formState.errors.baseUrl || formState.errors.adminApiKey) ? ( {formState.errors.baseUrl?.message || formState.errors.adminApiKey?.message} ) : null} { await saveAdminConfig(values); queryClient.clear(); router.replace('/monitor'); })} > {config.saving ? '登录中...' : '进入管理台'} ); }