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