Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. export enum AsyncActionStatus {
  3.   INIT = 'INIT',
  4.   UNSTARTED = 'UNSTARTED',
  5.   STARTED = 'STARTED',
  6.   SUCCEEDED = 'SUCCEEDED',
  7.   FAILED = 'FAILED',
  8. }
  9.  
  10. interface StartedAsyncAction<T> {
  11.   type: T;
  12.   status: AsyncActionStatus.STARTED;
  13. }
  14.  
  15. interface SucceededAsyncAction<T, P = any> {
  16.   type: T;
  17.   status: AsyncActionStatus.SUCCEEDED;
  18.   payload: P;
  19. }
  20.  
  21. interface FailedAsyncAction<T> {
  22.   type: T;
  23.   status: AsyncActionStatus.FAILED;
  24.   payload: Error;
  25. }
  26.  
  27. export type AsyncAction<T, P = any> = StartedAsyncAction<T> |
  28.                                       SucceededAsyncAction<T, P> |
  29.                                       FailedAsyncAction<T>;
  30.  
  31. function startedAsyncAction<T>(type: T): StartedAsyncAction<T> {
  32.   return {
  33.     type,
  34.     status: AsyncActionStatus.STARTED,
  35.   };
  36. }
  37.  
  38. function succeededAsyncAction<T, P>(type: T, payload: P): SucceededAsyncAction<T, P> {
  39.   return {
  40.     type,
  41.     status: AsyncActionStatus.SUCCEEDED,
  42.     payload,
  43.   };
  44. }
  45.  
  46. function failedAsyncAction<T>(type: T, error: Error): FailedAsyncAction<T> {
  47.   return {
  48.     type,
  49.     status: AsyncActionStatus.FAILED,
  50.     payload: error,
  51.   };
  52. }
  53.  
  54. export function async<T, P>(type: T, action: (...args: any[]) => Promise<P>, ...args: any[]) {
  55.   return async (dispatch: any) => {
  56.     dispatch(startedAsyncAction(type));
  57.     try {
  58.       const payload = await action(...args);
  59.       dispatch(succeededAsyncAction(type, payload));
  60.     } catch (error) {
  61.       dispatch(failedAsyncAction(type, error));
  62.     }
  63.   };
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement