mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
af9214b302
The mobx-state-tree examples (with and without typescript) pre-dated the next _app class and needed to be updated to use _app for persisting state across client-side navigation transitions. Also removed unneeded custom server class to better keep with the "show one feature per example" style of the next examples folder
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { applySnapshot, Instance, SnapshotIn, SnapshotOut, types } from "mobx-state-tree";
|
|
|
|
let store:IStore = null as any;
|
|
|
|
const Store = types
|
|
.model({
|
|
foo: types.number,
|
|
lastUpdate: types.Date,
|
|
light: false,
|
|
})
|
|
.actions((self) => {
|
|
let timer;
|
|
const start = () => {
|
|
timer = setInterval(() => {
|
|
// mobx-state-tree doesn't allow anonymous callbacks changing data.
|
|
// Pass off to another action instead (need to cast self as any
|
|
// because typescript doesn't yet know about the actions we're
|
|
// adding to self here)
|
|
(self as any).update();
|
|
}, 1000);
|
|
};
|
|
const update = () => {
|
|
self.lastUpdate = new Date(Date.now());
|
|
self.light = true;
|
|
};
|
|
const stop = () => {
|
|
clearInterval(timer);
|
|
};
|
|
return { start, stop, update };
|
|
});
|
|
|
|
type IStore = Instance<typeof Store>;
|
|
type IStoreSnapshotIn = SnapshotIn<typeof Store>;
|
|
type IStoreSnapshotOut = SnapshotOut<typeof Store>;
|
|
|
|
const initializeStore = (isServer, snapshot = null) => {
|
|
if (isServer) {
|
|
store = Store.create({ foo:6, lastUpdate: Date.now() });
|
|
}
|
|
if (store as any === null) {
|
|
store = Store.create({ foo:6, lastUpdate: Date.now() });
|
|
}
|
|
if (snapshot) {
|
|
applySnapshot(store, snapshot);
|
|
}
|
|
return store;
|
|
};
|
|
|
|
export { initializeStore, IStore, IStoreSnapshotIn, IStoreSnapshotOut };
|