47 lines
1.1 KiB
JavaScript
47 lines
1.1 KiB
JavaScript
import React, { createElement } from "react"
|
|
import PropTypes from "prop-types"
|
|
import { publicLoader } from "./loader"
|
|
import { apiRunner } from "./api-runner-browser"
|
|
|
|
// Renders page
|
|
class PageRenderer extends React.Component {
|
|
render() {
|
|
const props = {
|
|
...this.props,
|
|
pathContext: this.props.pageContext,
|
|
}
|
|
|
|
const [replacementElement] = apiRunner(`replaceComponentRenderer`, {
|
|
props: this.props,
|
|
loader: publicLoader,
|
|
})
|
|
|
|
const pageElement =
|
|
replacementElement ||
|
|
createElement(this.props.pageResources.component, {
|
|
...props,
|
|
key: this.props.path || this.props.pageResources.page.path,
|
|
})
|
|
|
|
const wrappedPage = apiRunner(
|
|
`wrapPageElement`,
|
|
{ element: pageElement, props },
|
|
pageElement,
|
|
({ result }) => {
|
|
return { element: result, props }
|
|
}
|
|
).pop()
|
|
|
|
return wrappedPage
|
|
}
|
|
}
|
|
|
|
PageRenderer.propTypes = {
|
|
location: PropTypes.object.isRequired,
|
|
pageResources: PropTypes.object.isRequired,
|
|
data: PropTypes.object,
|
|
pageContext: PropTypes.object.isRequired,
|
|
}
|
|
|
|
export default PageRenderer
|