graphile_worker_admin_ui_client 0.1.3

Leptos WASM client for the embedded graphile_worker admin UI
Documentation
use leptos::prelude::*;
use wasm_bindgen_futures::spawn_local;

use super::super::browser::show_toast;
use super::super::types::{AdminClientConfig, ListJobsResponse, ListedJob, OverviewResponse};
use super::http::api_get;

#[derive(Clone, Copy)]
pub(super) struct RefreshSignals {
    pub(super) token: RwSignal<String>,
    pub(super) limit: RwSignal<i64>,
    pub(super) overview: RwSignal<OverviewResponse>,
    pub(super) jobs: RwSignal<Vec<ListedJob>>,
    pub(super) selected_jobs: RwSignal<Vec<i64>>,
    pub(super) toast: RwSignal<Option<String>>,
    pub(super) refreshing: RwSignal<bool>,
    pub(super) refresh_pending: RwSignal<bool>,
}

pub(super) fn refresh_data(config: AdminClientConfig, signals: RefreshSignals) {
    if signals.refreshing.get_untracked() {
        signals.refresh_pending.set(true);
        return;
    }
    signals.refreshing.set(true);
    spawn_local(async move {
        loop {
            signals.refresh_pending.set(false);
            let token = signals.token.get_untracked();
            let limit_value = signals.limit.get_untracked();
            let jobs_path = format!("/api/jobs?state=all&limit={limit_value}");
            let overview_request = api_get::<OverviewResponse>("/api/overview", &config, &token);
            let jobs_request = api_get::<ListJobsResponse>(&jobs_path, &config, &token);
            let (overview_result, jobs_result) = futures::join!(overview_request, jobs_request);
            match (overview_result, jobs_result) {
                (Ok(next_overview), Ok(next_jobs)) => {
                    let next_ids = next_jobs.jobs.iter().map(|job| job.id).collect::<Vec<_>>();
                    signals.overview.set(next_overview);
                    signals.jobs.set(next_jobs.jobs);
                    signals
                        .selected_jobs
                        .update(|selected| selected.retain(|id| next_ids.contains(id)));
                }
                (Err(error), _) | (_, Err(error)) => show_toast(signals.toast, error),
            }
            if !signals.refresh_pending.get_untracked() {
                break;
            }
        }
        signals.refreshing.set(false);
    });
}