{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/hooks/useAsyncProcessQueue/index.ts"],"sourcesContent":["import { useCallback, useState, useRef } from 'react';\n\ntype RequestFunction<T> = (...args: any[]) => Promise<T>;\n\ninterface UseAsyncProcessQueueOptions {\n  keepPreviousData?: boolean;\n}\n\n/**\n * @experimental 실험적인 훅으로 추후 변경될 수 있습니다.\n */\nexport function useAsyncProcessQueue<T = unknown, E = unknown>({\n  keepPreviousData = false,\n}: UseAsyncProcessQueueOptions = {}) {\n  const requestQueue = useRef<RequestFunction<T>[]>([]);\n\n  const [data, setData] = useState<T | null>(null);\n  const [error, setError] = useState<E | null>(null);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const handleRequestQueue = useCallback(async () => {\n    if (requestQueue.current.length === 0) {\n      return;\n    }\n\n    const requestFunc = requestQueue.current[0];\n    setIsLoading(true);\n\n    try {\n      const res = await requestFunc();\n\n      setData(res as T);\n      setError(null);\n    } catch (err) {\n      setData(null);\n      setError(err as E);\n    } finally {\n      requestQueue.current.shift();\n      setIsLoading(false);\n\n      await handleRequestQueue();\n    }\n  }, []);\n\n  const addToProcessQueue = useCallback(\n    async (callbackFunc: RequestFunction<T>) => {\n      requestQueue.current.push(callbackFunc);\n\n      if (requestQueue.current.length === 1) {\n        if (!keepPreviousData) {\n          setData(null);\n          setError(null);\n        }\n\n        await handleRequestQueue();\n      }\n    },\n    [keepPreviousData, handleRequestQueue]\n  );\n\n  return { data, error, isLoading, addToProcessQueue };\n}\n"],"mappings":";;;;;AAWA,SAAgB,qBAA+C,EAC7D,mBAAmB,UACY,EAAE,EAAE;CACnC,MAAM,eAAe,OAA6B,EAAE,CAAC;CAErD,MAAM,CAAC,MAAM,WAAW,SAAmB,KAAK;CAChD,MAAM,CAAC,OAAO,YAAY,SAAmB,KAAK;CAClD,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CAEjD,MAAM,qBAAqB,YAAY,YAAY;EACjD,IAAI,aAAa,QAAQ,WAAW,GAClC;EAGF,MAAM,cAAc,aAAa,QAAQ;EACzC,aAAa,KAAK;EAElB,IAAI;GAGF,QAAQ,MAFU,aAAa,CAEd;GACjB,SAAS,KAAK;WACP,KAAK;GACZ,QAAQ,KAAK;GACb,SAAS,IAAS;YACV;GACR,aAAa,QAAQ,OAAO;GAC5B,aAAa,MAAM;GAEnB,MAAM,oBAAoB;;IAE3B,EAAE,CAAC;CAkBN,OAAO;EAAE;EAAM;EAAO;EAAW,mBAhBP,YACxB,OAAO,iBAAqC;GAC1C,aAAa,QAAQ,KAAK,aAAa;GAEvC,IAAI,aAAa,QAAQ,WAAW,GAAG;IACrC,IAAI,CAAC,kBAAkB;KACrB,QAAQ,KAAK;KACb,SAAS,KAAK;;IAGhB,MAAM,oBAAoB;;KAG9B,CAAC,kBAAkB,mBAAmB,CAGU;EAAE"}