64 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import React from 'react';
 | |
| import PropTypes from 'prop-types';
 | |
| import { Switch, Route } from 'react-router-dom';
 | |
| 
 | |
| import ColumnLoading from 'flavours/glitch/features/ui/components/column_loading';
 | |
| import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error';
 | |
| import BundleContainer from 'flavours/glitch/features/ui/containers/bundle_container';
 | |
| 
 | |
| // Small wrapper to pass multiColumn to the route components
 | |
| export class WrappedSwitch extends React.PureComponent {
 | |
| 
 | |
|   render () {
 | |
|     const { multiColumn, children } = this.props;
 | |
| 
 | |
|     return (
 | |
|       <Switch>
 | |
|         {React.Children.map(children, child => React.cloneElement(child, { multiColumn }))}
 | |
|       </Switch>
 | |
|     );
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| WrappedSwitch.propTypes = {
 | |
|   multiColumn: PropTypes.bool,
 | |
|   children: PropTypes.node,
 | |
| };
 | |
| 
 | |
| // Small Wraper to extract the params from the route and pass
 | |
| // them to the rendered component, together with the content to
 | |
| // be rendered inside (the children)
 | |
| export class WrappedRoute extends React.Component {
 | |
| 
 | |
|   static propTypes = {
 | |
|     component: PropTypes.func.isRequired,
 | |
|     content: PropTypes.node,
 | |
|     multiColumn: PropTypes.bool,
 | |
|   }
 | |
| 
 | |
|   renderComponent = ({ match }) => {
 | |
|     const { component, content, multiColumn } = this.props;
 | |
| 
 | |
|     return (
 | |
|       <BundleContainer fetchComponent={component} loading={this.renderLoading} error={this.renderError}>
 | |
|         {Component => <Component params={match.params} multiColumn={multiColumn}>{content}</Component>}
 | |
|       </BundleContainer>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   renderLoading = () => {
 | |
|     return <ColumnLoading />;
 | |
|   }
 | |
| 
 | |
|   renderError = (props) => {
 | |
|     return <BundleColumnError {...props} />;
 | |
|   }
 | |
| 
 | |
|   render () {
 | |
|     const { component: Component, content, ...rest } = this.props;
 | |
| 
 | |
|     return <Route {...rest} render={this.renderComponent} />;
 | |
|   }
 | |
| 
 | |
| }
 |