import { useState } from "react"; import { Keyboard, KeyboardAvoidingView, Platform, Pressable, Text, TouchableWithoutFeedback, View, } from "react-native"; import { Redirect, useRouter } from "expo-router"; import Logo from "@/components/Logo"; import { TailwindResolver } from "@/components/TailwindResolver"; import { Button, buttonVariants } from "@/components/ui/Button"; import { Input } from "@/components/ui/Input"; import useAppSettings from "@/lib/settings"; import { api } from "@/lib/trpc"; import { cn } from "@/lib/utils"; import { Bug } from "lucide-react-native"; enum LoginType { Password, ApiKey, } export default function Signin() { const { settings, setSettings } = useAppSettings(); const router = useRouter(); const [error, setError] = useState(); const [loginType, setLoginType] = useState(LoginType.Password); const toggleLoginType = () => { setLoginType((prev) => { if (prev === LoginType.Password) { return LoginType.ApiKey; } else { return LoginType.Password; } }); }; const { mutate: login, isPending: userNamePasswordRequestIsPending } = api.apiKeys.exchange.useMutation({ onSuccess: (resp) => { setSettings({ ...settings, apiKey: resp.key, apiKeyId: resp.id }); }, onError: (e) => { if (e.data?.code === "UNAUTHORIZED") { setError("Wrong username or password"); } else { setError(`${e.message}`); } }, }); const { mutate: validateApiKey, isPending: apiKeyValueRequestIsPending } = api.apiKeys.validate.useMutation({ onSuccess: () => { setSettings({ ...settings, apiKey: formState.apiKey }); }, onError: (e) => { if (e.data?.code === "UNAUTHORIZED") { setError("Invalid API key"); } else { setError(`${e.message}`); } }, }); const [formState, setFormState] = useState<{ serverAddress: string; email: string; password: string; apiKey: string; }>({ serverAddress: "", email: "", password: "", apiKey: "", }); if (settings.apiKey) { return ; } const onSignin = () => { if (!formState.serverAddress) { setError("Server address is required"); return; } if ( !formState.serverAddress.startsWith("http://") && !formState.serverAddress.startsWith("https://") ) { setError("Server address must start with http:// or https://"); return; } if (loginType === LoginType.Password) { const randStr = (Math.random() + 1).toString(36).substring(5); login({ email: formState.email, password: formState.password, keyName: `Mobile App: (${randStr})`, }); } else if (loginType === LoginType.ApiKey) { validateApiKey({ apiKey: formState.apiKey }); } }; return ( ( )} /> {error && ( {error} )} Server Address { setFormState((s) => ({ ...s, serverAddress: e })); setSettings({ ...settings, address: e.replace(/\/$/, "") }); }} /> {loginType === LoginType.Password && ( <> Email setFormState((s) => ({ ...s, email: e.trim() })) } /> Password setFormState((s) => ({ ...s, password: e })) } /> )} {loginType === LoginType.ApiKey && ( API Key setFormState((s) => ({ ...s, apiKey: e }))} /> )}