{"version":3,"file":"use-api.mjs","sources":["../../../../../packages/components/pro-table/src/use-api.ts"],"sourcesContent":["import { useConfig } from '@element-ultra/hooks'\nimport { getCurrentInstance, shallowReactive, shallowRef, watch } from 'vue'\n\nimport type { ProTableEmits, ProTableProps } from './pro-table'\n\ninterface Options {\n  props: ProTableProps\n  emit: ProTableEmits\n  canAutoQuery: { value: boolean }\n}\n\nexport function useApi(options: Options) {\n  const { props, emit, canAutoQuery } = options\n\n  const [configStore] = useConfig()\n\n  const pageQuery = shallowReactive({\n    page: 1,\n    size: props.pageSize || configStore.proTableDefaultSize || 20\n  })\n\n  const inst = getCurrentInstance()!\n\n  /** 缓存query */\n  const storeQuery = () => {\n    const { pagination, query } = props\n    const { $router, $route } = inst.appContext.app.config.globalProperties\n\n    if (!query || !$router || !$route) return\n    const _query = pagination ? { ...query, ...pageQuery } : query\n    let queryStr = Object.keys(_query)\n      .reduce((acc, key) => {\n        const v = _query[key]\n        if ([undefined, null, ''].includes(v)) return acc\n        return (acc += `${key}=${JSON.stringify(v)}&`)\n      }, '')\n      .slice(0, -1)\n\n    if (queryStr) {\n      queryStr = '?' + queryStr\n    }\n\n    if (location.search === queryStr) return\n    // 考虑到刷新的时候会丢失query，因此重新访问一下路由\n    $router.replace($route.path + queryStr)\n  }\n\n  let sortKeys: Record<string, 'asc' | 'dsc' | 'default'> | undefined = undefined\n\n  const handleSort = (_sortKeys: Record<string, 'asc' | 'dsc' | 'default'>) => {\n    sortKeys = _sortKeys\n    fetchData(false)\n  }\n\n  /** 获取查询参数 */\n  const getParams = () => {\n    const { query, api, pagination, requestExtra } = props\n    const _query: Record<string, any> = {}\n\n    query &&\n      Object.keys(query).forEach((key) => {\n        // 尝试将自动请求的$前缀去掉\n        _query[key.replace(/^\\$/, '')] = query[key]\n      })\n\n    return {\n      api: api!,\n      query: pagination ? { ..._query, ...pageQuery } : _query,\n      extra: requestExtra,\n      sortKeys\n    }\n  }\n\n  const loading = shallowRef(false)\n  const startLoading = () => (loading.value = true)\n  const endLoading = () => (loading.value = false)\n\n  const state = shallowReactive({\n    /** 分页的总数 */\n    total: 0,\n    /** 表格的数据 */\n    data: [] as any[],\n    /** 选中的数据 */\n    checked: props.checked || ([] as any[]),\n    /** 表格的字段的统计 */\n    statistics: undefined as Record<string, any> | undefined\n  })\n\n  watch(\n    () => props.checked,\n    (checked) => {\n      state.checked = checked || []\n    }\n  )\n\n  const currentQueryStr = { value: '' }\n\n  /**\n   * 请求数据\n   * @param resetPage 重置分页到第一页\n   *  @default true\n   *\n   */\n  const fetchData = async (resetPage = true) => {\n    const { api, data, cacheParams } = props\n    const { proTableRequestMethod: request } = configStore\n\n    if (!api || data || !request) return\n\n    // 重置分页\n    if (resetPage) {\n      pageQuery.page = 1\n    }\n\n    // 每次请求后尝试缓存query, 这行代码必须放在前面，因为后缓存会导致请求两次\n    cacheParams && storeQuery()\n\n    // 获取请求参数信息, 包含接口, 查询条件, 额外信息, 排序信息\n    const params = getParams()\n\n    // 记录当前的query字符串\n    currentQueryStr.value = JSON.stringify(props.query)\n\n    startLoading()\n    const res = await request(params).finally(endLoading)\n\n    state.data = res.data\n    state.total = res.total ?? 0\n    state.statistics = res.statistics\n\n    handleCheck([])\n    emit('loaded', res)\n  }\n\n  const defaultQuery = { value: {} }\n  /** 设置默认查询项 */\n  const setDefaultQuery = (query?: Record<string, any>) => {\n    if (!query) {\n      defaultQuery.value = {}\n      return\n    }\n    defaultQuery.value = JSON.parse(JSON.stringify(query))\n  }\n\n  /** 读取地址栏参数 */\n  const readUrlParams = () => {\n    const search = location.search.replace('?', '')\n    const { query } = props\n    if (!search || !query) return\n\n    search.split('&').forEach((item) => {\n      let [key, val] = decodeURIComponent(item).split('=')\n      try {\n        val = JSON.parse(val)\n      } catch {}\n\n      if (key in query) {\n        query[key] = val\n      } else if (key in pageQuery) {\n        // @ts-ignore\n        pageQuery[key] = val\n      }\n    })\n  }\n\n  let stopWatchQueryField: () => void\n  const watchQueryField = (query: Record<string, any>) => {\n    const watchList = Object.keys(query)\n      .filter((k) => k.startsWith('$'))\n      .map((k) => () => query[k])\n\n    stopWatchQueryField = watch(watchList, () => {\n      canAutoQuery.value && fetchData()\n    })\n  }\n\n  // 监听query, 获取query的默认值, 并重新监听每个以$开头的query字段\n  watch(\n    () => props.query,\n    (query) => {\n      // 停止监听之前的query字段\n      stopWatchQueryField?.()\n      // 设置默认query值\n      setDefaultQuery(query)\n      if (!query) return\n\n      // 读取url中的参数到query和pageQuery中\n      readUrlParams()\n      watchQueryField(query)\n    },\n    { immediate: true }\n  )\n\n  // 第一次请求时可能读取url中的缓存, 因此不重置\n  // api变更时需要重新请求数据\n  let isFirst = true\n  watch(\n    () => props.api,\n    (api) => {\n      if (!api) return\n\n      if (isFirst) {\n        fetchData(false)\n        isFirst = false\n      } else {\n        fetchData(true)\n      }\n    },\n    { immediate: true }\n  )\n\n  // 多选\n  const handleCheck = (checked: any[]) => {\n    state.checked = checked\n    emit('check', checked)\n    emit('update:checked', checked)\n  }\n  return {\n    fetchData,\n    getParams,\n    handleSort,\n    handleCheck,\n    state,\n    pageQuery,\n    loading,\n    currentQueryStr,\n    defaultQuery\n  }\n}\n"],"names":[],"mappings":"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"}