Skip to content

Commit 63b1aff

Browse files
feat(packages): resolve comments
1 parent a368a1e commit 63b1aff

File tree

8 files changed

+155
-99
lines changed

8 files changed

+155
-99
lines changed

routes/vault/src/api/index.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

routes/vault/src/api/getVaultProviders.ts renamed to routes/vault/src/clients/vault-providers-api/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Vault Provider API
2+
* Vault Provider API Client
33
*
44
* This module handles fetching vault provider data.
55
* Currently returns mock data, but structured to support GraphQL integration.

routes/vault/src/components/Activities/Activities.tsx

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,73 @@ import {
77
ProviderItem,
88
Warning,
99
} from "@babylonlabs-io/core-ui";
10+
import { useCallback } from "react";
1011
import { BorrowFlow } from "../BorrowFlow";
1112
import {
1213
PeginModal,
1314
PeginSignModal,
1415
PeginSuccessModal,
1516
} from "../modals";
1617
import { useActivitiesState } from "./useActivitiesState";
18+
import { usePeginFlowState } from "../PeginFlow";
1719
import { bitcoinIcon } from "../../assets";
1820

1921
export function Activities() {
2022
const {
2123
activities,
2224
borrowFlowOpen,
2325
selectedActivity,
24-
handleNewBorrow,
2526
handleActivityBorrow,
2627
handleBorrowFlowClose,
2728
isWalletConnected,
2829
refetchActivities,
29-
// Deposit flow
30-
peginModalOpen,
31-
peginSignModalOpen,
32-
peginSuccessModalOpen,
30+
connectedAddress,
31+
addPendingPegin,
32+
} = useActivitiesState();
33+
34+
const {
35+
btcAddress,
36+
btcBalanceSat,
37+
modalOpen: peginModalOpen,
38+
signModalOpen: peginSignModalOpen,
39+
successModalOpen: peginSuccessModalOpen,
3340
peginAmount,
3441
selectedProviders,
35-
btcBalanceSat,
42+
startPeginFlow,
3643
handlePeginClick,
37-
handlePeginSignSuccess,
38-
handlePeginSuccessClose,
39-
setPeginModalOpen,
40-
setPeginSignModalOpen,
41-
} = useActivitiesState();
44+
handleSignSuccess: handlePeginSignSuccessBase,
45+
handleSuccessClose: handlePeginSuccessClose,
46+
setModalOpen: setPeginModalOpen,
47+
setSignModalOpen: setPeginSignModalOpen,
48+
} = usePeginFlowState();
49+
50+
// Handler to add pending peg-in to storage and trigger refetch
51+
const handlePeginSignSuccess = useCallback(() => {
52+
// Add to local storage when peg-in is submitted
53+
if (connectedAddress && btcAddress) {
54+
const peginId = `pending-${Date.now()}`; // Temporary ID until we get BTC tx hash
55+
56+
addPendingPegin({
57+
id: peginId,
58+
amount: peginAmount.toString(),
59+
providers: selectedProviders,
60+
ethAddress: connectedAddress,
61+
btcAddress: btcAddress,
62+
});
63+
64+
console.log('[Activities] Added pending peg-in to localStorage:', {
65+
id: peginId,
66+
amount: peginAmount,
67+
providers: selectedProviders,
68+
});
69+
}
70+
71+
// Complete the peg-in flow
72+
handlePeginSignSuccessBase(() => {
73+
// Refetch activities to show the new pending peg-in
74+
refetchActivities();
75+
});
76+
}, [connectedAddress, btcAddress, peginAmount, selectedProviders, addPendingPegin, handlePeginSignSuccessBase, refetchActivities]);
4277

4378
console.log('[Activities] activities:', activities);
4479
console.log('[Activities] activities.length:', activities.length);
@@ -137,7 +172,7 @@ export function Activities() {
137172
<>
138173
<div className="container mx-auto flex max-w-[760px] flex-1 flex-col px-4 py-8">
139174
<ActivityList
140-
onNewItem={handleNewBorrow}
175+
onNewItem={startPeginFlow}
141176
isEmpty={activities.length === 0}
142177
isConnected={isWalletConnected}
143178
>

routes/vault/src/components/Activities/useActivitiesState.ts

Lines changed: 2 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,6 @@ import { usePeginRequests, usePeginStorage } from "../../hooks";
66

77
export function useActivitiesState() {
88
const ethConnector = useChainConnector('ETH');
9-
const btcConnector = useChainConnector('BTC');
10-
11-
// Get BTC address from connector
12-
const btcAddress = useMemo(() => {
13-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
14-
return (btcConnector as any)?.connectedWallet?.account?.address as string | undefined;
15-
}, [btcConnector]);
169

1710
const connectedAddress = useMemo(() => {
1811
const address = (
@@ -25,20 +18,10 @@ export function useActivitiesState() {
2518
return address;
2619
}, [ethConnector]);
2720

28-
// Hardcoded BTC balance (in satoshis) - TODO: Replace with real wallet balance
29-
const btcBalanceSat = 500000000; // 5 BTC
30-
3121
// Borrow flow state
3222
const [borrowFlowOpen, setBorrowFlowOpen] = useState(false);
3323
const [selectedActivity, setSelectedActivity] = useState<VaultActivity | null>(null);
3424

35-
// Peg-in flow state
36-
const [peginModalOpen, setPeginModalOpen] = useState(false);
37-
const [peginSignModalOpen, setPeginSignModalOpen] = useState(false);
38-
const [peginSuccessModalOpen, setPeginSuccessModalOpen] = useState(false);
39-
const [peginAmount, setPeginAmount] = useState(0);
40-
const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
41-
4225
const handleActivityBorrow = useCallback((activity: VaultActivity) => {
4326
setSelectedActivity(activity);
4427
setBorrowFlowOpen(true);
@@ -61,78 +44,20 @@ export function useActivitiesState() {
6144

6245
console.log('[useActivitiesState] allActivities (merged):', allActivities);
6346

64-
const handleNewBorrow = useCallback(() => {
65-
// Open peg-in modal instead of borrow modal
66-
setPeginModalOpen(true);
67-
}, []);
68-
6947
const handleBorrowFlowClose = useCallback(() => {
7048
setBorrowFlowOpen(false);
7149
setSelectedActivity(null);
7250
}, []);
7351

74-
// Peg-in handlers
75-
const handlePeginClick = useCallback((amount: number, providers: string[]) => {
76-
console.log("Peg-in clicked:", { amount, providers });
77-
setPeginAmount(amount);
78-
setSelectedProviders(providers);
79-
setPeginModalOpen(false);
80-
setPeginSignModalOpen(true);
81-
}, []);
82-
83-
const handlePeginSignSuccess = useCallback(() => {
84-
// Add to local storage when peg-in is submitted
85-
if (connectedAddress && btcAddress) {
86-
const peginId = `pending-${Date.now()}`; // Temporary ID until we get BTC tx hash
87-
88-
addPendingPegin({
89-
id: peginId,
90-
amount: peginAmount.toString(),
91-
providers: selectedProviders,
92-
ethAddress: connectedAddress,
93-
btcAddress: btcAddress,
94-
});
95-
96-
console.log('[useActivitiesState] Added pending peg-in to localStorage:', {
97-
id: peginId,
98-
amount: peginAmount,
99-
providers: selectedProviders,
100-
});
101-
}
102-
103-
setPeginSignModalOpen(false);
104-
setPeginSuccessModalOpen(true);
105-
106-
// Refetch activities to show the new pending peg-in
107-
refetch();
108-
}, [connectedAddress, btcAddress, peginAmount, selectedProviders, addPendingPegin, refetch]);
109-
110-
const handlePeginSuccessClose = useCallback(() => {
111-
setPeginSuccessModalOpen(false);
112-
setPeginAmount(0);
113-
setSelectedProviders([]);
114-
}, []);
115-
11652
return {
11753
activities: allActivities,
11854
borrowFlowOpen,
11955
selectedActivity,
120-
handleNewBorrow,
12156
handleActivityBorrow,
12257
handleBorrowFlowClose,
12358
isWalletConnected: !!connectedAddress,
12459
refetchActivities: refetch,
125-
// Peg-in flow
126-
peginModalOpen,
127-
peginSignModalOpen,
128-
peginSuccessModalOpen,
129-
peginAmount,
130-
selectedProviders,
131-
btcBalanceSat,
132-
handlePeginClick,
133-
handlePeginSignSuccess,
134-
handlePeginSuccessClose,
135-
setPeginModalOpen,
136-
setPeginSignModalOpen,
60+
connectedAddress,
61+
addPendingPegin,
13762
};
13863
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { usePeginFlowState } from './usePeginFlowState';
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import { useState, useCallback, useMemo } from "react";
2+
import { useChainConnector } from "@babylonlabs-io/wallet-connector";
3+
import type { Hex } from "viem";
4+
5+
export function usePeginFlowState() {
6+
const ethConnector = useChainConnector('ETH');
7+
const btcConnector = useChainConnector('BTC');
8+
9+
// Get BTC address from connector
10+
const btcAddress = useMemo(() => {
11+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
12+
return (btcConnector as any)?.connectedWallet?.account?.address as string | undefined;
13+
}, [btcConnector]);
14+
15+
// Get ETH address from connector
16+
const connectedAddress = useMemo(() => {
17+
const address = (
18+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
19+
(ethConnector as any)?.connectedWallet?.account?.address ||
20+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
21+
(ethConnector as any)?.connectedWallet?.accounts?.[0]?.address
22+
) as Hex | undefined;
23+
return address;
24+
}, [ethConnector]);
25+
26+
// Hardcoded BTC balance (in satoshis) - TODO: Replace with real wallet balance
27+
const btcBalanceSat = 500000000; // 5 BTC
28+
29+
// Modal states
30+
const [modalOpen, setModalOpen] = useState(false);
31+
const [signModalOpen, setSignModalOpen] = useState(false);
32+
const [successModalOpen, setSuccessModalOpen] = useState(false);
33+
34+
// Peg-in flow data
35+
const [peginAmount, setPeginAmount] = useState(0);
36+
const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
37+
38+
// Start the peg-in flow
39+
const startPeginFlow = useCallback(() => {
40+
setModalOpen(true);
41+
}, []);
42+
43+
// Handle modal close
44+
const handleModalClose = useCallback(() => {
45+
setModalOpen(false);
46+
}, []);
47+
48+
// Handle peg-in click from PeginModal
49+
const handlePeginClick = useCallback((amount: number, providers: string[]) => {
50+
console.log("Peg-in clicked:", { amount, providers });
51+
setPeginAmount(amount);
52+
setSelectedProviders(providers);
53+
setModalOpen(false);
54+
setSignModalOpen(true);
55+
}, []);
56+
57+
// Handle signing success - callback provided by parent to add to storage
58+
const handleSignSuccess = useCallback((onPeginSubmitted?: () => void) => {
59+
setSignModalOpen(false);
60+
setSuccessModalOpen(true);
61+
62+
// Notify parent that peg-in was submitted
63+
if (onPeginSubmitted) {
64+
onPeginSubmitted();
65+
}
66+
}, []);
67+
68+
// Handle sign modal close
69+
const handleSignModalClose = useCallback(() => {
70+
setSignModalOpen(false);
71+
}, []);
72+
73+
// Handle success modal close
74+
const handleSuccessClose = useCallback(() => {
75+
setSuccessModalOpen(false);
76+
setPeginAmount(0);
77+
setSelectedProviders([]);
78+
}, []);
79+
80+
return {
81+
// Wallet data
82+
connectedAddress,
83+
btcAddress,
84+
btcBalanceSat,
85+
// Modal states
86+
modalOpen,
87+
signModalOpen,
88+
successModalOpen,
89+
// Peg-in data
90+
peginAmount,
91+
selectedProviders,
92+
// Actions
93+
startPeginFlow,
94+
handleModalClose,
95+
handlePeginClick,
96+
handleSignSuccess,
97+
handleSignModalClose,
98+
handleSuccessClose,
99+
setModalOpen,
100+
setSignModalOpen,
101+
};
102+
}

routes/vault/src/components/modals/PeginModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { useState, useMemo } from "react";
1313
import { bitcoinIcon } from "../../assets";
1414
import { useVaultProviders } from "../../hooks/useVaultProviders";
1515
import { usePeginForm } from "../../hooks/usePeginForm";
16-
import type { VaultProvider } from "../../api";
16+
import type { VaultProvider } from "../../clients/vault-providers-api";
1717

1818
interface PeginModalProps {
1919
open: boolean;

routes/vault/src/hooks/useVaultProviders.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useQuery } from '@tanstack/react-query';
2-
import { getVaultProviders } from '../api';
2+
import { getVaultProviders } from '../clients/vault-providers-api';
33

44
const FIVE_MINUTES = 5 * 60 * 1000;
55

0 commit comments

Comments
 (0)