fix: jellyseerr better login

This commit is contained in:
Fredrik Burmester
2025-02-19 11:36:47 +01:00
parent 0cf930d6e1
commit 77aef8877e
3 changed files with 61 additions and 71 deletions

View File

@@ -209,7 +209,12 @@ export default function search() {
paddingRight: insets.right, paddingRight: insets.right,
}} }}
> >
<View className="flex flex-col"> <View
className="flex flex-col"
style={{
marginTop: Platform.OS === "android" ? 16 : 0,
}}
>
{jellyseerrApi && ( {jellyseerrApi && (
<View className="flex flex-row flex-wrap space-x-2 px-4 mb-2"> <View className="flex flex-row flex-wrap space-x-2 px-4 mb-2">
<TouchableOpacity onPress={() => setSearchType("Library")}> <TouchableOpacity onPress={() => setSearchType("Library")}>

View File

@@ -317,7 +317,9 @@ const Login: React.FC = () => {
<Button <Button
loading={loadingServerCheck} loading={loadingServerCheck}
disabled={loadingServerCheck} disabled={loadingServerCheck}
onPress={async () => await handleConnect(serverURL)} onPress={async () => {
await handleConnect(serverURL);
}}
className="w-full grow" className="w-full grow"
> >
{t("server.connect_button")} {t("server.connect_button")}

View File

@@ -26,9 +26,6 @@ export const JellyseerrSettings = () => {
const [user] = useAtom(userAtom); const [user] = useAtom(userAtom);
const [settings, updateSettings, pluginSettings] = useSettings(); const [settings, updateSettings, pluginSettings] = useSettings();
const [promptForJellyseerrPass, setPromptForJellyseerrPass] =
useState<boolean>(false);
const [jellyseerrPassword, setJellyseerrPassword] = useState< const [jellyseerrPassword, setJellyseerrPassword] = useState<
string | undefined string | undefined
>(undefined); >(undefined);
@@ -39,10 +36,22 @@ export const JellyseerrSettings = () => {
const loginToJellyseerrMutation = useMutation({ const loginToJellyseerrMutation = useMutation({
mutationFn: async () => { mutationFn: async () => {
if (!jellyseerrServerUrl || !user?.Name || !jellyseerrPassword) { if (!jellyseerrServerUrl && !settings?.jellyseerrServerUrl) {
throw new Error("Missing server url");
}
if (!user?.Name || !jellyseerrPassword) {
throw new Error("Missing required information for login"); throw new Error("Missing required information for login");
} }
const jellyseerrTempApi = new JellyseerrApi(jellyseerrServerUrl); const jellyseerrTempApi = new JellyseerrApi(
jellyseerrServerUrl || settings.jellyseerrServerUrl || ""
);
const testResult = await jellyseerrTempApi.test();
if (!testResult.isValid) {
throw new Error("Invalid server url");
}
return jellyseerrTempApi.login(user.Name, jellyseerrPassword); return jellyseerrTempApi.login(user.Name, jellyseerrPassword);
}, },
onSuccess: (user) => { onSuccess: (user) => {
@@ -57,31 +66,11 @@ export const JellyseerrSettings = () => {
}, },
}); });
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 = () => { const clearData = () => {
clearAllJellyseerData().finally(() => { clearAllJellyseerData().finally(() => {
setJellyseerrUser(undefined);
setJellyseerrPassword(undefined);
setjellyseerrServerUrl(undefined); setjellyseerrServerUrl(undefined);
setPromptForJellyseerrPass(false);
}); });
}; };
@@ -92,34 +81,46 @@ export const JellyseerrSettings = () => {
<> <>
<ListGroup title={"Jellyseerr"}> <ListGroup title={"Jellyseerr"}>
<ListItem <ListItem
title={t("home.settings.plugins.jellyseerr.total_media_requests")} title={t(
"home.settings.plugins.jellyseerr.total_media_requests"
)}
value={jellyseerrUser?.requestCount?.toString()} value={jellyseerrUser?.requestCount?.toString()}
/> />
<ListItem <ListItem
title={t("home.settings.plugins.jellyseerr.movie_quota_limit")} title={t("home.settings.plugins.jellyseerr.movie_quota_limit")}
value={ value={
jellyseerrUser?.movieQuotaLimit?.toString() ?? t("home.settings.plugins.jellyseerr.unlimited") jellyseerrUser?.movieQuotaLimit?.toString() ??
t("home.settings.plugins.jellyseerr.unlimited")
} }
/> />
<ListItem <ListItem
title={t("home.settings.plugins.jellyseerr.movie_quota_days")} title={t("home.settings.plugins.jellyseerr.movie_quota_days")}
value={ value={
jellyseerrUser?.movieQuotaDays?.toString() ?? t("home.settings.plugins.jellyseerr.unlimited") jellyseerrUser?.movieQuotaDays?.toString() ??
t("home.settings.plugins.jellyseerr.unlimited")
} }
/> />
<ListItem <ListItem
title={t("home.settings.plugins.jellyseerr.tv_quota_limit")} title={t("home.settings.plugins.jellyseerr.tv_quota_limit")}
value={jellyseerrUser?.tvQuotaLimit?.toString() ?? t("home.settings.plugins.jellyseerr.unlimited")} value={
jellyseerrUser?.tvQuotaLimit?.toString() ??
t("home.settings.plugins.jellyseerr.unlimited")
}
/> />
<ListItem <ListItem
title={t("home.settings.plugins.jellyseerr.tv_quota_days")} title={t("home.settings.plugins.jellyseerr.tv_quota_days")}
value={jellyseerrUser?.tvQuotaDays?.toString() ?? t("home.settings.plugins.jellyseerr.unlimited")} value={
jellyseerrUser?.tvQuotaDays?.toString() ??
t("home.settings.plugins.jellyseerr.unlimited")
}
/> />
</ListGroup> </ListGroup>
<View className="p-4"> <View className="p-4">
<Button color="red" onPress={clearData}> <Button color="red" onPress={clearData}>
{t("home.settings.plugins.jellyseerr.reset_jellyseerr_config_button")} {t(
"home.settings.plugins.jellyseerr.reset_jellyseerr_config_button"
)}
</Button> </Button>
</View> </View>
</> </>
@@ -128,14 +129,19 @@ export const JellyseerrSettings = () => {
<Text className="text-xs text-red-600 mb-2"> <Text className="text-xs text-red-600 mb-2">
{t("home.settings.plugins.jellyseerr.jellyseerr_warning")} {t("home.settings.plugins.jellyseerr.jellyseerr_warning")}
</Text> </Text>
<Text className="font-bold mb-1">{t("home.settings.plugins.jellyseerr.server_url")}</Text> <Text className="font-bold mb-1">
{t("home.settings.plugins.jellyseerr.server_url")}
</Text>
<View className="flex flex-col shrink mb-2"> <View className="flex flex-col shrink mb-2">
<Text className="text-xs text-gray-600"> <Text className="text-xs text-gray-600">
{t("home.settings.plugins.jellyseerr.server_url_hint")} {t("home.settings.plugins.jellyseerr.server_url_hint")}
</Text> </Text>
</View> </View>
<Input <Input
placeholder={t("home.settings.plugins.jellyseerr.server_url_placeholder")} className="border border-neutral-800 mb-2"
placeholder={t(
"home.settings.plugins.jellyseerr.server_url_placeholder"
)}
value={settings?.jellyseerrServerUrl ?? jellyseerrServerUrl} value={settings?.jellyseerrServerUrl ?? jellyseerrServerUrl}
defaultValue={ defaultValue={
settings?.jellyseerrServerUrl ?? jellyseerrServerUrl settings?.jellyseerrServerUrl ?? jellyseerrServerUrl
@@ -145,40 +151,20 @@ export const JellyseerrSettings = () => {
autoCapitalize="none" autoCapitalize="none"
textContentType="URL" textContentType="URL"
onChangeText={setjellyseerrServerUrl} onChangeText={setjellyseerrServerUrl}
editable={!testJellyseerrServerUrlMutation.isPending} editable={!loginToJellyseerrMutation.isPending}
/> />
<View>
<Button <Text className="font-bold mb-2">
loading={testJellyseerrServerUrlMutation.isPending} {t("home.settings.plugins.jellyseerr.password")}
disabled={testJellyseerrServerUrlMutation.isPending} </Text>
color={promptForJellyseerrPass ? "red" : "purple"}
className="h-12 mt-2"
onPress={() => {
if (promptForJellyseerrPass) {
clearData();
return;
}
testJellyseerrServerUrlMutation.mutate();
}}
style={{
marginBottom: 8,
}}
>
{promptForJellyseerrPass ? t("home.settings.plugins.jellyseerr.clear_button") : t("home.settings.plugins.jellyseerr.save_button")}
</Button>
<View
pointerEvents={promptForJellyseerrPass ? "auto" : "none"}
style={{
opacity: promptForJellyseerrPass ? 1 : 0.5,
}}
>
<Text className="font-bold mb-2">{t("home.settings.plugins.jellyseerr.password")}</Text>
<Input <Input
className="border border-neutral-800"
autoFocus={true} autoFocus={true}
focusable={true} focusable={true}
placeholder={t("home.settings.plugins.jellyseerr.password_placeholder", {username: user?.Name})} placeholder={t(
"home.settings.plugins.jellyseerr.password_placeholder",
{ username: user?.Name }
)}
value={jellyseerrPassword} value={jellyseerrPassword}
keyboardType="default" keyboardType="default"
secureTextEntry={true} secureTextEntry={true}
@@ -186,10 +172,7 @@ export const JellyseerrSettings = () => {
autoCapitalize="none" autoCapitalize="none"
textContentType="password" textContentType="password"
onChangeText={setJellyseerrPassword} onChangeText={setJellyseerrPassword}
editable={ editable={!loginToJellyseerrMutation.isPending}
!loginToJellyseerrMutation.isPending &&
promptForJellyseerrPass
}
/> />
<Button <Button
loading={loginToJellyseerrMutation.isPending} loading={loginToJellyseerrMutation.isPending}