Improve the UI add button
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* useWizardSubmit - Standardized hook for wizard submission
|
||||
*
|
||||
* Provides consistent loading states, error handling, and success callbacks
|
||||
* across all wizard types.
|
||||
*/
|
||||
|
||||
import { useState, useCallback } from 'react';
|
||||
|
||||
interface UseWizardSubmitOptions<T> {
|
||||
onSubmit: (data: T) => Promise<void>;
|
||||
onSuccess?: (data: T) => void;
|
||||
onError?: (error: Error) => void;
|
||||
}
|
||||
|
||||
interface UseWizardSubmitReturn<T> {
|
||||
submit: (data: T) => Promise<void>;
|
||||
loading: boolean;
|
||||
error: string | null;
|
||||
clearError: () => void;
|
||||
}
|
||||
|
||||
export function useWizardSubmit<T>({
|
||||
onSubmit,
|
||||
onSuccess,
|
||||
onError,
|
||||
}: UseWizardSubmitOptions<T>): UseWizardSubmitReturn<T> {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
const submit = useCallback(
|
||||
async (data: T) => {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
try {
|
||||
await onSubmit(data);
|
||||
onSuccess?.(data);
|
||||
} catch (err) {
|
||||
const errorMessage =
|
||||
err instanceof Error ? err.message : 'An error occurred during submission';
|
||||
setError(errorMessage);
|
||||
onError?.(err instanceof Error ? err : new Error(errorMessage));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
},
|
||||
[onSubmit, onSuccess, onError]
|
||||
);
|
||||
|
||||
const clearError = useCallback(() => {
|
||||
setError(null);
|
||||
}, []);
|
||||
|
||||
return {
|
||||
submit,
|
||||
loading,
|
||||
error,
|
||||
clearError,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user