MobX authStore для сохранения профиля - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь создать AuthStore с MobX для SPA с Django бэкэндом Rest Framework. Я не могу найти способ сохранить профиль, не перезагружая его каждый раз.

Идея состоит в том, что каждый раз, когда вызывается authStore, он проверяет наличие токена в localStore, который затем проверяет дату истечения срока действия сам знак. Токен создается с использованием Django Rest Framework.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно определить профиль, чтобы я мог установить его и сделать его видимым. Однако каждый раз, когда я его назначаю, он должен быть пустым.

Есть идеи?

import { toJS, decorate, observable, computed } from "mobx";
import jwt_decode from "jwt-decode";
import axios from "axios";

export const instance = axios.create({ baseURL: "http://localhost:8001" });
class AuthStore {
  loggedIn = false;
  profile = {};

  fetchProfile = () =>
    new Promise((resolve, reject) => {
        instance
          .get("users/details/")
          .then((res) => {
            this.profile = res.data;
            console.log(toJS(this.profile));
            resolve(res);
          })
          .catch((e) => reject(e));
    });

  setToken = (token) =>
    new Promise((resolve, reject) => {
      if (token) {
        instance.defaults.headers.common["Authorization"] = `Bearer ${token}`;
        localStorage.setItem("knowKuwait", token);
        this.fetchProfile()
          .then((res) => {
            this.loggedIn = true;
            resolve(res);
          })
          .catch((e) => reject(e));
      } else {
        try {
          this.loggedIn = false;
          this.profile = {};
          delete instance.defaults.headers.common["Authorization"];
          localStorage.removeItem("knowKuwait");
          resolve();
        } catch (e) {
          reject(e);
        }
      }
    });
  checkForToken = () => {
    const token = localStorage.getItem("knowKuwait");
    if (token) {
      const currentTime = Date.now() / 1000;
      const jwt = jwt_decode(token);
      if (jwt.exp >= currentTime) {
        this.setToken(token);
      } else {
        this.logout();
      }
    }
  };
}

decorate(AuthStore, {
  loggedIn: observable,
  profile: observable,
});

const authStore = new AuthStore();
authStore.checkForToken();

export default authStore;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...