@wanp/use-swr-data
Version:
use-swr-data is a React hook that simplifies data fetching and caching using SWR (stale-while-revalidate) strategy.
76 lines (72 loc) • 2.21 kB
JavaScript
import { useState, useMemo, useCallback } from 'react';
import useSwr__default from 'swr';
export * from 'swr';
const DEFAULT_PAGE = { pageNum: 1, pageSize: 10 };
const SIMPLE_CONF = {
revalidateOnMount: true,
revalidateOnFocus: false,
revalidateOnReconnect: false,
shouldRetryOnError: false,
dedupingInterval: 500
};
function useSwrData(props) {
const { reqKey, req, params, ready = true, simple = false, paging = false, swrConfig } = props;
const defaultPage = "defaultPage" in props ? props.defaultPage || DEFAULT_PAGE : DEFAULT_PAGE;
const defaultSearch = "defaultSearch" in props ? props.defaultSearch : undefined;
const [pageInfo, setPage] = useState(defaultPage);
const [searchInfo, setSearch] = useState(defaultSearch);
const mergeKey = useMemo(() => {
if (ready === false) {
return null;
}
let mergeParams = {};
if (paging) {
mergeParams = { ...pageInfo, ...searchInfo, ...params };
}
else {
mergeParams = params;
}
return [reqKey, mergeParams];
}, [pageInfo, paging, params, ready, reqKey, searchInfo]);
const mergeConf = useMemo(() => {
let base = { revalidateOnFocus: false };
if (swrConfig) {
base = swrConfig;
}
if (simple) {
base = { ...SIMPLE_CONF, ...base };
}
return base;
}, [simple, swrConfig]);
const { data, isLoading, error, mutate } = useSwr__default(mergeKey, async (data) => {
return req(data[1]);
}, mergeConf);
const onSearch = useCallback((value) => {
setSearch(value);
setPage(defaultPage);
}, [defaultPage]);
if (paging) {
return {
key: mergeKey,
data,
error,
isLoading,
refresh: mutate,
pageInfo,
searchInfo,
onSearch,
setPage,
setSearch,
};
}
else {
return {
key: mergeKey,
data,
error,
isLoading,
refresh: mutate,
};
}
}
export { DEFAULT_PAGE, SIMPLE_CONF, useSwrData as default };