Add a basic widget explorer to devtools (per-room)
This commit is contained in:
parent
461b569278
commit
254e0b9a94
2 changed files with 96 additions and 0 deletions
|
@ -32,6 +32,8 @@ import {
|
||||||
PHASE_STARTED,
|
PHASE_STARTED,
|
||||||
PHASE_CANCELLED,
|
PHASE_CANCELLED,
|
||||||
} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
|
} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
|
||||||
|
import WidgetStore from "../../../stores/WidgetStore";
|
||||||
|
import {UPDATE_EVENT} from "../../../stores/AsyncStore";
|
||||||
|
|
||||||
class GenericEditor extends React.PureComponent {
|
class GenericEditor extends React.PureComponent {
|
||||||
// static propTypes = {onBack: PropTypes.func.isRequired};
|
// static propTypes = {onBack: PropTypes.func.isRequired};
|
||||||
|
@ -701,6 +703,97 @@ class VerificationExplorer extends React.Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class WidgetExplorer extends React.Component {
|
||||||
|
static getLabel() {
|
||||||
|
return _t("Active Widgets");
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
query: '',
|
||||||
|
editWidget: null, // set to an IApp when editing
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
onWidgetStoreUpdate = () => {
|
||||||
|
this.forceUpdate();
|
||||||
|
};
|
||||||
|
|
||||||
|
onQueryChange = (query) => {
|
||||||
|
this.setState({query});
|
||||||
|
};
|
||||||
|
|
||||||
|
onEditWidget = (widget) => {
|
||||||
|
this.setState({editWidget: widget});
|
||||||
|
};
|
||||||
|
|
||||||
|
onBack = () => {
|
||||||
|
const widgets = WidgetStore.instance.getApps(this.props.room.roomId);
|
||||||
|
if (this.state.editWidget && widgets.includes(this.state.editWidget)) {
|
||||||
|
this.setState({editWidget: null});
|
||||||
|
} else {
|
||||||
|
this.props.onBack();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
WidgetStore.instance.on(UPDATE_EVENT, this.onWidgetStoreUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
WidgetStore.instance.off(UPDATE_EVENT, this.onWidgetStoreUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const room = this.props.room;
|
||||||
|
|
||||||
|
const editWidget = this.state.editWidget;
|
||||||
|
const widgets = WidgetStore.instance.getApps(room.roomId);
|
||||||
|
if (editWidget && widgets.includes(editWidget)) {
|
||||||
|
const allState = Array.from(Array.from(room.currentState.events.values()).map(e => e.values()))
|
||||||
|
.reduce((p, c) => {p.push(...c); return p;}, []);
|
||||||
|
const stateEv = allState.find(ev => ev.getId() === editWidget.eventId);
|
||||||
|
if (!stateEv) { // "should never happen"
|
||||||
|
return <div>
|
||||||
|
{_t("There was an error finding this widget.")}
|
||||||
|
<div className="mx_Dialog_buttons">
|
||||||
|
<button onClick={this.onBack}>{_t("Back")}</button>
|
||||||
|
</div>
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
|
return <SendCustomEvent
|
||||||
|
onBack={this.onBack}
|
||||||
|
room={room}
|
||||||
|
forceStateEvent={true}
|
||||||
|
inputs={{
|
||||||
|
eventType: stateEv.getType(),
|
||||||
|
evContent: JSON.stringify(stateEv.getContent(), null, '\t'),
|
||||||
|
stateKey: stateEv.getStateKey(),
|
||||||
|
}}
|
||||||
|
/>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (<div>
|
||||||
|
<div className="mx_Dialog_content">
|
||||||
|
<FilteredList query={this.state.query} onChange={this.onQueryChange}>
|
||||||
|
{widgets.map(w =>
|
||||||
|
<button
|
||||||
|
className='mx_DevTools_RoomStateExplorer_button'
|
||||||
|
key={w.url + w.eventId}
|
||||||
|
onClick={() => this.onEditWidget(w)}
|
||||||
|
>{w.url}</button>
|
||||||
|
)}
|
||||||
|
</FilteredList>
|
||||||
|
</div>
|
||||||
|
<div className="mx_Dialog_buttons">
|
||||||
|
<button onClick={this.onBack}>{_t("Back")}</button>
|
||||||
|
</div>
|
||||||
|
</div>);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const Entries = [
|
const Entries = [
|
||||||
SendCustomEvent,
|
SendCustomEvent,
|
||||||
RoomStateExplorer,
|
RoomStateExplorer,
|
||||||
|
@ -708,6 +801,7 @@ const Entries = [
|
||||||
AccountDataExplorer,
|
AccountDataExplorer,
|
||||||
ServersInRoomList,
|
ServersInRoomList,
|
||||||
VerificationExplorer,
|
VerificationExplorer,
|
||||||
|
WidgetExplorer,
|
||||||
];
|
];
|
||||||
|
|
||||||
export default class DevtoolsDialog extends React.PureComponent {
|
export default class DevtoolsDialog extends React.PureComponent {
|
||||||
|
|
|
@ -2042,6 +2042,8 @@
|
||||||
"Explore Account Data": "Explore Account Data",
|
"Explore Account Data": "Explore Account Data",
|
||||||
"View Servers in Room": "View Servers in Room",
|
"View Servers in Room": "View Servers in Room",
|
||||||
"Verification Requests": "Verification Requests",
|
"Verification Requests": "Verification Requests",
|
||||||
|
"Active Widgets": "Active Widgets",
|
||||||
|
"There was an error finding this widget.": "There was an error finding this widget.",
|
||||||
"Toolbox": "Toolbox",
|
"Toolbox": "Toolbox",
|
||||||
"Developer Tools": "Developer Tools",
|
"Developer Tools": "Developer Tools",
|
||||||
"There was an error updating your community. The server is unable to process your request.": "There was an error updating your community. The server is unable to process your request.",
|
"There was an error updating your community. The server is unable to process your request.": "There was an error updating your community. The server is unable to process your request.",
|
||||||
|
|
Loading…
Reference in a new issue