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

Commit

Permalink
Merge pull request #2036 from matrix-org/dbkr/many_persistedelements
Browse files Browse the repository at this point in the history
Give PersistedElement a key
  • Loading branch information
lukebarnard1 authored Jul 4, 2018
2 parents f429ae5 + ad35fbf commit bfbd499
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 13 deletions.
26 changes: 14 additions & 12 deletions src/components/views/elements/PersistedElement.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,24 @@ limitations under the License.

const React = require('react');
const ReactDOM = require('react-dom');
const PropTypes = require('prop-types');

// Shamelessly ripped off Modal.js. There's probably a better way
// of doing reusable widgets like dialog boxes & menus where we go and
// pass in a custom control as the actual body.

const ContainerId = "mx_PersistedElement";

function getOrCreateContainer() {
let container = document.getElementById(ContainerId);
function getOrCreateContainer(containerId) {
let container = document.getElementById(containerId);

if (!container) {
container = document.createElement("div");
container.id = ContainerId;
container.id = containerId;
document.body.appendChild(container);
}

return container;
}

// Greater than that of the ContextualMenu
const PE_Z_INDEX = 5000;

/*
* Class of component that renders its children in a separate ReactDOM virtual tree
* in a container element appended to document.body.
Expand All @@ -50,6 +46,14 @@ const PE_Z_INDEX = 5000;
* bounding rect as the parent of PE.
*/
export default class PersistedElement extends React.Component {

static propTypes = {
// Unique identifier for this PersistedElement instance
// Any PersistedElements with the same persistKey will use
// the same DOM container.
persistKey: PropTypes.string.isRequired,
};

constructor() {
super();
this.collectChildContainer = this.collectChildContainer.bind(this);
Expand Down Expand Up @@ -97,18 +101,16 @@ export default class PersistedElement extends React.Component {
left: parentRect.left + 'px',
width: parentRect.width + 'px',
height: parentRect.height + 'px',
zIndex: PE_Z_INDEX,
});
}

render() {
const content = <div ref={this.collectChild}>
const content = <div ref={this.collectChild} style={this.props.style}>
{this.props.children}
</div>;

ReactDOM.render(content, getOrCreateContainer());
ReactDOM.render(content, getOrCreateContainer('mx_persistedElement_'+this.props.persistKey));

return <div ref={this.collectChildContainer}></div>;
}
}

6 changes: 5 additions & 1 deletion src/components/views/rooms/Stickerpicker.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ import WidgetUtils from '../../../utils/WidgetUtils';

const widgetType = 'm.stickerpicker';

// We sit in a context menu, so the persisted element container needs to float
// above it, so it needs a greater z-index than the ContextMenu
const STICKERPICKER_Z_INDEX = 5000;

export default class Stickerpicker extends React.Component {
constructor(props) {
super(props);
Expand Down Expand Up @@ -211,7 +215,7 @@ export default class Stickerpicker extends React.Component {
width: this.popoverWidth,
}}
>
<PersistedElement>
<PersistedElement containerId="mx_persisted_stickerPicker" style={{zIndex: STICKERPICKER_Z_INDEX}}>
<AppTile
collectWidgetMessaging={this._collectWidgetMessaging}
id={stickerpickerWidget.id}
Expand Down

0 comments on commit bfbd499

Please sign in to comment.