99 lines
2.8 KiB
JavaScript
99 lines
2.8 KiB
JavaScript
import {defineStore} from 'pinia'
|
|
import {api} from "boot/axios";
|
|
import {EDIT_USER} from "src/graphql/mutations/user";
|
|
import {LOGGED_USER_DETAIL, USER_DETAIL} from "src/graphql/queries/user";
|
|
import {ref} from "vue";
|
|
import {mutate, query} from "stores/helpers";
|
|
|
|
export const useUserStore = defineStore('LoggedUser', () => {
|
|
const user = ref(null);
|
|
const publicUser = ref(null);
|
|
const isQueryRunning = ref(false);
|
|
const isMutationRunning = ref(false);
|
|
const isRefreshing = ref(false);
|
|
|
|
const fetchLoggedUserDetail = ({refresh}) => query({
|
|
isQueryRunning,
|
|
query: LOGGED_USER_DETAIL,
|
|
refreshUnauthorized: refresh || false,
|
|
}).then(item => {
|
|
user.value = item;
|
|
return item;
|
|
});
|
|
|
|
const fetchPublicUserDetail = (username) => query({
|
|
isQueryRunning,
|
|
query: USER_DETAIL,
|
|
variables: {username}
|
|
}).then(item => {
|
|
publicUser.value = item;
|
|
return item;
|
|
});
|
|
|
|
const update = (input) => mutate({
|
|
isMutationRunning,
|
|
mutation: EDIT_USER,
|
|
variables: {input}
|
|
}).then(item => {
|
|
user.value = item;
|
|
return item;
|
|
});
|
|
|
|
const register = async (formData) => {
|
|
return api.post('/registration', formData).then(response => {
|
|
const registeredUser = response.data;
|
|
const isSuccess = response.status === 201
|
|
})
|
|
};
|
|
|
|
const login = async (formData) => {
|
|
return api.post("/login", formData).then(({data}) => {
|
|
setTokens(data);
|
|
user.value = data.user;
|
|
})
|
|
};
|
|
|
|
const logout = () => {
|
|
return api.post("/logout").then(response => {
|
|
localStorage.removeItem("accessToken");
|
|
localStorage.removeItem("accessTokenValidity");
|
|
user.value = null;
|
|
});
|
|
};
|
|
|
|
const setTokens = ({access_token, access_token_validity}) => {
|
|
const now = new Date().getTime() / 1000;
|
|
localStorage.setItem("accessToken", access_token);
|
|
localStorage.setItem("accessTokenValidity", now + access_token_validity);
|
|
};
|
|
|
|
const getAccessToken = () => {
|
|
// TODO: https://dev.to/quasar/quasar-ssr-using-cookies-with-other-libs-services-4nkl
|
|
if (typeof localStorage === 'undefined') return null;
|
|
|
|
const tokenValidity = localStorage.getItem("accessTokenValidity");
|
|
const now = new Date().getTime() / 1000;
|
|
|
|
if (tokenValidity < now) {
|
|
localStorage.removeItem("accessToken");
|
|
localStorage.removeItem("accessTokenValidity");
|
|
}
|
|
|
|
return localStorage.getItem(`accessToken`);
|
|
};
|
|
|
|
const hasAccessToken = () => !!localStorage.getItem("accessToken");
|
|
|
|
const refreshAccessToken = async () => api.post("/refresh")
|
|
.then(({data}) => {
|
|
setTokens(data);
|
|
return data.access_token;
|
|
});
|
|
|
|
return {
|
|
isQueryRunning, isMutationRunning, user, publicUser, fetchLoggedUserDetail, fetchPublicUserDetail, update,
|
|
register, login, logout,
|
|
getAccessToken, hasAccessToken, refreshAccessToken, isRefreshing
|
|
}
|
|
});
|