@@ -23,7 +23,9 @@ export default function CreateWalletModal({
2323 onDismiss,
2424 onWalletCreated,
2525} : CreateWalletModalProps ) {
26+ const [ mode , setMode ] = useState < 'create' | 'import' > ( 'create' )
2627 const [ name , setName ] = useState ( '' )
28+ const [ nwcUri , setNwcUri ] = useState ( '' )
2729 const [ selectedPermissions , setSelectedPermissions ] = useState < Set < NWCPermission > > (
2830 new Set ( [ 'get_info' , 'get_balance' ] )
2931 )
@@ -47,9 +49,20 @@ export default function CreateWalletModal({
4749 return
4850 }
4951
50- if ( selectedPermissions . size === 0 ) {
51- setError ( 'Please select at least one permission' )
52- return
52+ if ( mode === 'import' ) {
53+ if ( ! nwcUri . trim ( ) ) {
54+ setError ( 'Please enter an NWC URI' )
55+ return
56+ }
57+ if ( ! nwcUri . startsWith ( 'nostr+walletconnect://' ) ) {
58+ setError ( 'Invalid NWC URI format' )
59+ return
60+ }
61+ } else {
62+ if ( selectedPermissions . size === 0 ) {
63+ setError ( 'Please select at least one permission' )
64+ return
65+ }
5366 }
5467
5568 setLoading ( true )
@@ -58,17 +71,20 @@ export default function CreateWalletModal({
5871 try {
5972 const config : WalletConfig = {
6073 name : name . trim ( ) ,
61- permissions : Array . from ( selectedPermissions ) ,
62- budgetMsat : budgetSats ? parseInt ( budgetSats ) * 1000 : undefined ,
74+ permissions : mode === 'create' ? Array . from ( selectedPermissions ) : [ ] ,
75+ budgetMsat : ( mode === 'create' && budgetSats ) ? parseInt ( budgetSats ) * 1000 : undefined ,
76+ nwcUri : mode === 'import' ? nwcUri . trim ( ) : undefined
6377 }
6478
6579 const wallet = await walletManager . createSubWallet ( config )
6680 onWalletCreated ( wallet )
6781
6882 // Reset form
6983 setName ( '' )
84+ setNwcUri ( '' )
7085 setSelectedPermissions ( new Set ( [ 'get_info' , 'get_balance' ] ) )
7186 setBudgetSats ( '' )
87+ setMode ( 'create' )
7288 } catch ( err ) {
7389 setError ( err instanceof Error ? err . message : 'Failed to create wallet' )
7490 } finally {
@@ -87,9 +103,30 @@ export default function CreateWalletModal({
87103 < Card style = { styles . card } >
88104 < Card . Content >
89105 < Text variant = "headlineSmall" style = { styles . title } >
90- Create Sub-Wallet
106+ { mode === 'create' ? ' Create Sub-Wallet' : 'Import Wallet' }
91107 </ Text >
92108
109+ < View style = { styles . toggleRow } >
110+ < Button
111+ mode = { mode === 'create' ? 'contained' : 'outlined' }
112+ onPress = { ( ) => setMode ( 'create' ) }
113+ style = { styles . toggleButton }
114+ buttonColor = { mode === 'create' ? '#FFD700' : undefined }
115+ textColor = { mode === 'create' ? '#000000' : '#888888' }
116+ >
117+ New
118+ </ Button >
119+ < Button
120+ mode = { mode === 'import' ? 'contained' : 'outlined' }
121+ onPress = { ( ) => setMode ( 'import' ) }
122+ style = { styles . toggleButton }
123+ buttonColor = { mode === 'import' ? '#FFD700' : undefined }
124+ textColor = { mode === 'import' ? '#000000' : '#888888' }
125+ >
126+ Import
127+ </ Button >
128+ </ View >
129+
93130 < TextInput
94131 label = "Wallet Name"
95132 value = { name }
@@ -100,36 +137,60 @@ export default function CreateWalletModal({
100137 error = { ! ! error && ! name . trim ( ) }
101138 />
102139
103- < Text variant = "titleMedium" style = { styles . sectionTitle } >
104- Permissions
105- </ Text >
106-
107- { AVAILABLE_PERMISSIONS . map ( ( perm ) => (
108- < View key = { perm . key } style = { styles . checkboxRow } >
109- < Checkbox
110- status = { selectedPermissions . has ( perm . key ) ? 'checked' : 'unchecked' }
111- onPress = { ( ) => togglePermission ( perm . key ) }
112- color = "#FFD700"
113- />
114- < Text style = { styles . checkboxLabel } onPress = { ( ) => togglePermission ( perm . key ) } >
115- { perm . label }
140+ { mode === 'import' ? (
141+ < TextInput
142+ label = "NWC URI"
143+ value = { nwcUri }
144+ onChangeText = { setNwcUri }
145+ mode = "outlined"
146+ placeholder = "nostr+walletconnect://..."
147+ style = { styles . input }
148+ multiline
149+ numberOfLines = { 3 }
150+ error = { ! ! error && ( ! nwcUri || ! nwcUri . startsWith ( 'nostr+walletconnect://' ) ) }
151+ />
152+ ) : (
153+ < >
154+ < Text variant = "titleMedium" style = { styles . sectionTitle } >
155+ Access Level
116156 </ Text >
117- </ View >
118- ) ) }
119-
120- < Text variant = "titleMedium" style = { styles . sectionTitle } >
121- Budget (Optional)
122- </ Text >
157+ < View style = { styles . toggleRow } >
158+ < Button
159+ mode = { selectedPermissions . has ( 'pay_invoice' ) ? 'contained' : 'outlined' }
160+ onPress = { ( ) => setSelectedPermissions ( new Set ( [ 'get_info' , 'get_balance' , 'make_invoice' , 'pay_invoice' , 'list_transactions' ] ) ) }
161+ style = { styles . toggleButton }
162+ buttonColor = { selectedPermissions . has ( 'pay_invoice' ) ? '#FFD700' : undefined }
163+ textColor = { selectedPermissions . has ( 'pay_invoice' ) ? '#000000' : '#888888' }
164+ >
165+ Full Access
166+ </ Button >
167+ < Button
168+ mode = { ! selectedPermissions . has ( 'pay_invoice' ) ? 'contained' : 'outlined' }
169+ onPress = { ( ) => setSelectedPermissions ( new Set ( [ 'get_info' , 'get_balance' , 'make_invoice' , 'list_transactions' ] ) ) }
170+ style = { styles . toggleButton }
171+ buttonColor = { ! selectedPermissions . has ( 'pay_invoice' ) ? '#FFD700' : undefined }
172+ textColor = { ! selectedPermissions . has ( 'pay_invoice' ) ? '#000000' : '#888888' }
173+ >
174+ Receive Only
175+ </ Button >
176+ </ View >
123177
124- < TextInput
125- label = "Budget in sats"
126- value = { budgetSats }
127- onChangeText = { setBudgetSats }
128- mode = "outlined"
129- keyboardType = "numeric"
130- placeholder = "e.g., 100000"
131- style = { styles . input }
132- />
178+ < Text variant = "titleMedium" style = { styles . sectionTitle } >
179+ Budget (Optional)
180+ </ Text >
181+ < View style = { styles . budgetRow } >
182+ < TextInput
183+ label = "Initial Balance (Sats)"
184+ value = { budgetSats }
185+ onChangeText = { setBudgetSats }
186+ mode = "outlined"
187+ keyboardType = "numeric"
188+ placeholder = "e.g., 1000"
189+ style = { styles . budgetInput }
190+ />
191+ </ View >
192+ </ >
193+ ) }
133194
134195 { error ? (
135196 < Text style = { styles . errorText } > { error } </ Text >
@@ -153,7 +214,7 @@ export default function CreateWalletModal({
153214 buttonColor = "#FFD700"
154215 textColor = "#000000"
155216 >
156- Create
217+ { mode === 'create' ? ' Create' : 'Import' }
157218 </ Button >
158219 </ View >
159220 </ Card . Content >
@@ -200,6 +261,15 @@ const styles = StyleSheet.create({
200261 marginTop : 24 ,
201262 gap : 12 ,
202263 } ,
264+ toggleRow : {
265+ flexDirection : 'row' ,
266+ marginBottom : 16 ,
267+ gap : 12 ,
268+ } ,
269+ toggleButton : {
270+ flex : 1 ,
271+ borderColor : '#333333' ,
272+ } ,
203273 cancelButton : {
204274 flex : 1 ,
205275 borderColor : '#333333' ,
@@ -211,4 +281,10 @@ const styles = StyleSheet.create({
211281 color : '#CF6679' ,
212282 marginTop : 8 ,
213283 } ,
284+ budgetRow : {
285+ marginBottom : 8 ,
286+ } ,
287+ budgetInput : {
288+ flex : 1 ,
289+ } ,
214290} )
0 commit comments