Files
app/src/stores/User.js
T

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
}
});