Files
buzz/desktop/src/shared/hooks/useToastEffect.ts
T
2026-04-21 13:03:48 -07:00

37 lines
969 B
TypeScript

import * as React from "react";
import { toast } from "sonner";
/**
* Show a toast when a message string becomes truthy. Uses a ref to avoid
* double-firing in React StrictMode (where effects run twice with the same
* value).
*/
function useToastEffect(
message: string | null | undefined,
variant: "success" | "error",
) {
const shownRef = React.useRef<string | null>(null);
React.useEffect(() => {
if (message && message !== shownRef.current) {
shownRef.current = message;
toast[variant](message);
}
if (!message) {
shownRef.current = null;
}
}, [message, variant]);
}
/**
* Convenience wrapper: show success/error toasts for a pair of feedback
* message strings (common pattern after mutations).
*/
export function useFeedbackToasts(
noticeMessage: string | null | undefined,
errorMessage: string | null | undefined,
) {
useToastEffect(noticeMessage, "success");
useToastEffect(errorMessage, "error");
}