@@ -27,6 +27,12 @@ use crate::daemon::{
27
27
Daemon ,
28
28
} ;
29
29
30
+ pub enum Modal {
31
+ VerifyAddress ( VerifyAddressModal ) ,
32
+ ShowQrCode ( ShowQrCodeModal ) ,
33
+ None ,
34
+ }
35
+
30
36
#[ derive( Debug , Default ) ]
31
37
pub struct Addresses {
32
38
list : Vec < Address > ,
@@ -51,8 +57,7 @@ pub struct ReceivePanel {
51
57
wallet : Arc < Wallet > ,
52
58
addresses : Addresses ,
53
59
labels_edited : LabelsEdited ,
54
- qr_code : Option < qr_code:: State > ,
55
- modal : Option < VerifyAddressModal > ,
60
+ modal : Modal ,
56
61
warning : Option < Error > ,
57
62
}
58
63
@@ -63,8 +68,7 @@ impl ReceivePanel {
63
68
wallet,
64
69
addresses : Addresses :: default ( ) ,
65
70
labels_edited : LabelsEdited :: default ( ) ,
66
- qr_code : None ,
67
- modal : None ,
71
+ modal : Modal :: None ,
68
72
warning : None ,
69
73
}
70
74
}
@@ -78,22 +82,24 @@ impl State for ReceivePanel {
78
82
self . warning . as_ref ( ) ,
79
83
view:: receive:: receive (
80
84
& self . addresses . list ,
81
- self . qr_code . as_ref ( ) ,
82
85
& self . addresses . labels ,
83
86
self . labels_edited . cache ( ) ,
84
87
) ,
85
88
) ;
86
- if let Some ( m) = & self . modal {
87
- modal:: Modal :: new ( content, m. view ( ) )
89
+
90
+ match & self . modal {
91
+ Modal :: VerifyAddress ( m) => modal:: Modal :: new ( content, m. view ( ) )
88
92
. on_blur ( Some ( view:: Message :: Close ) )
89
- . into ( )
90
- } else {
91
- content
93
+ . into ( ) ,
94
+ Modal :: ShowQrCode ( m) => modal:: Modal :: new ( content, m. view ( ) )
95
+ . on_blur ( Some ( view:: Message :: Close ) )
96
+ . into ( ) ,
97
+ Modal :: None => content,
92
98
}
93
99
}
94
100
95
101
fn subscription ( & self ) -> Subscription < Message > {
96
- if let Some ( modal) = & self . modal {
102
+ if let Modal :: VerifyAddress ( modal) = & self . modal {
97
103
modal. subscription ( )
98
104
} else {
99
105
Subscription :: none ( )
@@ -124,11 +130,6 @@ impl State for ReceivePanel {
124
130
match res {
125
131
Ok ( ( address, derivation_index) ) => {
126
132
self . warning = None ;
127
- self . qr_code = qr_code:: State :: new ( format ! (
128
- "bitcoin:{}?index={}" ,
129
- address, derivation_index
130
- ) )
131
- . ok ( ) ;
132
133
self . addresses . list . push ( address) ;
133
134
self . addresses . derivation_indexes . push ( derivation_index) ;
134
135
}
@@ -137,11 +138,11 @@ impl State for ReceivePanel {
137
138
Command :: none ( )
138
139
}
139
140
Message :: View ( view:: Message :: Close ) => {
140
- self . modal = None ;
141
+ self . modal = Modal :: None ;
141
142
Command :: none ( )
142
143
}
143
144
Message :: View ( view:: Message :: Select ( i) ) => {
144
- self . modal = Some ( VerifyAddressModal :: new (
145
+ self . modal = Modal :: VerifyAddress ( VerifyAddressModal :: new (
145
146
self . data_dir . clone ( ) ,
146
147
self . wallet . clone ( ) ,
147
148
cache. network ,
@@ -154,12 +155,20 @@ impl State for ReceivePanel {
154
155
) ) ;
155
156
Command :: none ( )
156
157
}
158
+ Message :: View ( view:: Message :: ShowQrCode ( i) ) => {
159
+ let address = self . addresses . list . get ( i) . expect ( "Must be present" ) . clone ( ) ;
160
+ let qr_code = qr_code:: State :: new ( format ! ( "bitcoin:{}?index={}" , address, i) ) . ok ( ) ;
161
+ self . modal = Modal :: ShowQrCode ( ShowQrCodeModal :: new ( qr_code. unwrap ( ) ) ) ;
162
+ Command :: none ( )
163
+ }
157
164
Message :: View ( view:: Message :: Next ) => self . load ( daemon) ,
158
- _ => self
159
- . modal
160
- . as_mut ( )
161
- . map ( |m| m. update ( daemon, cache, message) )
162
- . unwrap_or_else ( Command :: none) ,
165
+ _ => {
166
+ if let Modal :: VerifyAddress ( ref mut m) = self . modal {
167
+ m. update ( daemon, cache, message)
168
+ } else {
169
+ Command :: none ( )
170
+ }
171
+ }
163
172
}
164
173
}
165
174
@@ -268,6 +277,20 @@ impl VerifyAddressModal {
268
277
}
269
278
}
270
279
280
+ pub struct ShowQrCodeModal {
281
+ qr_code : qr_code:: State ,
282
+ }
283
+
284
+ impl ShowQrCodeModal {
285
+ pub fn new ( qr : qr_code:: State ) -> Self {
286
+ Self { qr_code : qr }
287
+ }
288
+
289
+ fn view ( & self ) -> Element < view:: Message > {
290
+ view:: receive:: qr_modal ( & self . qr_code )
291
+ }
292
+ }
293
+
271
294
async fn verify_address (
272
295
hw : std:: sync:: Arc < dyn async_hwi:: HWI + Send + Sync > ,
273
296
index : ChildNumber ,
0 commit comments