Skip to content

Commit

Permalink
add event handlers to earn component
Browse files Browse the repository at this point in the history
  • Loading branch information
alissacrane-cb committed Mar 10, 2025
1 parent c03cf27 commit fec9f0d
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 5 deletions.
30 changes: 27 additions & 3 deletions playground/nextjs-app-router/components/demo/Earn.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,37 @@
import { AppContext } from '@/components/AppProvider';
import { Earn } from '@coinbase/onchainkit/earn';
import { useContext } from 'react';
import { Earn, LifecycleStatus } from '@coinbase/onchainkit/earn';
import { TransactionError } from '@coinbase/onchainkit/transaction';
import { useCallback, useContext } from 'react';
import { TransactionReceipt } from 'viem';

export function EarnDemo() {
const { vaultAddress } = useContext(AppContext);

const handleOnSuccess = useCallback(
(transactionReceipt?: TransactionReceipt) => {
console.log('Success: ', transactionReceipt);
},
[],
);

const handleOnError = useCallback((earnError: TransactionError) => {
console.log('Error:', earnError);
}, []);

const handleOnStatus = useCallback((lifecycleStatus: LifecycleStatus) => {
console.log('Status:', lifecycleStatus);
}, []);

if (!vaultAddress) {
return <div>Please set a vault address</div>;
}

return <Earn vaultAddress={vaultAddress} />;
return (
<Earn
vaultAddress={vaultAddress}
onSuccess={handleOnSuccess}
onError={handleOnError}
onStatus={handleOnStatus}
/>
);
}
11 changes: 10 additions & 1 deletion src/earn/components/Earn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,19 @@ export function Earn({
className,
vaultAddress,
isSponsored,
onError,
onStatus,
onSuccess,
}: EarnReact) {
const componentTheme = useTheme();
return (
<EarnProvider vaultAddress={vaultAddress} isSponsored={isSponsored}>
<EarnProvider
vaultAddress={vaultAddress}
isSponsored={isSponsored}
onError={onError}
onStatus={onStatus}
onSuccess={onSuccess}
>
<div
className={cn(
componentTheme,
Expand Down
14 changes: 14 additions & 0 deletions src/earn/components/EarnProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
createContext,
useCallback,
useContext,
useEffect,
useMemo,
useState,
} from 'react';
Expand All @@ -25,6 +26,9 @@ export function EarnProvider({
vaultAddress,
children,
isSponsored,
onError,
onStatus,
onSuccess,
}: EarnProviderReact) {
if (!vaultAddress) {
throw new Error(
Expand All @@ -43,6 +47,16 @@ export function EarnProvider({
const [withdrawAmount, setWithdrawAmount] = useState('');
const [depositAmount, setDepositAmount] = useState('');

useEffect(() => {
if (lifecycleStatus.statusName === 'error') {
onError?.(lifecycleStatus.statusData);
}
if (lifecycleStatus?.statusName === 'success') {
onSuccess?.(lifecycleStatus?.statusData?.transactionReceipts?.[0]);
}
onStatus?.(lifecycleStatus);
}, [lifecycleStatus]);

const {
asset,
balance: depositedBalance,
Expand Down
9 changes: 8 additions & 1 deletion src/earn/types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import type { TransactionError } from '@/api/types';
import type { UseMorphoVaultReturnType } from '@/earn/hooks/useMorphoVault';
import type { LifecycleStatusUpdate } from '@/internal/types';
import type { Token } from '@/token';
import type { Call } from '@/transaction/types';
import type { LifecycleStatus as TransactionLifecycleStatus } from '@/transaction/types';
import type React from 'react';
import type { Address } from 'viem';
import type { Address, TransactionReceipt } from 'viem';

/**
* Note: exported as public Type
Expand All @@ -14,6 +15,9 @@ export type EarnReact = {
className?: string;
vaultAddress: Address;
isSponsored?: boolean;
onError?: (error: TransactionError) => void; // An optional callback function that handles errors within the provider.
onStatus?: (lifecycleStatus: LifecycleStatus) => void; // An optional callback function that exposes the component lifecycle state
onSuccess?: (transactionReceipt?: TransactionReceipt) => void; // An optional callback function that exposes the transaction receipt
};

/**
Expand All @@ -23,6 +27,9 @@ export type EarnProviderReact = {
children: React.ReactNode;
vaultAddress: Address;
isSponsored?: boolean;
onError?: (error: TransactionError) => void; // An optional callback function that handles errors within the provider.
onStatus?: (lifecycleStatus: LifecycleStatus) => void; // An optional callback function that exposes the component lifecycle state
onSuccess?: (transactionReceipt?: TransactionReceipt) => void; // An optional callback function that exposes the transaction receipt
};

/**
Expand Down

0 comments on commit fec9f0d

Please sign in to comment.