UNPKG

1.57 kBJavaScriptView Raw
1import React from 'react';
2import { connect } from 'react-redux';
3import { createSelector } from 'reselect';
4import pathToRegex from 'path-to-regexp';
5
6const T = React.PropTypes;
7
8export class Case extends React.Component {
9 static propTypes = {
10 url: T.string.isRequired,
11 exec: T.func.isRequired,
12 pageProperties: T.object,
13 };
14
15 render() {
16 const { exec, pageProperties } = this.props;
17 return exec(pageProperties);
18 }
19}
20
21export class Page extends React.Component {
22 static propTypes = {
23 url: T.string.isRequired,
24 pageProperties: T.object,
25 };
26
27 render() {
28 const { component, pageProperties } = this.props;
29 return React.createElement(component, pageProperties);
30 }
31}
32
33export class _UrlSwitch extends React.Component {
34 static propTypes = {
35 children: T.oneOfType([T.arrayOf(T.element), T.object]),
36 currentPage: T.object.isRequired,
37 };
38
39 render() {
40 const { children, currentPage } = this.props;
41 const pages = Array.isArray(children) ? children : [children];
42
43 let resultPage = null;
44
45 for (let page of pages) {
46 const { url } = page.props;
47
48 const reg = pathToRegex(url);
49 const result = reg.exec(currentPage.url);
50
51 if (result) {
52 resultPage = page;
53 break;
54 }
55 }
56
57 if (resultPage) {
58 return React.cloneElement(resultPage, { pageProperties: currentPage });
59 }
60
61 return false;
62 }
63}
64
65const selector = createSelector(
66 state => state.platform.currentPage,
67 currentPage => ({ currentPage })
68);
69
70export const UrlSwitch = connect(selector)(_UrlSwitch);