• Refresh user library from AniList, handling loading, errors, and rate limiting. Used by both "Try Again" and "Refresh" buttons for shared refresh logic.

    Parameters

    Returns void

    export function handleLibraryRefresh(params: LibraryRefreshParams): void {
    const {
    token,
    setLibraryLoading,
    setLibraryError,
    setRetryCount,
    setRateLimit,
    setUserLibrary,
    } = params;

    setLibraryLoading(true);
    setLibraryError(null);
    setRetryCount(0);
    setRateLimit(false, undefined, undefined);

    const controller = new AbortController();

    getUserMangaList(token, controller.signal)
    .then((library) => {
    console.info(
    `[LibrarySync] Loaded ${Object.keys(library).length} entries from user's AniList library`,
    );
    setUserLibrary(library);
    setLibraryLoading(false);
    })
    .catch((error) => {
    if (error.name !== "AbortError") {
    console.error(
    "[LibrarySync] Failed to load user library again:",
    error,
    );

    // Check for rate limiting - with our new client updates, this should be more reliable
    if (error.isRateLimited || error.status === 429) {
    console.warn("[LibrarySync] 📛 DETECTED RATE LIMIT in SyncPage:", {
    isRateLimited: error.isRateLimited,
    status: error.status,
    retryAfter: error.retryAfter,
    });

    const retryDelay = error.retryAfter ? error.retryAfter : 60;
    const retryTimestamp = Date.now() + retryDelay;

    console.debug(
    `[LibrarySync] Setting rate limited state with retry after: ${retryTimestamp} (in ${retryDelay / 1000}s)`,
    );

    setRateLimit(
    true,
    retryDelay,
    "AniList API rate limit reached. Waiting to retry...",
    );
    } else {
    setLibraryError(
    error.message ||
    "Failed to load your AniList library. Synchronization can still proceed without comparison data.",
    );
    }

    setUserLibrary({});
    setLibraryLoading(false);
    }
    });
    }