1 | import React from 'react';
|
2 | import { connect } from 'react-redux';
|
3 | import { createSelector } from 'reselect';
|
4 | import pathToRegex from 'path-to-regexp';
|
5 |
|
6 | const T = React.PropTypes;
|
7 |
|
8 | export 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 |
|
21 | export 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 |
|
33 | export 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 |
|
65 | const selector = createSelector(
|
66 | state => state.platform.currentPage,
|
67 | currentPage => ({ currentPage })
|
68 | );
|
69 |
|
70 | export const UrlSwitch = connect(selector)(_UrlSwitch);
|