Fix addTapListener both on initial load and on navigation. Initial page load attempted to access a stale actionsApi that was set at construction time. This wasn't valid until a SHOW_REVISION_ACTIONS occurred. Snapshots of actionsApi and restApi were used across page navigation. These stale references would prevent proper addTapListener registration. Change-Id: I12ffd0433badccb5370505f3ac391b8d458d9480
diff --git a/web/automerger.ts b/web/automerger.ts index 96bcab5..fe294a0 100644 --- a/web/automerger.ts +++ b/web/automerger.ts
@@ -18,8 +18,6 @@ ActionInfo, ChangeInfo, } from '@gerritcodereview/typescript-api/rest-api'; -import {RestPluginApi} from '@gerritcodereview/typescript-api/rest'; -import {ChangeActionsPluginApi} from '@gerritcodereview/typescript-api/change-actions'; import {PopupPluginApi} from '@gerritcodereview/typescript-api/popup'; import {PluginApi} from '@gerritcodereview/typescript-api/plugin'; import {RequestPayload} from '@gerritcodereview/typescript-api/rest'; @@ -44,13 +42,10 @@ private downstreamConfigMap: ConfigMap = {}; - readonly restApi: RestPluginApi; + readonly plugin: PluginApi; - readonly actionsApi: ChangeActionsPluginApi; - - constructor(readonly plugin: PluginApi) { - this.restApi = plugin.restApi(); - this.actionsApi = plugin.changeActions(); + constructor(readonly p: PluginApi) { + this.plugin = p; } private callAction(payload: RequestPayload, onSuccess: () => void) { @@ -149,12 +144,17 @@ private getDownstreamConfigMap() { const change = this.change; if (!change) return; + const changeId = change._number; + if(changeId === undefined) return; + const revisionId = change.current_revision; + if(revisionId === undefined) return; + const url = `/changes/${changeId}/revisions/${revisionId}` + '/automerger~config-downstream'; - this.restApi.post<ConfigMap>(url, {subject: change.subject}).then(resp => { + this.plugin.restApi().post<ConfigMap>(url, {subject: change.subject}).then(resp => { this.downstreamConfigMap = resp; this.styleRelatedChanges(); }); @@ -162,13 +162,19 @@ onShowChange(change: ChangeInfo) { this.change = change; - this.action = this.actionsApi.getActionDetails( - 'automerge-change' - ) as UIActionInfo; this.downstreamConfigMap = {}; this.getDownstreamConfigMap(); + } + + onShowRevision() { + let actionsApi = this.plugin.changeActions(); + + this.action = actionsApi.getActionDetails( + 'automerge-change' + ) as UIActionInfo; + if (this.action) { - this.actionsApi.addTapListener(this.action.__key, () => { + actionsApi.addTapListener(this.action.__key, () => { this.onAutomergeChange(); }); }
diff --git a/web/plugin.ts b/web/plugin.ts index e926a35..03e107b 100644 --- a/web/plugin.ts +++ b/web/plugin.ts
@@ -24,4 +24,7 @@ plugin.on(EventType.SHOW_CHANGE, (change: ChangeInfo) => automerger.onShowChange(change) ); + plugin.on(EventType.SHOW_REVISION_ACTIONS, () => + automerger.onShowRevision() + ); });