FarmBot/Farmbot-Web-App

View on GitHub
frontend/config/actions.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { didLogin, setToken } from "../auth/actions";
import { Thunk } from "../redux/interfaces";
import { Session } from "../session";
import { maybeRefreshToken } from "../refresh_token";
import { AuthState } from "../auth/interfaces";
import { timeout } from "promise-timeout";

export const storeToken =
  (old: AuthState, dispatch: Function) => (_new: AuthState | undefined) => {
    const t = _new || old;
    (!_new) && console.warn("Can't refresh token. Is API_HOST set correctly?");
    dispatch(setToken(t));
    didLogin(t, dispatch);
  };

/** Amount of time we're willing to wait before concluding that the token is bad
 * or the API is down. */
const MAX_TOKEN_WAIT_TIME = 10000;

/** (IMPORTANT) One of the highest level callbacks in the app.
 * called once DOM is ready and React is attached to the DOM.
 * => Lets Redux know that the app is ready to bootstrap.
 * => Checks for token updates since last log in. */
export function ready(): Thunk {
  return (dispatch, getState) => {
    const auth = Session.fetchStoredToken() || getState().auth;
    if (auth) {
      const ok = storeToken(auth, dispatch);
      const no = () => ok(undefined);
      const p = maybeRefreshToken(auth);
      timeout(p, MAX_TOKEN_WAIT_TIME).then(ok, no);
    } else {
      Session.clear();
    }
  };
}