mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
|
import { applySnapshot, Instance, IStateTreeNode, SnapshotIn, SnapshotOut, types } from "mobx-state-tree";
|
||
|
|
||
|
let store:IStateTreeNode = null as any;
|
||
|
|
||
|
const Store = types
|
||
|
.model({
|
||
|
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 initStore = (isServer, snapshot = null) => {
|
||
|
if (isServer) {
|
||
|
store = Store.create({ lastUpdate: Date.now() });
|
||
|
}
|
||
|
if (store as any === null) {
|
||
|
store = Store.create({ lastUpdate: Date.now() });
|
||
|
}
|
||
|
if (snapshot) {
|
||
|
applySnapshot(store, snapshot);
|
||
|
}
|
||
|
return store;
|
||
|
};
|
||
|
|
||
|
export { initStore, IStore, IStoreSnapshotIn, IStoreSnapshotOut };
|