function useSDKOperation<T>(operation: () => Promise<T>) {
const [loading, setLoading] = useState(false);
const [error, setError] = useState<SDKError | null>(null);
const [data, setData] = useState<T | null>(null);
const execute = useCallback(async () => {
setLoading(true);
setError(null);
try {
const result = await operation();
setData(result);
return result;
} catch (err) {
const sdkError = err instanceof SDKError ? err : new SDKError(err.message);
setError(sdkError);
throw sdkError;
} finally {
setLoading(false);
}
}, [operation]);
return { execute, loading, error, data };
}
// Usage
function DepositButton() {
const { execute, loading, error } = useSDKOperation(() =>
sdk.vault.deposit({ tokenAddress, amount })
);
return (
<>
<button onClick={execute} disabled={loading}>
{loading ? 'Processing...' : 'Deposit'}
</button>
{error && <p className="error">{handleError(error)}</p>}
</>
);
}