{"version":3,"sources":["../../src/use-paging-list/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useForm } from '../use-form'\nimport { useLatest } from '../use-latest'\nimport { useMultiSelect } from '../use-multi-select'\nimport { usePagination } from '../use-pagination'\nimport { useQuery } from '../use-query'\nimport { useSafeState } from '../use-safe-state'\nimport { useStableFn } from '../use-stable-fn'\nimport { shallowEqual } from '../utils/equal'\n\nimport type { UseFormOptions, UseFormReturns } from '../use-form'\nimport type { UseMultiSelectReturnsActions, UseMultiSelectReturnsState } from '../use-multi-select'\nimport type { UsePaginationOptions, UsePaginationReturnsActions, UsePaginationReturnsState } from '../use-pagination'\nimport type { UseQueryOptions, UseQueryReturns } from '../use-query'\nimport type { ReactSetState } from '../use-safe-state'\n\nexport interface UsePagingListOptions<Item, FormState extends object> {\n  /**\n   * fetcher function that will be called when the query is triggered\n   */\n  fetcher?: UsePagingListFetcher<Item, FormState>\n  /**\n   * options for `useForm`, see `useForm` for more details\n   *\n   * @defaultValue undefined\n   */\n  form?: UseFormOptions<FormState>\n  /**\n   * options for `useQuery`, see `useQuery` for more details\n   *\n   * @defaultValue undefined\n   */\n  query?: Omit<\n    UseQueryOptions<UsePagingListFetcher<Item, FormState>>,\n    'initialParams' | 'initialData' | 'cacheKey' | 'cacheExpirationTime' | 'provider'\n  >\n  /**\n   * options for `usePagination`, see `usePagination` for more details\n   *\n   * @defaultValue undefined\n   */\n  pagination?: UsePaginationOptions<Item[]>\n  /**\n   * keys of form state that will trigger a new query when changed\n   *\n   * @defaultValue []\n   */\n  immediateQueryKeys?: (keyof FormState)[]\n  /**\n   * strategy to handle page number when page size changes\n   *\n   * - 'reset' - reset to page 1\n   * - 'preserve' - preserve the current position by keeping the first item visible on the new page\n   *\n   * @since 1.14.0\n   *\n   * @defaultValue 'reset'\n   */\n  pageStrategy?: 'reset' | 'preserve'\n}\n\nexport interface UsePagingListFetcherParams<Item, FormState extends object> {\n  /**\n   * previous data\n   */\n  previousData: Item[] | 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   * set total count\n   */\n  setTotal: ReactSetState<number>\n}\n\nexport type UsePagingListFetcher<Item, FormState extends object> = (\n  params: UsePagingListFetcherParams<Item, FormState>,\n) => Promise<Item[]>\n\nexport interface UsePagingListReturns<Item, FormState extends object>\n  extends Pick<\n    UseQueryReturns<any, any>,\n    'loading' | 'params' | 'error' | 'initializing' | 'refreshing' | 'loadingSlow'\n  > {\n  /**\n   * list data\n   */\n  list: Item[]\n  /**\n   * form state\n   */\n  form: UseFormReturns<FormState>\n  /**\n   * refresh query\n   */\n  refresh: () => void\n  /**\n   * selection state\n   */\n  selection: UseMultiSelectReturnsState<Item> & UseMultiSelectReturnsActions<Item>\n  /**\n   * pagination state\n   */\n  pagination: UsePaginationReturnsState<Item[]> & UsePaginationReturnsActions\n}\n\n/**\n * A hook for handling paging lists that integrates the functionalities of `useQuery`, `useForm`, `useMultiSelect`, and `usePagination`.\n *\n * @since 1.7.0\n */\nexport function usePagingList<Item, FormState extends object = object>(\n  options: UsePagingListOptions<Item, FormState> = {},\n): UsePagingListReturns<Item, FormState> {\n  type Fetcher = UsePagingListFetcher<Item, FormState>\n\n  const previousDataRef = useRef<Item[] | undefined>(undefined)\n  const previousFormRef = useRef<FormState>((options.form?.initialValue || {}) as FormState)\n  const previousSelectedRef = useRef<Item[]>([])\n  const isFormChangedRef = useRef<boolean>(false)\n  const isChangingPageInternallyRef = useRef<boolean>(false)\n  const [total, setTotal] = useSafeState<number>(Number.POSITIVE_INFINITY)\n\n  const form = useForm<FormState>({\n    ...options.form,\n    onReset(...args) {\n      startNewQuery()\n      return latest.current.options.form?.onReset?.(...args)\n    },\n    onSubmit(...args) {\n      const form = args[0]\n      const isFormChanged = isFormChangedRef.current\n\n      if (isFormChanged) {\n        startNewQuery()\n      } else {\n        query.run({\n          previousData: previousDataRef.current,\n          page: paginationState.page,\n          pageSize: paginationState.pageSize,\n          form,\n          setTotal,\n        })\n      }\n\n      latest.current.options.form?.onSubmit?.(...args)\n    },\n    onChange(...args) {\n      isFormChangedRef.current = true\n\n      const nextForm = args[0]\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          startNewQuery()\n          break\n        }\n      }\n\n      previousFormRef.current = nextForm\n\n      return latest.current.options.form?.onChange?.(...args)\n    },\n  })\n\n  const startNewQuery = useStableFn(() => {\n    previousDataRef.current = undefined\n\n    isChangingPageInternallyRef.current = true\n    paginationActions.go(1)\n\n    query.run({\n      previousData: previousDataRef.current,\n      page: 1,\n      pageSize: paginationState.pageSize,\n      form: form.value,\n      setTotal,\n    })\n  })\n\n  const [paginationState, paginationActions] = usePagination<Item[]>({\n    ...options.pagination,\n    list: undefined,\n    total,\n    onPageChange(state, lastPage) {\n      if (!isChangingPageInternallyRef.current) {\n        query.run({\n          previousData: previousDataRef.current,\n          page: state.page,\n          pageSize: state.pageSize,\n          form: form.value,\n          setTotal,\n        })\n      }\n\n      latest.current.options.pagination?.onPageChange?.(state, lastPage)\n    },\n    onPageSizeChange(state, lastPageSize) {\n      const strategy = latest.current.options.pageStrategy || 'reset'\n      const isReset = strategy === 'reset'\n\n      if (isReset) {\n        startNewQuery()\n      } else {\n        const transformedPage = Math.floor(((state.page - 1) * lastPageSize) / state.pageSize) + 1\n\n        isChangingPageInternallyRef.current = true\n        paginationActions.go(transformedPage)\n\n        query.run({\n          previousData: previousDataRef.current,\n          page: transformedPage,\n          pageSize: state.pageSize,\n          form: form.value,\n          setTotal,\n        })\n      }\n\n      latest.current.options.pagination?.onPageSizeChange?.(state, lastPageSize)\n    },\n  })\n\n  const query = useQuery<Fetcher>(options?.fetcher as Fetcher, {\n    ...options.query,\n    initialParams: [\n      {\n        previousData: undefined,\n        page: paginationState.page,\n        pageSize: paginationState.pageSize,\n        form: form.value,\n        setTotal,\n      },\n    ] as Parameters<Fetcher>,\n    onBefore(...args) {\n      if (latest.current.selectState.selected.length) {\n        previousSelectedRef.current = latest.current.selectState.selected\n      }\n      latest.current.options.query?.onBefore?.(...args)\n    },\n    onSuccess(data, ...reset) {\n      previousDataRef.current = data\n\n      if (previousSelectedRef.current.length) {\n        const selected = []\n\n        for (const item of previousSelectedRef.current) {\n          const matchedSelectedItem = data.find((d) => shallowEqual(d, item))\n\n          if (matchedSelectedItem) {\n            selected.push(matchedSelectedItem)\n          }\n        }\n\n        selectActions.setSelected(selected)\n        previousSelectedRef.current = []\n      }\n\n      latest.current.options.query?.onSuccess?.(data, ...reset)\n    },\n    onFinally(...args) {\n      isFormChangedRef.current = false\n      isChangingPageInternallyRef.current = false\n\n      latest.current.options.query?.onFinally?.(...args)\n    },\n  })\n\n  const [selectState, selectActions] = useMultiSelect<Item>(query.data ?? [], [])\n\n  const latest = useLatest({ options, selectState, paginationState })\n\n  const refresh = useStableFn(() => query.refresh())\n\n  return {\n    get params() {\n      return query.params\n    },\n    get loadingSlow() {\n      return query.loadingSlow\n    },\n    get error() {\n      return query.error\n    },\n    get loading() {\n      return query.loading\n    },\n    get refreshing() {\n      return query.refreshing\n    },\n    get initializing() {\n      return query.initializing\n    },\n    get list() {\n      return (query.data ?? []) as Item[]\n    },\n    form,\n    refresh,\n    selection: {\n      ...selectState,\n      ...selectActions,\n    },\n    pagination: {\n      ...paginationState,\n      ...paginationActions,\n    },\n  }\n}\n"],"names":["usePagingList","options","previousDataRef","useRef","undefined","previousFormRef","form","initialValue","previousSelectedRef","isFormChangedRef","isChangingPageInternallyRef","useSafeState","Number","POSITIVE_INFINITY","total","setTotal","useForm","onReset","args","latest","startNewQuery","current","onSubmit","isFormChanged","query","run","previousData","page","paginationState","pageSize","onChange","nextForm","keys","immediateQueryKeys","key","isChanged","shallowEqual","useStableFn","paginationActions","go","value","usePagination","pagination","list","onPageChange","state","lastPage","onPageSizeChange","lastPageSize","strategy","pageStrategy","isReset","transformedPage","Math","floor","useQuery","fetcher","initialParams","onBefore","selectState","selected","length","onSuccess","data","reset","item","matchedSelectedItem","find","d","push","selectActions","setSelected","onFinally","useMultiSelect","useLatest","refresh","params","loadingSlow","error","loading","refreshing","initializing","selection"],"mappings":"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"}