Skip to content

Commit b2556eb

Browse files
committed
removed cache implmeentation for delegation, now using zustand for tracking step progress state for the ledgerReivewTransaction screen, decoupled delegation logic from ledger completely
1 parent 3861776 commit b2556eb

File tree

9 files changed

+111
-135
lines changed

9 files changed

+111
-135
lines changed

packages/core-mobile/app/contexts/DelegationContext.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
import React, { createContext, ReactNode, useContext, useMemo } from 'react'
2-
import { type Step } from 'services/earn/computeDelegationSteps/types'
2+
import { type Step, Operation } from 'services/earn/computeDelegationSteps/types'
33
import { useDelegation } from 'hooks/earn/useDelegation'
44

55
export type ComputeSteps = (stakeAmount: bigint) => Promise<Step[]>
66

77
type TransactionHash = string
88

9+
export type OnDelegationProgress = (
10+
step: number,
11+
operation: Operation | null
12+
) => void
13+
914
export type Delegate = ({
1015
steps,
1116
startDate,
1217
endDate,
13-
nodeId
18+
nodeId,
19+
onProgress
1420
}: {
1521
steps: Step[]
1622
startDate: Date
1723
endDate: Date
1824
nodeId: string
25+
onProgress?: OnDelegationProgress
1926
}) => Promise<TransactionHash>
2027

2128
interface DelegationContextState {

packages/core-mobile/app/hooks/earn/useDelegation.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import Logger from 'utils/Logger'
2525
import { useActiveWallet } from 'common/hooks/useActiveWallet'
2626
import { selectActiveAccount } from 'store/account'
2727
import { getMinimumStakeDurationMs } from 'services/earn/utils'
28-
import { ledgerParamsCache } from 'new/features/ledger/services/ledgerParamsCache'
2928
import { useXPAddresses } from 'hooks/useXPAddresses/useXPAddresses'
3029
import {
3130
useAvalancheEvmProvider,
@@ -108,7 +107,7 @@ export const useDelegation = (): {
108107

109108
const delegate: Delegate = useCallback(
110109
// eslint-disable-next-line @typescript-eslint/no-shadow
111-
async ({ steps, startDate, endDate, nodeId }) => {
110+
async ({ steps, startDate, endDate, nodeId, onProgress }) => {
112111
if (activeAccount === undefined) {
113112
throw new Error('No active account')
114113
}
@@ -128,17 +127,6 @@ export const useDelegation = (): {
128127

129128
setSteps(steps)
130129

131-
// Get progress callback once before the loop (cache auto-clears after get)
132-
let onProgress:
133-
| ((step: number, operation: Operation | null) => void)
134-
| undefined
135-
try {
136-
const params = ledgerParamsCache.ledgerReviewTransactionParams.get()
137-
onProgress = params.stakingProgress?.onProgress
138-
} catch {
139-
// No ledger params cache available, skip progress callback
140-
}
141-
142130
let txHash
143131
let stepIndex = 0
144132

@@ -229,6 +217,9 @@ export const useDelegation = (): {
229217
stepIndex++
230218
}
231219

220+
// Signal completion - stepIndex now equals steps.length
221+
onProgress?.(stepIndex, null)
222+
232223
if (!txHash) {
233224
throw new Error('No transaction hash found')
234225
}

packages/core-mobile/app/hooks/earn/useIssueDelegation.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { useDelegationContext } from 'contexts/DelegationContext'
1+
import {
2+
useDelegationContext,
3+
OnDelegationProgress
4+
} from 'contexts/DelegationContext'
25
import { useCallback } from 'react'
36
import { useUiSafeMutation } from 'hooks/useUiSafeMutation'
47
import Logger from 'utils/Logger'
@@ -18,12 +21,14 @@ export const useIssueDelegation = ({
1821
nodeId,
1922
startDate,
2023
endDate,
21-
recomputeSteps
24+
recomputeSteps,
25+
onProgress
2226
}: {
2327
nodeId: string
2428
startDate: Date
2529
endDate: Date
2630
recomputeSteps?: boolean
31+
onProgress?: OnDelegationProgress
2732
}) => Promise<void>
2833
isPending: boolean
2934
} => {
@@ -34,28 +39,32 @@ export const useIssueDelegation = ({
3439
nodeId,
3540
startDate,
3641
endDate,
37-
recomputeSteps = false
42+
recomputeSteps = false,
43+
onProgress
3844
}: {
3945
nodeId: string
4046
startDate: Date
4147
endDate: Date
4248
recomputeSteps?: boolean
49+
onProgress?: OnDelegationProgress
4350
}) => {
4451
if (recomputeSteps) {
4552
const newSteps = await computeSteps(stakeAmount.toSubUnit())
4653
return delegate({
4754
steps: newSteps,
4855
startDate,
4956
endDate,
50-
nodeId
57+
nodeId,
58+
onProgress
5159
})
5260
}
5361

5462
return delegate({
5563
steps,
5664
startDate,
5765
endDate,
58-
nodeId
66+
nodeId,
67+
onProgress
5968
})
6069
},
6170
[computeSteps, delegate, steps, stakeAmount]

packages/core-mobile/app/new/features/ledger/screens/LedgerReviewTransactionScreen.tsx

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,8 @@ import { LedgerAppType } from 'services/ledger/types'
2020
import Logger from 'utils/Logger'
2121
import { useHeaderHeight } from '@react-navigation/elements'
2222
import { Operation } from 'services/earn/computeDelegationSteps/types'
23-
import {
24-
LedgerReviewTransactionParams,
25-
ledgerParamsCache
26-
} from '../services/ledgerParamsCache'
27-
import { useLedgerWalletMap } from '../store'
23+
import { useLedgerWalletMap, useLedgerParams } from '../store'
2824
import { getLedgerAppName } from '../utils'
29-
import { withLedgerParamsCache } from '../services/withLedgerParamsCache'
3025

3126
type Phase = 'connection' | 'progress'
3227

@@ -70,13 +65,17 @@ const getStepConfig = (operation: Operation | null): StepConfig => {
7065
}
7166
}
7267

73-
const LedgerReviewTransactionScreen = ({
74-
params: { network, onApprove, onReject, stakingProgress }
75-
}: {
76-
params: LedgerReviewTransactionParams
77-
}): JSX.Element => {
68+
const LedgerReviewTransactionScreen = (): JSX.Element | null => {
7869
const walletId = useSelector(selectActiveWalletId)
7970
const { ledgerWalletMap } = useLedgerWalletMap()
71+
const { reviewTransactionParams } = useLedgerParams()
72+
73+
// Extract params from store
74+
const network = reviewTransactionParams?.network
75+
const onApprove = reviewTransactionParams?.onApprove
76+
const onReject = reviewTransactionParams?.onReject
77+
const stakingProgress = reviewTransactionParams?.stakingProgress
78+
8079
const [isConnected, setIsConnected] = useState(false)
8180
const [isAvalancheAppOpen, setIsAvalancheAppOpen] = useState(false)
8281
const [isCancelEnabled, setIsCancelEnabled] = useState(false)
@@ -161,33 +160,26 @@ const LedgerReviewTransactionScreen = ({
161160
deviceForWallet &&
162161
isConnected &&
163162
isAvalancheAppOpen &&
164-
phase === 'connection'
163+
phase === 'connection' &&
164+
onApprove
165165
) {
166166
if (stakingProgress) {
167-
// Set up progress callback before starting the transaction
168-
ledgerParamsCache.ledgerReviewTransactionParams.set({
169-
network,
170-
onApprove,
171-
onReject,
172-
stakingProgress: {
173-
...stakingProgress,
174-
onProgress: (step: number, operation: Operation | null) => {
175-
setCurrentStep(step)
176-
setCurrentOperation(operation)
177-
178-
// Auto-complete when all steps are done
179-
if (step >= stakingProgress.totalSteps) {
180-
setTimeout(() => {
181-
stakingProgress.onComplete()
182-
}, 500) // Brief delay to show final state
183-
}
184-
}
167+
// Create progress callback that updates local state
168+
const onProgress = (step: number, operation: Operation | null): void => {
169+
setCurrentStep(step)
170+
setCurrentOperation(operation)
171+
172+
// Auto-complete when all steps are done
173+
if (step >= stakingProgress.totalSteps) {
174+
setTimeout(() => {
175+
stakingProgress.onComplete()
176+
}, 500) // Brief delay to show final state
185177
}
186-
})
178+
}
187179
// Transition to progress phase
188180
setPhase('progress')
189-
// Start the transaction process
190-
onApprove()
181+
// Start the transaction process with progress callback
182+
onApprove(onProgress)
191183
} else {
192184
// No staking progress tracking, just approve and let the caller handle navigation
193185
onApprove()
@@ -199,9 +191,7 @@ const LedgerReviewTransactionScreen = ({
199191
isAvalancheAppOpen,
200192
phase,
201193
stakingProgress,
202-
onApprove,
203-
network,
204-
onReject
194+
onApprove
205195
])
206196

207197
useEffect(() => {
@@ -463,6 +453,11 @@ const LedgerReviewTransactionScreen = ({
463453
renderDeviceItem
464454
])
465455

456+
// Return null if params not available (placed after all hooks to comply with rules of hooks)
457+
if (!reviewTransactionParams || !onApprove || !onReject) {
458+
return null
459+
}
460+
466461
return (
467462
<ScrollScreen
468463
isModal
@@ -478,6 +473,4 @@ const LedgerReviewTransactionScreen = ({
478473
)
479474
}
480475

481-
export default withLedgerParamsCache('ledgerReviewTransactionParams')(
482-
LedgerReviewTransactionScreen
483-
)
476+
export default LedgerReviewTransactionScreen

packages/core-mobile/app/new/features/ledger/services/ledgerParamsCache.ts

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

packages/core-mobile/app/new/features/ledger/services/withLedgerParamsCache.tsx

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

packages/core-mobile/app/new/features/ledger/store.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { Network } from '@avalabs/core-chains-sdk'
12
import { ZustandStorageKeys } from 'resources/Constants'
3+
import { OnDelegationProgress } from 'contexts/DelegationContext'
24
import { zustandMMKVStorage } from 'utils/mmkv/storages'
35
import { create } from 'zustand'
46
import { persist } from 'zustand/middleware'
@@ -16,6 +18,27 @@ interface LedgerWalletMapState {
1618
resetLedgerWalletMap: () => void
1719
}
1820

21+
// Types for ledger review transaction params
22+
export type StakingProgressParams = {
23+
totalSteps: number
24+
onComplete: () => void
25+
onCancel: () => void
26+
}
27+
28+
export type LedgerReviewTransactionParams = {
29+
network: Network
30+
onApprove: (onProgress?: OnDelegationProgress) => Promise<void>
31+
onReject: (message?: string) => void
32+
stakingProgress?: StakingProgressParams
33+
}
34+
35+
interface LedgerParamsState {
36+
reviewTransactionParams: LedgerReviewTransactionParams | null
37+
setReviewTransactionParams: (
38+
params: LedgerReviewTransactionParams | null
39+
) => void
40+
}
41+
1942
export const ledgerWalletMapStore = create<LedgerWalletMapState>()(
2043
persist(
2144
(set, get) => ({
@@ -50,3 +73,13 @@ export const ledgerWalletMapStore = create<LedgerWalletMapState>()(
5073
export const useLedgerWalletMap = (): LedgerWalletMapState => {
5174
return ledgerWalletMapStore()
5275
}
76+
77+
// Ephemeral store for ledger params (no persistence needed)
78+
export const ledgerParamsStore = create<LedgerParamsState>(set => ({
79+
reviewTransactionParams: null,
80+
setReviewTransactionParams: params => set({ reviewTransactionParams: params })
81+
}))
82+
83+
export const useLedgerParams = (): LedgerParamsState => {
84+
return ledgerParamsStore()
85+
}

packages/core-mobile/app/new/features/ledger/utils/index.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import { router } from 'expo-router'
22
import { ChainId, Network, NetworkVMType } from '@avalabs/core-chains-sdk'
33
import { LedgerAppType, LedgerDerivationPathType } from 'services/ledger/types'
4+
import { OnDelegationProgress } from 'contexts/DelegationContext'
45
import { z } from 'zod'
5-
import {
6-
ledgerParamsCache,
7-
StakingProgressParams
8-
} from '../services/ledgerParamsCache'
6+
import { ledgerParamsStore, StakingProgressParams } from '../store'
97

108
export const showLedgerReviewTransaction = ({
119
network,
@@ -14,11 +12,11 @@ export const showLedgerReviewTransaction = ({
1412
stakingProgress
1513
}: {
1614
network: Network
17-
onApprove: () => Promise<void>
15+
onApprove: (onProgress?: OnDelegationProgress) => Promise<void>
1816
onReject: (message?: string) => void
1917
stakingProgress?: StakingProgressParams
2018
}): void => {
21-
ledgerParamsCache.ledgerReviewTransactionParams.set({
19+
ledgerParamsStore.getState().setReviewTransactionParams({
2220
network,
2321
onApprove,
2422
onReject,

0 commit comments

Comments
 (0)