diff --git a/gatsby-browser.js b/gatsby-browser.js
index 913da8da604..a6d4cffe455 100644
--- a/gatsby-browser.js
+++ b/gatsby-browser.js
@@ -8,7 +8,6 @@
const React = require('react');
const ReactDOM = require('react-dom');
-const {BannerContextManager} = require('components/Banner');
// Import global styles
require('normalize.css');
@@ -23,7 +22,3 @@ window.ReactDOM = ReactDOM;
// A stub function is needed because gatsby won't load this file otherwise
// (https://github.com/gatsbyjs/gatsby/issues/6759)
exports.onClientEntry = () => {};
-
-exports.wrapRootElement = ({element}) => (
- {element}
-);
diff --git a/src/components/Banner/Banner.js b/src/components/Banner/Banner.js
index 1c8c8190ead..9c7b2ed68a0 100644
--- a/src/components/Banner/Banner.js
+++ b/src/components/Banner/Banner.js
@@ -6,28 +6,184 @@
*/
// $FlowFixMe Update Flow
-import React, {useContext} from 'react';
-import BannerContext from './BannerContext';
-import {media} from 'theme';
+import React from 'react';
+import {colors, fonts, media} from 'theme';
+import ExternalLinkSvg from 'templates/components/ExternalLinkSvg';
+
+const linkProps = {
+ href: 'https://www.surveymonkey.co.uk/r/673TZ7T',
+ target: '_blank',
+ rel: 'noopener',
+};
export default function Banner() {
- const {banner, dismiss} = useContext(BannerContext);
- if (banner === null) {
- return null;
- }
return (
- {banner.content(dismiss)}
+
);
}
diff --git a/src/components/Banner/BannerContext.js b/src/components/Banner/BannerContext.js
deleted file mode 100644
index daa4a2c7cc8..00000000000
--- a/src/components/Banner/BannerContext.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * @emails react-core
- * @flow
- */
-
-import React from 'react';
-
-// $FlowFixMe Update Flow
-export default React.createContext({
- banner: null,
- dismiss() {},
-});
diff --git a/src/components/Banner/BannerContextManager.js b/src/components/Banner/BannerContextManager.js
deleted file mode 100644
index 962a23cc9a7..00000000000
--- a/src/components/Banner/BannerContextManager.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * @emails react-core
- * @flow
- */
-
-// $FlowFixMe Update Flow
-import React, {useState, useLayoutEffect} from 'react';
-import BannerContext from './BannerContext';
-
-let activeBanner = null;
-let snoozeStartDate = null;
-const today = new Date();
-
-function addTimes(date, days) {
- const time = new Date(date);
- time.setDate(time.getDate() + days);
- return time;
-}
-
-// Example usage:
-// activeBanner = {
-// storageId: 'react_banner_XX',
-// normalHeight: 60,
-// smallHeight: 80,
-// campaignStartDate: '2020-09-20Z', // the Z is for UTC
-// campaignEndDate: '2020-10-31Z', // the Z is for UTC
-// snoozeForDays: 7,
-// content: dismiss => (
-//
-// ),
-// };
-
-if (activeBanner) {
- try {
- if (localStorage[activeBanner.storageId]) {
- snoozeStartDate = new Date(
- parseInt(localStorage.getItem(activeBanner.storageId), 10),
- );
- }
- } catch (err) {
- // Ignore.
- }
-
- try {
- // If it's too early or long past the campaign, don't show the banner:
- if (
- today < new Date(activeBanner.campaignStartDate) ||
- today > new Date(activeBanner.campaignEndDate)
- ) {
- activeBanner = null;
- // If we're in the campaign window, but the snooze has been set and it hasn't expired:
- } else if (
- snoozeStartDate &&
- addTimes(snoozeStartDate, activeBanner.snoozeForDays) >= today
- ) {
- activeBanner = null;
- }
- } catch (err) {
- // Ignore.
- }
-}
-
-type Props = {
- children: mixed,
-};
-
-export default function BannerContextManager({children}: Props) {
- const [bannerContext, setBannerContext] = useState({
- banner: null,
- dismiss() {},
- });
-
- // Apply after hydration.
- useLayoutEffect(() => {
- if (activeBanner) {
- let banner = activeBanner;
- setBannerContext({
- banner,
- dismiss: () => {
- try {
- localStorage.setItem(banner.storageId, Date.now().toString());
- } catch (err) {
- // Ignore.
- }
- // Don't show for next navigations within the session.
- activeBanner = null;
- // Hide immediately.
- setBannerContext({
- banner: null,
- dismiss() {},
- });
- },
- });
- }
- }, []);
-
- return (
-
- {children}
-
- );
-}
diff --git a/src/components/Banner/index.js b/src/components/Banner/index.js
index 2371d99a1e3..3e286dd7418 100644
--- a/src/components/Banner/index.js
+++ b/src/components/Banner/index.js
@@ -5,8 +5,5 @@
*/
import Banner from './Banner';
-import BannerContext from './BannerContext';
-import BannerContextManager from './BannerContextManager';
export default Banner;
-export {BannerContext, BannerContextManager};
diff --git a/src/components/LayoutHeader/Header.js b/src/components/LayoutHeader/Header.js
index 7dfb93449a1..82fa2c888be 100644
--- a/src/components/LayoutHeader/Header.js
+++ b/src/components/LayoutHeader/Header.js
@@ -20,6 +20,15 @@ import navHeader from '../../../content/headerNav.yml';
import logoSvg from 'icons/logo.svg';
+const ContainerWrapper = ({children}) => (
+
+ {children}
+
+);
+
const Header = ({location}: {location: Location}) => (
(
display: 'none',
},
}}>
+
+
+
+
+
+
+
(
-
-
-
);
diff --git a/src/components/MarkdownHeader/MarkdownHeader.js b/src/components/MarkdownHeader/MarkdownHeader.js
index 38ba716fca3..0ddc20cc8f8 100644
--- a/src/components/MarkdownHeader/MarkdownHeader.js
+++ b/src/components/MarkdownHeader/MarkdownHeader.js
@@ -7,31 +7,29 @@
import Flex from 'components/Flex';
// $FlowFixMe Update Flow
-import React, {useContext} from 'react';
-import {BannerContext} from 'components/Banner';
+import React from 'react';
import {colors, fonts, media} from 'theme';
const MarkdownHeader = ({title}: {title: string}) => {
- const {banner} = useContext(BannerContext);
return (
{title}
diff --git a/src/components/MarkdownPage/MarkdownPage.js b/src/components/MarkdownPage/MarkdownPage.js
index daae170f529..ab1f3af3aa0 100644
--- a/src/components/MarkdownPage/MarkdownPage.js
+++ b/src/components/MarkdownPage/MarkdownPage.js
@@ -10,8 +10,7 @@ import Flex from 'components/Flex';
import MarkdownHeader from 'components/MarkdownHeader';
import NavigationFooter from 'templates/components/NavigationFooter';
// $FlowFixMe Update Flow
-import React, {useContext} from 'react';
-import {BannerContext} from 'components/Banner';
+import React from 'react';
import StickyResponsiveSidebar from 'components/StickyResponsiveSidebar';
import TitleAndMetaTags from 'components/TitleAndMetaTags';
import FeedbackForm from 'components/FeedbackForm';
@@ -19,7 +18,7 @@ import findSectionForPath from 'utils/findSectionForPath';
import toCommaSeparatedList from 'utils/toCommaSeparatedList';
import {sharedStyles} from 'theme';
import createCanonicalUrl from 'utils/createCanonicalUrl';
-import {colors} from 'theme';
+import {colors, media} from 'theme';
import type {Node} from 'types';
@@ -58,7 +57,6 @@ const MarkdownPage = ({
sectionList,
titlePostfix = '',
}: Props) => {
- const {banner} = useContext(BannerContext);
const hasAuthors = authors.length > 0;
const titlePrefix = markdownRemark.frontmatter.title || '';
@@ -77,7 +75,10 @@ const MarkdownPage = ({
position: 'relative',
zIndex: 0,
'& h1, & h2, & h3, & h4, & h5, & h6': {
- scrollMarginTop: banner ? banner.normalHeight : 0,
+ scrollMarginTop: 'var(--banner-height-normal)',
+ [media.lessThan('small')]: {
+ scrollMarginTop: 'var(--banner-height-small)',
+ },
},
}}>
{
- static contextType = BannerContext;
-
constructor(props: Props) {
super(props);
@@ -45,9 +42,8 @@ class StickyResponsiveSidebar extends Component {
render() {
const {open} = this.state;
- const {banner} = this.context;
const smallScreenSidebarStyles = {
- top: banner ? banner.smallHeight : 0,
+ top: 'var(--banner-height-small)',
left: 0,
bottom: 0,
right: 0,
@@ -121,18 +117,18 @@ class StickyResponsiveSidebar extends Component {
transition: 'transform 0.5s ease',
}}
css={{
- marginTop: 60 + (banner ? banner.normalHeight : 0),
+ marginTop: 'calc(60px + var(--banner-height-normal))',
[media.size('xsmall')]: {
marginTop: 40,
},
[media.between('small', 'medium')]: {
- marginTop: 20 + (banner ? banner.normalHeight : 0),
+ marginTop: 'calc(20px + var(--banner-height-normal))',
},
[media.between('medium', 'large')]: {
- marginTop: 50 + (banner ? banner.normalHeight : 0),
+ marginTop: 'calc(50px + var(--banner-height-normal))',
},
[media.greaterThan('small')]: {
diff --git a/src/html.js b/src/html.js
index 9683e820904..7e7834d69e8 100644
--- a/src/html.js
+++ b/src/html.js
@@ -41,6 +41,94 @@ export default class HTML extends React.Component {
{this.props.headComponents}
+