Skip to content

Commit 7f4c096

Browse files
feat(packages): resolve comments
1 parent 8111327 commit 7f4c096

File tree

6 files changed

+145
-36
lines changed

6 files changed

+145
-36
lines changed

routes/vault/src/components/PeginFlow/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

routes/vault/src/components/VaultDashboard/VaultActivityCard.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import {
77
ActivityCard,
88
StatusBadge,
99
ProviderItem,
10+
Warning,
1011
type ActivityCardData,
1112
type ActivityCardDetailItem,
1213
} from "@babylonlabs-io/core-ui";
1314
import type { VaultActivity } from "../../mockData/vaultActivities";
1415
import { getVaultState, getActionForState } from "../../utils/vaultState";
1516
import { formatUSDCAmount } from "../../utils/peginTransformers";
17+
import { bitcoinIcon } from "../../assets";
1618

1719
interface VaultActivityCardProps {
1820
activity: VaultActivity;
@@ -114,10 +116,17 @@ export function VaultActivityCard({ activity, onBorrow, onRepay }: VaultActivity
114116
// Transform to ActivityCardData format
115117
const cardData: ActivityCardData = {
116118
formattedAmount: `${activity.collateral.amount} ${activity.collateral.symbol}`,
117-
icon: activity.collateral.icon,
119+
icon: activity.collateral.icon || bitcoinIcon,
118120
iconAlt: activity.collateral.symbol,
119121
details,
120122
optionalDetails: optionalDetails.length > 0 ? optionalDetails : undefined,
123+
// Add warning for pending peg-ins
124+
warning: activity.isPending ? (
125+
<Warning>
126+
{activity.pendingMessage ||
127+
"Your peg-in is being processed. This can take up to ~5 hours while Bitcoin confirmations and provider acknowledgements complete."}
128+
</Warning>
129+
) : undefined,
121130
primaryAction: getActionForState(vaultState, activity, onBorrow, onRepay),
122131
};
123132

routes/vault/src/components/VaultDashboard/VaultDashboard.tsx

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11
import { ActivityList } from "@babylonlabs-io/core-ui";
2+
import { useCallback } from "react";
23
import { BorrowFlow } from "../BorrowFlow";
34
import { RepayFlow } from "../RepayFlow";
5+
import {
6+
PeginModal,
7+
PeginSignModal,
8+
PeginSuccessModal,
9+
} from "../modals";
410
import { useVaultPositions } from "../../hooks/useVaultPositions";
511
import { useBorrowFlow } from "../../hooks/useBorrowFlow";
612
import { useRepayFlow } from "../../hooks/useRepayFlow";
13+
import { usePeginFlow } from "../../hooks/usePeginFlow";
714
import { EmptyState } from "./EmptyState";
815
import { VaultActivityCard } from "./VaultActivityCard";
916

1017
export function VaultDashboard() {
1118
// Data fetching
12-
const { activities, isWalletConnected, refetchActivities } = useVaultPositions();
19+
const {
20+
activities,
21+
isWalletConnected,
22+
refetchActivities,
23+
connectedAddress,
24+
btcAddress,
25+
addPendingPegin,
26+
} = useVaultPositions();
1327

1428
// Borrow flow modal state
1529
const {
@@ -27,12 +41,47 @@ export function VaultDashboard() {
2741
closeRepayFlow,
2842
} = useRepayFlow();
2943

30-
// Handle "New Item" button click - open borrow for first activity
31-
const handleNewBorrow = () => {
32-
if (activities.length > 0) {
33-
openBorrowFlow(activities[0]);
44+
// Peg-in flow modal state
45+
const {
46+
isOpen: peginFlowOpen,
47+
signModalOpen: peginSignModalOpen,
48+
successModalOpen: peginSuccessModalOpen,
49+
peginAmount,
50+
selectedProviders,
51+
btcBalanceSat,
52+
openPeginFlow,
53+
closePeginFlow,
54+
handlePeginClick,
55+
handlePeginSignSuccess: handlePeginSignSuccessBase,
56+
handlePeginSuccessClose,
57+
} = usePeginFlow();
58+
59+
// Handle peg-in sign success with storage integration
60+
const handlePeginSignSuccess = useCallback(() => {
61+
// Add to local storage when peg-in is submitted
62+
if (connectedAddress && btcAddress) {
63+
const peginId = `pending-${Date.now()}`; // Temporary ID until we get BTC tx hash
64+
65+
addPendingPegin({
66+
id: peginId,
67+
amount: peginAmount.toString(),
68+
providers: selectedProviders,
69+
ethAddress: connectedAddress,
70+
btcAddress: btcAddress,
71+
});
72+
73+
console.log('[VaultDashboard] Added pending peg-in to localStorage:', {
74+
id: peginId,
75+
amount: peginAmount,
76+
providers: selectedProviders,
77+
});
3478
}
35-
};
79+
80+
// Complete the peg-in flow and refetch activities
81+
handlePeginSignSuccessBase(() => {
82+
refetchActivities();
83+
});
84+
}, [connectedAddress, btcAddress, peginAmount, selectedProviders, addPendingPegin, handlePeginSignSuccessBase, refetchActivities]);
3685

3786
// Show message if wallet is not connected
3887
if (!isWalletConnected) {
@@ -42,7 +91,11 @@ export function VaultDashboard() {
4291
return (
4392
<>
4493
<div className="container mx-auto flex max-w-[760px] flex-1 flex-col px-4 py-8">
45-
<ActivityList onNewItem={handleNewBorrow}>
94+
<ActivityList
95+
onNewItem={openPeginFlow}
96+
isEmpty={activities.length === 0}
97+
isConnected={isWalletConnected}
98+
>
4699
{activities.map((activity) => (
47100
<VaultActivityCard
48101
key={activity.id}
@@ -54,6 +107,28 @@ export function VaultDashboard() {
54107
</ActivityList>
55108
</div>
56109

110+
{/* Peg-in Modals */}
111+
<PeginModal
112+
open={peginFlowOpen}
113+
onClose={closePeginFlow}
114+
onPegIn={handlePeginClick}
115+
btcBalance={btcBalanceSat}
116+
/>
117+
118+
<PeginSignModal
119+
open={peginSignModalOpen}
120+
onClose={() => {}}
121+
onSuccess={handlePeginSignSuccess}
122+
amount={peginAmount}
123+
selectedProviders={selectedProviders}
124+
/>
125+
126+
<PeginSuccessModal
127+
open={peginSuccessModalOpen}
128+
onClose={handlePeginSuccessClose}
129+
amount={peginAmount}
130+
/>
131+
57132
<BorrowFlow
58133
activity={selectedBorrowActivity}
59134
isOpen={borrowFlowOpen}

routes/vault/src/hooks/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@ export { usePeginRequests } from './usePeginRequests';
66
export type { UsePeginRequestsResult } from './usePeginRequests';
77
export { useVaultProviders } from './useVaultProviders';
88
export { usePeginForm } from './usePeginForm';
9-
export { usePeginStorage } from './usePeginStorage';
9+
export { usePeginStorage } from './usePeginStorage';
10+
export { useVaultPositions } from './useVaultPositions';
11+
export { useBorrowFlow } from './useBorrowFlow';
12+
export { useRepayFlow } from './useRepayFlow';
13+
export { usePeginFlow } from './usePeginFlow';
Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,42 @@
1-
import { useState, useCallback } from "react";
1+
import { useState, useCallback } from 'react';
22

3-
export function usePeginFlowState() {
3+
/**
4+
* Hook to manage peg-in flow modal state
5+
*/
6+
export function usePeginFlow() {
47
// Hardcoded BTC balance (in satoshis) - TODO: Replace with real wallet balance
58
const btcBalanceSat = 500000000; // 5 BTC
69

710
// Modal states
8-
const [peginModalOpen, setPeginModalOpen] = useState(false);
9-
const [peginSignModalOpen, setPeginSignModalOpen] = useState(false);
10-
const [peginSuccessModalOpen, setPeginSuccessModalOpen] = useState(false);
11+
const [isOpen, setIsOpen] = useState(false);
12+
const [signModalOpen, setSignModalOpen] = useState(false);
13+
const [successModalOpen, setSuccessModalOpen] = useState(false);
1114

1215
// Peg-in flow data
1316
const [peginAmount, setPeginAmount] = useState(0);
1417
const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
1518

16-
// Start the peg-in flow
17-
const handleNewBorrow = useCallback(() => {
18-
setPeginModalOpen(true);
19+
const openPeginFlow = useCallback(() => {
20+
setIsOpen(true);
21+
}, []);
22+
23+
const closePeginFlow = useCallback(() => {
24+
setIsOpen(false);
1925
}, []);
2026

2127
// Handle peg-in click from PeginModal
2228
const handlePeginClick = useCallback((amount: number, providers: string[]) => {
2329
console.log("Peg-in clicked:", { amount, providers });
2430
setPeginAmount(amount);
2531
setSelectedProviders(providers);
26-
setPeginModalOpen(false);
27-
setPeginSignModalOpen(true);
32+
setIsOpen(false);
33+
setSignModalOpen(true);
2834
}, []);
2935

3036
// Handle signing success - accepts callback for parent to handle storage
3137
const handlePeginSignSuccess = useCallback((onSuccess?: () => void) => {
32-
setPeginSignModalOpen(false);
33-
setPeginSuccessModalOpen(true);
38+
setSignModalOpen(false);
39+
setSuccessModalOpen(true);
3440

3541
// Call parent callback if provided
3642
if (onSuccess) {
@@ -40,27 +46,25 @@ export function usePeginFlowState() {
4046

4147
// Handle success modal close
4248
const handlePeginSuccessClose = useCallback(() => {
43-
setPeginSuccessModalOpen(false);
49+
setSuccessModalOpen(false);
4450
setPeginAmount(0);
4551
setSelectedProviders([]);
4652
}, []);
4753

4854
return {
49-
// Wallet data
50-
btcBalanceSat,
5155
// Modal states
52-
peginModalOpen,
53-
peginSignModalOpen,
54-
peginSuccessModalOpen,
56+
isOpen,
57+
signModalOpen,
58+
successModalOpen,
5559
// Peg-in data
5660
peginAmount,
5761
selectedProviders,
62+
btcBalanceSat,
5863
// Actions
59-
handleNewBorrow,
64+
openPeginFlow,
65+
closePeginFlow,
6066
handlePeginClick,
6167
handlePeginSignSuccess,
6268
handlePeginSuccessClose,
63-
setPeginModalOpen,
64-
setPeginSignModalOpen,
6569
};
66-
}
70+
}

routes/vault/src/hooks/useVaultPositions.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
import { useMemo } from "react";
22
import { useChainConnector } from "@babylonlabs-io/wallet-connector";
33
import type { Hex } from "viem";
4-
import { usePeginRequests } from "./usePeginRequests";
4+
import { usePeginRequests, usePeginStorage } from "./usePeginRequests";
55

66
/**
77
* Hook to manage vault positions data fetching and wallet connection
88
* Only responsible for data - UI modal states are managed by separate hooks
99
*/
1010
export function useVaultPositions() {
1111
const ethConnector = useChainConnector('ETH');
12+
const btcConnector = useChainConnector('BTC');
13+
14+
// Get BTC address from connector
15+
const btcAddress = useMemo(() => {
16+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
17+
return (btcConnector as any)?.connectedWallet?.account?.address as string | undefined;
18+
}, [btcConnector]);
1219

1320
const connectedAddress = useMemo(() => {
1421
const address = (
@@ -21,15 +28,26 @@ export function useVaultPositions() {
2128
}, [ethConnector]);
2229

2330
// Fetch pegin requests from blockchain
24-
// Note: We pass a no-op function since we don't need borrow callback here anymore
25-
const { activities, refetch } = usePeginRequests(
31+
const { activities: confirmedActivities, refetch } = usePeginRequests(
2632
connectedAddress,
2733
() => {} // no-op callback
2834
);
2935

36+
// Integrate local storage for pending peg-ins
37+
const {
38+
allActivities,
39+
addPendingPegin,
40+
} = usePeginStorage({
41+
ethAddress: connectedAddress || '',
42+
confirmedPegins: confirmedActivities,
43+
});
44+
3045
return {
31-
activities,
46+
activities: allActivities,
3247
isWalletConnected: !!connectedAddress,
3348
refetchActivities: refetch,
49+
connectedAddress,
50+
btcAddress,
51+
addPendingPegin,
3452
};
3553
}

0 commit comments

Comments
 (0)