import { LOGIN_PAGE, router } from "@/router"; import { call, createResource } from "frappe-ui"; import { defineStore } from "pinia"; import { computed, ComputedRef, Ref, ref } from "vue"; const URI_LOGOUT = "logout"; const URI_USER_INFO = "opendesk.api.auth.get_user"; /** * This is supposed to be the entry point of authentication. This will be * called from router itself. Hence the router instance from `useRouter()` will * not be available. All Authentication related logic should go in this file. * Some of these might contain async methods, beware. */ export const useAuthStore = defineStore("auth", () => { const userInfo = createResource({ url: URI_USER_INFO, }); const init = async () => { if (userInfo.fetched) return; await userInfo.fetch(); }; const reloadUser = userInfo.reload; const user__ = computed(() => userInfo.data || {}); const hasDeskAccess: ComputedRef = computed( () => user__.value.has_desk_access ); const isAdmin: ComputedRef = computed(() => user__.value.is_admin); const isAgent: ComputedRef = computed(() => user__.value.is_agent); const hasAgentRecord: ComputedRef = computed( () => user__.value.has_agent_record ); const isManager: ComputedRef = computed( () => user__.value.is_manager ); const userId: ComputedRef = computed(() => user__.value.user_id); const userImage: ComputedRef = computed( () => user__.value.user_image ); const userFirstName: ComputedRef = computed( () => user__.value.user_first_name ); const userName: ComputedRef = computed(() => user__.value.user_name); const username: ComputedRef = computed(() => user__.value.username); const availability: ComputedRef = computed( () => user__.value.availability || "" ); const availabilityChangedOn: ComputedRef = computed( () => user__.value.availability_changed_on || "" ); const availabilityChangedBy: ComputedRef = computed( () => user__.value.availability_changed_by || "" ); const timezone: ComputedRef = computed(() => user__.value.time_zone); const userTeams: ComputedRef = computed( () => user__.value.user_teams ); const language: ComputedRef = computed(() => user__.value.language); const personaCaptured: ComputedRef = computed( () => !!user__.value.persona_captured ); function sessionUser() { const cookies = new URLSearchParams(document.cookie.split("; ").join("&")); let _sessionUser = cookies.get("user_id"); if (_sessionUser === "Guest") { _sessionUser = null; } return _sessionUser; } const user: Ref = ref(sessionUser()); const isLoggedIn: ComputedRef = computed(() => !!user.value); // No in-SPA login on purpose: the full-page login round trip is what keeps // module-scope userStorage keys in sync with the session cookie. function logout() { user.value = null; call(URI_LOGOUT).then(() => { window.location.href = LOGIN_PAGE; }); } return { hasDeskAccess, init, isAdmin, isAgent, hasAgentRecord, isManager, isLoggedIn, reloadUser, userFirstName, userId, userImage, userName, username, availability, availabilityChangedOn, availabilityChangedBy, timezone, userTeams, language, personaCaptured, user, logout, }; });