Skip to content

Commit 59610ac

Browse files
committed
Fix Bug
1 parent 95e071b commit 59610ac

11 files changed

Lines changed: 810 additions & 220 deletions

File tree

app.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,4 @@
5858
}
5959
}
6060
}
61-
}
61+
}

components/CreateWalletModal.tsx

Lines changed: 111 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
})

metro.config.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const { getDefaultConfig } = require('expo/metro-config');
2+
const path = require('path');
3+
4+
/** @type {import('expo/metro-config').MetroConfig} */
5+
const config = getDefaultConfig(__dirname);
6+
7+
// Alias websocket-polyfill to a local empty shim
8+
config.resolver.extraNodeModules = {
9+
...config.resolver.extraNodeModules,
10+
'websocket-polyfill': path.resolve(__dirname, 'shims/websocket-polyfill.js'),
11+
};
12+
13+
module.exports = config;

0 commit comments

Comments
 (0)