Skip to content

Commit 2ac1631

Browse files
authored
fix(feedback): Add FeedbackWidget to SSR (#7870)
* fix(feedback): Add `FeedbackWidget` to SSR Follow-up to #7761 -- fixes hydration warnings/errors due to mismatched component tree.
1 parent 6e18e96 commit 2ac1631

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

gatsby-browser.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import React from 'react';
22
import {GatsbyBrowser} from 'gatsby';
33

4-
import {FeedbackWidget} from 'sentry-docs/components/feedback/feedbackWidget';
4+
import {FeedbackWidgetLoader} from 'sentry-docs/components/feedback/feedbackWidgetLoader';
55
import PageContext from 'sentry-docs/components/pageContext';
66

77
export const wrapPageElement: GatsbyBrowser['wrapPageElement'] = ({
88
element,
99
props: {pageContext},
1010
}) => <PageContext.Provider value={pageContext}>
11-
<FeedbackWidget />
11+
<FeedbackWidgetLoader />
1212
{element}
1313
</PageContext.Provider>
1414

gatsby-ssr.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import React from 'react';
55
import {GatsbySSR} from 'gatsby';
66

7+
import {FeedbackWidgetLoader} from 'sentry-docs/components/feedback/feedbackWidgetLoader';
78
import {PageContext} from 'sentry-docs/components/pageContext';
89

910
const sentryEnvironment = process.env.GATSBY_ENV || process.env.NODE_ENV || 'development';
@@ -12,7 +13,12 @@ const sentryLoaderUrl = process.env.SENTRY_LOADER_URL;
1213
export const wrapPageElement: GatsbySSR['wrapPageElement'] = ({
1314
element,
1415
props: {pageContext},
15-
}) => <PageContext.Provider value={pageContext}>{element}</PageContext.Provider>;
16+
}) => (
17+
<PageContext.Provider value={pageContext}>
18+
<FeedbackWidgetLoader />
19+
{element}
20+
</PageContext.Provider>
21+
);
1622

1723
export const onPreRenderHTML: GatsbySSR['onPreRenderHTML'] = ({getHeadComponents}) => {
1824
if (process.env.NODE_ENV !== 'production') {

src/components/feedback/feedbackWidget.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ async function sendFeedback(
2626
return response;
2727
}
2828

29-
export function FeedbackWidget() {
29+
export default function FeedbackWidget() {
3030
const [open, setOpen] = useState(false);
3131
const [showSuccessMessage, setShowSuccessMessage] = useState(false);
3232

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React, {lazy} from 'react';
2+
3+
const FeedbackWidget = lazy(() => import('./feedbackWidget'));
4+
5+
/**
6+
* Only render FeedbackWidget on client as it needs access to `window`
7+
*/
8+
export function FeedbackWidgetLoader() {
9+
const isSSR = typeof window === 'undefined';
10+
11+
return (
12+
<React.Fragment>
13+
{!isSSR && (
14+
<React.Suspense fallback={<div />}>
15+
<FeedbackWidget />
16+
</React.Suspense>
17+
)}
18+
</React.Fragment>
19+
);
20+
}

0 commit comments

Comments
 (0)