Skip to content

Commit f939602

Browse files
committed
feat: walletd resubscribe
1 parent aee6084 commit f939602

File tree

7 files changed

+188
-61
lines changed

7 files changed

+188
-61
lines changed

.changeset/dull-trees-grow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'walletd': minor
3+
---
4+
5+
Address generation and addition dialogs now have an option to resubscribe from a specified height.

apps/walletd/contexts/events/index.tsx

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@ import {
33
useDatasetEmptyState,
44
useServerFilters,
55
} from '@siafoundation/design-system'
6-
import {
7-
useResubscribe,
8-
useWalletEvents,
9-
useWalletTxPool,
10-
} from '@siafoundation/react-walletd'
11-
import { createContext, useCallback, useContext, useMemo } from 'react'
6+
import { useWalletEvents, useWalletTxPool } from '@siafoundation/react-walletd'
7+
import { createContext, useContext, useMemo } from 'react'
128
import {
139
CellContext,
1410
EventData,
@@ -56,13 +52,6 @@ export function useEventsMain() {
5652
},
5753
})
5854

59-
const _resubscribe = useResubscribe()
60-
const resubscribe = useCallback(async () => {
61-
_resubscribe.post({
62-
payload: 0,
63-
})
64-
}, [_resubscribe])
65-
6655
const dataset = useMemo<EventData[] | null>(() => {
6756
if (!responseEvents.data || !responseTxPool.data) {
6857
return null
@@ -204,7 +193,6 @@ export function useEventsMain() {
204193
removeFilter,
205194
removeLastFilter,
206195
resetFilters,
207-
resubscribe,
208196
offset,
209197
limit,
210198
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import {
2+
Alert,
3+
ConfigFields,
4+
FieldNumber,
5+
FieldSwitch,
6+
Label,
7+
Text,
8+
} from '@siafoundation/design-system'
9+
import { Path, UseFormReturn } from 'react-hook-form'
10+
import { Warning16 } from '@carbon/icons-react'
11+
import BigNumber from 'bignumber.js'
12+
import { useResubscribe } from '@siafoundation/react-walletd'
13+
14+
export function getResubscribeFields() {
15+
return {
16+
shouldResubscribe: {
17+
type: 'boolean',
18+
title: 'Resubscribe',
19+
validation: {},
20+
},
21+
resubscribeStartHeight: {
22+
type: 'number',
23+
decimalsLimit: 0,
24+
title: 'Start index',
25+
validation: {},
26+
},
27+
} as const
28+
}
29+
30+
export const defaultResubscribeValues = {
31+
shouldResubscribe: false,
32+
resubscribeStartHeight: new BigNumber(0),
33+
}
34+
35+
type Values = typeof defaultResubscribeValues
36+
37+
type Props<V extends Values> = {
38+
fields: ConfigFields<V, never>
39+
form: UseFormReturn<V>
40+
}
41+
42+
export function FieldResubscribe<V extends Values>({ form, fields }: Props<V>) {
43+
const shouldResubscribe = form.watch('shouldResubscribe' as Path<V>)
44+
return (
45+
<div className="flex flex-col gap-1 pt-2">
46+
<div className="flex flex-col gap-2">
47+
<Label color="contrast">Advanced</Label>
48+
<Text size="14" color="subtle">
49+
Resubscribe to wallet events after adding addresses.
50+
</Text>
51+
</div>
52+
<div className="flex justify-start gap-3">
53+
<FieldSwitch
54+
form={form}
55+
fields={fields}
56+
name={'shouldResubscribe' as Path<V>}
57+
/>
58+
{shouldResubscribe && (
59+
<FieldNumber
60+
form={form}
61+
fields={fields}
62+
name={'resubscribeStartHeight' as Path<V>}
63+
/>
64+
)}
65+
</div>
66+
{shouldResubscribe && (
67+
<div className="pt-2">
68+
<Alert className="!p-2">
69+
<div className="flex flex-col gap-1">
70+
<div className="flex gap-2 items-center">
71+
<Text>
72+
<Warning16 />
73+
</Text>
74+
<Text weight="medium">Warning</Text>
75+
</div>
76+
<Text size="14" color="subtle">
77+
Only enable this if you are adding addresses with past
78+
transactions. Resubscribing processes the blockchain from the
79+
specified height - this can take take a long time.
80+
</Text>
81+
</div>
82+
</Alert>
83+
</div>
84+
)}
85+
</div>
86+
)
87+
}
88+
89+
export function useTriggerResubscribe() {
90+
const resubscribe = useResubscribe()
91+
return async (values: Values) => {
92+
if (values.shouldResubscribe) {
93+
await resubscribe.post({
94+
payload: values.resubscribeStartHeight
95+
? values.resubscribeStartHeight.toNumber()
96+
: 0,
97+
})
98+
}
99+
}
100+
}

apps/walletd/dialogs/WalletAddressesAddDialog.tsx

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import {
33
ConfigFields,
44
Dialog,
5-
FieldSwitch,
65
FieldTextArea,
76
FormSubmitButton,
87
Paragraph,
@@ -12,14 +11,19 @@ import {
1211
} from '@siafoundation/design-system'
1312
import {
1413
WalletAddressMetadata,
15-
useResubscribe,
1614
useWalletAddressAdd,
1715
} from '@siafoundation/react-walletd'
1816
import { useCallback } from 'react'
1917
import { useForm } from 'react-hook-form'
2018
import { useWallets } from '../contexts/wallets'
2119
import { isValidAddress } from '@siafoundation/units'
2220
import { uniq } from '@technically/lodash'
21+
import {
22+
FieldResubscribe,
23+
useTriggerResubscribe,
24+
getResubscribeFields,
25+
defaultResubscribeValues,
26+
} from './FieldResubscribe'
2327

2428
export type WalletAddressesAddDialogParams = {
2529
walletId: string
@@ -34,7 +38,7 @@ type Props = {
3438

3539
const defaultValues = {
3640
addresses: '',
37-
shouldResubscribe: false,
41+
...defaultResubscribeValues,
3842
}
3943

4044
type Values = typeof defaultValues
@@ -84,11 +88,7 @@ function getFields(): ConfigFields<Values, never> {
8488
},
8589
},
8690
},
87-
shouldResubscribe: {
88-
type: 'boolean',
89-
title: 'Resubscribe',
90-
validation: {},
91-
},
91+
...getResubscribeFields(),
9292
}
9393
}
9494

@@ -115,7 +115,6 @@ export function WalletAddressesAddDialog({
115115
const fields = getFields()
116116

117117
const addressAdd = useWalletAddressAdd()
118-
const resubscribe = useResubscribe()
119118
const addAllAddresses = useCallback(
120119
async (addresses: string) => {
121120
const addrs = formatAddresses(addresses)
@@ -151,6 +150,7 @@ export function WalletAddressesAddDialog({
151150
[walletId, addressAdd]
152151
)
153152

153+
const triggerResubscribe = useTriggerResubscribe()
154154
const onSubmit = useCallback(
155155
async (values: Values) => {
156156
const result = await addAllAddresses(values.addresses)
@@ -175,14 +175,10 @@ export function WalletAddressesAddDialog({
175175
`Successfully added ${result.successful} addresses.`
176176
)
177177
}
178-
if (values.shouldResubscribe) {
179-
resubscribe.post({
180-
payload: 0,
181-
})
182-
}
178+
triggerResubscribe(values)
183179
closeAndReset()
184180
},
185-
[addAllAddresses, closeAndReset, resubscribe]
181+
[addAllAddresses, closeAndReset, triggerResubscribe]
186182
)
187183

188184
const addressesText = form.watch('addresses')
@@ -215,7 +211,7 @@ export function WalletAddressesAddDialog({
215211
Enter multiple addresses separated by spaces or commas.
216212
</Paragraph>
217213
<FieldTextArea form={form} fields={fields} name="addresses" />
218-
<FieldSwitch form={form} fields={fields} name="shouldResubscribe" />
214+
<FieldResubscribe form={form} fields={fields} />
219215
</div>
220216
</Dialog>
221217
)

apps/walletd/dialogs/WalletAddressesGenerateLedgerDialog/index.tsx

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ import { useLedger } from '../../contexts/ledger'
2424
import { LedgerAddress } from './LedgerAddress'
2525
import { useWalletAddresses } from '../../hooks/useWalletAddresses'
2626
import { getSDK } from '@siafoundation/sdk'
27+
import {
28+
FieldResubscribe,
29+
getResubscribeFields,
30+
defaultResubscribeValues,
31+
useTriggerResubscribe,
32+
} from '../FieldResubscribe'
2733

2834
export type WalletAddressesGenerateLedgerDialogParams = {
2935
walletId: string
@@ -42,6 +48,7 @@ function getDefaultValues(lastIndex: number) {
4248
ledgerConnected: false,
4349
index: new BigNumber(lastIndex),
4450
count: new BigNumber(1),
51+
...defaultResubscribeValues,
4552
}
4653
}
4754

@@ -78,6 +85,7 @@ function getFields(): ConfigFields<Values, never> {
7885
max: 1000,
7986
},
8087
},
88+
...getResubscribeFields(),
8189
}
8290
}
8391

@@ -300,16 +308,21 @@ export function WalletAddressesGenerateLedgerDialog({
300308
defaultValues,
301309
})
302310

303-
const onSubmit = useCallback(async () => {
304-
if (newGeneratedAddresses.length === 0) {
305-
triggerErrorToast(
306-
'Add and generate addresses with your Ledger device to continue.'
307-
)
308-
return
309-
}
310-
await saveAddresses()
311-
closeAndReset()
312-
}, [newGeneratedAddresses, saveAddresses, closeAndReset])
311+
const triggerResubscribe = useTriggerResubscribe()
312+
const onSubmit = useCallback(
313+
async (values: Values) => {
314+
if (newGeneratedAddresses.length === 0) {
315+
triggerErrorToast(
316+
'Add and generate addresses with your Ledger device to continue.'
317+
)
318+
return
319+
}
320+
await saveAddresses()
321+
await triggerResubscribe(values)
322+
closeAndReset()
323+
},
324+
[newGeneratedAddresses, saveAddresses, closeAndReset, triggerResubscribe]
325+
)
313326

314327
return (
315328
<Dialog
@@ -372,6 +385,7 @@ export function WalletAddressesGenerateLedgerDialog({
372385
)}
373386
</div>
374387
</div>
388+
<FieldResubscribe form={form} fields={fields} />
375389
</div>
376390
</Dialog>
377391
)

0 commit comments

Comments
 (0)