Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 76cc5bf

Browse files
committed
Remember all capabilities given to a widget
Fixes element-hq/element-web#18786 Instead of replacing the remembered set, we now add to it. This should be safe as the user expectation was previously to remember the capabilities, so we can keep appending to that list. This commit also moves the utility functions closer to the widget driver as they aren't needed in the dialog anymore.
1 parent ee95e36 commit 76cc5bf

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

src/components/views/dialogs/WidgetCapabilitiesPromptDialog.tsx

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,6 @@ import LabelledToggleSwitch from "../elements/LabelledToggleSwitch";
3131
import { CapabilityText } from "../../../widgets/CapabilityText";
3232
import { replaceableComponent } from "../../../utils/replaceableComponent";
3333

34-
export function getRememberedCapabilitiesForWidget(widget: Widget): Capability[] {
35-
return JSON.parse(localStorage.getItem(`widget_${widget.id}_approved_caps`) || "[]");
36-
}
37-
38-
function setRememberedCapabilitiesForWidget(widget: Widget, caps: Capability[]) {
39-
localStorage.setItem(`widget_${widget.id}_approved_caps`, JSON.stringify(caps));
40-
}
41-
4234
interface IProps extends IDialogProps {
4335
requestedCapabilities: Set<Capability>;
4436
widget: Widget;
@@ -95,10 +87,7 @@ export default class WidgetCapabilitiesPromptDialog extends React.PureComponent<
9587
};
9688

9789
private closeAndTryRemember(approved: Capability[]) {
98-
if (this.state.rememberSelection) {
99-
setRememberedCapabilitiesForWidget(this.props.widget, approved);
100-
}
101-
this.props.onFinished({ approved });
90+
this.props.onFinished({ approved, remember: this.state.rememberSelection });
10291
}
10392

10493
public render() {

src/stores/widgets/StopGapWidgetDriver.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ import { MatrixClientPeg } from "../../MatrixClientPeg";
3333
import ActiveRoomObserver from "../../ActiveRoomObserver";
3434
import Modal from "../../Modal";
3535
import WidgetOpenIDPermissionsDialog from "../../components/views/dialogs/WidgetOpenIDPermissionsDialog";
36-
import WidgetCapabilitiesPromptDialog, {
37-
getRememberedCapabilitiesForWidget,
38-
} from "../../components/views/dialogs/WidgetCapabilitiesPromptDialog";
36+
import WidgetCapabilitiesPromptDialog from "../../components/views/dialogs/WidgetCapabilitiesPromptDialog";
3937
import { WidgetPermissionCustomisations } from "../../customisations/WidgetPermissions";
4038
import { OIDCState, WidgetPermissionStore } from "./WidgetPermissionStore";
4139
import { WidgetType } from "../../widgets/WidgetType";
@@ -48,6 +46,14 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
4846

4947
// TODO: Purge this from the universe
5048

49+
function getRememberedCapabilitiesForWidget(widget: Widget): Capability[] {
50+
return JSON.parse(localStorage.getItem(`widget_${widget.id}_approved_caps`) || "[]");
51+
}
52+
53+
function setRememberedCapabilitiesForWidget(widget: Widget, caps: Capability[]) {
54+
localStorage.setItem(`widget_${widget.id}_approved_caps`, JSON.stringify(caps));
55+
}
56+
5157
export class StopGapWidgetDriver extends WidgetDriver {
5258
private allowedCapabilities: Set<Capability>;
5359

@@ -100,6 +106,7 @@ export class StopGapWidgetDriver extends WidgetDriver {
100106
}
101107
}
102108
// TODO: Do something when the widget requests new capabilities not yet asked for
109+
let rememberApproved = false;
103110
if (missing.size > 0) {
104111
try {
105112
const [result] = await Modal.createTrackedDialog(
@@ -111,12 +118,19 @@ export class StopGapWidgetDriver extends WidgetDriver {
111118
widgetKind: this.forWidgetKind,
112119
}).finished;
113120
(result.approved || []).forEach(cap => allowedSoFar.add(cap));
121+
rememberApproved = result.remember;
114122
} catch (e) {
115123
console.error("Non-fatal error getting capabilities: ", e);
116124
}
117125
}
118126

119-
return new Set(iterableUnion(allowedSoFar, requested));
127+
const allAllowed = new Set(iterableUnion(allowedSoFar, requested));
128+
129+
if (rememberApproved) {
130+
setRememberedCapabilitiesForWidget(this.forWidget, Array.from(allAllowed));
131+
}
132+
133+
return allAllowed;
120134
}
121135

122136
public async sendEvent(eventType: string, content: any, stateKey: string = null): Promise<ISendEventDetails> {

0 commit comments

Comments
 (0)