mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-07-17 18:03:01 +01:00
fix(auth): surface failed account save to the user
A skipped or failed post-login account save only wrote a log entry, so the user believed the account was saved. Both save paths (loginMutation PIN guard and PendingAccountSaveModal catch) now show an error toast.
This commit is contained in:
@@ -1,13 +1,16 @@
|
||||
import { useAtom, useAtomValue } from "jotai";
|
||||
import type React from "react";
|
||||
import { useEffect } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Platform } from "react-native";
|
||||
import { toast } from "sonner-native";
|
||||
import { SaveAccountModal } from "@/components/SaveAccountModal";
|
||||
import {
|
||||
pendingAccountSaveAtom,
|
||||
useJellyfin,
|
||||
userAtom,
|
||||
} from "@/providers/JellyfinProvider";
|
||||
import { writeErrorLog } from "@/utils/log";
|
||||
|
||||
/**
|
||||
* Post-login save-account prompt. Login flows (password or Quick Connect)
|
||||
@@ -19,6 +22,7 @@ export const PendingAccountSaveModal: React.FC = () => {
|
||||
const [pending, setPending] = useAtom(pendingAccountSaveAtom);
|
||||
const user = useAtomValue(userAtom);
|
||||
const { saveCurrentAccount } = useJellyfin();
|
||||
const { t } = useTranslation();
|
||||
|
||||
// A logout before answering drops the intent — it must not resurface on
|
||||
// the next (possibly different) login.
|
||||
@@ -37,7 +41,10 @@ export const PendingAccountSaveModal: React.FC = () => {
|
||||
const serverName = pending?.serverName;
|
||||
setPending(null);
|
||||
saveCurrentAccount({ securityType, pinCode, serverName }).catch(
|
||||
(error) => console.warn("Failed to save account:", error),
|
||||
(error) => {
|
||||
writeErrorLog(`Failed to save account: ${error?.message ?? error}`);
|
||||
toast.error(t("save_account.not_saved"));
|
||||
},
|
||||
);
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -22,6 +22,7 @@ import { useTranslation } from "react-i18next";
|
||||
import { AppState, Platform } from "react-native";
|
||||
import { getDeviceNameSync } from "react-native-device-info";
|
||||
import uuid from "react-native-uuid";
|
||||
import { toast } from "sonner-native";
|
||||
import useRouter from "@/hooks/useAppRouter";
|
||||
import { useInterval } from "@/hooks/useInterval";
|
||||
import { JellyseerrApi, useJellyseerr } from "@/hooks/useJellyseerr";
|
||||
@@ -450,8 +451,9 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({
|
||||
if (securityType === "pin" && !pinHash) {
|
||||
// Never persist a "pin" credential without its hash — it would be
|
||||
// impossible to unlock. Skip the save rather than failing a login
|
||||
// that already succeeded.
|
||||
// that already succeeded, and tell the user it didn't happen.
|
||||
writeErrorLog("Account save skipped: PIN required but missing");
|
||||
toast.error(t("save_account.not_saved"));
|
||||
} else {
|
||||
await saveAccountCredential({
|
||||
serverUrl: api.basePath,
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
"save_account": {
|
||||
"title": "Save account",
|
||||
"save_for_later": "Save this account",
|
||||
"not_saved": "Account was not saved",
|
||||
"security_option": "Security option",
|
||||
"no_protection": "No protection",
|
||||
"no_protection_desc": "Quick login without authentication",
|
||||
|
||||
Reference in New Issue
Block a user