This repository has been archived on 2022-08-14. You can view files and clone it, but cannot push or open issues or pull requests.
outline/frontend/stores/UserStore.js

88 lines
1.8 KiB
JavaScript
Raw Normal View History

2017-05-12 00:23:56 +00:00
// @flow
import { observable, action, computed } from 'mobx';
2017-05-12 00:23:56 +00:00
import invariant from 'invariant';
import { client } from 'utils/ApiClient';
2017-05-12 00:23:56 +00:00
import type { User, Team } from 'types';
const USER_STORE = 'USER_STORE';
class UserStore {
2017-05-12 00:23:56 +00:00
@observable user: ?User;
@observable team: ?Team;
2017-05-12 00:23:56 +00:00
@observable token: ?string;
@observable oauthState: string;
2017-05-12 00:23:56 +00:00
@observable isLoading: boolean = false;
/* Computed */
2017-05-12 00:23:56 +00:00
@computed get authenticated(): boolean {
return !!this.token;
}
2017-05-12 00:23:56 +00:00
@computed get asJson(): string {
return JSON.stringify({
user: this.user,
team: this.team,
token: this.token,
oauthState: this.oauthState,
});
}
/* Actions */
2017-05-17 07:11:13 +00:00
@action logout = (cb: Function) => {
this.user = null;
this.token = null;
2017-05-17 07:11:13 +00:00
cb();
};
@action getOauthState = () => {
const state = Math.random().toString(36).substring(7);
this.oauthState = state;
return this.oauthState;
2017-04-27 04:47:03 +00:00
};
2017-05-17 07:11:13 +00:00
@action authWithSlack = async (code: string, state: string) => {
if (state !== this.oauthState) {
2017-05-17 07:11:13 +00:00
return {
success: false,
};
}
let res;
try {
res = await client.post('/auth.slack', { code });
} catch (e) {
2017-05-17 07:11:13 +00:00
return {
success: false,
};
}
2017-05-12 00:23:56 +00:00
invariant(
res && res.data && res.data.user && res.data.team && res.data.accessToken,
'All values should be available'
);
this.user = res.data.user;
this.team = res.data.team;
this.token = res.data.accessToken;
2017-05-17 07:11:13 +00:00
return {
success: true,
};
2017-04-27 04:47:03 +00:00
};
constructor() {
// Rehydrate
2016-07-15 07:26:34 +00:00
const data = JSON.parse(localStorage.getItem(USER_STORE) || '{}');
this.user = data.user;
this.team = data.team;
this.token = data.token;
this.oauthState = data.oauthState;
}
}
export default UserStore;
2017-04-27 04:47:03 +00:00
export { USER_STORE };