import { createApiClient } from '@pipu/api-client'; import { checkServer, normalizeServerUrl, type ServerCheck } from '@pipu/core'; import { useQuery } from '@tanstack/react-query'; import Constants from 'expo-constants'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Pressable, ScrollView, Text, View } from 'react-native'; import { useSessionCtx } from '../lib/session'; import { forgetServer, loadServers } from '../lib/storage'; import { radius, useColors } from '../theme'; import { Button, ErrorBox, Field, H1, Icon, Muted, Screen } from '../ui/kit'; const appVersionCode = Number(Constants.expoConfig?.extra?.versionCode ?? 0); /** Подключение: адрес → проверка /server-info (версия, совместимость) → вход. */ export default function ConnectScreen() { const colors = useColors(); const { t } = useTranslation(); const { connect } = useSessionCtx(); const [address, setAddress] = useState(''); const [checking, setChecking] = useState(false); const [result, setResult] = useState(null); const servers = useQuery({ queryKey: ['saved-servers'], queryFn: loadServers }); const onConnect = async (raw = address) => { const baseUrl = normalizeServerUrl(raw); if (!baseUrl) return setResult('invalid'); setChecking(true); const res = await checkServer(createApiClient({ baseUrl }), appVersionCode); setChecking(false); setResult(res); if (res.status === 'ok') await connect(baseUrl, res.info.version); }; return (

{t('app.name')}

{t('app.tagline')} void onConnect()} placeholder="https://music.home.lan" keyboardType="url" editable={!checking} /> {result === 'invalid' && {t('server.invalid_address')}} {result !== null && result !== 'invalid' && result.status === 'unsupported_app' && ( {t('server.unsupported_app')} )} {result !== null && result !== 'invalid' && result.status === 'offline' && {t('server.offline')}}