From 85929c285496a229634e07cdd50d248c5e98598d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Sep 2025 18:15:50 +0000
Subject: [PATCH] Add 'Add New Server' functionality without requiring logout
Co-authored-by: retardgerman <78982850+retardgerman@users.noreply.github.com>
---
app/(auth)/(tabs)/(home)/settings.tsx | 3 +
components/settings/AddNewServer.tsx | 124 ++++++++++++++++++++++++++
2 files changed, 127 insertions(+)
create mode 100644 components/settings/AddNewServer.tsx
diff --git a/app/(auth)/(tabs)/(home)/settings.tsx b/app/(auth)/(tabs)/(home)/settings.tsx
index afcb5e85..97d22a47 100644
--- a/app/(auth)/(tabs)/(home)/settings.tsx
+++ b/app/(auth)/(tabs)/(home)/settings.tsx
@@ -7,6 +7,7 @@ import { useSafeAreaInsets } from "react-native-safe-area-context";
import { Text } from "@/components/common/Text";
import { ListGroup } from "@/components/list/ListGroup";
import { ListItem } from "@/components/list/ListItem";
+import { AddNewServer } from "@/components/settings/AddNewServer";
import { AppLanguageSelector } from "@/components/settings/AppLanguageSelector";
import { AudioToggles } from "@/components/settings/AudioToggles";
import { ChromecastSettings } from "@/components/settings/ChromecastSettings";
@@ -67,6 +68,8 @@ export default function settings() {
+
+
diff --git a/components/settings/AddNewServer.tsx b/components/settings/AddNewServer.tsx
new file mode 100644
index 00000000..1db56dac
--- /dev/null
+++ b/components/settings/AddNewServer.tsx
@@ -0,0 +1,124 @@
+import { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { Alert, View, type ViewProps } from "react-native";
+import { useJellyfin } from "@/providers/JellyfinProvider";
+import { ListGroup } from "../list/ListGroup";
+import { ListItem } from "../list/ListItem";
+import { Input } from "../common/Input";
+import { Button } from "../Button";
+
+interface Props extends ViewProps {}
+
+export const AddNewServer: React.FC = ({ ...props }) => {
+ const [showForm, setShowForm] = useState(false);
+ const [serverUrl, setServerUrl] = useState("");
+ const [loading, setLoading] = useState(false);
+ const { addNewServer } = useJellyfin();
+ const { t } = useTranslation();
+
+ const handleAddServer = async () => {
+ if (!serverUrl.trim()) {
+ Alert.alert(t("login.error_title"), "Please enter a server URL");
+ return;
+ }
+
+ setLoading(true);
+ try {
+ // Validate URL format
+ const cleanUrl = serverUrl.trim().replace(/\/$/, "");
+
+ // Test connection to the server
+ const baseUrl = cleanUrl.replace(/^https?:\/\//i, "");
+ const protocols = ["https", "http"];
+ let validUrl: string | null = null;
+
+ for (const protocol of protocols) {
+ try {
+ const response = await fetch(
+ `${protocol}://${baseUrl}/System/Info/Public`,
+ { mode: "cors" }
+ );
+ if (response.ok) {
+ validUrl = `${protocol}://${baseUrl}`;
+ break;
+ }
+ } catch (error) {
+ // Continue to next protocol
+ }
+ }
+
+ if (!validUrl) {
+ Alert.alert(
+ t("login.connection_failed"),
+ t("login.could_not_connect_to_server")
+ );
+ return;
+ }
+
+ // Add the server to the list
+ await addNewServer({ address: validUrl });
+
+ Alert.alert(
+ "Success",
+ `Server ${validUrl} has been added to your server list. You can now switch to it from Quick Switch Servers.`
+ );
+
+ setServerUrl("");
+ setShowForm(false);
+ } catch (error) {
+ console.error("Failed to add server:", error);
+ Alert.alert(
+ t("login.error_title"),
+ "Failed to add server. Please try again."
+ );
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+ {!showForm ? (
+ setShowForm(true)}
+ title="Add Server"
+ icon="add"
+ showArrow
+ />
+ ) : (
+
+
+
+
+
+
+
+ )}
+
+
+ );
+};
\ No newline at end of file