| /** | |
| * @license | |
| * Copyright 2016 Google LLC | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import {GrReplyDialog} from '../../change/gr-reply-dialog/gr-reply-dialog'; | |
| import {PluginApi, TargetElement} from '../../../api/plugin'; | |
| import {JsApiService} from './gr-js-api-types'; | |
| import { | |
| ChangeReplyPluginApi, | |
| LabelsChangedCallback, | |
| LabelsChangedDetail, | |
| ReplyChangedCallback, | |
| ValueChangedDetail, | |
| } from '../../../api/change-reply'; | |
| import {getAppContext} from '../../../services/app-context'; | |
| import {HookApi, PluginElement} from '../../../api/hook'; | |
| /** | |
| * GrChangeReplyInterface, provides a set of handy methods on reply dialog. | |
| */ | |
| export class GrChangeReplyInterface implements ChangeReplyPluginApi { | |
| private readonly reporting = getAppContext().reportingService; | |
| constructor( | |
| readonly plugin: PluginApi, | |
| readonly sharedApiElement: JsApiService | |
| ) { | |
| this.reporting.trackApi(this.plugin, 'reply', 'constructor'); | |
| } | |
| get _el(): GrReplyDialog { | |
| return this.sharedApiElement.getElement( | |
| TargetElement.REPLY_DIALOG | |
| ) as unknown as GrReplyDialog; | |
| } | |
| getLabelValue(label: string): string | number | undefined { | |
| this.reporting.trackApi(this.plugin, 'reply', 'getLabelValue'); | |
| return this._el.getLabelValue(label); | |
| } | |
| setLabelValue(label: string, value: string) { | |
| this.reporting.trackApi(this.plugin, 'reply', 'setLabelValue'); | |
| this._el.setLabelValue(label, value); | |
| } | |
| addReplyTextChangedCallback(handler: ReplyChangedCallback) { | |
| this.reporting.trackApi(this.plugin, 'reply', 'addReplyTextChangedCb'); | |
| const hookApi = this.plugin.hook<PluginElement>('reply-text'); | |
| const wrappedHandler = (el: PluginElement, e: Event) => { | |
| const ce = e as CustomEvent<ValueChangedDetail>; | |
| handler(ce.detail.value, el.change); | |
| }; | |
| this.addCallbackAsHookListener(hookApi, 'value-changed', wrappedHandler); | |
| } | |
| addLabelValuesChangedCallback(handler: LabelsChangedCallback) { | |
| this.reporting.trackApi(this.plugin, 'reply', 'addLabelValuesChangedCb'); | |
| const hookApi = this.plugin.hook<PluginElement>('reply-label-scores'); | |
| const wrappedHandler = (el: PluginElement, e: Event) => { | |
| const ce = e as CustomEvent<LabelsChangedDetail>; | |
| handler(ce.detail, el.change); | |
| }; | |
| this.addCallbackAsHookListener(hookApi, 'labels-changed', wrappedHandler); | |
| } | |
| private addCallbackAsHookListener( | |
| hookApi: HookApi<PluginElement>, | |
| eventName: string, | |
| handler: (el: PluginElement, e: Event) => void | |
| ) { | |
| let registeredHandler: ((e: Event) => void) | undefined; | |
| hookApi.onAttached(el => { | |
| registeredHandler = (e: Event) => handler(el, e); | |
| el.content?.addEventListener(eventName, registeredHandler); | |
| }); | |
| hookApi.onDetached(el => { | |
| if (registeredHandler) { | |
| el.content?.removeEventListener(eventName, registeredHandler); | |
| registeredHandler = undefined; | |
| } | |
| }); | |
| } | |
| showMessage(message: string) { | |
| this.reporting.trackApi(this.plugin, 'reply', 'showMessage'); | |
| this._el.setPluginMessage(message); | |
| } | |
| } |