Skip to content

Commit

Permalink
Extract common components from Page.js and tag.js
Browse files Browse the repository at this point in the history
  • Loading branch information
smyrick committed Jun 24, 2022
1 parent 12ea4dc commit 61b34c5
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 160 deletions.
33 changes: 33 additions & 0 deletions src/components/ApolloHeader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import Header from './Header';
import MobileNav from './MobileNav';
import PropTypes from 'prop-types';
import React from 'react';
import {Box} from '@chakra-ui/react';
import {SidebarNav} from './Sidebar';

export function ApolloHeader({
algoliaFilters,
navItems,
renderSwitcher,
renderSwitcher1
}) {
return (
<Header algoliaFilters={algoliaFilters}>
<MobileNav>
<SidebarNav navItems={navItems} darkBg="gray.700">
<Box px="3" pt="1" pb="3">
{renderSwitcher}
</Box>
</SidebarNav>
</MobileNav>
{renderSwitcher1}
</Header>
);
}

ApolloHeader.propTypes = {
algoliaFilters: PropTypes.any,
navItems: PropTypes.any,
renderSwitcher: PropTypes.any,
renderSwitcher1: PropTypes.any
};
39 changes: 39 additions & 0 deletions src/components/ApolloSidebar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import PropTypes from 'prop-types';
import React from 'react';
import Sidebar, {SidebarNav} from './Sidebar';
import {Fade, IconButton, Tooltip} from '@chakra-ui/react';
import {FiChevronsRight} from 'react-icons/fi';
import {TOTAL_HEADER_HEIGHT} from './Header';

ApolloSidebar.propTypes = {
in: PropTypes.any,
onClick: PropTypes.func,
navItems: PropTypes.any,
onHide: PropTypes.func
};

export function ApolloSidebar(props) {
return (
<div>
<Fade in={props.in} unmountOnExit delay={0.25}>
<Tooltip placement="right" label="Show sidebar">
<IconButton
d={{base: 'none', md: 'flex'}}
pos="fixed"
mt="2"
left="2"
size="sm"
variant="outline"
fontSize="md"
icon={<FiChevronsRight />}
css={{top: TOTAL_HEADER_HEIGHT}}
onClick={props.onClick}
/>
</Tooltip>
</Fade>
<Sidebar isHidden={props.in}>
<SidebarNav navItems={props.navItems} onHide={props.onHide} />
</Sidebar>
</div>
);
}
61 changes: 61 additions & 0 deletions src/components/ApolloTableOfContents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import PropTypes from 'prop-types';
import React from 'react';
import TableOfContents from './TableOfContents';
import {Button, Heading, Stack, chakra} from '@chakra-ui/react';
import {FaDiscourse} from 'react-icons/fa';
import {FiStar} from 'react-icons/fi';

ApolloTableOfContents.propTypes = {
toc: PropTypes.any,
top: PropTypes.string,
paddingBottom: PropTypes.any,
title: PropTypes.any,
headings: PropTypes.any,
onClick: PropTypes.func,
editOnGitHub: PropTypes.any
};

export function ApolloTableOfContents(props) {
return (
<>
{props.toc !== false && (
// hide the table of contents on the home page
<chakra.aside
d={{base: 'none', lg: 'flex'}}
flexDirection="column"
ml={{base: 10, xl: 16}}
w={250}
flexShrink="0"
pos="sticky"
top={props.top}
maxH={`calc(100vh - ${props.top} - ${props.paddingBottom})`}
>
<Heading size="md" mb="3">
{props.title}
</Heading>
<TableOfContents headings={props.headings} />
<Stack align="flex-start" spacing="3" mt="8">
<Button
onClick={props.onClick}
variant="link"
size="lg"
leftIcon={<FiStar />}
>
Rate article
</Button>
{props.editOnGitHub}
<Button
as="a"
href="https://community.apollographql.com/"
variant="link"
size="lg"
leftIcon={<FaDiscourse />}
>
Discuss in forums
</Button>
</Stack>
</chakra.aside>
)}
</>
);
}
123 changes: 30 additions & 93 deletions src/components/Page.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,13 @@
import Blockquote from './Blockquote';
import CodeColumns from './CodeColumns';
import DocsetMenu from './DocsetMenu';
import ExpansionPanel, {
ExpansionPanelList,
ExpansionPanelListItem
} from './ExpansionPanel';
import ExpansionPanel from './ExpansionPanel';
import Footer from './Footer';
import Header, {TOTAL_HEADER_HEIGHT} from './Header';
import InlineCode from './InlineCode';
import MobileNav from './MobileNav';
import Pagination from './Pagination';
import PropTypes from 'prop-types';
import React, {Fragment, createElement, useCallback, useMemo} from 'react';
import RelativeLink, {ButtonLink, PrimaryLink} from './RelativeLink';
import Sidebar, {
SIDEBAR_WIDTH_BASE,
SIDEBAR_WIDTH_XL,
SidebarNav
} from './Sidebar';
import TableOfContents from './TableOfContents';
import RelativeLink, {PrimaryLink} from './RelativeLink';
import TypeScriptApiBox from './TypeScriptApiBox';
import VersionBanner from './VersionBanner';
import autolinkHeadings from 'rehype-autolink-headings';
Expand All @@ -30,21 +19,17 @@ import {
Box,
Button,
Divider,
Fade,
Flex,
Heading,
IconButton,
ListItem,
OrderedList,
Stack,
Table,
Tag,
Tbody,
Td,
Text,
Th,
Thead,
Tooltip,
Tr,
UnorderedList,
chakra,
Expand All @@ -56,13 +41,14 @@ import {
MultiCodeBlock,
MultiCodeBlockContext
} from '@apollo/chakra-helpers';
import {FaDiscourse, FaGithub} from 'react-icons/fa';
import {FiChevronsRight, FiStar} from 'react-icons/fi';
import {FaGithub} from 'react-icons/fa';
import {GatsbySeo} from 'gatsby-plugin-next-seo';
import {Global} from '@emotion/react';
import {MDXProvider} from '@mdx-js/react';
import {MDXRenderer} from 'gatsby-plugin-mdx';
import {PathContext, useFieldTableStyles} from '../utils';
import {SIDEBAR_WIDTH_BASE, SIDEBAR_WIDTH_XL} from './Sidebar';
import {TOTAL_HEADER_HEIGHT} from './Header';
import {YouTube} from './YouTube';
import {graphql, useStaticQuery} from 'gatsby';
import {kebabCase} from 'lodash';
Expand All @@ -84,6 +70,9 @@ import 'prismjs/components/prism-swift';
import 'prismjs/components/prism-tsx';
import 'prismjs/components/prism-typescript';
import 'prismjs/components/prism-yaml';
import {ApolloHeader} from './ApolloHeader';
import {ApolloSidebar} from './ApolloSidebar';
import {ApolloTableOfContents} from './ApolloTableOfContents';

const LIST_SPACING = 4;
const HEADINGS = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
Expand Down Expand Up @@ -164,15 +153,12 @@ const mdxComponents = {
inlineCode: InlineCode,
Button, // TODO: consider making pages import this from @chakra-ui/react
ExpansionPanel,
ExpansionPanelList,
ExpansionPanelListItem,
MultiCodeBlock,
YouTube,
CodeColumns,
TypeScriptApiBox,
TypescriptApiBox: TypeScriptApiBox,
EmbeddableExplorer,
ButtonLink
EmbeddableExplorer
};

const {processSync} = rehype()
Expand Down Expand Up @@ -318,38 +304,18 @@ export default function Page({file, pageContext, uri}) {
path: name === 'index' ? uri : dirname(uri)
}}
>
<Header algoliaFilters={algoliaFilters}>
<MobileNav>
<SidebarNav navItems={navItems} darkBg="gray.700">
<Box px="3" pt="1" pb="3">
{renderSwitcher({size: 'sm'})}
</Box>
</SidebarNav>
</MobileNav>
{renderSwitcher({d: {base: 'none', md: 'flex'}})}
</Header>
<Fade in={sidebarHidden} unmountOnExit delay={0.25}>
<Tooltip placement="right" label="Show sidebar">
<IconButton
d={{base: 'none', md: 'flex'}}
pos="fixed"
mt="2"
left="2"
size="sm"
variant="outline"
fontSize="md"
icon={<FiChevronsRight />}
css={{top: TOTAL_HEADER_HEIGHT}}
onClick={() => setSidebarHidden(false)}
/>
</Tooltip>
</Fade>
<Sidebar isHidden={sidebarHidden}>
<SidebarNav
navItems={navItems}
onHide={() => setSidebarHidden(true)}
/>
</Sidebar>
<ApolloHeader
algoliaFilters={algoliaFilters}
navItems={navItems}
renderSwitcher={renderSwitcher({size: 'sm'})}
renderSwitcher1={renderSwitcher({d: {base: 'none', md: 'flex'}})}
/>
<ApolloSidebar
in={sidebarHidden}
onClick={() => setSidebarHidden(false)}
navItems={navItems}
onHide={() => setSidebarHidden(true)}
/>
<Box
marginLeft={{
base: 0,
Expand Down Expand Up @@ -471,44 +437,15 @@ export default function Page({file, pageContext, uri}) {
</Box>
<Pagination navItems={navItems} />
</Box>
{toc !== false && (
// hide the table of contents on the home page
<chakra.aside
d={{base: 'none', lg: 'flex'}}
flexDirection="column"
ml={{base: 10, xl: 16}}
w={250}
flexShrink="0"
pos="sticky"
top={scrollMarginTop}
maxH={`calc(100vh - ${scrollMarginTop} - ${paddingBottom})`}
>
<Heading size="md" mb="3">
{title}
</Heading>
<TableOfContents headings={headings} />
<Stack align="flex-start" spacing="3" mt="8">
<Button
onClick={() => window.freddyWidget?.show()}
variant="link"
size="lg"
leftIcon={<FiStar />}
>
Rate article
</Button>
{editOnGitHub}
<Button
as="a"
href="https://community.apollographql.com/"
variant="link"
size="lg"
leftIcon={<FaDiscourse />}
>
Discuss in forums
</Button>
</Stack>
</chakra.aside>
)}
<ApolloTableOfContents
toc={toc}
top={scrollMarginTop}
paddingBottom={paddingBottom}
title={title}
headings={headings}
onClick={() => window.freddyWidget?.show()}
editOnGitHub={editOnGitHub}
/>
</Flex>
<Footer />
</Box>
Expand Down
2 changes: 1 addition & 1 deletion src/components/TechNotes/RecentNotes.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import {graphql, useStaticQuery} from 'gatsby';
import {Flex, HStack} from '@chakra-ui/react';
import {PrimaryLink} from '../RelativeLink';
import {graphql, useStaticQuery} from 'gatsby';

export default function RecentNotes() {
const {
Expand Down
22 changes: 22 additions & 0 deletions src/templates/technotes/RecentTechNote.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import PropTypes from 'prop-types';
import React from 'react';
import {HStack} from '@chakra-ui/react';
import {PrimaryLink} from '../../components/RelativeLink';

RecentTechNote.propTypes = {file: PropTypes.any};

export function RecentTechNote(props) {
return (
<HStack justifyContent={'space-between'}>
<PrimaryLink href={`../..${props.file.node.fields.slug}`}>
{props.file.node.frontmatter.title}
</PrimaryLink>
<span>
Last Updated{' '}
{new Intl.DateTimeFormat('en-US').format(
new Date(props.file.node.parent.changeTime)
)}
</span>
</HStack>
);
}
Loading

0 comments on commit 61b34c5

Please sign in to comment.