@v4fire/client
Version:
V4Fire client core library
227 lines (186 loc) • 4.47 kB
text/typescript
/*!
* V4Fire Client Core
* https://github.com/V4Fire/Client
*
* Released under the MIT license
* https://github.com/V4Fire/Client/blob/master/LICENSE
*/
import type bVirtualScroll from 'base/b-virtual-scroll/b-virtual-scroll';
import type { UnsafeIData } from 'super/i-data/i-data';
import type { ComponentVNodeData } from 'core/component/vnode';
export interface RequestQueryFn<T extends object = object> {
(params: DataState<T>): Dictionary<Dictionary>;
}
export interface RequestFn<T extends object = object> {
(params: DataState<T>): boolean;
}
export interface GetData<T extends unknown = unknown> {
(ctx: bVirtualScroll, query: CanUndef<Dictionary>): Promise<T>;
}
export interface VirtualItemEl<T extends object = object> {
/**
* Current render data
*/
current: T;
/**
* Previous render data
*/
prev: CanUndef<T>;
/**
* Next render data
*/
next: CanUndef<T>;
}
/**
* @deprecated
* @see [[VirtualItemEl]]
*/
export type OptionEl<T extends object = object> = VirtualItemEl<T>;
/**
* @typeparam ITEM - data item to render
* @typeparam RAW - raw provider data
*/
export interface DataState<ITEM extends object = object, RAW extends unknown = unknown> {
/**
* Number of the last loaded page
*/
currentPage: number;
/**
* Number of a page to upload
*/
nextPage: number;
/**
* All loaded data
*/
data: object[];
/**
* Number of items to show till the page bottom is reached
*/
itemsTillBottom: number;
/**
* Items to render
*/
items: Array<RenderItem<ITEM>>;
/**
* Data that pending to be rendered
*/
pendingData: object[];
/**
* True if the last requested data response was empty
*/
isLastEmpty: boolean;
/**
* Last loaded data chunk
*/
lastLoadedChunk: {
/**
* Normalized data (processed with `dbConverter`)
*/
normalized: ITEM[];
/**
* Raw provider data
*/
raw: CanUndef<RAW>;
};
/**
* @deprecated
* @see [[RequestMoreParams.lastLoadedChunk]]
*/
lastLoadedData: ITEM[];
/**
* `total` property from the loaded data
*/
total: CanUndef<number>;
}
export interface RemoteData extends Dictionary {
/**
* Data to render components
*/
data?: object[];
/**
* Total number of elements
*/
total?: number;
}
export interface RenderItem<T extends object = object> {
/**
* Component data
*/
data: T;
/**
* Component DOM element
*/
node: CanUndef<HTMLElement>;
/**
* Component destructor
*/
destructor: CanUndef<Function>;
/**
* Component position in a DOM tree
*/
index: number;
}
/**
* Attributes of items to render
*/
export type ItemAttrs = {
[prop in keyof ComponentVNodeData]?: ComponentVNodeData[prop];
} & Dictionary;
/**
* Last loaded data chunk
*
* @typeparam DATA - data to render
* @typeparam RAW - raw provider data
*/
export interface LastLoadedChunk<DATA extends object = object[], RAW extends unknown = unknown> {
normalized: DATA;
raw: CanUndef<RAW>;
}
export interface DataToRender {
itemAttrs: Dictionary;
itemParams: VirtualItemEl;
index: number;
}
/**
* Local state of a component:
*
* * `error` - indicates the component loading error appear
* * `init` - indicates the component now loading the first chunk of data
* * `ready` - indicates the component now is ready to render data
*/
export type LocalState = 'init' | 'ready' | 'error';
/**
* The loading strategy:
*
* * `scroll` - will prompt the client to load data every time a new element appears in the viewport
* * `manual` - there is only one way to load data: by using `renderNext` method (except the initial load)
*/
export type LoadStrategy = 'scroll' | 'manual';
/**
* Display state of the ref
*/
export type RefDisplayState = '' | 'none';
/**
* `bVirtualScroll` `$refs`
*/
export type bVirtualScrollRefs = bVirtualScroll['$refs'];
// @ts-ignore (unsafe)
export interface UnsafeBVirtualScroll<CTX extends bVirtualScroll = bVirtualScroll> extends UnsafeIData<CTX> {
// @ts-ignore (access)
total: CTX['total'];
// @ts-ignore (access)
localState: CTX['localState'];
// @ts-ignore (access)
chunkRender: CTX['chunkRender'];
// @ts-ignore (access)
chunkRequest: CTX['chunkRequest'];
// @ts-ignore (access)
componentRender: CTX['componentRender'];
// @ts-ignore (access)
getDataStateSnapshot: CTX['getDataStateSnapshot'];
// @ts-ignore (access)
onRequestError: CTX['onRequestError'];
}
export type MergeDataStateParams = {
[key in keyof DataState]?: DataState[key];
};