import Vue from 'vue'
import { setActiveReq, setStateProvider, getRootState } from 'pinia'
-// import { Plugin } from '@nuxt/types'
-
-// declare module '@nuxt/types' {
-// interface Context {
-// ssrContext: {
-// req: Parameters<Plugin>[0]['req']
-// nuxt: {
-// __piniaStates?: Record<string, any>
-// }
-// }
-// }
-// }
-
-// declare global {
-// interface Window {
-// __NUXT__: {
-// __piniaStates: Record<string, any>
-// }
-// }
-// }
-
-const piniStatesGetter = () => window.__NUXT__.__piniaStates
-
-const noop = () => {}
-const emptyObjectReturn = () => ({})
-
-/**
- * Create a state provider for nuxt
- * @param {Parameters<import('@nuxt/types').Plugin>[0]['ssrContext'] | undefined} context
- */
-function createStateProvider(context) {
- /**
- *
- * @param {any} store
- */
- const piniStatesSetter = store => {
- // context is always non undefined on server
- const { nuxt } = context
- const states = nuxt.__piniaStates || (nuxt.__piniaStates = {})
- states[store.id] = store.state
- }
-
- return {
- get: process.client ? piniStatesGetter : emptyObjectReturn,
- set: context ? piniStatesSetter : noop,
- }
-}
Vue.mixin({
beforeCreate() {
if (context.ssrContext && context.ssrContext.req) {
setActiveReq(context.ssrContext.req)
}
- // setStateProvider(createStateProvider(context.ssrContext))
+
return setup(props, context)
}
}
const original = patchedServerPrefetch[i]
patchedServerPrefetch[i] = function() {
setActiveReq(this.$ssrContext.req)
- // setStateProvider(createStateProvider(this.$ssrContext.req))
+
return original.call(this)
}
}
/** @type {import('@nuxt/types').Plugin} */
const myPlugin = context => {
// console.log('🍍 Pinia Nuxt plugin installed')
- // setActiveReq(context.req)
- // setStateProvider(createStateProvider(context.ssrContext))
if (process.server) {
setActiveReq(context.req)
nuxtState.pinia = getRootState(context.req)
})
} else {
- setStateProvider({
- get: () => context.nuxtState.pinia,
- // TODO: remove the setter
- set: () => {},
- })
+ setStateProvider(() => context.nuxtState.pinia)
}
}
* A state provider allows to set how states are stored for hydration. e.g. setting a property on a context, getting a property from window
*/
interface StateProvider {
- get(): Record<string, StateTree>
- set(store: GenericStore): any
+ (): Record<string, StateTree>
}
/**
export function getInitialState(id: string): StateTree | undefined {
const provider = stateProviders.get(getActiveReq())
- return provider && provider.get()[id]
-}
-
-export function setInitialState(store: GenericStore): void {
- const provider = stateProviders.get(getActiveReq())
- if (provider) provider.set(store)
+ return provider && provider()[id]
}
/**