Usage
Implemented in form.tsx
useActionFeedback(actionState, {
onSuccess: ({ actionState }) => {
if (actionState.message) {
toast.success(actionState.message);
}
},
onError: ({ actionState }) => {
if (actionState.message) {
toast.error(actionState.message);
}
},
});Implementation
src/components/form/hooks/use-action-feedback.tsimport { useEffect, useRef } from "react";
import { ActionState } from "@/components/form/utils/to-action-state";
type OnArgs = {
actionState: ActionState;
};
type UseActionFeedbackOptions = {
onSuccess?: (onArgs: OnArgs) => void;
onError?: (onArgs: OnArgs) => void;
};
const useActionFeedback = (
actionState: ActionState,
options: UseActionFeedbackOptions,
) => {
const prevTimestamp = useRef(actionState.timestamp);
useEffect(() => {
const isUpdate = prevTimestamp.current !== actionState.timestamp;
if (!isUpdate) return;
if (actionState.status === "SUCCESS") {
options.onSuccess?.({ actionState });
}
if (actionState.status === "ERROR") {
options.onError?.({ actionState });
}
prevTimestamp.current = actionState.timestamp;
}, [actionState, options]);
};
export { useActionFeedback };