fix: tokio runtime, Enter-to-login, and server URL handling
Three bugs fixed: - No tokio reactor: glib::spawn_future_local does not provide a tokio context, so reqwest/hyper panicked at runtime. Introduce src/runtime.rs with a multi-thread tokio Runtime (init() called from main before the GTK app starts). runtime::spawn() posts the async result back to GTK via a tokio oneshot channel awaited by glib::spawn_future_local, which only polls a flag (no I/O). runtime::spawn_bg() is used for fire-and-forget background calls. - Enter key didn't submit login: connect_apply on AdwEntryRow only fires when show-apply-button is true. Switch to connect_entry_activated which fires on Return in all three login rows. - Wrong API URL: the app constructed /accounts/ClientLogin directly off the server host, yielding a 404. Add normalize_base_url() in api.rs that appends /api/greader.php when the URL doesn't already contain it, so users can enter just https://rss.example.com.
This commit is contained in:
parent
d157f3f244
commit
5dee5cc52b
6 changed files with 161 additions and 67 deletions
|
|
@ -68,6 +68,7 @@ mod imp {
|
|||
fn constructed(&self) {
|
||||
self.parent_constructed();
|
||||
|
||||
// Login button
|
||||
let obj_weak = self.obj().downgrade();
|
||||
self.login_button.connect_activated(move |_| {
|
||||
if let Some(dialog) = obj_weak.upgrade() {
|
||||
|
|
@ -75,9 +76,20 @@ mod imp {
|
|||
}
|
||||
});
|
||||
|
||||
// Also trigger on Enter in password row
|
||||
// Enter in any row submits the form (connect_entry_activated fires on Return)
|
||||
for weak in [
|
||||
self.server_url_row.downgrade(),
|
||||
self.username_row.downgrade(),
|
||||
] {
|
||||
let obj_weak = self.obj().downgrade();
|
||||
weak.upgrade().unwrap().connect_entry_activated(move |_| {
|
||||
if let Some(dialog) = obj_weak.upgrade() {
|
||||
dialog.imp().on_login_clicked();
|
||||
}
|
||||
});
|
||||
}
|
||||
let obj_weak2 = self.obj().downgrade();
|
||||
self.password_row.connect_apply(move |_| {
|
||||
self.password_row.connect_entry_activated(move |_| {
|
||||
if let Some(dialog) = obj_weak2.upgrade() {
|
||||
dialog.imp().on_login_clicked();
|
||||
}
|
||||
|
|
@ -87,14 +99,21 @@ mod imp {
|
|||
|
||||
impl LoginDialog {
|
||||
fn on_login_clicked(&self) {
|
||||
let server_url = self.server_url_row.text().trim().to_string();
|
||||
let raw_url = self.server_url_row.text().trim().to_string();
|
||||
let username = self.username_row.text().trim().to_string();
|
||||
let password = self.password_row.text().to_string();
|
||||
|
||||
if server_url.is_empty() || username.is_empty() || password.is_empty() {
|
||||
if raw_url.is_empty() || username.is_empty() || password.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepend https:// if no scheme given
|
||||
let server_url = if raw_url.starts_with("http://") || raw_url.starts_with("https://") {
|
||||
raw_url
|
||||
} else {
|
||||
format!("https://{raw_url}")
|
||||
};
|
||||
|
||||
self.obj().close();
|
||||
self.obj().emit_by_name::<()>("logged-in", &[&server_url, &username, &password]);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue