Skip to content

Commit 9f63761

Browse files
authored
Merge pull request #365 from gadget-inc/bootprops
Give layouts access to the props that the app is booted with
2 parents 888461f + e0d00ed commit 9f63761

File tree

7 files changed

+99
-15
lines changed

7 files changed

+99
-15
lines changed

packages/fastify-renderer/src/client/react/Root.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@ export interface LayoutProps {
88
isNavigating: boolean
99
navigationDestination: string
1010
children: React.ReactNode
11+
bootProps: Record<string, any>
1112
}
1213

13-
const RouteTable = (props: { Layout: React.FunctionComponent<LayoutProps>; routes: JSX.Element[] }) => {
14+
const RouteTable = (props: {
15+
Layout: React.FunctionComponent<LayoutProps>
16+
routes: JSX.Element[]
17+
bootProps: Record<string, any>
18+
}) => {
1419
const [isNavigating, navigationDestination] = useNavigationDetails()
1520

1621
return (
17-
<props.Layout isNavigating={isNavigating} navigationDestination={navigationDestination}>
22+
<props.Layout isNavigating={isNavigating} navigationDestination={navigationDestination} bootProps={props.bootProps}>
1823
<Switch>{props.routes}</Switch>
1924
</props.Layout>
2025
)
@@ -75,7 +80,7 @@ export function Root<BootProps>(props: {
7580

7681
return (
7782
<Router base={props.basePath} hook={useTransitionLocation as any} matcher={matcher}>
78-
<RouteTable routes={routes} Layout={props.Layout} />
83+
<RouteTable routes={routes} Layout={props.Layout} bootProps={props.bootProps} />
7984
</Router>
8085
)
8186
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React, { Suspense } from 'react'
2+
3+
const Layout = (props: { children: React.ReactNode; bootProps: Record<string, any> }) => {
4+
return (
5+
<Suspense fallback={<div>Loading...</div>}>
6+
<pre id="bootprops">
7+
<code>{JSON.stringify(props.bootProps)}</code>
8+
</pre>
9+
{props.children}
10+
</Suspense>
11+
)
12+
}
13+
14+
export default Layout

packages/test-apps/simple-react/Home.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ const Home = (props: { time: number }) => {
1515
Red About
1616
</Link>
1717
<br />
18+
<Link href="~/bootprops/test">Boot props test</Link>
19+
<br />
1820
<Link href="navigation-test"> Navigation Test </Link>
1921
</>
2022
)

packages/test-apps/simple-react/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"react-dom": "*"
1515
},
1616
"devDependencies": {
17+
"@playwright/test": "^1.23.0",
1718
"html-validator": "^5.1.18"
1819
}
1920
}

packages/test-apps/simple-react/server.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,23 @@ export const server = async () => {
7171
})
7272
})
7373

74+
await server.register(async (instance) => {
75+
instance.setRenderConfig({ base: '/bootprops', layout: require.resolve('./BootPropsLayout') })
76+
77+
instance.get('/bootprops/test', { render: require.resolve('./About') }, async (request) => {
78+
return { hostname: os.hostname(), requestIP: request.ip, bootProp: 'this is a boot prop' }
79+
})
80+
})
81+
7482
await server.ready()
7583
return server
7684
}
7785

7886
if (require.main === module) {
7987
void server().then((server) => {
8088
console.warn(server.printRoutes())
81-
return server.listen(3000)
89+
return server.listen(3000).then((address) => {
90+
console.warn(`Test server listening on ${address}`)
91+
})
8292
})
8393
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { expect } from '@playwright/test'
2+
import { Page } from 'playwright-chromium'
3+
import { newTestPage, reactReady, rootURL } from '../../helpers'
4+
5+
describe('boot props', () => {
6+
let page: Page
7+
8+
beforeEach(async () => {
9+
page = await newTestPage()
10+
})
11+
12+
test('should make the boot props available to the layout', async () => {
13+
await page.goto(`${rootURL}/bootprops/test`)
14+
await reactReady(page)
15+
await (expect(page.locator('#bootprops')) as any).toContainText('this is a boot prop')
16+
})
17+
})

yarn.lock

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,14 @@
11951195
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.1.0.tgz#563539048255bbe1a5f4f586a4a10a1bb737f44a"
11961196
integrity sha512-hf+3bwuBwtXsugA2ULBc95qxrOqP2pOekLz34BJhcAKawt94vfeNyUKpYc0lZQ/3sCP6LqRa7UAdHA7i5UODzQ==
11971197

1198+
"@playwright/test@^1.23.0":
1199+
version "1.23.0"
1200+
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.23.0.tgz#5d07ace37e1598a4a1a785b07856620b4e26fc43"
1201+
integrity sha512-RPWI8AHBVBiDyfTuxi1BhOaY3yaVy3S5ZsGKkSGGeWpZtSgN4SerInCYvgh9+EunIAK4RJQo+bzupbAn5pVqHQ==
1202+
dependencies:
1203+
"@types/node" "*"
1204+
playwright-core "1.23.0"
1205+
11981206
"@rollup/pluginutils@^4.1.1":
11991207
version "4.1.1"
12001208
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec"
@@ -1361,17 +1369,17 @@
13611369
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
13621370
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
13631371

1364-
"@types/react-dom@17.0.4", "@types/react-dom@^17.0.11":
1365-
version "17.0.4"
1366-
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.4.tgz#d65159a847aca2a0fc87a7544a2f8fece8754d04"
1367-
integrity sha512-Wb6rlnPJfqbhpkvYN39y1NM/pOGGPzzIRquu0RdUMvTwgXNvASFO7pdtrtvyxGTQNb9wzBaQxXAWDdEqegZw2A==
1372+
"@types/react-dom@^17.0.11":
1373+
version "17.0.17"
1374+
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.17.tgz#2e3743277a793a96a99f1bf87614598289da68a1"
1375+
integrity sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==
13681376
dependencies:
1369-
"@types/react" "*"
1377+
"@types/react" "^17"
13701378

1371-
"@types/react@*", "@types/[email protected]", "@types/react@^17.0.43":
1372-
version "17.0.4"
1373-
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.4.tgz#a67c6f7a460d2660e950d9ccc1c2f18525c28220"
1374-
integrity sha512-onz2BqScSFMoTRdJUZUDD/7xrusM8hBA2Fktk2qgaTYPCgPvWnDEgkrOs8hhPUf2jfcIXkJ5yK6VfYormJS3Jw==
1379+
"@types/react@^17", "@types/react@^17.0.43":
1380+
version "17.0.47"
1381+
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.47.tgz#4ee71aaf4c5a9e290e03aa4d0d313c5d666b3b78"
1382+
integrity sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA==
13751383
dependencies:
13761384
"@types/prop-types" "*"
13771385
"@types/scheduler" "*"
@@ -5697,6 +5705,11 @@ [email protected]:
56975705
yauzl "2.10.0"
56985706
yazl "2.5.1"
56995707

5708+
5709+
version "1.23.0"
5710+
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.23.0.tgz#51e24121b3a5bbe759d79738d8eff7a63156293c"
5711+
integrity sha512-Zzhyr5RZGoJ1ek2sgfJCt2076kdOg8hnNwFBqAYeLySiutXyxSQk93vZ5gbnFiWV1sHvueCcwla9n35acUTxtA==
5712+
57005713
57015714
version "6.0.0"
57025715
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821"
@@ -5882,7 +5895,15 @@ [email protected]:
58825895
iconv-lite "0.4.24"
58835896
unpipe "1.0.0"
58845897

5885-
react-dom@*, [email protected]:
5898+
react-dom@*:
5899+
version "18.2.0"
5900+
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
5901+
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
5902+
dependencies:
5903+
loose-envify "^1.1.0"
5904+
scheduler "^0.23.0"
5905+
5906+
58865907
version "0.0.0-experimental-4ead6b530"
58875908
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-0.0.0-experimental-4ead6b530.tgz#6ca831f5aa7ab86f7299b9a2f7b81dffabfa4eb4"
58885909
integrity sha512-a03ptS8lhhEENNgne6zQMXQWX/Z6WMEBGJQY0laOC0NgJywidePYpgkiE72fUAaj/r7t9a6XsdVyqx4UsEZijg==
@@ -5906,7 +5927,14 @@ react-refresh@^0.10.0:
59065927
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.10.0.tgz#2f536c9660c0b9b1d500684d9e52a65e7404f7e3"
59075928
integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==
59085929

5909-
5930+
react@*:
5931+
version "18.2.0"
5932+
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
5933+
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
5934+
dependencies:
5935+
loose-envify "^1.1.0"
5936+
5937+
59105938
version "0.0.0-experimental-4ead6b530"
59115939
resolved "https://registry.yarnpkg.com/react/-/react-0.0.0-experimental-4ead6b530.tgz#88cdae012012a758dd039a63104758c6351115df"
59125940
integrity sha512-tpbYm6FEuC1L6tCVXIKYAhgGAkS8DShzKpmXosowZvLqeByeLQQe77Ef6bi5HdEkFm2v0lZffLWckSM8R4TToA==
@@ -6165,6 +6193,13 @@ [email protected]:
61656193
loose-envify "^1.1.0"
61666194
object-assign "^4.1.1"
61676195

6196+
scheduler@^0.23.0:
6197+
version "0.23.0"
6198+
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
6199+
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
6200+
dependencies:
6201+
loose-envify "^1.1.0"
6202+
61686203
secure-json-parse@^2.0.0:
61696204
version "2.4.0"
61706205
resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.4.0.tgz#5aaeaaef85c7a417f76271a4f5b0cc3315ddca85"

0 commit comments

Comments
 (0)