forked from abner/for-legacy-web
72 lines
1.5 KiB
TypeScript
72 lines
1.5 KiB
TypeScript
import { action, makeAutoObservable, runInAction } from "mobx";
|
|
|
|
import { latestChangelog } from "../../assets/changelogs";
|
|
import { modalController } from "../../controllers/modals/ModalController";
|
|
import Persistent from "../interfaces/Persistent";
|
|
import Store from "../interfaces/Store";
|
|
import Syncable from "../interfaces/Syncable";
|
|
|
|
export interface Data {
|
|
viewed?: number;
|
|
}
|
|
|
|
/**
|
|
* Keeps track of viewed changelog items
|
|
*/
|
|
export default class Changelog implements Store, Persistent<Data>, Syncable {
|
|
/**
|
|
* Last viewed changelog ID
|
|
*/
|
|
private viewed: number;
|
|
|
|
/**
|
|
* Construct new Layout store.
|
|
*/
|
|
constructor() {
|
|
this.viewed = 0;
|
|
makeAutoObservable(this);
|
|
}
|
|
|
|
get id() {
|
|
return "changelog";
|
|
}
|
|
|
|
toJSON() {
|
|
return {
|
|
viewed: this.viewed,
|
|
};
|
|
}
|
|
|
|
@action hydrate(data: Data) {
|
|
if (data.viewed) {
|
|
this.viewed = data.viewed;
|
|
}
|
|
}
|
|
|
|
apply(_key: string, data: unknown, _revision: number): void {
|
|
this.hydrate(data as Data);
|
|
}
|
|
|
|
toSyncable(): { [key: string]: object } {
|
|
return {
|
|
changelog: this.toJSON(),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Check whether there are new updates
|
|
*/
|
|
checkForUpdates() {
|
|
if (this.viewed < latestChangelog) {
|
|
modalController.push({
|
|
type: "changelog",
|
|
initial: latestChangelog,
|
|
});
|
|
|
|
runInAction(() => {
|
|
this.viewed = latestChangelog;
|
|
});
|
|
}
|
|
}
|
|
}
|