From 3ead525cf71fb4443f6e04ef526a5a5ad1f8dc66 Mon Sep 17 00:00:00 2001 From: Dustin Schau Date: Fri, 28 Sep 2018 14:17:15 -0500 Subject: [PATCH] feat: refactor index page so hot reloading works for code examples --- src/components/CodeEditor/CodeEditor.js | 43 +---------- src/components/CodeExample/CodeExample.js | 54 ++++++++++++++ src/components/CodeExample/index.js | 3 + src/pages/index.js | 90 ++++++----------------- 4 files changed, 82 insertions(+), 108 deletions(-) create mode 100644 src/components/CodeExample/CodeExample.js create mode 100644 src/components/CodeExample/index.js diff --git a/src/components/CodeEditor/CodeEditor.js b/src/components/CodeEditor/CodeEditor.js index f5ef723a..b199af5a 100644 --- a/src/components/CodeEditor/CodeEditor.js +++ b/src/components/CodeEditor/CodeEditor.js @@ -65,47 +65,8 @@ class CodeEditor extends Component { } return ( +
-
- {children && ( -
- {children} -
- )} -
)}
-
+
); } diff --git a/src/components/CodeExample/CodeExample.js b/src/components/CodeExample/CodeExample.js new file mode 100644 index 00000000..39b40fc1 --- /dev/null +++ b/src/components/CodeExample/CodeExample.js @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; +import {colors, media} from 'theme'; +import CodeEditor from '../CodeEditor/CodeEditor'; + +class CodeExample extends Component { + render() { + const {children, code, loaded} = this.props; + return ( +
+ {children && ( +
+ {children} +
+ )} + {loaded ? :

Loading code example...

} +
+ ) + } +} + +export default CodeExample; diff --git a/src/components/CodeExample/index.js b/src/components/CodeExample/index.js new file mode 100644 index 00000000..6bff868c --- /dev/null +++ b/src/components/CodeExample/index.js @@ -0,0 +1,3 @@ +import CodeExample from './CodeExample'; + +export default CodeExample; diff --git a/src/pages/index.js b/src/pages/index.js index 480d8b0a..c0bf8fc1 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -7,72 +7,37 @@ import ButtonLink from 'components/ButtonLink'; import Container from 'components/Container'; import Flex from 'components/Flex'; -import mountCodeExample from 'utils/mountCodeExample'; +import CodeExample from 'components/CodeExample'; import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {graphql} from 'gatsby'; import TitleAndMetaTags from 'components/TitleAndMetaTags'; import Layout from 'components/Layout'; +import loadScript from 'utils/loadScript'; import {colors, media, sharedStyles} from 'theme'; import createOgUrl from 'utils/createOgUrl'; -import loadScript from 'utils/loadScript'; import {babelURL} from 'site-constants'; import ReactDOM from 'react-dom'; import logoWhiteSvg from 'icons/logo-white.svg'; class Home extends Component { - constructor(props, context) { - super(props, context); - - const {data} = props; - - const code = data.code.edges.reduce((map, {node}) => { - map[node.id] = JSON.parse(node.internal.contentDigest); - - return map; - }, {}); - - const examples = data.examples.edges.map(({node}) => ({ - content: node.html, - id: node.fields.slug.replace(/^.+\//, '').replace('.html', ''), - title: node.frontmatter.title, - })); - - const marketing = data.marketing.edges.map(({node}) => ({ - title: node.frontmatter.title, - content: node.html, - })); - - this.state = { - code, - examples, - marketing, - }; - } + state = { + babelLoaded: false + }; componentDidMount() { - const {code, examples} = this.state; - - examples.forEach(({id}) => { - renderExamplePlaceholder(id); - }); - - function mountCodeExamples() { - examples.forEach(({id}) => { - mountCodeExample(id, code[id]); + loadScript(babelURL).then(() => { + this.setState({ + babelLoaded: true }); - } - - loadScript(babelURL).then(mountCodeExamples, error => { + }, error => { console.error('Babel failed to load.'); - - mountCodeExamples(); }); } - render() { - const {examples, marketing} = this.state; - const {location} = this.props; + const {babelLoaded} = this.state; + const {data, location} = this.props; + const {examples, marketing} = data; return ( @@ -217,7 +182,7 @@ class Home extends Component { whiteSpace: 'nowrap', }, }}> - {marketing.map((column, index) => ( + {marketing.edges.map(({ node: column }, index) => (
- {column.title} + {column.frontmatter.title} -
+
))}
@@ -283,7 +248,7 @@ class Home extends Component { />
- {examples.map((example, index) => ( + {examples.edges.map(({ node }, index) => (
-

{example.title}

-
-
+ +

{node.frontmatter.title}

+
+
))}
@@ -339,7 +305,6 @@ class Home extends Component { Home.propTypes = { data: PropTypes.shape({ - code: PropTypes.object.isRequired, examples: PropTypes.object.isRequired, marketing: PropTypes.object.isRequired, }).isRequired, @@ -382,22 +347,13 @@ const CtaItem = ({children, primary = false}) => ( export const pageQuery = graphql` query IndexMarkdown { - code: allExampleCode { - edges { - node { - id - internal { - contentDigest - } - } - } - } examples: allMarkdownRemark( filter: {fileAbsolutePath: {regex: "//home/examples//"}} sort: {fields: [frontmatter___order], order: ASC} ) { edges { node { + code fields { slug }