summaryrefslogblamecommitdiff
path: root/makima/src/daemon/tui/views/tasks.rs
blob: fd52b1177224d006d960174609d30684da91b8d3 (plain) (tree)






































































                                                                                   
//! Tasks view implementation.

use uuid::Uuid;

use crate::daemon::api::ApiClient;
use crate::daemon::tui::app::ListItem;

/// Load tasks from API
pub async fn load_tasks(
    client: &ApiClient,
    contract_id: Option<Uuid>,
) -> Result<Vec<ListItem>, Box<dyn std::error::Error>> {
    let Some(contract_id) = contract_id else {
        // TODO: Implement listing all tasks across contracts
        return Ok(Vec::new());
    };

    let result = client.supervisor_tasks(contract_id).await?;

    // Parse JSON response into ListItem
    let tasks: Vec<serde_json::Value> = serde_json::from_value(result.0)?;

    let items = tasks
        .into_iter()
        .filter_map(|t| {
            let id_str = t.get("id")?.as_str()?;
            let id = Uuid::parse_str(id_str).ok()?;

            Some(ListItem {
                id,
                name: t
                    .get("name")
                    .and_then(|v| v.as_str())
                    .unwrap_or("Unnamed")
                    .to_string(),
                status: t.get("status").and_then(|v| v.as_str()).map(String::from),
                description: t
                    .get("progressSummary")
                    .and_then(|v| v.as_str())
                    .map(String::from),
                updated_at: t
                    .get("updatedAt")
                    .and_then(|v| v.as_str())
                    .unwrap_or_default()
                    .to_string(),
                extra: t,
            })
        })
        .collect();

    Ok(items)
}

/// Get full task details for preview
pub async fn get_task_preview(
    client: &ApiClient,
    task_id: Uuid,
) -> Result<String, Box<dyn std::error::Error>> {
    let result = client.supervisor_get_task(task_id).await?;
    let task: serde_json::Value = result.0;

    Ok(format!(
        "Name: {}\nStatus: {}\nPlan: {}\n\nProgress:\n{}",
        task.get("name").and_then(|v| v.as_str()).unwrap_or("-"),
        task.get("status").and_then(|v| v.as_str()).unwrap_or("-"),
        task.get("plan").and_then(|v| v.as_str()).unwrap_or("-"),
        task.get("progressSummary")
            .and_then(|v| v.as_str())
            .unwrap_or("-"),
    ))
}