use filamento::presence::{Offline, Presence}; use iced::{ futures::StreamExt, widget::{button, checkbox, column, container, text, text_input}, Element, Task, }; use jid::JID; use keyring::Entry; use serde::{Deserialize, Serialize}; use tokio_stream::wrappers::ReceiverStream; use tracing::info; use crate::Client; #[derive(Default)] pub struct LoginModal { jid: String, password: String, remember_me: bool, error: Option, } #[derive(Debug, Clone)] pub enum Message { JID(String), Password(String), RememberMe, Submit, Error(Error), } #[derive(Debug, Clone)] pub enum Error { InvalidJID, } pub enum Action { None, ClientCreated(Task), CreateClient(String, String, bool), } #[derive(Serialize, Deserialize, Clone)] pub struct Creds { pub jid: String, pub password: String, } impl LoginModal { pub fn update(&mut self, message: Message) -> Action { match message { Message::JID(j) => { self.jid = j; Action::None } Message::Password(p) => { self.password = p; Action::None } Message::RememberMe => { self.remember_me = !self.remember_me; Action::None } Message::Submit => { info!("submitting login"); let jid_str = self.jid.clone(); let password = self.password.clone(); let remember_me = self.remember_me.clone(); Action::CreateClient(jid_str, password, remember_me) } Message::Error(error) => { self.error = Some(error); Action::None } } } pub fn view(&self) -> Element { container( column![ text("Log In").size(24), column![ column![ text("JID").size(12), text_input("berry@macaw.chat", &self.jid) .on_input(|j| Message::JID(j)) .on_submit(Message::Submit) .padding(5), ] .spacing(5), column![ text("Password").size(12), text_input("", &self.password) .on_input(|p| Message::Password(p)) .on_submit(Message::Submit) .secure(true) .padding(5), ] .spacing(5), checkbox("remember me", self.remember_me).on_toggle(|_| Message::RememberMe), button(text("Submit")).on_press(Message::Submit), ] .spacing(10) ] .spacing(20), ) .width(300) .padding(10) .style(container::rounded_box) .into() } }