import { Jsonify } from "type-fest"; import { Account } from "./account"; import { GlobalState } from "./global-state"; export class State< TGlobalState extends GlobalState = GlobalState, TAccount extends Account = Account > { accounts: { [userId: string]: TAccount } = {}; globals: TGlobalState; activeUserId: string; authenticatedAccounts: string[] = []; accountActivity: { [userId: string]: number } = {}; constructor(globals: TGlobalState) { this.globals = globals; } // TODO, make Jsonify work. It currently doesn't because Globals doesn't implement Jsonify. static fromJSON( obj: any, accountDeserializer: (json: Jsonify) => TAccount ): State { if (obj == null) { return null; } return Object.assign(new State(null), obj, { accounts: State.buildAccountMapFromJSON(obj?.accounts, accountDeserializer), }); } private static buildAccountMapFromJSON( jsonAccounts: { [userId: string]: Jsonify }, accountDeserializer: (json: Jsonify) => TAccount ) { if (!jsonAccounts) { return {}; } const accounts: { [userId: string]: TAccount } = {}; for (const userId in jsonAccounts) { accounts[userId] = accountDeserializer(jsonAccounts[userId]); } return accounts; } }