// Copyright (c) Cratis. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. import { Constructor } from '@cratis/fundamentals'; import { CloseDialog, DialogResponse } from '@cratis/applications.react/dialogs'; import { IDialogMediatorHandler } from './IDialogMediatorHandler'; import { DialogRegistration, DialogRequest } from './DialogRegistration'; /** * Represents an implementation of {@link IDialogMediatorHandler} */ export class DialogMediatorHandler extends IDialogMediatorHandler { private _registrations: WeakMap> = new WeakMap(); /** * Initializes a new instance of {@link DialogMediatorHandler} * @param {IDialogMediatorHandler} _parent Optional parent handler. */ constructor(readonly _parent: IDialogMediatorHandler | null = null) { super(); } /** @inheritdoc */ subscribe(requestType: Constructor, requester: DialogRequest, closeDialog: CloseDialog): void { this._registrations.set( requestType, new DialogRegistration(requester, closeDialog) as unknown as DialogRegistration); } /** @inheritdoc */ hasSubscriber(requestType: Constructor): boolean { return this._registrations.has(requestType); } /** @inheritdoc */ show(request: TRequest): Promise> { if (!this.hasSubscriber(request.constructor as Constructor)) { if (this._parent) { return this._parent.show(request); } return Promise.reject('No registration found for request'); } const promise = new Promise>((resolve) => { const registration = this._registrations.get(request.constructor as Constructor)!; registration.requester(request, (result, response) => { resolve([result, response as TResponse]); }); }); return promise; } /** @inheritdoc */ getRegistration(requestType: Constructor): DialogRegistration { if (!this.hasSubscriber(requestType)) { if (this._parent) { return this._parent.getRegistration(requestType); } throw new Error('No registration found for request'); } return this._registrations.get(requestType)! as unknown as DialogRegistration; } }