aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mobile/app/signin.tsx
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-03-13 21:43:44 +0000
committerMohamed Bassem <me@mbassem.com>2024-03-14 16:40:45 +0000
commit04572a8e5081b1e4871e273cde9dbaaa44c52fe0 (patch)
tree8e993acb732a50d1306d4d6953df96c165c57f57 /apps/mobile/app/signin.tsx
parent2df08ed08c065e8b91bc8df0266bd4bcbb062be4 (diff)
downloadkarakeep-04572a8e5081b1e4871e273cde9dbaaa44c52fe0.tar.zst
structure: Create apps dir and copy tooling dir from t3-turbo repo
Diffstat (limited to 'apps/mobile/app/signin.tsx')
-rw-r--r--apps/mobile/app/signin.tsx101
1 files changed, 101 insertions, 0 deletions
diff --git a/apps/mobile/app/signin.tsx b/apps/mobile/app/signin.tsx
new file mode 100644
index 00000000..a89b0087
--- /dev/null
+++ b/apps/mobile/app/signin.tsx
@@ -0,0 +1,101 @@
+import { useRouter } from "expo-router";
+import { useEffect, useState } from "react";
+import { View, Text } from "react-native";
+
+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<string | undefined>();
+
+ 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 (
+ <View className="flex h-full flex-col justify-center gap-2 px-4">
+ <View className="items-center">
+ <Logo />
+ </View>
+ {error && (
+ <Text className="w-full text-center text-red-500">{error}</Text>
+ )}
+ <View className="gap-2">
+ <Text className="font-bold">Server Address</Text>
+ <Input
+ className="w-full"
+ placeholder="Server Address"
+ value={settings.address}
+ autoCapitalize="none"
+ keyboardType="url"
+ onEndEditing={(e) =>
+ setSettings({ ...settings, address: e.nativeEvent.text })
+ }
+ />
+ </View>
+ <View className="gap-2">
+ <Text className="font-bold">Email</Text>
+ <Input
+ className="w-full"
+ placeholder="Email"
+ keyboardType="email-address"
+ autoCapitalize="none"
+ value={formData.email}
+ onChangeText={(e) => setFormData((s) => ({ ...s, email: e }))}
+ />
+ </View>
+ <View className="gap-2">
+ <Text className="font-bold">Password</Text>
+ <Input
+ className="w-full"
+ placeholder="Password"
+ secureTextEntry
+ value={formData.password}
+ onChangeText={(e) => setFormData((s) => ({ ...s, password: e }))}
+ />
+ </View>
+ <Button
+ className="w-full"
+ label="Sign In"
+ onPress={onSignin}
+ disabled={isPending}
+ />
+ </View>
+ );
+}