import { useEffect, useState } from "react"; import { Keyboard, KeyboardAvoidingView, Platform, Text, TouchableWithoutFeedback, View, } from "react-native"; import { useRouter } from "expo-router"; import Logo from "@/components/Logo"; import { Button } from "@/components/ui/Button"; import { Input } from "@/components/ui/Input"; import useAppSettings from "@/lib/settings"; import { api } from "@/lib/trpc"; export default function Signin() { const router = useRouter(); const { settings, setSettings } = useAppSettings(); const [error, setError] = useState(); const { mutate: login, isPending } = api.apiKeys.exchange.useMutation({ onSuccess: (resp) => { setSettings({ ...settings, apiKey: resp.key }); router.replace("dashboard"); }, onError: (e) => { if (e.data?.code === "UNAUTHORIZED") { setError("Wrong username or password"); } else { setError(`${e.message}`); } }, }); const [formData, setFormData] = useState<{ email: string; password: string; }>({ email: "", password: "", }); useEffect(() => { if (settings.apiKey) { router.navigate("dashboard"); } }, [settings]); const onSignin = () => { const randStr = (Math.random() + 1).toString(36).substring(5); login({ ...formData, keyName: `Mobile App: (${randStr})` }); }; return ( {error && ( {error} )} Server Address setSettings({ ...settings, address: e }) } /> Email setFormData((s) => ({ ...s, email: e }))} /> Password setFormData((s) => ({ ...s, password: e }))} />