Skip to content

Commit 46d3d7d

Browse files
authored
fix(login): change ordering of account creation pages (#1976)
1 parent 70d4571 commit 46d3d7d

File tree

4 files changed

+88
-108
lines changed

4 files changed

+88
-108
lines changed

ui/src/layouts/log_in/copy_seed_words.rs

Lines changed: 79 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,21 @@ use dioxus_desktop::{use_window, LogicalSize};
77
use kit::elements::{button::Button, label::Label, Appearance};
88
use tokio::time::sleep;
99

10-
use crate::get_app_style;
11-
1210
use super::AuthPages;
11+
use crate::get_app_style;
12+
use common::state::configuration::Configuration;
13+
use common::{
14+
sounds,
15+
warp_runner::{MultiPassCmd, WarpCmd},
16+
WARP_CMD_CH,
17+
};
18+
use futures::channel::oneshot;
19+
use futures::StreamExt;
20+
use warp::multipass;
1321

1422
// styles for this layout are in layouts/style.scss
1523
#[component]
16-
pub fn Layout(cx: Scope, page: UseState<AuthPages>, seed_words: UseRef<String>) -> Element {
24+
pub fn Layout(cx: Scope, page: UseState<AuthPages>, username: String, pin: String) -> Element {
1725
let state = use_ref(cx, State::load);
1826
let window = use_window(cx);
1927

@@ -24,20 +32,18 @@ pub fn Layout(cx: Scope, page: UseState<AuthPages>, seed_words: UseRef<String>)
2432
});
2533
}
2634

27-
let words = use_future(cx, (), |_| {
28-
to_owned![seed_words];
29-
async move {
30-
let mnemonic = warp::crypto::keypair::generate_mnemonic_phrase(
31-
warp::crypto::keypair::PhraseType::Standard,
32-
)
33-
.into_phrase();
34-
35-
seed_words.set(mnemonic.clone());
35+
let words = use_future(cx, (), |_| async move {
36+
let mnemonic = warp::crypto::keypair::generate_mnemonic_phrase(
37+
warp::crypto::keypair::PhraseType::Standard,
38+
)
39+
.into_phrase();
40+
(
41+
mnemonic.clone(),
3642
mnemonic
3743
.split_ascii_whitespace()
3844
.map(|x| x.to_string())
39-
.collect::<Vec<String>>()
40-
}
45+
.collect::<Vec<String>>(),
46+
)
4147
});
4248

4349
cx.render(rsx!(
@@ -53,25 +59,76 @@ pub fn Layout(cx: Scope, page: UseState<AuthPages>, seed_words: UseRef<String>)
5359
aria_label: "copy-seed-words".into(),
5460
text: get_local_text("copy-seed-words")
5561
},
56-
if let Some(words) = words.value() {
57-
rsx!{ SeedWords { page: page.clone(), words: words.clone() } }
62+
if let Some((seed_words, words)) = words.value() {
63+
rsx!{ SeedWords { page: page.clone(), username: username.clone(), pin: pin.clone(), seed_words: seed_words.clone(), words: words.clone() } }
5864
}
5965
}
6066
))
6167
}
6268

6369
#[component]
64-
fn SeedWords(cx: Scope, page: UseState<AuthPages>, words: Vec<String>) -> Element {
70+
fn SeedWords(
71+
cx: Scope,
72+
page: UseState<AuthPages>,
73+
username: String,
74+
pin: String,
75+
seed_words: String,
76+
words: Vec<String>,
77+
) -> Element {
6578
let copied = use_ref(cx, || false);
79+
let loading = use_state(cx, || false);
80+
6681
use_future(cx, copied, |current| async move {
6782
if *current.read() {
6883
sleep(Duration::from_secs(3)).await;
6984
*current.write() = false;
7085
}
7186
});
87+
88+
let ch = use_coroutine(cx, |mut rx: UnboundedReceiver<()>| {
89+
to_owned![page, loading, username, pin, seed_words];
90+
async move {
91+
let config = Configuration::load_or_default();
92+
let warp_cmd_tx = WARP_CMD_CH.tx.clone();
93+
while let Some(()) = rx.next().await {
94+
loading.set(true);
95+
let (tx, rx) =
96+
oneshot::channel::<Result<multipass::identity::Identity, warp::error::Error>>();
97+
98+
if let Err(e) = warp_cmd_tx.send(WarpCmd::MultiPass(MultiPassCmd::CreateIdentity {
99+
username: username.clone(),
100+
tesseract_passphrase: pin.clone(),
101+
seed_words: seed_words.clone(),
102+
rsp: tx,
103+
})) {
104+
log::error!("failed to send warp command: {}", e);
105+
continue;
106+
}
107+
108+
let res = rx.await.expect("failed to get response from warp_runner");
109+
110+
match res {
111+
Ok(ident) => {
112+
if config.audiovideo.interface_sounds {
113+
sounds::Play(sounds::Sounds::On);
114+
}
115+
116+
page.set(AuthPages::Success(ident));
117+
}
118+
// todo: notify user
119+
Err(e) => log::error!("create identity failed: {}", e),
120+
}
121+
}
122+
}
123+
});
72124
render! {
125+
loading.get().then(|| rsx!(
126+
div {
127+
class: "overlay-load-shadow",
128+
},
129+
)),
73130
div {
74-
class: "seed-words",
131+
class: format_args!("seed-words {}", if *loading.get() {"progress"} else {""}),
75132
words.chunks_exact(2).enumerate().map(|(idx, vals)| rsx! {
76133
div {
77134
class: "row",
@@ -126,16 +183,19 @@ fn SeedWords(cx: Scope, page: UseState<AuthPages>, words: Vec<String>) -> Elemen
126183
class: "controls",
127184
Button {
128185
text: get_local_text("uplink.go-back"),
186+
disabled: *loading.get(),
129187
aria_label: "back-button".into(),
130188
icon: icons::outline::Shape::ChevronLeft,
131189
onpress: move |_| page.set(AuthPages::CreateOrRecover),
132190
appearance: Appearance::Secondary
133191
},
134192
Button {
135193
aria_label: "i-saved-it-button".into(),
194+
disabled: *loading.get(),
195+
loading: *loading.get(),
136196
text: get_local_text("copy-seed-words.finished"),
137197
onpress: move |_| {
138-
page.set(AuthPages::EnterUserName);
198+
ch.send(());
139199
}
140200
}
141201
}

ui/src/layouts/log_in/create_or_recover.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn Layout(cx: Scope, page: UseState<AuthPages>) -> Element {
3939
aria_label: "create-button".into(),
4040
text: get_local_text("create-or-recover.create"),
4141
onpress: move |_| {
42-
page.set(AuthPages::CopySeedWords);
42+
page.set(AuthPages::EnterUserName);
4343
}
4444
},
4545
Button {

ui/src/layouts/log_in/enter_username.rs

Lines changed: 5 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,23 @@
11
use common::icons::outline::Shape as Icon;
22
use common::language::get_local_text;
3-
use common::state::configuration::Configuration;
4-
use common::{
5-
sounds,
6-
warp_runner::{MultiPassCmd, WarpCmd},
7-
WARP_CMD_CH,
8-
};
93
use dioxus::prelude::*;
104
use dioxus_desktop::{use_window, LogicalSize};
11-
use futures::channel::oneshot;
12-
use futures::StreamExt;
135
use kit::elements::label::Label;
146
use kit::elements::{
157
button::Button,
168
input::{Input, Options, Validation},
179
};
1810
use tracing::log;
19-
use warp::multipass;
2011

2112
use crate::AuthPages;
2213

2314
pub const MIN_USERNAME_LEN: i32 = 4;
2415
pub const MAX_USERNAME_LEN: i32 = 32;
2516

26-
struct CreateAccountCmd {
27-
username: String,
28-
passphrase: String,
29-
seed_words: String,
30-
}
31-
3217
#[component]
33-
pub fn Layout(
34-
cx: Scope,
35-
page: UseState<AuthPages>,
36-
pin: UseRef<String>,
37-
seed_words: UseRef<String>,
38-
) -> Element {
18+
pub fn Layout(cx: Scope, page: UseState<AuthPages>, user_name: UseRef<String>) -> Element {
3919
log::trace!("rendering enter username layout");
4020
let window = use_window(cx);
41-
let loading = use_state(cx, || false);
4221

4322
if !matches!(&*page.current(), AuthPages::Success(_)) {
4423
window.set_inner_size(LogicalSize {
@@ -47,7 +26,6 @@ pub fn Layout(
4726
});
4827
}
4928

50-
let username = use_state(cx, String::new);
5129
//let error = use_state(cx, String::new);
5230
let button_disabled = use_state(cx, || true);
5331

@@ -67,57 +45,9 @@ pub fn Layout(
6745
special_chars: None,
6846
};
6947

70-
let ch = use_coroutine(cx, |mut rx: UnboundedReceiver<CreateAccountCmd>| {
71-
to_owned![page, loading];
72-
async move {
73-
let config = Configuration::load_or_default();
74-
let warp_cmd_tx = WARP_CMD_CH.tx.clone();
75-
while let Some(CreateAccountCmd {
76-
username,
77-
passphrase,
78-
seed_words,
79-
}) = rx.next().await
80-
{
81-
loading.set(true);
82-
let (tx, rx) =
83-
oneshot::channel::<Result<multipass::identity::Identity, warp::error::Error>>();
84-
85-
if let Err(e) = warp_cmd_tx.send(WarpCmd::MultiPass(MultiPassCmd::CreateIdentity {
86-
username,
87-
tesseract_passphrase: passphrase,
88-
seed_words,
89-
rsp: tx,
90-
})) {
91-
log::error!("failed to send warp command: {}", e);
92-
continue;
93-
}
94-
95-
let res = rx.await.expect("failed to get response from warp_runner");
96-
97-
match res {
98-
Ok(ident) => {
99-
if config.audiovideo.interface_sounds {
100-
sounds::Play(sounds::Sounds::On);
101-
}
102-
103-
page.set(AuthPages::Success(ident));
104-
}
105-
// todo: notify user
106-
Err(e) => log::error!("create identity failed: {}", e),
107-
}
108-
}
109-
}
110-
});
111-
11248
cx.render(rsx!(
113-
loading.get().then(|| rsx!(
114-
div {
115-
class: "overlay-load-shadow",
116-
},
117-
)),
11849
div {
11950
id: "unlock-layout",
120-
class: format_args!("{}", if *loading.get() {"progress"} else {""}),
12151
aria_label: "unlock-layout",
12252
Label {
12353
text: get_local_text("auth.enter-username")
@@ -134,7 +64,6 @@ pub fn Layout(
13464
icon: Icon::Identification,
13565
aria_label: "username-input".into(),
13666
disable_onblur: true,
137-
disabled: *loading.get(),
13867
placeholder: get_local_text("auth.enter-username"),
13968
options: Options {
14069
with_validation: Some(username_validation),
@@ -147,30 +76,21 @@ pub fn Layout(
14776
if *button_disabled.get() != should_disable {
14877
button_disabled.set(should_disable);
14978
}
150-
username.set(val);
79+
user_name.set(val);
15180
},
15281
onreturn: move |_| {
15382
if !*button_disabled.get() {
154-
ch.send(CreateAccountCmd {
155-
username: username.get().to_string(),
156-
passphrase: pin.read().to_string(),
157-
seed_words: seed_words.read().to_string()
158-
});
83+
page.set(AuthPages::CopySeedWords);
15984
}
16085
}
16186
},
16287
Button {
16388
text: get_local_text("unlock.create-account"),
16489
aria_label: "create-account-button".into(),
16590
appearance: kit::elements::Appearance::Primary,
166-
loading: *loading.get(),
167-
disabled: *button_disabled.get() || *loading.get(),
91+
disabled: *button_disabled.get(),
16892
onpress: move |_| {
169-
ch.send(CreateAccountCmd {
170-
username: username.get().to_string(),
171-
passphrase: pin.read().to_string(),
172-
seed_words: seed_words.read().to_string()
173-
});
93+
page.set(AuthPages::CopySeedWords);
17494
}
17595
}
17696
}

ui/src/layouts/log_in/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn AuthGuard(cx: Scope, page: UseState<AuthPages>) -> Element {
3434
log::trace!("rendering auth guard");
3535

3636
let pin = use_ref(cx, String::new);
37-
let seed_words = use_ref(cx, String::new);
37+
let user_name = use_ref(cx, String::new);
3838
let desktop = use_window(cx);
3939
let theme = "";
4040

@@ -64,10 +64,10 @@ pub fn AuthGuard(cx: Scope, page: UseState<AuthPages>) -> Element {
6464

6565
match *page.current() {
6666
AuthPages::EntryPoint => rsx!(entry_point::Layout { page: page.clone(), pin: pin.clone() }),
67-
AuthPages::EnterUserName => rsx!(enter_username::Layout { page: page.clone(), pin: pin.clone(), seed_words: seed_words.clone() }),
67+
AuthPages::EnterUserName => rsx!(enter_username::Layout { page: page.clone(), user_name: user_name.clone() }),
6868
AuthPages::CreateOrRecover => rsx!(create_or_recover::Layout { page: page.clone() }),
6969
AuthPages::EnterSeedWords => rsx!(enter_seed_words::Layout { page: page.clone(), pin: pin.clone(), }),
70-
AuthPages::CopySeedWords => rsx!(copy_seed_words::Layout { page: page.clone(), seed_words: seed_words.clone() }),
70+
AuthPages::CopySeedWords => rsx!(copy_seed_words::Layout { page: page.clone(), username: user_name.read().clone(), pin: pin.read().clone() }),
7171
_ => unreachable!("this view should disappear when an account is unlocked or created"),
7272
}
7373
}

0 commit comments

Comments
 (0)