ui-grid-core 0.1.7

Rust engine for ui-grid
Documentation
use serde::{Deserialize, Serialize};

use crate::models::GridInfiniteScrollState;

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MaybeRequestInfiniteScrollDataContext {
    pub state: GridInfiniteScrollState,
    pub start_index: usize,
    pub visible_rows: usize,
    pub viewport_rows: usize,
    pub threshold: usize,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum InfiniteScrollRequest {
    Top,
    Bottom,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MaybeRequestInfiniteScrollDataResult {
    #[serde(default)]
    pub request: Option<InfiniteScrollRequest>,
    pub next_state: GridInfiniteScrollState,
}

pub fn maybe_request_infinite_scroll_data(
    context: &MaybeRequestInfiniteScrollDataContext,
) -> MaybeRequestInfiniteScrollDataResult {
    if context.state.data_loading {
        return MaybeRequestInfiniteScrollDataResult {
            request: None,
            next_state: context.state.clone(),
        };
    }

    if context.state.scroll_up && context.start_index <= context.threshold {
        return MaybeRequestInfiniteScrollDataResult {
            request: Some(InfiniteScrollRequest::Top),
            next_state: GridInfiniteScrollState {
                scroll_up: context.state.scroll_up,
                scroll_down: context.state.scroll_down,
                data_loading: true,
                previous_visible_rows: context.visible_rows,
            },
        };
    }

    if context.state.scroll_down
        && context.start_index + context.viewport_rows
            >= std::cmp::max(context.visible_rows.saturating_sub(context.threshold), 0)
    {
        return MaybeRequestInfiniteScrollDataResult {
            request: Some(InfiniteScrollRequest::Bottom),
            next_state: GridInfiniteScrollState {
                scroll_up: context.state.scroll_up,
                scroll_down: context.state.scroll_down,
                data_loading: true,
                previous_visible_rows: context.visible_rows,
            },
        };
    }

    MaybeRequestInfiniteScrollDataResult {
        request: None,
        next_state: context.state.clone(),
    }
}

pub fn complete_infinite_scroll_data_load(
    state: &GridInfiniteScrollState,
    scroll_up: bool,
    scroll_down: bool,
) -> GridInfiniteScrollState {
    GridInfiniteScrollState {
        scroll_up,
        scroll_down,
        data_loading: false,
        previous_visible_rows: state.previous_visible_rows,
    }
}

pub fn reset_infinite_scroll_state(scroll_up: bool, scroll_down: bool) -> GridInfiniteScrollState {
    GridInfiniteScrollState {
        scroll_up,
        scroll_down,
        data_loading: false,
        previous_visible_rows: 0,
    }
}

pub fn save_infinite_scroll_percentage(
    state: &GridInfiniteScrollState,
    visible_rows: usize,
) -> GridInfiniteScrollState {
    GridInfiniteScrollState {
        scroll_up: state.scroll_up,
        scroll_down: state.scroll_down,
        data_loading: state.data_loading,
        previous_visible_rows: visible_rows,
    }
}

pub fn set_infinite_scroll_directions_state(
    state: &GridInfiniteScrollState,
    scroll_up: bool,
    scroll_down: bool,
) -> GridInfiniteScrollState {
    GridInfiniteScrollState {
        scroll_up,
        scroll_down,
        data_loading: state.data_loading,
        previous_visible_rows: state.previous_visible_rows,
    }
}