Skip to content

Commit a51c9f4

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

File tree

7 files changed

+187
-61
lines changed

7 files changed

+187
-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: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
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: 'boolean',
23+
title: 'Start index',
24+
validation: {},
25+
},
26+
} as const
27+
}
28+
29+
export const defaultResubscribeValues = {
30+
shouldResubscribe: false,
31+
resubscribeStartHeight: new BigNumber(0),
32+
}
33+
34+
type Values = typeof defaultResubscribeValues
35+
36+
type Props<V extends Values> = {
37+
fields: ConfigFields<V, never>
38+
form: UseFormReturn<V>
39+
}
40+
41+
export function FieldResubscribe<V extends Values>({ form, fields }: Props<V>) {
42+
const shouldResubscribe = form.watch('shouldResubscribe' as Path<V>)
43+
return (
44+
<div className="flex flex-col gap-1 pt-2">
45+
<div className="flex flex-col gap-2">
46+
<Label color="contrast">Advanced</Label>
47+
<Text size="14" color="subtle">
48+
Resubscribe to wallet events after adding addresses.
49+
</Text>
50+
</div>
51+
<div className="flex justify-start gap-3">
52+
<FieldSwitch
53+
form={form}
54+
fields={fields}
55+
name={'shouldResubscribe' as Path<V>}
56+
/>
57+
{shouldResubscribe && (
58+
<FieldNumber
59+
form={form}
60+
fields={fields}
61+
name={'resubscribeStartHeight' as Path<V>}
62+
/>
63+
)}
64+
</div>
65+
{shouldResubscribe && (
66+
<div className="pt-2">
67+
<Alert className="!p-2">
68+
<div className="flex flex-col gap-1">
69+
<div className="flex gap-2 items-center">
70+
<Text>
71+
<Warning16 />
72+
</Text>
73+
<Text weight="medium">Warning</Text>
74+
</div>
75+
<Text size="14" color="subtle">
76+
Only enable this if you are adding addresses with past
77+
transactions. Resubscribing processes the blockchain from the
78+
specified height - this can take take a long time.
79+
</Text>
80+
</div>
81+
</Alert>
82+
</div>
83+
)}
84+
</div>
85+
)
86+
}
87+
88+
export function useTriggerResubscribe() {
89+
const resubscribe = useResubscribe()
90+
return async (values: Values) => {
91+
if (values.shouldResubscribe) {
92+
await resubscribe.post({
93+
payload: values.resubscribeStartHeight
94+
? values.resubscribeStartHeight.toNumber()
95+
: 0,
96+
})
97+
}
98+
}
99+
}

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)