UNPKG

fetch-react-hook

Version:

Performant, flexible and extensible fetch library for React Hooks

1 lines 10.4 kB
{"version":3,"sources":["../src/hooks/useFetch.ts","../src/provider/index.tsx","../src/utils/index.ts","../src/index.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport {\r\n Fetcher,\r\n IStatus,\r\n Options,\r\n ResponseFetcher,\r\n UseFetch,\r\n UseFetchProps,\r\n} from \"../type\";\r\nimport { useFetchContext } from \"../provider\";\r\n\r\nconst defaultsConfigs = {\r\n keepDefaultParams: true,\r\n requestOptions: undefined,\r\n};\r\nconst useFetch = <D, I extends unknown, R, O>(\r\n fetcher: Fetcher<I, R, O>,\r\n {\r\n autoFetch = true,\r\n enableLoading = true,\r\n initialData,\r\n onSuccess = () => null,\r\n defaultParams,\r\n beforeAutoFetch = () => undefined,\r\n onError = () => null,\r\n onFinish = () => null,\r\n setMessage = (res: any) => res?.message,\r\n onDataSetter,\r\n defaultStatus,\r\n catchKey,\r\n onCache = () => null,\r\n justCache = false,\r\n cacheStrategy,\r\n }: UseFetchProps<D, I, R> = {}\r\n): UseFetch<D, I, R, O> => {\r\n const { cacheStrategy: providerCacheStrategy } = useFetchContext();\r\n const { getItem, setItem } = cacheStrategy || providerCacheStrategy || {};\r\n\r\n const getDefaultStatus = (): IStatus => {\r\n if (defaultStatus) return defaultStatus;\r\n if (!enableLoading) return \"success\";\r\n return autoFetch ? \"loading\" : \"success\";\r\n };\r\n const [status, setStatus] = useState<IStatus>(getDefaultStatus);\r\n const [data, setData] = useState<D>(initialData as D);\r\n\r\n const sendFetch = async (\r\n data?: Partial<I>,\r\n configs: Options<O> = defaultsConfigs\r\n ): Promise<ResponseFetcher<R> | never> => {\r\n const { keepDefaultParams, requestOptions } = configs;\r\n const mergedData = mergeData(\r\n keepDefaultParams ? defaultParams : undefined,\r\n data\r\n );\r\n try {\r\n const catchData=getDataFromCatch()\r\n if(catchData){\r\n handleCatchData(catchData)\r\n return { status: \"success\" }\r\n }\r\n if (enableLoading) setStatus(\"loading\");\r\n const res = await fetcher(mergedData, requestOptions);\r\n if (onDataSetter) {\r\n const callBackData: D | null = onDataSetter(res);\r\n if (callBackData) handleCatchResponse(callBackData)\r\n }\r\n handleSuccessRequest(res, mergedData);\r\n return {\r\n status: \"success\",\r\n response: res,\r\n message: setMessage(res),\r\n };\r\n } catch (e: any) {\r\n handleErrorRequest(e, mergedData);\r\n throw e;\r\n }\r\n };\r\n\r\n const handleCatchResponse = (data: D ) => {\r\n if (catchKey) {\r\n setItem<D>(catchKey, data);\r\n onCache(data);\r\n }\r\n !justCache && setData(data);\r\n }; \r\n \r\n const handleCatchData=(data: D)=>{\r\n onCache(data);\r\n !justCache && setData(data);\r\n }\r\n\r\n const handleFetch = async (\r\n data?: Partial<I>,\r\n configs?: Options<O>\r\n ): Promise<ResponseFetcher<R> | never> => await sendFetch(data, configs);\r\n\r\n const getDataFromCatch = (): D | undefined => {\r\n if (catchKey) return getItem(catchKey);\r\n return undefined;\r\n };\r\n\r\n const mergeData = (defaultParams?: Partial<I>, data?: Partial<I>): I => {\r\n if (defaultParams && data) {\r\n if (typeof data == \"object\") {\r\n return { ...defaultParams, ...data } as I;\r\n }\r\n if (Array.isArray(data) && Array.isArray(defaultParams)) {\r\n return [...defaultParams, ...data] as I;\r\n }\r\n }\r\n if (data) return data as I;\r\n return defaultParams as I;\r\n };\r\n\r\n const handleSuccessRequest = (res: R, payload: I) => {\r\n setStatus(\"success\");\r\n onSuccess(res, payload);\r\n onFinish(setMessage(res), { status: \"success\", response: res, payload });\r\n };\r\n\r\n const handleErrorRequest = (e: any, payload: I) => {\r\n onError(e, payload);\r\n onFinish(e.message, { status: \"error\", response: undefined, payload });\r\n setStatus(\"error\");\r\n };\r\n\r\n useEffect(() => {\r\n if (catchKey) {\r\n const catchData = getDataFromCatch();\r\n if (catchData) {\r\n handleCatchData(catchData)\r\n setStatus(\"success\");\r\n } else {\r\n if (autoFetch) {\r\n handleFetch(beforeAutoFetch());\r\n }\r\n }\r\n } else {\r\n if (autoFetch) {\r\n handleFetch(beforeAutoFetch());\r\n }\r\n }\r\n }, []);\r\n\r\n const handleSetData = (newValue: D): void => {\r\n setData(newValue);\r\n if (catchKey) setItem<D>(catchKey, newValue);\r\n };\r\n return {\r\n isPending: status === \"loading\",\r\n isError: status == \"error\",\r\n data,\r\n reFetch: handleFetch,\r\n status,\r\n setData: handleSetData,\r\n };\r\n};\r\n\r\nexport default useFetch;\r\n","import { FC, ReactNode, createContext, useContext } from \"react\";\r\nimport { ICacheStrategy } from \"../type\";\r\nimport { MemoryCacheStrategy } from \"../utils\";\r\n\r\nconst FetchContext = createContext<ContextType>({} as ContextType);\r\n\r\ntype Props = {\r\n children: ReactNode;\r\n cacheStrategy?: ICacheStrategy;\r\n};\r\n\r\ntype ContextType = {\r\n cacheStrategy: ICacheStrategy;\r\n};\r\nconst FetchProvider: FC<Props> = ({\r\n children,\r\n cacheStrategy = new MemoryCacheStrategy(),\r\n}) => {\r\n return (\r\n <FetchContext.Provider value={{ cacheStrategy }}>\r\n {children}\r\n </FetchContext.Provider>\r\n );\r\n};\r\nconst useFetchContext = () => useContext(FetchContext);\r\nexport { useFetchContext };\r\n\r\nexport default FetchProvider;\r\n","import { ICacheStrategy } from \"../type\";\r\n\r\n\r\nconst cache = new Map<string, any>()\r\n\r\nexport class MemoryCacheStrategy implements ICacheStrategy {\r\n setItem<T extends unknown>(key: string, data: T) {\r\n cache.set(key, data);\r\n }\r\n getItem<T extends unknown>(key: string) {\r\n return cache?.get(key) as T;\r\n }\r\n removeItem(key: string) {\r\n return cache.delete(key);\r\n }\r\n clear() {\r\n cache.clear();\r\n }\r\n}\r\n\r\nexport class LocalStorageCacheStrategy implements ICacheStrategy {\r\n setItem<T extends unknown>(key: string, data: T) {\r\n localStorage.setItem(key, JSON.stringify(data));\r\n }\r\n getItem<T extends unknown>(key: string) {\r\n const data = localStorage.getItem(key);\r\n return JSON.parse(data as string) as T;\r\n }\r\n removeItem(key: string) {\r\n localStorage.removeItem(key);\r\n return true;\r\n }\r\n clear() {\r\n localStorage.clear();\r\n }\r\n}\r\n","import useFetch from \"./hooks/useFetch\";\r\nimport FetchProvider from \"./provider\";\r\nexport type { IStatus, ICacheStrategy } from \"./type\";\r\nexport { FetchProvider };\r\nexport * from \"./utils\";\r\nexport default useFetch;\r\n"],"mappings":"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","names":["data","defaultParams"]}