• Generates a Sonner toast action button configuration for recovery actions.

    Parameters

    • action: ErrorRecoveryAction

      The recovery action to create a button for.

    • OptionalonRetry: () => void | Promise<void>

      Optional callback for retry actions.

    Returns null | { label: string; onClick: () => void }

    A Sonner action config object, or null if no action button should be shown.

    export function getRecoveryActionButton(
    action: ErrorRecoveryAction,
    onRetry?: () => void | Promise<void>,
    ): { label: string; onClick: () => void } | null {
    switch (action) {
    case ErrorRecoveryAction.RETRY:
    if (!onRetry) return null;
    return {
    label: "Retry",
    onClick: () => {
    // Handle both sync and async callbacks
    const result = onRetry();
    if (result instanceof Promise) {
    result.catch((error) => {
    console.error("[ErrorHandling] Retry failed:", error);
    });
    }
    },
    };

    case ErrorRecoveryAction.CHECK_CONNECTION:
    return {
    label: "Check Connection",
    onClick: () => {
    // Use centralized helper to open external links safely
    openExternalSafe("https://www.google.com").then((res) => {
    if (!res.success) {
    console.warn(
    "[ErrorHandling] Failed to open connection check link:",
    res.error,
    );
    }
    });
    },
    };

    case ErrorRecoveryAction.REFRESH_TOKEN:
    if (!onRetry) return null;
    return {
    label: "Re-authenticate",
    onClick: () => {
    // Handle both sync and async callbacks
    const result = onRetry();
    if (result instanceof Promise) {
    result.catch((error) => {
    console.error("[ErrorHandling] Re-authentication failed:", error);
    });
    }
    },
    };

    case ErrorRecoveryAction.CONTACT_SUPPORT:
    return {
    label: "Get Help",
    onClick: () => {
    try {
    const helpLink = getHelpLinkForErrorType(ErrorType.UNKNOWN);
    if (helpLink) {
    openExternalSafe(helpLink).then((res) => {
    if (!res.success) {
    console.warn(
    "[ErrorHandling] Failed to open help link:",
    res.error,
    );
    }
    });
    }
    } catch (error) {
    console.error("[ErrorHandling] Failed to open help link:", error);
    }
    },
    };

    case ErrorRecoveryAction.WAIT_RATE_LIMIT:
    // Rate limit errors are handled by specialized notification
    return null;

    case ErrorRecoveryAction.NONE:
    default:
    return null;
    }
    }