llm-manager 1.1.0

Terminal UI for managing LLMs
Documentation
use crossterm::event::KeyCode;

use crate::tui::app::{App, ModelsMode};

pub async fn fetch_and_store_readme(app: &mut App, model_id: String) {
    match crate::backend::hub::fetch_readme(&model_id).await {
        Ok(readme) => {
            if let ModelsMode::Search { results, .. } = &mut app.models_mode
                && let Some(idx) = app.search.search_results_idx
                && let Some(r) = results.get_mut(idx)
            {
                r.readme = Some(readme);
            }
            app.add_log("README loaded.", crate::config::LogLevel::Info);
        }
        Err(e) => {
            app.add_log(
                format!("Failed to fetch README: {}", e),
                crate::config::LogLevel::Error,
            );
        }
    }
}

pub async fn fetch_readme_for_selected(app: &mut App, model_id: String) {
    if let ModelsMode::Search {
        results,
        show_readme,
        ..
    } = &app.models_mode
        && *show_readme
        && let Some(idx) = app.search.search_results_idx
        && let Some(r) = results.get(idx)
        && r.readme.is_none()
    {
        app.add_log(
            format!("Fetching README for {}...", model_id),
            crate::config::LogLevel::Info,
        );
        fetch_and_store_readme(app, model_id).await;
    }
}

pub fn handle_readme_key(app: &mut App, key: crossterm::event::KeyEvent) {
    match key.code {
        KeyCode::Esc => {
            if let ModelsMode::Search { show_readme, .. } = &mut app.models_mode {
                *show_readme = false;
                app.ui.active_panel = crate::tui::app::ActivePanel::Models;
            }
            if let ModelsMode::Files { .. } = &app.models_mode {
                app.ui.active_panel = crate::tui::app::ActivePanel::Models;
            }
        }
        KeyCode::Up | KeyCode::Char('k') => {
            app.picker.readme_scroll_offset = app.picker.readme_scroll_offset.saturating_sub(1);
        }
        KeyCode::Down | KeyCode::Char('j') => {
            app.picker.readme_scroll_offset = app.picker.readme_scroll_offset.saturating_add(1);
        }
        _ => {}
    }
}