import { query } from '@synnaxlabs/client'; import { compare, CrudeTimeSpan, destructor, record, state } from '@synnaxlabs/x'; import { Result } from './result'; import { CreateRetrieveParams, RetrieveParams } from './retrieve'; /** Reads one entry, or many at once, out of a list query's results. */ export interface GetItem> { (key: K): E | undefined; (keys: K[]): E[]; } /** Options for a list retrieval. Append for paging, replace for a new search. */ export interface AsyncListOptions extends query.FetchOptions { mode?: "append" | "replace"; } /** Return value for a list hook. Spread it into a {@link List.Frame}. */ export type UseListReturn> = Omit, "data"> & { retrieve: (query: state.SetArg>, options?: AsyncListOptions) => void; retrieveAsync: (query: state.SetArg>, options?: AsyncListOptions) => Promise; data: K[]; /** * Whether the list has an answer. An unanswered list has the same empty data as a * genuinely empty one, so anything that speaks for the absence of items (empty * content, an empty-state action) must wait for this. */ answered: boolean; getItem: GetItem; subscribe: (callback: () => void, key: K) => destructor.Destructor; }; export interface RetrieveByKeyParams extends Omit, "query"> { query: Partial; key: K; } export interface CreateListParams> extends CreateRetrieveParams { sort?: compare.Comparator; retrieveByKey: (params: RetrieveByKeyParams) => Promise; /** * Live updates for items fetched through retrieveByKey. Page members get * their updates from `onChange`; this covers lookups outside any page. */ onChangeByKey?: (params: RetrieveByKeyParams, handler: query.ChangeHandler) => destructor.Destructor; } export interface UseListParams> { initialQuery?: Query; filter?: (item: E) => boolean; sort?: compare.Comparator; retrieveDebounce?: CrudeTimeSpan; useCachedList?: boolean; } export interface UseList> { (params?: UseListParams): UseListReturn; } export declare const createList: >({ name, retrieve, retrieveByKey, onChange: subscribeToQuery, onChangeByKey, getCached, sort: defaultSort, normalizeQuery, }: CreateListParams) => UseList; export interface UseListItemParams> extends Pick, "subscribe" | "getItem"> { key: K; } export declare const useListItem: >({ key, subscribe, getItem, }: UseListItemParams) => E | undefined; //# sourceMappingURL=list.d.ts.map