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

Commit 2d2b529

Browse files
committed
Use new ContextualMenu component in Stickerpicker
1 parent 9ec2570 commit 2d2b529

File tree

1 file changed

+56
-37
lines changed

1 file changed

+56
-37
lines changed

src/components/views/rooms/Stickerpicker.js

Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import React from 'react';
1717
import { _t } from '../../../languageHandler';
1818
import Widgets from '../../../utils/widgets';
1919
import AppTile from '../elements/AppTile';
20-
import ContextualMenu from '../../structures/ContextualMenu';
2120
import MatrixClientPeg from '../../../MatrixClientPeg';
2221
import Modal from '../../../Modal';
2322
import sdk from '../../../index';
@@ -36,6 +35,7 @@ export default class Stickerpicker extends React.Component {
3635
this._launchManageIntegrations = this._launchManageIntegrations.bind(this);
3736
this._removeStickerpickerWidgets = this._removeStickerpickerWidgets.bind(this);
3837
this._onWidgetAction = this._onWidgetAction.bind(this);
38+
this._onResize = this._onResize.bind(this);
3939
this._onFinished = this._onFinished.bind(this);
4040

4141
this.popoverWidth = 300;
@@ -44,13 +44,17 @@ export default class Stickerpicker extends React.Component {
4444
this.state = {
4545
showStickers: false,
4646
imError: null,
47+
stickerpickerX: null,
48+
stickerpickerY: null,
49+
stickerpickerWidget: null,
50+
widgetId: null,
4751
};
4852
}
4953

5054
_removeStickerpickerWidgets() {
5155
console.warn('Removing Stickerpicker widgets');
52-
if (this.widgetId) {
53-
this.scalarClient.disableWidgetAssets(widgetType, this.widgetId).then(() => {
56+
if (this.state.widgetId) {
57+
this.scalarClient.disableWidgetAssets(widgetType, this.state.widgetId).then(() => {
5458
console.warn('Assets disabled');
5559
}).catch((err) => {
5660
console.error('Failed to disable assets');
@@ -59,8 +63,7 @@ export default class Stickerpicker extends React.Component {
5963
console.warn('No widget ID specified, not disabling assets');
6064
}
6165

62-
// Wrap this in a timeout in order to avoid the DOM node from being pulled from under its feet
63-
setTimeout(() => this.stickersMenu.close());
66+
this.setState({showStickers: false});
6467
Widgets.removeStickerpickerWidgets().then(() => {
6568
this.forceUpdate();
6669
}).catch((e) => {
@@ -69,6 +72,9 @@ export default class Stickerpicker extends React.Component {
6972
}
7073

7174
componentDidMount() {
75+
// Close the sticker picker when the window resizes
76+
window.addEventListener('resize', this._onResize);
77+
7278
this.scalarClient = null;
7379
if (SdkConfig.get().integrations_ui_url && SdkConfig.get().integrations_rest_url) {
7480
this.scalarClient = new ScalarAuthClient();
@@ -82,9 +88,15 @@ export default class Stickerpicker extends React.Component {
8288
if (!this.state.imError) {
8389
this.dispatcherRef = dis.register(this._onWidgetAction);
8490
}
91+
const stickerpickerWidget = Widgets.getStickerpickerWidgets()[0];
92+
this.setState({
93+
stickerpickerWidget,
94+
widgetId: stickerpickerWidget ? stickerpickerWidget.id : null,
95+
});
8596
}
8697

8798
componentWillUnmount() {
99+
window.removeEventListener('resize', this._onResize);
88100
if (this.dispatcherRef) {
89101
dis.unregister(this.dispatcherRef);
90102
}
@@ -102,9 +114,7 @@ export default class Stickerpicker extends React.Component {
102114
if (payload.action === "user_widget_updated") {
103115
this.forceUpdate();
104116
} else if (payload.action === "stickerpicker_close") {
105-
// Wrap this in a timeout in order to avoid the DOM node from being
106-
// pulled from under its feet
107-
setTimeout(() => this.stickersMenu.close());
117+
this.setState({showStickers: false});
108118
}
109119
}
110120

@@ -137,14 +147,13 @@ export default class Stickerpicker extends React.Component {
137147
// TODO - Add support for Stickerpickers from multiple app stores.
138148
// Render content from multiple stickerpack sources, each within their
139149
// own iframe, within the stickerpicker UI element.
140-
const stickerpickerWidget = Widgets.getStickerpickerWidgets()[0];
150+
const stickerpickerWidget = this.state.stickerpickerWidget;
141151
let stickersContent;
142152

143153
// Load stickerpack content
144154
if (stickerpickerWidget && stickerpickerWidget.content && stickerpickerWidget.content.url) {
145155
// Set default name
146156
stickerpickerWidget.content.name = stickerpickerWidget.name || _t("Stickerpack");
147-
this.widgetId = stickerpickerWidget.id;
148157

149158
stickersContent = (
150159
<div className='mx_Stickers_content_container'>
@@ -186,12 +195,7 @@ export default class Stickerpicker extends React.Component {
186195
// Default content to show if stickerpicker widget not added
187196
console.warn("No available sticker picker widgets");
188197
stickersContent = this._defaultStickerpickerContent();
189-
this.widgetId = null;
190-
this.forceUpdate();
191198
}
192-
this.setState({
193-
showStickers: false,
194-
});
195199
return stickersContent;
196200
}
197201

@@ -201,37 +205,32 @@ export default class Stickerpicker extends React.Component {
201205
* @param {Event} e Event that triggered the function
202206
*/
203207
_onShowStickersClick(e) {
204-
const GenericElementContextMenu = sdk.getComponent('context_menus.GenericElementContextMenu');
205208
const buttonRect = e.target.getBoundingClientRect();
206209

207210
// The window X and Y offsets are to adjust position when zoomed in to page
208211
const x = buttonRect.right + window.pageXOffset - 42;
209212
const y = (buttonRect.top + (buttonRect.height / 2) + window.pageYOffset) - 19;
210-
// const self = this;
211-
this.stickersMenu = ContextualMenu.createMenu(GenericElementContextMenu, {
212-
chevronOffset: 10,
213-
chevronFace: 'bottom',
214-
left: x,
215-
top: y,
216-
menuWidth: this.popoverWidth,
217-
menuHeight: this.popoverHeight,
218-
element: this._getStickerpickerContent(),
219-
onFinished: this._onFinished,
220-
menuPaddingTop: 0,
221-
menuPaddingLeft: 0,
222-
menuPaddingRight: 0,
223-
});
224-
225213

226-
this.setState({showStickers: true});
214+
this.setState({
215+
showStickers: true,
216+
stickerPickerX: x,
217+
stickerPickerY: y,
218+
});
227219
}
228220

229221
/**
230222
* Trigger hiding of the sticker picker overlay
231223
* @param {Event} ev Event that triggered the function call
232224
*/
233225
_onHideStickersClick(ev) {
234-
setTimeout(() => this.stickersMenu.close());
226+
this.setState({showStickers: false});
227+
}
228+
229+
/**
230+
* Called when the window is resized
231+
*/
232+
_onResize() {
233+
this.setState({showStickers: false});
235234
}
236235

237236
/**
@@ -250,20 +249,37 @@ export default class Stickerpicker extends React.Component {
250249
this.scalarClient.getScalarInterfaceUrlForRoom(
251250
this.props.room,
252251
'type_' + widgetType,
253-
this.widgetId,
252+
this.state.widgetId,
254253
) :
255254
null;
256255
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
257256
src: src,
258257
}, "mx_IntegrationsManager");
259258

260-
// Wrap this in a timeout in order to avoid the DOM node from being pulled from under its feet
261-
setTimeout(() => this.stickersMenu.close());
259+
this.setState({showStickers: false});
262260
}
263261

264262
render() {
265263
const TintableSvg = sdk.getComponent("elements.TintableSvg");
264+
const ContextualMenu = sdk.getComponent('structures.ContextualMenu');
265+
const GenericElementContextMenu = sdk.getComponent('context_menus.GenericElementContextMenu');
266266
let stickersButton;
267+
268+
const stickerPicker = <ContextualMenu
269+
elementClass={GenericElementContextMenu}
270+
chevronOffset={10}
271+
chevronFace={'bottom'}
272+
left={this.state.stickerPickerX}
273+
top={this.state.stickerPickerY}
274+
menuWidth={this.popoverWidth}
275+
menuHeight={this.popoverHeight}
276+
element={this._getStickerpickerContent()}
277+
onFinished={this._onFinished}
278+
menuPaddingTop={0}
279+
menuPaddingLeft={0}
280+
menuPaddingRight={0}
281+
/>;
282+
267283
if (this.state.showStickers) {
268284
// Show hide-stickers button
269285
stickersButton =
@@ -288,6 +304,9 @@ export default class Stickerpicker extends React.Component {
288304
<TintableSvg src="img/icons-show-stickers.svg" width="35" height="35" />
289305
</div>;
290306
}
291-
return stickersButton;
307+
return <div>
308+
{stickersButton}
309+
{this.state.showStickers && stickerPicker}
310+
</div>;
292311
}
293312
}

0 commit comments

Comments
 (0)