{"version":3,"sources":["../../src/use-infinite-list/index.ts"],"sourcesContent":["import { useMemo, useRef } from 'react'\nimport { useAsyncFn } from '../use-async-fn'\nimport { useForm } from '../use-form'\nimport { useInfiniteScroll } from '../use-infinite-scroll'\nimport { useLatest } from '../use-latest'\nimport { useMultiSelect } from '../use-multi-select'\nimport { usePagination } from '../use-pagination'\nimport { useStableFn } from '../use-stable-fn'\nimport { useTrackedRefState } from '../use-tracked-ref-state'\nimport { shallowEqual } from '../utils/equal'\n\nimport type { UseAsyncFnOptions } from '../use-async-fn'\nimport type { UseFormOptions, UseFormReturns } from '../use-form'\nimport type { UseInfiniteScrollOptions, UseInfiniteScrollReturns } from '../use-infinite-scroll'\nimport type { UseMultiSelectReturnsActions, UseMultiSelectReturnsState } from '../use-multi-select'\nimport type { UsePaginationOptions, UsePaginationReturnsState } from '../use-pagination'\nimport type { ElementTarget } from '../use-target-element'\nimport type { AnyFunc } from '../utils/basic'\n\nexport interface UseInfiniteListOptions<\n  Data,\n  Item,\n  FormState extends object,\n  Fetcher extends AnyFunc,\n  Container extends HTMLElement,\n> {\n  /**\n   * The container element\n   */\n  target?: ElementTarget<Container>\n  /**\n   * The fetcher function, should return a object with data item list.\n   */\n  fetcher?: Fetcher\n  /**\n   * The map function to map each data to item list\n   */\n  mapFullList?: (data: Data) => Item[]\n  /**\n   * The form options\n   *\n   * see `useForm` for more details\n   */\n  form?: UseFormOptions<FormState>\n  /**\n   * The async function options\n   *\n   * see `useAsyncFn` for more details\n   */\n  asyncFn?: Omit<UseAsyncFnOptions<Fetcher, Data, any>, 'initialParams'>\n  /**\n   * The pagination options\n   *\n   * see `usePagination` for more details\n   */\n  pagination?: UsePaginationOptions<Data>\n  /**\n   * Whether can load more\n   */\n  canLoadMore?: (previousData: Data | undefined, dataList: Data[], fullList: Item[]) => boolean\n  /**\n   * The infinite scroll options\n   *\n   * see `useInfiniteScroll` for more details\n   */\n  infiniteScroll?: Omit<UseInfiniteScrollOptions<Data>, 'canLoadMore'>\n  /**\n   * The keys of form state that will trigger a new query when changed\n   */\n  immediateQueryKeys?: (keyof FormState)[]\n}\n\nexport interface UseInfiniteListFetcherParams<Data, FormState extends object> {\n  /**\n   * previous data\n   */\n  previousData: Data | undefined\n  /**\n   * current page\n   */\n  page: number\n  /**\n   * page size\n   */\n  pageSize: number\n  /**\n   * form state\n   */\n  form: FormState\n}\n\nexport type UseInfiniteListFetcher<Data, FormState extends object> = (\n  params: UseInfiniteListFetcherParams<Data, FormState>,\n) => Promise<Data>\n\nexport interface UseInfiniteListReturns<Data, Item, FormState extends object>\n  extends Omit<UseInfiniteScrollReturns, 'reset'> {\n  /**\n   * reset the list, form, pagination, selection, and refetch the data\n   */\n  reset: () => void\n  /**\n   * The form state\n   */\n  form: UseFormReturns<FormState>\n  /**\n   * The list data\n   */\n  list: Data[]\n  /**\n   * The full list data\n   */\n  fullList: Item[]\n  /**\n   * The selection state and action\n   */\n  selection: UseMultiSelectReturnsState<Item> & UseMultiSelectReturnsActions<Item>\n  /**\n   * The pagination state\n   */\n  paginationState: UsePaginationReturnsState<Data>\n}\n\n/**\n *\n * @since 1.7.0\n */\nexport function useInfiniteList<\n  Data,\n  Item = any,\n  FormState extends object = object,\n  Fetcher extends UseInfiniteListFetcher<Data, FormState> = UseInfiniteListFetcher<Data, FormState>,\n  Container extends HTMLElement = HTMLElement,\n>(\n  options: UseInfiniteListOptions<Data, Item, FormState, Fetcher, Container> = {},\n): UseInfiniteListReturns<Data, Item, FormState> {\n  const { target, fetcher = () => {} } = options\n\n  // for instant get the latest state, by ref\n  const [{ dataList }, { updateRefState }, stateRef] = useTrackedRefState<{ dataList: Data[] }>({ dataList: [] })\n  const previousDataRef = useRef<Data | undefined>(undefined)\n  const previousFormRef = useRef<FormState>((options.form?.initialValue || {}) as FormState)\n\n  const form = useForm<FormState>({\n    ...options.form,\n    onChange: (form, ...args) => {\n      const nextForm = form\n      const keys = options.immediateQueryKeys || []\n\n      for (const key of keys) {\n        const isChanged = !shallowEqual(previousFormRef.current[key], nextForm[key])\n\n        if (isChanged) {\n          reset()\n          break\n        }\n      }\n\n      previousFormRef.current = nextForm\n\n      return latest.current.options.form?.onChange?.(form, ...args)\n    },\n    onSubmit: (form) => {\n      reset()\n      return latest.current.options.form?.onSubmit?.(form)\n    },\n    onReset: () => {\n      reset()\n      return latest.current.options.form?.onReset?.()\n    },\n  })\n\n  const loadFn = useAsyncFn<Fetcher, Data, any>(fetcher as Fetcher, {\n    ...options.asyncFn,\n    immediate: !options.target,\n    initialParams: [\n      {\n        page: options.pagination?.page ?? 1,\n        pageSize: options.pagination?.pageSize ?? 10,\n        form: form.value,\n        previousData: undefined,\n      },\n    ] as Parameters<Fetcher>,\n    onSuccess(data, ...reset) {\n      updateRefState('dataList', [...stateRef.dataList.value, data])\n      paginationActions.next()\n      previousDataRef.current = data\n      return latest.current.options.asyncFn?.onSuccess?.(data, ...reset)\n    },\n  })\n\n  const infiniteScroll = useInfiniteScroll<Data>(\n    target,\n    () => {\n      return loadFn.run({\n        form: form.value,\n        page: latest.current.paginationState.page ?? 10,\n        pageSize: latest.current.paginationState.pageSize ?? 10,\n        previousData: previousDataRef.current,\n      })\n    },\n    {\n      ...options.infiniteScroll,\n      canLoadMore: (pre) => {\n        const dataList = stateRef.dataList.value\n        const fullList = dataList.flatMap((data) => latestMapFullList.current?.(data) ?? []) as Item[]\n        return latest.current.options.canLoadMore?.(pre, dataList, fullList) ?? true\n      },\n    },\n  )\n\n  const reset = useStableFn(() => {\n    loadFn.cancel()\n    previousDataRef.current = undefined\n    updateRefState('dataList', [])\n    selectActions.setSelected([])\n    paginationActions.go(1)\n    infiniteScroll.reset()\n\n    if (!latest.current.options.target) {\n      infiniteScroll.loadMore()\n    }\n  })\n\n  const latestMapFullList = useLatest(options.mapFullList)\n\n  const fullList = useMemo(() => {\n    return dataList.flatMap((data) => latestMapFullList.current?.(data) ?? []) as Item[]\n  }, [dataList])\n\n  const [selectState, selectActions] = useMultiSelect<Item>(fullList)\n\n  const [paginationState, paginationActions] = usePagination<Data>({\n    ...options.pagination,\n    onPageSizeChange: (paging, lastPageSize) => {\n      reset()\n      return latest.current.options.pagination?.onPageSizeChange?.(paging, lastPageSize)\n    },\n  })\n\n  const latest = useLatest({\n    dataList,\n    fullList,\n    options,\n    selectState,\n    paginationState,\n  })\n\n  return {\n    ...infiniteScroll,\n    reset,\n    form,\n    list: dataList,\n    fullList,\n    paginationState,\n    selection: {\n      ...selectState,\n      ...selectActions,\n    },\n  }\n}\n"],"names":["useInfiniteList","options","target","fetcher","useTrackedRefState","dataList","updateRefState","stateRef","previousDataRef","useRef","undefined","previousFormRef","form","initialValue","useForm","onChange","args","latest","nextForm","keys","immediateQueryKeys","key","isChanged","shallowEqual","current","reset","onSubmit","onReset","loadFn","useAsyncFn","asyncFn","immediate","initialParams","page","pagination","pageSize","value","previousData","onSuccess","data","paginationActions","next","infiniteScroll","useInfiniteScroll","run","paginationState","canLoadMore","pre","fullList","flatMap","latestMapFullList","useStableFn","cancel","selectActions","setSelected","go","loadMore","useLatest","mapFullList","useMemo","useMultiSelect","selectState","usePagination","onPageSizeChange","paging","lastPageSize","list","selection"],"mappings":"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"}