37 lines
845 B
JavaScript
37 lines
845 B
JavaScript
import { createContext, useContext } from 'react';
|
|
import { RootStore } from './root';
|
|
|
|
/** @type{RootStore} */
|
|
let store;
|
|
const StoreContext = createContext(store);
|
|
|
|
export function useStore() {
|
|
const context = useContext(StoreContext);
|
|
if (context === undefined) {
|
|
throw new Error('useStore must be used within StoreProvider');
|
|
}
|
|
|
|
return context;
|
|
}
|
|
|
|
function initializeStore(initialData) {
|
|
const _store = store ?? new RootStore();
|
|
|
|
if (initialData) {
|
|
const { user } = initialData;
|
|
_store.$user.hydrate(user);
|
|
}
|
|
|
|
if (typeof window === 'undefined') return _store;
|
|
if (!store) store = _store;
|
|
|
|
return _store;
|
|
}
|
|
|
|
export function StoreProvider({ children, ...initialData }) {
|
|
const store = initializeStore(initialData);
|
|
return (
|
|
<StoreContext.Provider value={store}>{children}</StoreContext.Provider>
|
|
);
|
|
}
|