{"version":3,"file":"index.dev.mjs","sources":["../../src/index.tsx"],"sourcesContent":["import * as React from 'react'\nimport useLatest from '@react-hook/latest'\n\nexport function useAsync<\n  ValueType extends any = any,\n  ErrorType extends any = Error,\n  Args extends any[] = any[]\n>(asyncCallback: (...args: Args) => Promise<ValueType>) {\n  const [state, dispatch] = React.useReducer<\n    React.Reducer<\n      AsyncReducerState<ValueType, ErrorType>,\n      AsyncAction<ValueType, ErrorType>\n    >,\n    undefined\n  >(\n    (prev, action) => ({\n      // This is the current status of the promise or async/await function. A\n      // promise or async/await can only be in one state at a time.\n      status: action.status,\n      // The value is persisted between 'success' statuses. This means I can\n      // still display things that depend on my current value while my new\n      // value is loading.\n      value: action.status === 'success' ? action.value : prev.value,\n      // Errors get reset each time we leave the error state. There's really\n      // no use in keeping those around. They go stale once we leave.\n      error: action.status === 'error' ? action.error : void 0,\n    }),\n    void 0,\n    () => {\n      return {\n        status: 'idle',\n        value: void 0,\n        error: void 0,\n      }\n    }\n  )\n  // Creates a stable callback that manages our loading/success/error status updates\n  // as the callback is invoked.\n  const storedCallback = useLatest(asyncCallback)\n\n  const [callback] = React.useState(() => {\n    const cancelled: Set<Promise<ValueType> | null> = new Set()\n    let previous: Promise<ValueType> | null\n\n    return Object.assign(\n      async (...args: Args) => {\n        // Reloading automatically cancels previous promises\n        cancelled.add(previous)\n        dispatch({status: 'loading'})\n        let current: Promise<ValueType> | null = null\n\n        try {\n          previous = current = storedCallback.current(...args)\n          const value = await current\n          !cancelled.has(current) && dispatch({status: 'success', value})\n        } catch (error) {\n          current &&\n            !cancelled.has(current) &&\n            dispatch({status: 'error', error})\n        } finally {\n          cancelled.delete(current)\n        }\n      },\n      {\n        cancel: () => {\n          cancelled.add(previous)\n        },\n      }\n    )\n  })\n\n  // Cancels any pending async callbacks when the hook unmounts\n  React.useEffect(() => callback.cancel, [callback])\n\n  return [\n    React.useMemo(() => {\n      return {\n        status: state.status,\n        value: state.value,\n        error: state.error,\n        cancel: () => {\n          // Prevent the callback from dispatching\n          callback.cancel()\n          // Create a new callback and set status to cancelled\n          dispatch({status: 'cancelled'})\n        },\n      }\n    }, [callback, state]),\n    callback,\n  ] as const\n}\n\nexport function useAsyncEffect<\n  ValueType extends any = any,\n  ErrorType extends any = Error\n>(\n  asyncCallback: () => Promise<ValueType>,\n  dependencies?: React.DependencyList\n) {\n  const [state, callback] = useAsync<ValueType, ErrorType>(asyncCallback)\n  // Runs the callback each time deps change\n  React.useEffect(() => {\n    callback()\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, dependencies)\n\n  return state\n}\n\nexport interface AsyncReducerState<ValueType, ErrorType> {\n  status: AsyncStatus\n  value?: ValueType\n  error?: ErrorType\n}\n\nexport type AsyncAction<ValueType, ErrorType> =\n  | {\n      status: 'idle' | 'loading' | 'cancelled'\n    }\n  | {\n      status: 'success'\n      value: ValueType\n    }\n  | {\n      status: 'error'\n      error?: ErrorType\n    }\n\nexport type AsyncStatus = 'idle' | 'loading' | 'success' | 'error' | 'cancelled'\n"],"names":["prev","action","status","value","error","useAsync","asyncCallback","state","dispatch","React","storedCallback","useLatest","callback","cancelled","Set","previous","Object","assign","add","current","has","delete","cancel","useAsyncEffect","dependencies"],"mappings":"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"}