diff --git a/components/Button.tsx b/components/Button.tsx index 1498a975..1a73ad01 100644 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -47,7 +47,7 @@ export const Button: React.FC> = ({ { + const { + jellyseerrApi, + jellyseerrUser, + setJellyseerrUser, + clearAllJellyseerData, + } = useJellyseerr(); + + const [user] = useAtom(userAtom); + const [settings, updateSettings] = useSettings(); + + const [promptForJellyseerrPass, setPromptForJellyseerrPass] = + useState(false); + + const [jellyseerrPassword, setJellyseerrPassword] = useState< + string | undefined + >(undefined); + + const [jellyseerrServerUrl, setjellyseerrServerUrl] = useState< + string | undefined + >(settings?.jellyseerrServerUrl || undefined); + + const loginToJellyseerrMutation = useMutation({ + mutationFn: async () => { + if (!jellyseerrServerUrl || !user?.Name || !jellyseerrPassword) { + throw new Error("Missing required information for login"); + } + const jellyseerrTempApi = new JellyseerrApi(jellyseerrServerUrl); + return jellyseerrTempApi.login(user.Name, jellyseerrPassword); + }, + onSuccess: (user) => { + setJellyseerrUser(user); + updateSettings({ jellyseerrServerUrl }); + }, + onError: () => { + toast.error("Failed to login"); + }, + onSettled: () => { + setJellyseerrPassword(undefined); + }, + }); + + const testJellyseerrServerUrlMutation = useMutation({ + mutationFn: async () => { + if (!jellyseerrServerUrl || jellyseerrApi) return null; + const jellyseerrTempApi = new JellyseerrApi(jellyseerrServerUrl); + return jellyseerrTempApi.test(); + }, + onSuccess: (result) => { + if (result && result.isValid) { + if (result.requiresPass) { + setPromptForJellyseerrPass(true); + } else { + updateSettings({ jellyseerrServerUrl }); + } + } else { + setPromptForJellyseerrPass(false); + setjellyseerrServerUrl(undefined); + clearAllJellyseerData(); + } + }, + }); + + const clearData = () => { + clearAllJellyseerData().finally(() => { + setjellyseerrServerUrl(undefined); + setPromptForJellyseerrPass(false); + }); + }; + + return ( + + Jellyseerr + + {jellyseerrUser ? ( + + + + + + + + + + + ) : ( + + + This integration is in its early stages. Expect things to change. + + Server URL + + + Example: http(s)://your-host.url + + + (add port if required) + + + + + + + + Password + + + + + )} + + + ); +}; diff --git a/components/settings/SettingToggles.tsx b/components/settings/SettingToggles.tsx index 73d197a6..a83f95f8 100644 --- a/components/settings/SettingToggles.tsx +++ b/components/settings/SettingToggles.tsx @@ -21,7 +21,7 @@ import * as BackgroundFetch from "expo-background-fetch"; import * as ScreenOrientation from "expo-screen-orientation"; import * as TaskManager from "expo-task-manager"; import { useAtom } from "jotai"; -import React, {useCallback, useEffect, useRef, useState} from "react"; +import React, { useCallback, useEffect, useRef, useState } from "react"; import { Linking, Switch, @@ -40,35 +40,23 @@ import { Stepper } from "@/components/inputs/Stepper"; import { MediaProvider } from "./MediaContext"; import { SubtitleToggles } from "./SubtitleToggles"; import { AudioToggles } from "./AudioToggles"; -import {JellyseerrApi, useJellyseerr} from "@/hooks/useJellyseerr"; -import {ListItem} from "@/components/ListItem"; +import { JellyseerrApi, useJellyseerr } from "@/hooks/useJellyseerr"; +import { ListItem } from "@/components/ListItem"; +import { JellyseerrSettings } from "./Jellyseerr"; interface Props extends ViewProps {} export const SettingToggles: React.FC = ({ ...props }) => { const [settings, updateSettings] = useSettings(); const { setProcesses } = useDownload(); - const { - jellyseerrApi, - jellyseerrUser, - setJellyseerrUser , - clearAllJellyseerData - } = useJellyseerr(); const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); - const jellyseerrPassInputRef = useRef(null); const [marlinUrl, setMarlinUrl] = useState(""); - const [promptForJellyseerrPass, setPromptForJellyseerrPass] = useState(false); - const [isJellyseerrLoading, setIsLoadingJellyseerr] = useState(false); - const [jellyseerrPassword, setJellyseerrPassword] = useState(undefined); const [optimizedVersionsServerUrl, setOptimizedVersionsServerUrl] = useState(settings?.optimizedVersionsServerUrl || ""); - const [jellyseerrServerUrl, setjellyseerrServerUrl] = - useState(settings?.jellyseerrServerUrl || undefined); - const queryClient = useQueryClient(); /******************** @@ -123,49 +111,6 @@ export const SettingToggles: React.FC = ({ ...props }) => { staleTime: 0, }); - const loginToJellyseerr = useCallback(() => { - if (jellyseerrServerUrl && user?.Name && jellyseerrPassword) { - setIsLoadingJellyseerr(true) - const jellyseerrTempApi = new JellyseerrApi(jellyseerrServerUrl); - jellyseerrTempApi.login(user?.Name, jellyseerrPassword) - .then(user => { - setJellyseerrUser(user); - updateSettings({jellyseerrServerUrl}) - }) - .catch(() => { - toast.error("Failed to login to jellyseerr!") - }) - .finally(() => { - setJellyseerrPassword(undefined); - setPromptForJellyseerrPass(false) - setIsLoadingJellyseerr(false) - }) - } - }, [user, jellyseerrServerUrl, jellyseerrPassword]); - - const testJellyseerrServerUrl = useCallback(async () => { - if (!jellyseerrServerUrl || jellyseerrApi) - return; - - setIsLoadingJellyseerr(true) - const jellyseerrTempApi = new JellyseerrApi(jellyseerrServerUrl); - - jellyseerrTempApi.test().then(result => { - if (result.isValid) { - if (result.requiresPass) - setPromptForJellyseerrPass(true) - // promptForJellyseerrLogin() - else - updateSettings({jellyseerrServerUrl}) - } - else { - setPromptForJellyseerrPass(false) - setjellyseerrServerUrl(undefined); - clearAllJellyseerData(); - } - }).finally(() => setIsLoadingJellyseerr(false)) - }, [jellyseerrServerUrl]) - if (!settings) return null; return ( @@ -692,98 +637,7 @@ export const SettingToggles: React.FC = ({ ...props }) => { - - Jellyseerr - - {jellyseerrUser && <> - - - - - - - - } - - - - - - Server URL - - - - Set the URL for your jellyseerr instance. - - Example: http(s)://your-host.url - (add port if required) - This integration is in its early stages. Expect things to change. - - - - {promptForJellyseerrPass && - - } - - - {isJellyseerrLoading && - - } - - - + ); };