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