/**
 * 创建一个带「加载中防重入」的数据拉取函数，统一各 store 的 fetch 模板。
 * @param fetchFn 返回 { data } 的请求函数
 * @param assign 拿到 data 后如何写入 store 的 ref
 * @param options.skipIfLoaded 返回 true 时跳过本次请求（用于已加载则不重复拉取）
 */
export function createCachedFetcher<T>(
  fetchFn: () => Promise<{ data: T }>,
  assign: (data: T) => void,
  options: { skipIfLoaded?: () => boolean } = {},
) {
  let isLoading = false
  return async () => {
    if (isLoading) return
    if (options.skipIfLoaded?.()) return
    isLoading = true
    try {
      const { data } = await fetchFn()
      assign(data)
    } catch (error) {
      console.error(error)
    } finally {
      isLoading = false
    }
  }
}
