use anyhow::Result;
use crossterm::event::{KeyCode, KeyEvent};
use super::{App, Screen, Tab};
impl App {
pub async fn logout(&mut self) -> Result<()> {
if self.current_tab == Tab::Settings && self.settings_state.has_unsaved_changes {
self.settings_state.show_save_confirmation = true;
self.settings_state.pending_tab = None; return Ok(());
}
let session_store = match self.api_client.session_scope() {
Some(server_url) => crate::session::SessionStore::for_server(server_url),
None => crate::session::SessionStore::new(),
};
if let Ok(session_store) = session_store {
if let Ok(Some(token)) = session_store.load() {
let _ = self.api_client.logout(token).await;
}
if let Err(e) = session_store.delete() {
log::warn!("Failed to delete session file: {}", e);
}
}
if let Err(e) = self.config_manager.delete_session(&self.instance_id) {
log::warn!("Failed to delete config_manager session: {}", e);
}
self.auth_state.current_user = None;
self.current_screen = Screen::Auth;
self.posts_state.posts.clear();
self.profile_state.profile = None;
self.dms_state.conversations.clear();
self.dms_state.conversations_loaded = false;
self.dms_state.messages.clear();
self.auth_state.github_auth_in_progress = false;
self.auth_state.github_device_code = None;
self.auth_state.github_user_code = None;
self.auth_state.github_verification_uri = None;
self.auth_state.github_poll_interval = None;
self.auth_state.github_auth_start_time = None;
self.auth_state.error = None;
Ok(())
}
pub async fn load_test_users(&mut self) -> Result<()> {
self.auth_state.loading = true;
self.auth_state.error = None;
match self.api_client.get_test_users().await {
Ok(users) => {
if users.is_empty() {
self.auth_state.error = Some(
"No test users available. Please check server configuration.".to_string(),
);
} else {
self.auth_state.test_users = users;
}
self.auth_state.loading = false;
}
Err(e) => {
self.auth_state.error = Some(format!(
"Connection Error: Cannot reach server. Is it running? ({})",
e
));
self.auth_state.loading = false;
}
}
Ok(())
}
pub async fn login_selected_user(&mut self) -> Result<()> {
if self.auth_state.test_users.is_empty() {
return Ok(());
}
let selected_user = &self.auth_state.test_users[self.auth_state.selected_index];
self.auth_state.loading = true;
self.auth_state.error = None;
match self.api_client.login(selected_user.username.clone()).await {
Ok(response) => {
self.auth_state.current_user = Some(response.user.clone());
self.auth_state.loading = false;
self.current_screen = Screen::Main;
let session_data = crate::config::SessionData {
username: response.user.username.clone(),
session_token: response.session_token.clone(),
user_id: response.user.id.to_string(),
};
if let Err(e) = self
.config_manager
.save_session(&self.instance_id, &session_data)
{
eprintln!("Warning: Failed to save session: {}", e);
}
let session_store = match self.api_client.session_scope() {
Some(server_url) => crate::session::SessionStore::for_server(server_url),
None => crate::session::SessionStore::new(),
};
if let Ok(session_store) = session_store {
if let Err(e) = session_store.save(&response.session_token) {
log::warn!("Failed to save canonical session token: {}", e);
}
}
let _ = self.load_settings().await;
self.load_filter_preference();
let _ = self.load_posts().await;
}
Err(e) => {
self.auth_state.error = Some(format!("Login failed: {}", e));
self.auth_state.loading = false;
}
}
Ok(())
}
pub fn handle_auth_keys(&mut self, key: KeyEvent) -> Result<()> {
match key.code {
KeyCode::Up | KeyCode::Char('k') | KeyCode::Char('K') => {
if self.auth_state.selected_index > 0 {
self.auth_state.selected_index -= 1;
}
}
KeyCode::Down | KeyCode::Char('j') | KeyCode::Char('J') => {
let max_users = self.auth_state.test_users.len().min(3);
if self.auth_state.selected_index < max_users.saturating_sub(1) {
self.auth_state.selected_index += 1;
}
}
_ => {}
}
Ok(())
}
}