import { useMutation } from "@tanstack/react-query"; import { useAtom } from "jotai"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { View } from "react-native"; import { toast } from "sonner-native"; import { JellyseerrApi, useJellyseerr } from "@/hooks/useJellyseerr"; import { userAtom } from "@/providers/JellyfinProvider"; import { useSettings } from "@/utils/atoms/settings"; import { jellyseerrProbe } from "@/utils/serverUrl/probes/jellyseerr"; import { resolveServerUrl } from "@/utils/serverUrl/resolve"; import { Button } from "../Button"; import { Input } from "../common/Input"; import { ServerUrlField } from "../common/ServerUrlField"; import { Text } from "../common/Text"; import { ListGroup } from "../list/ListGroup"; import { ListItem } from "../list/ListItem"; export const JellyseerrSettings = () => { const { jellyseerrUser, setJellyseerrUser, clearAllJellyseerData } = useJellyseerr(); const { t } = useTranslation(); const [user] = useAtom(userAtom); const { settings, updateSettings } = useSettings(); const [jellyseerrPassword, setJellyseerrPassword] = useState< string | undefined >(undefined); const [jellyseerrServerUrl, setjellyseerrServerUrl] = useState( settings?.jellyseerrServerUrl ?? "", ); const [resolvedUrl, setResolvedUrl] = useState( settings?.jellyseerrServerUrl ?? undefined, ); const loginToJellyseerrMutation = useMutation({ mutationFn: async () => { if (!user?.Name) throw new Error("Missing required information for login"); // Prefer the already-resolved URL; otherwise resolve the raw input now // (covers tapping Login before the field's on-blur resolve settled). let finalUrl = resolvedUrl || settings?.jellyseerrServerUrl || ""; if (!finalUrl && jellyseerrServerUrl) { const resolved = await resolveServerUrl( jellyseerrServerUrl, jellyseerrProbe, ); if (!resolved.ok) throw new Error("Invalid server url"); finalUrl = resolved.url; } if (!finalUrl) throw new Error("Missing server url"); const jellyseerrTempApi = new JellyseerrApi(finalUrl); const testResult = await jellyseerrTempApi.test(); if (!testResult.isValid) throw new Error("Invalid server url"); const loggedInUser = await jellyseerrTempApi.login( user.Name, jellyseerrPassword || "", ); return { user: loggedInUser, url: finalUrl }; }, onSuccess: ({ user: loggedInUser, url }) => { setJellyseerrUser(loggedInUser); setResolvedUrl(url); updateSettings({ jellyseerrServerUrl: url }); }, onError: () => { toast.error(t("jellyseerr.failed_to_login")); }, onSettled: () => { setJellyseerrPassword(undefined); }, }); const clearData = () => { clearAllJellyseerData().finally(() => { setJellyseerrUser(undefined); setJellyseerrPassword(undefined); setjellyseerrServerUrl(""); setResolvedUrl(undefined); }); }; return ( {jellyseerrUser ? ( <> ) : ( {t("home.settings.plugins.jellyseerr.jellyseerr_warning")} setResolvedUrl(url)} probe={jellyseerrProbe} minVersion='2.0.0' label={t("home.settings.plugins.jellyseerr.server_url")} hint={t("home.settings.plugins.jellyseerr.server_url_hint")} placeholder={t( "home.settings.plugins.jellyseerr.server_url_placeholder", )} editable={!loginToJellyseerrMutation.isPending} /> {t("home.settings.plugins.jellyseerr.password")} )} ); };