From b8c586139f49231e5196eef5ec10401f527e5712 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:21:27 +0000 Subject: [PATCH] Add server switching functionality to settings Co-authored-by: retardgerman <78982850+retardgerman@users.noreply.github.com> --- app/(auth)/(tabs)/(home)/settings.tsx | 3 ++ components/settings/ServerSwitcher.tsx | 57 ++++++++++++++++++++++++++ providers/JellyfinProvider.tsx | 14 +++++++ translations/en.json | 5 ++- 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 components/settings/ServerSwitcher.tsx diff --git a/app/(auth)/(tabs)/(home)/settings.tsx b/app/(auth)/(tabs)/(home)/settings.tsx index 91f569df..afcb5e85 100644 --- a/app/(auth)/(tabs)/(home)/settings.tsx +++ b/app/(auth)/(tabs)/(home)/settings.tsx @@ -17,6 +17,7 @@ import { MediaToggles } from "@/components/settings/MediaToggles"; import { OtherSettings } from "@/components/settings/OtherSettings"; import { PluginSettings } from "@/components/settings/PluginSettings"; import { QuickConnect } from "@/components/settings/QuickConnect"; +import { ServerSwitcher } from "@/components/settings/ServerSwitcher"; import { StorageSettings } from "@/components/settings/StorageSettings"; import { SubtitleToggles } from "@/components/settings/SubtitleToggles"; import { UserInfo } from "@/components/settings/UserInfo"; @@ -64,6 +65,8 @@ export default function settings() { + + diff --git a/components/settings/ServerSwitcher.tsx b/components/settings/ServerSwitcher.tsx new file mode 100644 index 00000000..1d6e0db3 --- /dev/null +++ b/components/settings/ServerSwitcher.tsx @@ -0,0 +1,57 @@ +import type React from "react"; +import { useMemo } from "react"; +import { useTranslation } from "react-i18next"; +import { View, type ViewProps } from "react-native"; +import { useMMKVString } from "react-native-mmkv"; +import { useJellyfin } from "@/providers/JellyfinProvider"; +import { ListGroup } from "../list/ListGroup"; +import { ListItem } from "../list/ListItem"; + +interface Server { + address: string; +} + +interface Props extends ViewProps {} + +export const ServerSwitcher: React.FC = ({ ...props }) => { + const [_previousServers] = useMMKVString("previousServers"); + const { switchServer } = useJellyfin(); + const { t } = useTranslation(); + + const previousServers = useMemo(() => { + return JSON.parse(_previousServers || "[]") as Server[]; + }, [_previousServers]); + + const handleServerSwitch = async (server: Server) => { + try { + await switchServer(server); + } catch (error) { + console.error("Failed to switch server:", error); + } + }; + + if (!previousServers.length) { + return ( + + + + + + ); + } + + return ( + + + {previousServers.map((server) => ( + handleServerSwitch(server)} + title={server.address} + showArrow + /> + ))} + + + ); +}; diff --git a/providers/JellyfinProvider.tsx b/providers/JellyfinProvider.tsx index 4c99e0be..0a2c5105 100644 --- a/providers/JellyfinProvider.tsx +++ b/providers/JellyfinProvider.tsx @@ -40,6 +40,7 @@ interface JellyfinContextValue { discoverServers: (url: string) => Promise; setServer: (server: Server) => Promise; removeServer: () => void; + switchServer: (server: Server) => Promise; login: (username: string, password: string) => Promise; logout: () => Promise; initiateQuickConnect: () => Promise; @@ -297,6 +298,18 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({ }, }); + const switchServerMutation = useMutation({ + mutationFn: async (server: Server) => { + // First logout the current user + await logoutMutation.mutateAsync(); + // Then set the new server + await setServerMutation.mutateAsync(server); + }, + onError: (error) => { + console.error("Failed to switch server:", error); + }, + }); + const [loaded, setLoaded] = useState(false); const [initialLoaded, setInitialLoaded] = useState(false); @@ -340,6 +353,7 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({ discoverServers, setServer: (server) => setServerMutation.mutateAsync(server), removeServer: () => removeServerMutation.mutateAsync(), + switchServer: (server) => switchServerMutation.mutateAsync(server), login: (username, password) => loginMutation.mutateAsync({ username, password }), logout: () => logoutMutation.mutateAsync(), diff --git a/translations/en.json b/translations/en.json index b1ccbb80..65a11b3a 100644 --- a/translations/en.json +++ b/translations/en.json @@ -32,7 +32,10 @@ "clear_button": "Clear", "search_for_local_servers": "Search for local servers", "searching": "Searching...", - "servers": "Servers" + "servers": "Servers", + "quick_switch": "Quick Switch Servers", + "switch_server": "Switch Server", + "no_previous_servers": "No previous servers available" }, "home": { "no_internet": "No Internet",