// @flow import {remove} from "../common/utils/ArrayUtils" import {assertMainOrNode} from "../Env" import type {LoginController} from "./LoginController" import type {OperationTypeEnum} from "../common/TutanotaConstants" import {equalsTypeRef} from "../common/EntityFunctions" assertMainOrNode() export type EntityUpdateData = { application: string, type: string, instanceListId: string, instanceId: string, operation: OperationTypeEnum } export type EntityEventsListener = ($ReadOnlyArray) => mixed; export const isUpdateForTypeRef = (typeRef: TypeRef, update: EntityUpdateData): boolean => equalsTypeRef(typeRef, update.application, update.type) export class EntityEventController { _listeners: Array; _logins: LoginController; constructor(logins: LoginController) { this._listeners = [] this._logins = logins } addListener(listener: EntityEventsListener) { this._listeners.push(listener) } removeListener(listener: EntityEventsListener) { remove(this._listeners, listener) } notificationReceived(entityUpdates: $ReadOnlyArray) { let loginsUpdates = Promise.resolve() if (this._logins.isUserLoggedIn()) { // the UserController must be notified first as other event receivers depend on it to be up-to-date loginsUpdates = this._logins.getUserController().entityEventsReceived(entityUpdates) } loginsUpdates.then(() => { this._listeners.forEach(listener => { listener(entityUpdates) }) }) } }