From 833af842b169f791c11654e1ad962e5930d50849 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 20 Jul 2023 21:03:33 +0530 Subject: [PATCH] feat: using pinia to create sessionStore get session user, login, logout, isLoggedIn to create a login page --- frontend/src/main.js | 8 ++++-- frontend/src/stores/session.js | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 frontend/src/stores/session.js 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, + } +})