Skip to content

Commit 08e2d38

Browse files
committed
Applied rsc structure to mobile rsc sample
Moved the NavigationStack back into App because for readability. Only need to move it out if configure function props - would rather explain that in the docs than have that as the default in the sample
1 parent 2563ab5 commit 08e2d38

File tree

6 files changed

+83
-82
lines changed

6 files changed

+83
-82
lines changed

NavigationReactMobile/sample/rsc/src/App.tsx

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
'use server-entry';
22
import './client';
3-
import { Scene } from 'navigation-react-mobile';
4-
import RootProvider from './RootProvider';
3+
import { NavigationStack, Scene } from 'navigation-react-mobile';
4+
import NavigationProvider from './NavigationProvider';
5+
import HmrProvider from './HmrProvider';
56
import People from './People';
67
import Person from './Person';
78

@@ -12,14 +13,21 @@ const App = async ({url}: any) => {
1213
<title>Navigation React Mobile</title>
1314
</head>
1415
<body>
15-
<RootProvider url={url}>
16-
<Scene stateKey="people">
17-
<People />
18-
</Scene>
19-
<Scene stateKey="person" dataKeyDeps={['id']}>
20-
<Person />
21-
</Scene>
22-
</RootProvider>
16+
<NavigationProvider url={url}>
17+
<HmrProvider>
18+
<NavigationStack
19+
unmountStyle={[{transform: 'translateX(100%)'}, {transform: 'translateX(0)'}]}
20+
crumbStyle={[{transform: 'translateX(5%) scale(0.9)', opacity: 0},{transform: 'translateX(0) scale(1)', opacity: 1}]}
21+
style={{position: 'fixed', left: '0', right: '0', top: '0', bottom: '0', overflow: 'auto', backgroundColor: '#fff', margin: '8px'}}>
22+
<Scene stateKey="people">
23+
<People />
24+
</Scene>
25+
<Scene stateKey="person" dataKeyDeps={['id']}>
26+
<Person />
27+
</Scene>
28+
</NavigationStack>
29+
</HmrProvider>
30+
</NavigationProvider>
2331
</body>
2432
</html>
2533
);

NavigationReactMobile/sample/rsc/src/HmrContext.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use client'
2+
import { useContext, useEffect } from 'react';
3+
import { BundlerContext, useNavigationEvent } from 'navigation-react';
4+
5+
const HmrProvider = ({children}: any) => {
6+
const {setRoot, deserialize} = useContext(BundlerContext);
7+
const {stateNavigator} = useNavigationEvent();
8+
useEffect(() => {
9+
const onHmrReload = (e: any) => {
10+
e.preventDefault();
11+
const {stateContext: {state, data, crumbs, nextCrumb: {crumblessUrl}}} = stateNavigator;
12+
const root = deserialize(stateNavigator.historyManager.getHref(crumblessUrl), {
13+
method: 'put',
14+
headers: {'Content-Type': 'application/json'},
15+
body: {
16+
crumbs: crumbs.map(({state, data}) => ({state: state.key, data})),
17+
state: state.key,
18+
data
19+
}
20+
});
21+
stateNavigator.historyManager.stop();
22+
setRoot(root);
23+
}
24+
window.addEventListener('parcelhmrreload', onHmrReload);
25+
return () => window.removeEventListener('parcelhmrreload', onHmrReload);
26+
});
27+
return children;
28+
}
29+
30+
export default HmrProvider;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
'use client'
2+
import { useMemo } from 'react';
3+
import { StateNavigator } from 'navigation';
4+
import { NavigationHandler } from 'navigation-react';
5+
import { MobileHistoryManager } from 'navigation-react-mobile';
6+
import stateNavigator from './stateNavigator';
7+
8+
const historyManager = new MobileHistoryManager(null, '');
9+
10+
const NavigationProvider = ({url, children}: any) => {
11+
const clientNavigator = useMemo(() => {
12+
historyManager.stop();
13+
const clientNavigator = new StateNavigator(stateNavigator, historyManager);
14+
var {state, data} = clientNavigator.parseLink<any>(url);
15+
const link = clientNavigator.fluent()
16+
.navigate('people')
17+
.navigate(state.key, data).url;
18+
clientNavigator.navigateLink(link);
19+
return clientNavigator;
20+
}, []);
21+
return (
22+
<NavigationHandler stateNavigator={clientNavigator}>
23+
{children}
24+
</NavigationHandler>
25+
)
26+
}
27+
28+
export default NavigationProvider;

NavigationReactMobile/sample/rsc/src/RootProvider.tsx

Lines changed: 0 additions & 64 deletions
This file was deleted.

NavigationReactMobile/sample/rsc/src/client.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
'use client-entry';
2-
import { useState, startTransition } from 'react';
2+
import { useState, useMemo, startTransition } from 'react';
33
import ReactDOM from 'react-dom/client';
44
import { createFromReadableStream } from 'react-server-dom-parcel/client';
55
import { rscStream } from 'rsc-html-stream/client';
6-
import HmrContext from './HmrContext';
6+
import { fetchRSC } from '@parcel/rsc/client';
7+
import { BundlerContext } from 'navigation-react';
78

89
function Shell() {
9-
let [root, setRoot] = useState(() => createFromReadableStream(rscStream));
10+
const [root, setRoot] = useState(() => createFromReadableStream(rscStream));
11+
const bundler = useMemo(() => ({setRoot, deserialize: fetchRSC}), []);
1012
return (
11-
<HmrContext.Provider value={setRoot}>
13+
<BundlerContext.Provider value={bundler}>
1214
{root}
13-
</HmrContext.Provider>
15+
</BundlerContext.Provider>
1416
);
1517
}
1618

0 commit comments

Comments
 (0)