1 | import React, { createElement } from "react"
|
2 | import PropTypes from "prop-types"
|
3 | import { publicLoader } from "./loader"
|
4 | import { apiRunner } from "./api-runner-browser"
|
5 |
|
6 |
|
7 | class PageRenderer extends React.Component {
|
8 | render() {
|
9 | const props = {
|
10 | ...this.props,
|
11 | pathContext: this.props.pageContext,
|
12 | }
|
13 |
|
14 | const [replacementElement] = apiRunner(`replaceComponentRenderer`, {
|
15 | props: this.props,
|
16 | loader: publicLoader,
|
17 | })
|
18 |
|
19 | const pageElement =
|
20 | replacementElement ||
|
21 | createElement(this.props.pageResources.component, {
|
22 | ...props,
|
23 | key: this.props.path || this.props.pageResources.page.path,
|
24 | })
|
25 |
|
26 | const wrappedPage = apiRunner(
|
27 | `wrapPageElement`,
|
28 | { element: pageElement, props },
|
29 | pageElement,
|
30 | ({ result }) => {
|
31 | return { element: result, props }
|
32 | }
|
33 | ).pop()
|
34 |
|
35 | return wrappedPage
|
36 | }
|
37 | }
|
38 |
|
39 | PageRenderer.propTypes = {
|
40 | location: PropTypes.object.isRequired,
|
41 | pageResources: PropTypes.object.isRequired,
|
42 | data: PropTypes.object,
|
43 | pageContext: PropTypes.object.isRequired,
|
44 | }
|
45 |
|
46 | export default PageRenderer
|