Skip to content

Commit 22aa4ee

Browse files
committed
fix: 🐛 Fixes SSR WritePage Error by using noCdnClient via context
1 parent 4d196e7 commit 22aa4ee

File tree

5 files changed

+53
-17
lines changed

5 files changed

+53
-17
lines changed

src/containers/write/MarkdownEditorContainer.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import { Helmet } from 'react-helmet-async';
4242
import { toast } from 'react-toastify';
4343
import { usePrevious } from 'react-use';
4444
import { useTheme } from '../../lib/hooks/useTheme';
45-
import { noCdnClient } from '../../lib/graphql/client';
45+
import { useUncachedApolloClient } from '../../lib/graphql/UncachedApolloContext';
4646

4747
export type MarkdownEditorContainerProps = {};
4848

@@ -60,13 +60,14 @@ const MarkdownEditorContainer: React.FC<MarkdownEditorContainerProps> = () => {
6060
initialTitle,
6161
tags,
6262
} = useSelector((state: RootState) => state.write);
63+
const uncachedClient = useUncachedApolloClient();
6364
const [writePost] = useMutation<WritePostResponse>(WRITE_POST, {
64-
client: noCdnClient,
65+
client: uncachedClient,
6566
});
6667
const [createPostHistory] =
6768
useMutation<CreatePostHistoryResponse>(CREATE_POST_HISTORY);
6869
const [editPost] = useMutation<EditPostResult>(EDIT_POST, {
69-
client: noCdnClient,
70+
client: uncachedClient,
7071
});
7172

7273
const [lastSavedData, setLastSavedData] = useState({

src/containers/write/PublishActionButtonsContainer.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { useMutation, useApolloClient } from '@apollo/react-hooks';
1616
import { setHeadingId } from '../../lib/heading';
1717
import { useHistory } from 'react-router';
1818
import { toast } from 'react-toastify';
19-
import { noCdnClient } from '../../lib/graphql/client';
19+
import { useUncachedApolloClient } from '../../lib/graphql/UncachedApolloContext';
2020

2121
type PublishActionButtonsContainerProps = {};
2222

@@ -52,11 +52,13 @@ const PublishActionButtonsContainer: React.FC<
5252
dispatch(closePublish());
5353
}, [dispatch]);
5454

55+
const uncachedClient = useUncachedApolloClient();
56+
5557
const [writePost] = useMutation<WritePostResponse>(WRITE_POST, {
56-
client: noCdnClient,
58+
client: uncachedClient,
5759
});
5860
const [editPost] = useMutation<EditPostResult>(EDIT_POST, {
59-
client: noCdnClient,
61+
client: uncachedClient,
6062
});
6163

6264
const variables = {

src/index.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import './typography.css';
99
import { createStore } from 'redux';
1010
import { Provider } from 'react-redux';
1111
import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly';
12-
import client from './lib/graphql/client';
12+
import client, { noCdnClient } from './lib/graphql/client';
1313
import rootReducer from './modules';
1414
import storage from './lib/storage';
1515
import { setUser } from './modules/core';
1616
import * as Sentry from '@sentry/browser';
1717
import { HelmetProvider } from 'react-helmet-async';
1818
import darkMode from './modules/darkMode';
19+
import { UncachedApolloProvider } from './lib/graphql/UncachedApolloContext';
1920

2021
Sentry.init({
2122
dsn: 'https://[email protected]/1886813',
@@ -66,11 +67,13 @@ if (process.env.NODE_ENV === 'production') {
6667
ReactDOM.render(
6768
<HelmetProvider>
6869
<Provider store={store}>
69-
<ApolloProvider client={client}>
70-
<BrowserRouter>
71-
<App />
72-
</BrowserRouter>
73-
</ApolloProvider>
70+
<UncachedApolloProvider client={noCdnClient}>
71+
<ApolloProvider client={client}>
72+
<BrowserRouter>
73+
<App />
74+
</BrowserRouter>
75+
</ApolloProvider>
76+
</UncachedApolloProvider>
7477
</Provider>
7578
</HelmetProvider>,
7679
document.getElementById('root'),
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { ApolloClient } from 'apollo-boost';
2+
import React, { createContext } from 'react';
3+
4+
const UncachedApolloContext = createContext<ApolloClient<any> | null>(null);
5+
export function UncachedApolloProvider({
6+
client,
7+
children,
8+
}: {
9+
client: ApolloClient<any>;
10+
children: React.ReactNode;
11+
}) {
12+
return (
13+
<UncachedApolloContext.Provider value={client}>
14+
{children}
15+
</UncachedApolloContext.Provider>
16+
);
17+
}
18+
19+
export function useUncachedApolloClient() {
20+
const value = React.useContext(UncachedApolloContext);
21+
if (value === null) {
22+
throw new Error(
23+
'useUncachedApolloClient must be used within a UncachedApolloProvider',
24+
);
25+
}
26+
return value;
27+
}

src/server/serverRender.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { ChunkExtractor, ChunkExtractorManager } from '@loadable/server';
1818
import CacheManager from './CacheManager';
1919
import { HelmetProvider, FilledContext } from 'react-helmet-async';
2020
import error from '../modules/error';
21+
import { UncachedApolloProvider } from '../lib/graphql/UncachedApolloContext';
2122

2223
const statsFile = path.resolve(__dirname, '../build/loadable-stats.json');
2324
const cacheManager = new CacheManager();
@@ -87,11 +88,13 @@ const serverRender = async ({ url, loggedIn, cookie }: SSROption) => {
8788
<HelmetProvider context={helmetContext}>
8889
<StyleSheetManager sheet={sheet.instance}>
8990
<Provider store={store}>
90-
<ApolloProvider client={client}>
91-
<StaticRouter location={url} context={context}>
92-
<App />
93-
</StaticRouter>
94-
</ApolloProvider>
91+
<UncachedApolloProvider client={client}>
92+
<ApolloProvider client={client}>
93+
<StaticRouter location={url} context={context}>
94+
<App />
95+
</StaticRouter>
96+
</ApolloProvider>
97+
</UncachedApolloProvider>
9598
</Provider>
9699
</StyleSheetManager>
97100
</HelmetProvider>

0 commit comments

Comments
 (0)