From 6fbf3a2497b74ca605640e4ccb4c05fbfc242e23 Mon Sep 17 00:00:00 2001 From: Shubham Kumar Date: Mon, 13 Jul 2026 11:15:46 +0530 Subject: [PATCH] feat (ldk): add VSS server step to wallet recovery --- App.tsx | 9 +- .../LdkRecovery/LdkRecoveryVssServer.tsx | 180 ++++++++++++++++++ .../LdkWalletRecoverySettings.tsx | 21 +- views/Settings/SeedRecovery.tsx | 7 +- 4 files changed, 203 insertions(+), 14 deletions(-) create mode 100644 views/Settings/LdkRecovery/LdkRecoveryVssServer.tsx rename views/Settings/{ => LdkRecovery}/LdkWalletRecoverySettings.tsx (85%) diff --git a/App.tsx b/App.tsx index 776d2e640..8cce97358 100644 --- a/App.tsx +++ b/App.tsx @@ -226,7 +226,8 @@ import EditFee from './views/EditFee'; // Embedded LND/LDK import Seed from './views/Settings/Seed'; import SeedRecovery from './views/Settings/SeedRecovery'; -import LdkWalletRecoverySettings from './views/Settings/LdkWalletRecoverySettings'; +import LdkWalletRecoverySettings from './views/Settings/LdkRecovery/LdkWalletRecoverySettings'; +import LdkRecoveryVssServer from './views/Settings/LdkRecovery/LdkRecoveryVssServer'; import SeedQRExport from './views/Settings/SeedQRExport'; import Sync from './views/Sync'; import SyncRecovery from './views/SyncRecovery'; @@ -1092,6 +1093,12 @@ export default class App extends React.PureComponent { LdkWalletRecoverySettings } /> + ; + route: Route< + 'LdkRecoveryVssServer', + { + network: string; + nickname?: string; + photo?: string; + wordCount: 12 | 24; + } + >; +} + +interface LdkRecoveryVssServerState { + selectedValue: string; + customServer: string; +} + +export default class LdkRecoveryVssServer extends React.Component< + LdkRecoveryVssServerProps, + LdkRecoveryVssServerState +> { + state = { + selectedValue: DEFAULT_VSS_SERVER, + customServer: '' + }; + + private getEffectiveServer = (): string => { + const { selectedValue, customServer } = this.state; + return selectedValue === 'custom' ? customServer.trim() : selectedValue; + }; + + private continueToRecovery = () => { + const { navigation, route } = this.props; + const { network, nickname, photo, wordCount } = route.params ?? {}; + + navigation.navigate('SeedRecovery', { + network, + implementation: 'ldk-node', + nickname, + photo, + wordCount, + vssServer: this.getEffectiveServer() || undefined + }); + }; + + render() { + const { navigation } = this.props; + const { selectedValue, customServer } = this.state; + const customServerTrimmed = customServer.trim(); + + const isCustom = selectedValue === 'custom'; + + const showInvalidUrlError = + isCustom && + customServerTrimmed !== '' && + !UrlUtils.isValidUrl(customServer); + const disabled = + isCustom && (customServerTrimmed === '' || showInvalidUrlError); + + return ( + +
+ + + {localeString( + 'views.Settings.EmbeddedNode.VssServer.subtitle' + )} + + + { + this.setState({ + selectedValue: value, + customServer: + value === 'custom' ? customServer : '' + }); + }} + values={LDK_VSS_SERVER_KEYS} + /> + + {isCustom && ( + <> + + this.setState({ customServer: text }) + } + autoCapitalize="none" + autoCorrect={false} + /> + {showInvalidUrlError && ( + + {localeString( + 'views.Settings.EmbeddedNode.invalidServerUrl' + )} + + )} + + )} + + +