Skip to content

Commit fc056a9

Browse files
Improved fix for #378
1 parent dfc1be6 commit fc056a9

File tree

6 files changed

+84
-0
lines changed

6 files changed

+84
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import React from 'react';
2+
import {NextPage} from 'next';
3+
import Link from 'next/link';
4+
import {State} from '../components/reducer';
5+
import {wrapper} from '../components/store';
6+
7+
const PropsPage: NextPage<State> = props => {
8+
return (
9+
<div className="pageProps">
10+
<p>Using Next.js default prop in a wrapped component.</p>
11+
<pre>{JSON.stringify(props)}</pre>
12+
<nav>
13+
<Link href="/">
14+
<a>Navigate to index</a>
15+
</Link>
16+
</nav>
17+
</div>
18+
);
19+
};
20+
21+
PropsPage.getInitialProps = wrapper.getInitialPageProps(store => async () => ({
22+
prop: 'foo',
23+
}));
24+
25+
export default PropsPage;

packages/demo-page/tests/index.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,12 @@ describe('Basic integration', () => {
2626
await expect(page).toMatch('"page": "was set in index page');
2727
await expect(page).toMatch('"custom": "custom"');
2828
});
29+
30+
it('initial page props', async () => {
31+
await openPage('/pageProps');
32+
33+
await page.waitForSelector('div.pageProps');
34+
35+
await expect(page).toMatch('{"prop":"foo"}');
36+
});
2937
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import React from 'react';
2+
import {NextPage} from 'next';
3+
import Link from 'next/link';
4+
import {State} from '../components/reducer';
5+
import {wrapper} from '../components/store';
6+
7+
const PropsPage: NextPage<State> = props => {
8+
return (
9+
<div className="pageProps">
10+
<p>Using Next.js default prop in a wrapped component.</p>
11+
<pre>{JSON.stringify(props)}</pre>
12+
<nav>
13+
<Link href="/">
14+
<a>Navigate to index</a>
15+
</Link>
16+
</nav>
17+
</div>
18+
);
19+
};
20+
21+
PropsPage.getInitialProps = wrapper.getInitialPageProps(store => async () => ({
22+
prop: 'foo',
23+
}));
24+
25+
export default PropsPage;

packages/demo/tests/index.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,12 @@ describe('Using App wrapper', () => {
5959
await expect(page).toMatch('"page": "static"'); // redux
6060
await expect(page).toMatch('"app": "was set in _app"'); // redux
6161
});
62+
63+
it('initial page props', async () => {
64+
await openPage('/pageProps');
65+
66+
await page.waitForSelector('div.pageProps');
67+
68+
await expect(page).toMatch('{"appProp":"/pageProps","prop":"foo"}');
69+
});
6270
});

packages/wrapper/src/index.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,16 @@ export const createWrapper = <S extends Store>(makeStore: MakeStore<S>, config:
217217
delete resultProps.pageProps.initialState;
218218
}
219219

220+
console.log({initialProps, resultProps});
221+
222+
// unwrap getInitialPageProps
223+
if (resultProps?.pageProps?.initialProps) {
224+
resultProps.pageProps = {...resultProps.pageProps, ...resultProps.pageProps.initialProps};
225+
delete resultProps.pageProps.initialProps;
226+
}
227+
228+
console.log({initialProps, resultProps});
229+
220230
return (
221231
<Provider store={this.store}>
222232
<Component {...initialProps} {...resultProps} />

packages/wrapper/tests/server.spec.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,14 @@ describe('withRedux', () => {
134134
child(<WrappedApp initialProps={{pageProps: {fromApp: true}}} pageProps={{getStaticProp: true}} />),
135135
).toEqual('{"props":{"pageProps":{"fromApp":true,"getStaticProp":true}},"state":{"reduxStatus":"init"}}');
136136
});
137+
test('for page case (new Next versions)', () => {
138+
const WrappedPage: any = createWrapper(makeStore).withRedux(DummyComponent);
139+
expect(
140+
child(<WrappedPage pageProps={{initialProps: {fromPage: true}}} somePropFromNextJs={true} />),
141+
).toEqual(
142+
'{"props":{"pageProps":{"fromPage":true},"somePropFromNextJs":true},"state":{"reduxStatus":"init"}}',
143+
);
144+
});
137145
});
138146
test('wrapped component should not have getInitialProps if source component did not have it', () => {
139147
expect(createWrapper(makeStore).withRedux(DummyComponent).getInitialProps).toBeUndefined();

0 commit comments

Comments
 (0)