diff --git a/frontend/src/main.js b/frontend/src/main.js index 57ec5c3e..c398e91c 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -3,16 +3,20 @@ import './index.css' import { createApp } from 'vue' import router from './router' import App from './App.vue' +import { createPinia } from "pinia"; import { FrappeUI, Button, setConfig, frappeRequest, resourcesPlugin } from 'frappe-ui' +// create a pinia instance +let pinia = createPinia(); + let app = createApp(App) setConfig('resourceFetcher', frappeRequest) -app.use(router) app.use(FrappeUI) -app.use(resourcesPlugin) +app.use(pinia); +app.use(router) app.component('Button', Button) app.mount('#app') diff --git a/frontend/src/stores/session.js b/frontend/src/stores/session.js new file mode 100644 index 00000000..dea1ade7 --- /dev/null +++ b/frontend/src/stores/session.js @@ -0,0 +1,46 @@ +import { defineStore } from 'pinia' +import { createResource } from 'frappe-ui' +import router from '@/router' +import { computed } from 'vue' + +export const sessionStore = defineStore('crm-session', () => { + const sessionUser = createResource({ + url: 'crm.api.session.get_user_info', + }) + + const user = computed(() => sessionUser.data || null) + const isLoggedIn = computed(() => !!user.value) + + const login = createResource({ + url: 'login', + onError() { + throw new Error('Invalid email or password') + }, + onSuccess() { + router.replace({ path: '/' }) + }, + }) + + const logout = createResource({ + url: 'logout', + onSuccess() { + router.replace({ name: 'Login' }) + }, + }) + + async function init() { + try { + await sessionUser.fetch() + } catch { + sessionUser.data = null + } + } + + return { + user, + isLoggedIn, + login, + logout, + init, + } +})