Skip to content
Snippets Groups Projects
Commit c2ccb01e authored by Chris Lawton's avatar Chris Lawton
Browse files

use a portal to reference the switcher element

parent a7c9027b
No related branches found
No related tags found
No related merge requests found
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
{% block title %}{{ object }}{% endblock %} {% block title %}{{ object }}{% endblock %}
{% block content %} {% block content %}
<div id="react-app">
<div class="admin-bar"> <div class="admin-bar">
<div class="admin-bar__inner admin-bar__inner--with-button"> <div class="admin-bar__inner admin-bar__inner--with-button">
<div> <div>
...@@ -16,13 +15,13 @@ ...@@ -16,13 +15,13 @@
</div> </div>
</div> </div>
<div id="react-original-content" class="wrapper wrapper--large"> <div id="react-app">
{% block table %} <div class="wrapper wrapper--large">
{{ block.super }} {% block table %}
{% endblock %} {{ block.super }}
{% endblock %}
</div>
</div> </div>
</div>
{% render_bundle 'main' %} {% render_bundle 'main' %}
{% endblock %} {% endblock %}
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom';
import { hot } from 'react-hot-loader' import { hot } from 'react-hot-loader'
import ArrayIcon from './../../images/icon-array.svg'; import Switcher from './components/Switcher'
import GridIcon from './../../images/icon-grid.svg';
import './App.scss'; import './App.scss';
class App extends React.Component { class App extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.originalContent = null;
this.setOriginalContentRef = element => {
this.originalContent = element.querySelector('#react-original-content');
ReactDOM.render(
<div>
<button onClick={this.detailOpen}><ArrayIcon /></button>
<button onClick={this.detailClose}><GridIcon /></button>
</div>,
element.querySelector('#react-switcher')
);
};
this.state = { this.state = {
detailOpen: false detailOpen: false
...@@ -28,13 +14,11 @@ class App extends React.Component { ...@@ -28,13 +14,11 @@ class App extends React.Component {
} }
detailOpen = (state) => { detailOpen = (state) => {
this.originalContent.style.display = 'none'; this.setState({ style: { display: 'none' } })
this.setState({ style: { display: 'None' } })
this.setState({ detailOpen: true }) this.setState({ detailOpen: true })
} }
detailClose = () => { detailClose = () => {
this.originalContent.style.display = null;
this.setState({ style: {} }) this.setState({ style: {} })
this.setState({ detailOpen: false }) this.setState({ detailOpen: false })
} }
...@@ -42,7 +26,8 @@ class App extends React.Component { ...@@ -42,7 +26,8 @@ class App extends React.Component {
render() { render() {
return ( return (
<div> <div>
<div ref={this.setOriginalContentRef} dangerouslySetInnerHTML={{ __html: this.props.pageContent }} /> <Switcher selector='react-switcher' open={this.state.detailOpen} handleOpen={this.detailOpen} handleClose={this.detailClose} />
<div style={this.state.style} ref={this.setOriginalContentRef} dangerouslySetInnerHTML={{ __html: this.props.pageContent }} />
{this.state.detailOpen && <div><h2>THIS IS REACT</h2></div>} {this.state.detailOpen && <div><h2>THIS IS REACT</h2></div>}
</div> </div>
) )
......
import React from 'react'
import ReactDOM from 'react-dom';
import ArrayIcon from 'images/icon-array.svg'
import GridIcon from 'images/icon-grid.svg';
class Switcher extends React.Component {
constructor(props) {
super(props);
this.el = document.getElementById(props.selector);
}
render() {
const { handleOpen, handleClose, open } = this.props;
return ReactDOM.createPortal(
<>
<button className={`button button--switcher ${open ? 'is-active' : ''}`} onClick={handleOpen}><ArrayIcon /></button>
<button className={`button button--switcher ${open ? '' : 'is-active'}`} onClick={handleClose}><GridIcon /></button>
</>,
this.el,
);
}
}
export default Switcher
...@@ -8,6 +8,6 @@ const container = document.getElementById('react-app'); ...@@ -8,6 +8,6 @@ const container = document.getElementById('react-app');
ReactDOM.render( ReactDOM.render(
<App pageContent={container.innerHTML} originalContent={document.getElementById('react-original-content')} />, <App pageContent={container.innerHTML} />,
container container
); );
...@@ -42,7 +42,7 @@ module.exports = { ...@@ -42,7 +42,7 @@ module.exports = {
}, },
resolve: { resolve: {
modules: ['node_modules'], modules: ['node_modules', './src'],
extensions: ['.js', '.jsx'] extensions: ['.js', '.jsx']
} }
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment