-
-
Notifications
You must be signed in to change notification settings - Fork 126
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
persisting pinia store within Quasar app #46
Comments
I dont really see what could be wrong, but I played a bit with the reprod repo, and in the vue devtools, there is no event related to pinia that is fired. This is weird and I dont really understand why, but that could be related to the issue since we subscribe to state mutations (like the devtools). My guess is there is smth with quasar, and i never used it so I can't help much atm. I'll try to look further, or if anyone has an idea. |
Ok thanks, you have set me on the right path because I have narrowed it down to being a problem with my Quasar boot file. Also I realised the opening post wasn't very clear, so I have updated it to reflect the current situation. Will post an update here if I find one! |
Hi, Quasar core team member here 👋 It's about Pinia's limitation about using plugins before the app is initialized: We will release first-party Pinia support soon, and mention this limitation on our docs, pointing to the Pinia documentation. |
started working on a helper for Quasar, i'll try to expose 3:
👍 |
first, u'll need a fake storage: import { StorageLike } from 'pinia-plugin-persistedstate';
export const cookieStorage: StorageLike = {
getItem(key: string) {
return '';
},
setItem(key: string, value: string) {
return;
},
}; we just need something (the fake storage) to import in the stores, like this: import { defineStore } from 'pinia';
import { cookieStorage } from './storages';
export const useAppStore = defineStore('app', {
state: () => ({
token: '',
}),
persist: {
storage: cookieStorage,
},
}); so, we can replace that fake storage by the real one in a import { store } from 'quasar/wrappers';
import { createPinia } from 'pinia';
import PiniaPersistedStatePlugin from 'pinia-plugin-persistedstate';
import { cookieStorage } from './storages';
import { Cookies } from 'quasar';
export default store(({ ssrContext }) => {
const pinia = createPinia();
// You can add Pinia plugins here
// pinia.use(SomePiniaPlugin)
const cookies = process.env.SERVER ? Cookies.parseSSR(ssrContext) : Cookies; // otherwise we're on client
pinia.use(({ options }) => {
if (!options.persist || typeof options.persist === 'boolean') {
return;
}
if (options.persist.storage === cookieStorage) {
options.persist.storage = {
getItem(key: string) {
return JSON.stringify(cookies.get(key));
},
setItem(key: string, value: string) {
const obj = JSON.parse(value);
cookies.set(key, obj, { path: '/', sameSite: 'Lax', secure: true });
},
};
}
});
pinia.use(PiniaPersistedStatePlugin);
return pinia;
}); This would be done before the PiniaPersistedStatePlugin be configured. here the source: |
yeah i think i took inspiration from some of your repos as im very unfamiliar with Quasar. Idea was to provide a helper as simple to use as this : import { boot } from "quasar/wrappers";
import { Cookies } from "quasar";
import {
createQuasarCookiesPersistedState
} from "pinia-plugin-persistedstate/quasar";
export default boot(({ store, ssrContext }) => {
store.use(createQuasarCookiesPersistedState(Cookies, ssrContext));
}); Kinda like what we did for Nuxt |
maybe as a plugin.: # the package will be named as quasar-app-extension-pinia-persistedstate
quasar ext add pinia-persistedstate this extension will install the PiniaPersistedStatePlugin, the Cookies Plugins and register the boots. import { defineStore } from 'pinia';
# pinia-plugin-persistedstate/quasar is an alias to quasar-app-extension-pinia-persistedstate
import { CookieStorage, /*LocalStorage, SessionStorage,IndexedStorage*/ } from 'pinia-plugin-persistedstate/quasar';
export const useAppStore = defineStore('app', {
state: () => ({
token: '',
}),
persist: {
storage: CookieStorage,
},
}); more about quasar extensions: |
that's fairly interesting. i never use quasar (cause its wayyy too heavy for what i do with vue). But whenever i have time i'll look into maybe making a quasar plugin as you suggest! thanks a lot! |
Fallacies I hear every day ;D |
I kept it iso with the way the Nuxt helper is made for now. Closing this for now? feel free to reopen if you feel like something is off/odd/broken |
thanks aloooot man <3 |
I'm trying to use this Pinia Plugin in my Quasar app (Vue 3 / TypeScript).
Out of the box everything works fine.
But when using a Quasar boot file the persisted state stops working. Refreshing the page wipes all the new values away.
I don't know why the boot file breaks the persisted state plugin, but I have narrowed the culprit down to a single line...
This is how I am using Pinia with Quasar and adding the plugin:
src/store/index.ts
And this is what my Pinia store looks like:
src/store/user.ts
Here is an example front-end page for fetching and setting the firstName:
src/pages/index.vue
Up to this point everything works fine.
I can set firstName to the Pinia store, refresh the page, and the new name is still in Pinia.
But when trying to use
const userStore = useUserStore(store)
inside a boot file like the example below, the persisted state stops working:src/boot/auth.ts
Any idea what's going on? And how to fix it?
I think this plugin is much cleaner than using the alternate LocalStorage persisted state solution so I would love to get it working with Quasar.
The text was updated successfully, but these errors were encountered: