fix: race condition where previous note actions may be displayed for current note (#613)

This commit is contained in:
Mo Bitar
2021-08-13 16:16:39 -05:00
committed by GitHub
parent 083d8f592e
commit 41e1dd9731
3 changed files with 24 additions and 17 deletions

View File

@@ -2,7 +2,7 @@ import { WebApplication } from '@/ui_models/application';
import { WebDirective } from './../../types'; import { WebDirective } from './../../types';
import template from '%/directives/actions-menu.pug'; import template from '%/directives/actions-menu.pug';
import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl'; import { PureViewCtrl } from '@Views/abstract/pure_view_ctrl';
import { SNItem, Action, SNActionsExtension, UuidString } from '@standardnotes/snjs'; import { SNItem, Action, SNActionsExtension, UuidString, CopyPayload } from '@standardnotes/snjs';
import { ActionResponse } from '@standardnotes/snjs'; import { ActionResponse } from '@standardnotes/snjs';
import { ActionsExtensionMutator } from '@standardnotes/snjs'; import { ActionsExtensionMutator } from '@standardnotes/snjs';
@@ -27,7 +27,7 @@ type ActionsMenuState = {
extensions: SNActionsExtension[] extensions: SNActionsExtension[]
extensionsState: Record<UuidString, ExtensionState> extensionsState: Record<UuidString, ExtensionState>
selectedActionId?: number selectedActionId?: number
menu: { menuItems: {
uuid: UuidString, uuid: UuidString,
name: string, name: string,
loading: boolean, loading: boolean,
@@ -57,7 +57,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
}); });
this.loadExtensions(); this.loadExtensions();
this.autorun(() => { this.autorun(() => {
this.rebuildMenu({ this.rebuildMenuState({
hiddenExtensions: this.appState.actionsMenu.hiddenExtensions hiddenExtensions: this.appState.actionsMenu.hiddenExtensions
}); });
}); });
@@ -65,13 +65,20 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
/** @override */ /** @override */
getInitialState() { getInitialState() {
const extensions = this.application.actionsManager!.getExtensions().sort((a, b) => { const extensions = this.application.actionsManager.getExtensions().sort((a, b) => {
return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1; return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
}).map((extension) => {
return new SNActionsExtension(CopyPayload(extension.payload, {
content: {
...extension.payload.safeContent,
actions: []
}
}));
}); });
const extensionsState: Record<UuidString, ExtensionState> = {}; const extensionsState: Record<UuidString, ExtensionState> = {};
extensions.map((extension) => { extensions.map((extension) => {
extensionsState[extension.uuid] = { extensionsState[extension.uuid] = {
loading: false, loading: true,
error: false, error: false,
}; };
}); });
@@ -79,11 +86,11 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
extensions, extensions,
extensionsState, extensionsState,
hiddenExtensions: {}, hiddenExtensions: {},
menu: [], menuItems: [],
}; };
} }
rebuildMenu({ rebuildMenuState({
extensions = this.state.extensions, extensions = this.state.extensions,
extensionsState = this.state.extensionsState, extensionsState = this.state.extensionsState,
selectedActionId = this.state.selectedActionId, selectedActionId = this.state.selectedActionId,
@@ -93,7 +100,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
extensions, extensions,
extensionsState, extensionsState,
selectedActionId, selectedActionId,
menu: extensions.map(extension => { menuItems: extensions.map(extension => {
const state = extensionsState[extension.uuid]; const state = extensionsState[extension.uuid];
const hidden = hiddenExtensions[extension.uuid]; const hidden = hiddenExtensions[extension.uuid];
return { return {
@@ -136,7 +143,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
async executeAction(action: Action, extensionUuid: UuidString) { async executeAction(action: Action, extensionUuid: UuidString) {
if (action.verb === 'nested') { if (action.verb === 'nested') {
this.rebuildMenu({ this.rebuildMenuState({
selectedActionId: action.id selectedActionId: action.id
}); });
return; return;
@@ -220,7 +227,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
} }
return ext; return ext;
}); });
await this.rebuildMenu({ await this.rebuildMenuState({
extensions extensions
}); });
} }
@@ -236,7 +243,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
} }
return ext; return ext;
}); });
this.rebuildMenu({ this.rebuildMenuState({
extensions extensions
}); });
} }
@@ -248,7 +255,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
private setLoadingExtension(extensionUuid: UuidString, value = false) { private setLoadingExtension(extensionUuid: UuidString, value = false) {
const { extensionsState } = this.state; const { extensionsState } = this.state;
extensionsState[extensionUuid].loading = value; extensionsState[extensionUuid].loading = value;
this.rebuildMenu({ this.rebuildMenuState({
extensionsState extensionsState
}); });
} }
@@ -256,7 +263,7 @@ class ActionsMenuCtrl extends PureViewCtrl<unknown, ActionsMenuState> implements
private setErrorExtension(extensionUuid: UuidString, value = false) { private setErrorExtension(extensionUuid: UuidString, value = false) {
const { extensionsState } = this.state; const { extensionsState } = this.state;
extensionsState[extensionUuid].error = value; extensionsState[extensionUuid].error = value;
this.rebuildMenu({ this.rebuildMenuState({
extensionsState extensionsState
}); });
} }

View File

@@ -7,7 +7,7 @@
target='blank' target='blank'
) )
menu-row(label="'Download Actions'") menu-row(label="'Download Actions'")
div(ng-repeat='extension in self.state.menu track by extension.uuid') div(ng-repeat='extension in self.state.menuItems track by extension.uuid')
.sk-menu-panel-header( .sk-menu-panel-header(
ng-click='self.toggleExtensionVisibility(extension.uuid); $event.stopPropagation();' ng-click='self.toggleExtensionVisibility(extension.uuid); $event.stopPropagation();'
) )
@@ -33,11 +33,11 @@
menu-row( menu-row(
faded='true', faded='true',
label="'No Actions Available'", label="'No Actions Available'",
ng-if='!extension.actions.length' ng-if='!extension.actions.length && !extension.hidden'
) )
menu-row( menu-row(
faded='true', faded='true',
label="'Error loading actions'", label="'Error loading actions'",
subtitle="'Please try again later.'" subtitle="'Please try again later.'"
ng-if='extension.error' ng-if='extension.error && !extension.hidden'
) )

View File

@@ -71,7 +71,7 @@
"@reach/checkbox": "^0.13.2", "@reach/checkbox": "^0.13.2",
"@reach/dialog": "^0.13.0", "@reach/dialog": "^0.13.0",
"@standardnotes/sncrypto-web": "1.2.10", "@standardnotes/sncrypto-web": "1.2.10",
"@standardnotes/snjs": "2.7.21", "@standardnotes/snjs": "2.7.23",
"mobx": "^6.3.2", "mobx": "^6.3.2",
"mobx-react-lite": "^3.2.0", "mobx-react-lite": "^3.2.0",
"preact": "^10.5.12" "preact": "^10.5.12"