Git Product home page Git Product logo

Comments (4)

gerardmrk avatar gerardmrk commented on September 7, 2024 1

store/session/action.ts


import { createAction } from "typesafe-actions";

import { MiddlewareFlags } from "@client/store/middleware";
import { AuthTokens } from "@client/store/session/models";

export const loginPending = createAction(
  "session.loginPending",
  resolve => (flags: MiddlewareFlags) => resolve(undefined, flags)
);

export const loginSuccess = createAction(
  "session.loginSuccess",
  resolve => (tokens: AuthTokens, flags: MiddlewareFlags) => resolve(tokens, flags)
);

export const loginFailure = createAction(
  "session.loginFailure",
  resolve => (error: Error, flags: MiddlewareFlags) => resolve(error, flags)
);

/*
 * as opposed to (this is better, don't use my example above unless you need to declare meta):
 *
 * export const loginAsync = createAsyncAction(
 *   "session.login_request",
 *   "session.login_success",
 *   "session.login_failure"
 *  )<void, models.AuthTokens, Error>();
 */

//...

store/session/async-actions.ts

// ...

export const login = (usernameOrEmail: string, password: string, remember: boolean): StoreAsyncAction => async (dispatch: StoreDispatcher, getState: () => StoreState, api: API): Promise<void> => {
  dispatch(actions.loginPending({
    showLoader: "progress.logging_in"
  }));

  try {
    const authTokens: AuthTokens = await api.auth.authenticate(
      usernameOrEmail,
      password,
      remember
    );

    api.auth.cacheLocalSession(authTokens);

    dispatch(actions.loginSuccess(authTokens, {
      showLoader: false
    }));
  } catch (err) {
    dispatch(actions.loginFailure(<Error>err, {
      showLoader: false
    }));
  }
};

// ...

Here's what I did. Rather than using createAsyncAction, I created normal actions which will be called in the thunk action, so I can add the meta object.

If anyone's curious to what this is doing, I've setup a couple of middleware (functions that eavesdrop on / intercept every action sent to the store. If an action contains a ui flag in its meta property, the middleware will fire an action to the store to toggle that UI.

For reference:
https://github.com/gerardmrk/xo/blob/master/src/client/store/middleware.ts#L29

Hope this helps

from typesafe-actions.

piotrwitek avatar piotrwitek commented on September 7, 2024

Could you describe what is this meta property?

from typesafe-actions.

gerardmrk avatar gerardmrk commented on September 7, 2024

With the standard synchronous action, you're able to specify a mandatory type, an optional payload, and an optional meta payload. Judging from the typings and the documentations, you're not able to specify an optional meta payload for async actions. That's okay though, I realize I can just declare all the standard request, success, and failure actions and just use that with my custom async function, so I'll just close this issue. Thanks for this package btw it really helps

from typesafe-actions.

piotrwitek avatar piotrwitek commented on September 7, 2024

@gerardmrk Thanks for explanation now I understood your issue.
It would be possible to add an overloaded createAsyncAction, that would accept 6 type parameters but that would be really mouthful and I think only a few % of user would really use it. Could you post a snippet of your solution to this problem? Perhaps someone in the future may end up here so he could benefit from your help :)

from typesafe-actions.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.