2023-08-11 11:48:33 +00:00
|
|
|
// mobx
|
|
|
|
import { observable, action, computed, makeObservable, runInAction } from "mobx";
|
|
|
|
// service
|
|
|
|
import UserService from "services/user.service";
|
2023-09-01 11:12:30 +00:00
|
|
|
|
|
|
|
export interface IUserStore {
|
|
|
|
currentUser: any | null;
|
|
|
|
fetchCurrentUser: () => void;
|
|
|
|
}
|
2023-08-11 11:48:33 +00:00
|
|
|
|
|
|
|
class UserStore implements IUserStore {
|
|
|
|
currentUser: any | null = null;
|
|
|
|
// root store
|
|
|
|
rootStore;
|
|
|
|
// service
|
|
|
|
userService;
|
|
|
|
|
|
|
|
constructor(_rootStore: any) {
|
|
|
|
makeObservable(this, {
|
|
|
|
// observable
|
2023-09-01 11:12:30 +00:00
|
|
|
currentUser: observable.ref,
|
2023-08-11 11:48:33 +00:00
|
|
|
// actions
|
2023-09-01 11:12:30 +00:00
|
|
|
setCurrentUser: action,
|
2023-08-11 11:48:33 +00:00
|
|
|
// computed
|
|
|
|
});
|
|
|
|
this.rootStore = _rootStore;
|
|
|
|
this.userService = new UserService();
|
|
|
|
}
|
|
|
|
|
2023-09-01 11:12:30 +00:00
|
|
|
setCurrentUser = (user: any) => {
|
2023-09-01 11:40:06 +00:00
|
|
|
runInAction(() => {
|
|
|
|
this.currentUser = { ...user };
|
|
|
|
});
|
2023-09-01 11:12:30 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param callback
|
|
|
|
* @description A wrapper function to check user authentication; it redirects to the login page if not authenticated, otherwise, it executes a callback.
|
|
|
|
* @example this.requiredLogin(() => { // do something });
|
|
|
|
*/
|
|
|
|
|
|
|
|
requiredLogin = (callback: () => void) => {
|
|
|
|
if (this.currentUser) {
|
|
|
|
callback();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.fetchCurrentUser()
|
|
|
|
.then(() => {
|
|
|
|
if (!this.currentUser) {
|
|
|
|
const currentPath = window.location.pathname;
|
|
|
|
window.location.href = `/?next_path=${currentPath}`;
|
|
|
|
} else callback();
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
const currentPath = window.location.pathname;
|
|
|
|
window.location.href = `/?next_path=${currentPath}`;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
fetchCurrentUser = async () => {
|
2023-08-11 11:48:33 +00:00
|
|
|
try {
|
2023-09-01 11:12:30 +00:00
|
|
|
const response = await this.userService.currentUser();
|
2023-08-11 11:48:33 +00:00
|
|
|
if (response) {
|
|
|
|
runInAction(() => {
|
|
|
|
this.currentUser = response;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} catch (error) {
|
2023-09-01 11:12:30 +00:00
|
|
|
console.error("Failed to fetch current user", error);
|
2023-08-11 11:48:33 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export default UserStore;
|