The recovery action to create a button for.
OptionalonRetry: () => void | Promise<void>Optional callback for retry actions.
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;
}
}
Generates a Sonner toast action button configuration for recovery actions.