rsnext/test/integration/app-tree/pages/_app.js
JJ Kasper 4850bd03ef Provide AppTree to getInitialProps for getDataFromTree (#7732)
* Provide AppContainer to getInitialProps for getDataFromTree

* Update to only pass AppTree component instead of AppContainer

* Clean up props and remove extra imports

* Make updates from review

* De-dupe AppTree a bit

* Re-use wrapApp in router

* Remove un-needed change

* revert changes to examples until on stable

* Add test for AppTree
2019-07-30 14:00:19 -04:00

57 lines
1.3 KiB
JavaScript

import React from 'react'
import Link from 'next/link'
import { render } from 'react-dom'
import App, { Container } from 'next/app'
import { renderToString } from 'react-dom/server'
class MyApp extends App {
static async getInitialProps ({ Component, AppTree, router, ctx }) {
let pageProps = {}
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx)
}
let html
const toRender = (
<AppTree
{...{
router,
Component
}}
/>
)
if (typeof window !== 'undefined') {
const el = document.createElement('div')
document.querySelector('body').appendChild(el)
render(toRender, el)
html = el.innerHTML
el.remove()
} else {
html = renderToString(toRender)
}
return { pageProps, html }
}
render () {
const { Component, pageProps, html, router } = this.props
const href = router.pathname === '/' ? '/another' : '/'
return html ? (
<>
<div dangerouslySetInnerHTML={{ __html: html }} />
<Link href={href}>
<a id={href === '/' ? 'home' : 'another'}>to {href}</a>
</Link>
</>
) : (
<Container>
<Component {...pageProps} {...{ html }} />
</Container>
)
}
}
export default MyApp