rustimate-client 0.1.0

WASM web client sources for rustimate
use crate::ctx::ClientContext;
use crate::poll_result::ResultSummary;

use anyhow::Result;
use rustimate_core::poll::Vote;
use std::sync::RwLock;

pub(crate) fn on_update_vote(ctx: &RwLock<ClientContext>, v: Vote) -> Result<()> {
  {
    let mut svc = ctx.write().expect("Cannot lock ClientContext for write");
    if let Some(ref mut x) = svc.session_ctx_mut() {
      x.set_vote(v.poll_id().clone(), v.user_id().clone(), v.choice().clone());
    }
  }
  {
    let svc = ctx.read().expect("Cannot lock ClientContext for read");
    render_votes(&svc)?;
    render_results(&svc)?;
  }
  Ok(())
}

pub(crate) fn render_votes(svc: &ClientContext) -> Result<()> {
  match crate::polls::get_active_poll_id(svc) {
    Ok(active) => {
      if let Some(sc) = svc.session_ctx() {
        let votes = sc.votes_by_poll(&active);
        let me = &svc.user_id().expect("No current user!");
        let current = votes.iter().find_map(|v| if &v.0 == me { Some(v.1.clone()) } else { None });
        svc.replace_template("poll-vote-status", crate::templates::poll::vote_status(sc.members_sorted(), votes))?;
        svc.replace_template(
          "poll-vote-choices",
          crate::templates::poll::vote_choices(sc.session().choices(), current)
        )?;
      }
      Ok(())
    }
    Err(_) => Ok(())
  }
}

pub(crate) fn render_results(svc: &ClientContext) -> Result<()> {
  match crate::polls::get_active_poll_id(svc) {
    Ok(active) => {
      if let Some(sc) = svc.session_ctx() {
        let members = sc.members_sorted();
        let votes = sc.votes_by_poll(&active);
        svc.replace_template("poll-complete-summary", crate::templates::poll::vote_results(&members, &votes))?;
        let summary = ResultSummary::new(&members, &votes);
        svc.replace_template("poll-complete-stats", crate::templates::poll::vote_stats(summary))?;
      }
      Ok(())
    }
    Err(_) => Ok(())
  }
}