use std::collections::HashSet; use seed::{prelude::*, *}; use crate::{ api::urls, graphql::{front_page_query::*, show_thread_query::*}, state::{Context, Model, Msg}, view::{ self, human_age, pretty_authors, reading_progress, search_toolbar, set_title, tags_chiclet, view_header, }, }; pub(super) fn view(model: &Model) -> Node { let show_icon_text = false; let content = match &model.context { Context::None => div![h1!["Loading"]], Context::ThreadResult { thread: ShowThreadQueryThread::EmailThread(thread), open_messages, } => view::thread(thread, open_messages, show_icon_text, &model.content_el), Context::ThreadResult { thread: ShowThreadQueryThread::NewsPost(post), .. } => view::news_post(post, show_icon_text, &model.content_el), Context::SearchResult { query, results, count, pager, selected_threads, } => search_results( &query, results.as_slice(), *count, pager, selected_threads, show_icon_text, ), }; div![ reading_progress(model.read_completion_ratio), view_header(&model.query, &model.refreshing_state), content, view_header(&model.query, &model.refreshing_state), div![view::tags(model), view::versions(&model.versions)] ] } fn search_results( query: &str, results: &[FrontPageQuerySearchNodes], count: usize, pager: &FrontPageQuerySearchPageInfo, selected_threads: &HashSet, show_icon_text: bool, ) -> Node { if query.is_empty() { set_title("all mail"); } else { set_title(query); } let rows = results.iter().map(|r| { let tid = r.thread.clone(); let check_tid = r.thread.clone(); let datetime = human_age(r.timestamp as i64); let unread_idx = r.tags.iter().position(|e| e == &"unread"); let mut tags = r.tags.clone(); if let Some(idx) = unread_idx { tags.remove(idx); }; div![ C!["NOTPORTED", "row"], label![ C!["NOTPORTED", "b-checkbox", "checkbox", "is-large"], input![attrs! { At::Type=>"checkbox", At::Checked=>selected_threads.contains(&tid).as_at_value(), }], span![C!["NOTPORTED", "check"]], ev(Ev::Input, move |e| { if let Some(input) = e .target() .as_ref() .expect("failed to get reference to target") .dyn_ref::() { if input.checked() { Msg::SelectionAddThread(check_tid) } else { Msg::SelectionRemoveThread(check_tid) } } else { Msg::Noop } }), ], a![ C!["NOTPORTED", "has-text-light", "summary"], IF!(unread_idx.is_some() => C!["NOTPORTED","unread"]), attrs! { At::Href => urls::thread(&tid) }, div![C!["NOTPORTED", "subject"], &r.subject], span![ C!["NOTPORTED", "from", "is-size-7"], pretty_authors(&r.authors) ], div![ span![C!["NOTPORTED", "is-size-7"], tags_chiclet(&tags, true)], span![ C!["NOTPORTED", "is-size-7", "float-right", "date"], datetime ] ] ] ] }); let show_bulk_edit = !selected_threads.is_empty(); div![ C!["NOTPORTED", "search-results"], search_toolbar(count, pager, show_bulk_edit, show_icon_text), div![C!["NOTPORTED", "index"], rows], search_toolbar(count, pager, show_bulk_edit, show_icon_text), ] }