Upgrade to Gatsby v2

This commit is contained in:
alxshelepenok
2018-11-09 20:08:48 +03:00
parent e83dfc6dff
commit 8b92891329
204 changed files with 18708 additions and 3904 deletions

View File

@@ -0,0 +1,50 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`CategoriesListTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<h1
className="page__title"
>
Categories
</h1>
<div
className="page__body"
>
<ul>
<li>
<Link
to="/categories/test-0/"
>
test_0
(
1
)
</Link>
</li>
<li>
<Link
to="/categories/test-1/"
>
test_1
(
2
)
</Link>
</li>
</ul>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,128 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`CategoryTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<h1
className="page__title"
>
test
</h1>
<div
className="page__body"
>
<div
className="feed"
>
<div
className="feed__item"
>
<div
className="feed__item-meta"
>
<time
className="feed__item-meta-time"
dateTime="September 2, 2016"
>
September 2016
</time>
<span
className="feed__item-meta-divider"
/>
<span
className="feed__item-meta-category"
>
<Link
className="feed__item-meta-category-link"
to="/test"
>
test
</Link>
</span>
</div>
<h2
className="feed__item-title"
>
<Link
className="feed__item-title-link"
to="/test_0"
>
test_0
</Link>
</h2>
<p
className="feed__item-description"
>
test_0
</p>
<Link
className="feed__item-readmore"
to="/test_0"
>
Read
</Link>
</div>
<div
className="feed__item"
>
<div
className="feed__item-meta"
>
<time
className="feed__item-meta-time"
dateTime="September 2, 2016"
>
September 2016
</time>
<span
className="feed__item-meta-divider"
/>
<span
className="feed__item-meta-category"
>
<Link
className="feed__item-meta-category-link"
to="/test"
>
test
</Link>
</span>
</div>
<h2
className="feed__item-title"
>
<Link
className="feed__item-title-link"
to="/test_1"
>
test_1
</Link>
</h2>
<p
className="feed__item-description"
>
test_1
</p>
<Link
className="feed__item-readmore"
to="/test_1"
>
Read
</Link>
</div>
</div>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,123 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`IndexTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<div
className="page__body"
>
<div
className="feed"
>
<div
className="feed__item"
>
<div
className="feed__item-meta"
>
<time
className="feed__item-meta-time"
dateTime="September 2, 2016"
>
September 2016
</time>
<span
className="feed__item-meta-divider"
/>
<span
className="feed__item-meta-category"
>
<Link
className="feed__item-meta-category-link"
to="/test_0"
>
test_0
</Link>
</span>
</div>
<h2
className="feed__item-title"
>
<Link
className="feed__item-title-link"
to="/test_0"
>
test_0
</Link>
</h2>
<p
className="feed__item-description"
>
test_0
</p>
<Link
className="feed__item-readmore"
to="/test_0"
>
Read
</Link>
</div>
<div
className="feed__item"
>
<div
className="feed__item-meta"
>
<time
className="feed__item-meta-time"
dateTime="September 2, 2016"
>
September 2016
</time>
<span
className="feed__item-meta-divider"
/>
<span
className="feed__item-meta-category"
>
<Link
className="feed__item-meta-category-link"
to="/test_1"
>
test_1
</Link>
</span>
</div>
<h2
className="feed__item-title"
>
<Link
className="feed__item-title-link"
to="/test_1"
>
test_1
</Link>
</h2>
<p
className="feed__item-description"
>
test_1
</p>
<Link
className="feed__item-readmore"
to="/test_1"
>
Read
</Link>
</div>
</div>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,31 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`NotFoundTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<h1
className="page__title"
>
NOT FOUND
</h1>
<div
className="page__body"
>
<p>
You just hit a route that doesn't exist... the sadness.
</p>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,35 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`PageTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<h1
className="page__title"
>
test
</h1>
<div
className="page__body"
>
<div
dangerouslySetInnerHTML={
Object {
"__html": "<p>test</p>",
}
}
/>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,91 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`PostTemplate renders correctly 1`] = `
<div
className="layout"
>
<div
className="post"
>
<Link
className="post__home-button"
to="/"
>
All Articles
</Link>
<div
className="post__content"
>
<div
className="content"
>
<h1
className="content__title"
>
test
</h1>
<div
className="content__body"
dangerouslySetInnerHTML={
Object {
"__html": "<p>test</p>",
}
}
/>
</div>
</div>
<div
className="post__footer"
>
<div
className="meta"
>
<p
className="meta__date"
>
Published
2 Sep 2016
</p>
</div>
<div
className="tags"
>
<ul
className="tags__list"
>
<li
className="tags__list-item"
>
<Link
className="tags__list-item-link"
to="/test_0"
>
test_0
</Link>
</li>
<li
className="tags__list-item"
>
<Link
className="tags__list-item-link"
to="/test_1"
>
test_1
</Link>
</li>
</ul>
</div>
<StaticQuery
render={[Function]}
/>
</div>
<div
className="post__comments"
>
<StaticQuery
render={[Function]}
/>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,128 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`TagTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<h1
className="page__title"
>
test
</h1>
<div
className="page__body"
>
<div
className="feed"
>
<div
className="feed__item"
>
<div
className="feed__item-meta"
>
<time
className="feed__item-meta-time"
dateTime="September 2, 2016"
>
September 2016
</time>
<span
className="feed__item-meta-divider"
/>
<span
className="feed__item-meta-category"
>
<Link
className="feed__item-meta-category-link"
to="/test"
>
test
</Link>
</span>
</div>
<h2
className="feed__item-title"
>
<Link
className="feed__item-title-link"
to="/test_0"
>
test_0
</Link>
</h2>
<p
className="feed__item-description"
>
test_0
</p>
<Link
className="feed__item-readmore"
to="/test_0"
>
Read
</Link>
</div>
<div
className="feed__item"
>
<div
className="feed__item-meta"
>
<time
className="feed__item-meta-time"
dateTime="September 2, 2016"
>
September 2016
</time>
<span
className="feed__item-meta-divider"
/>
<span
className="feed__item-meta-category"
>
<Link
className="feed__item-meta-category-link"
to="/test"
>
test
</Link>
</span>
</div>
<h2
className="feed__item-title"
>
<Link
className="feed__item-title-link"
to="/test_1"
>
test_1
</Link>
</h2>
<p
className="feed__item-description"
>
test_1
</p>
<Link
className="feed__item-readmore"
to="/test_1"
>
Read
</Link>
</div>
</div>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,50 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`TagsListTemplate renders correctly 1`] = `
<div
className="layout"
>
<StaticQuery
render={[Function]}
/>
<div
className="page"
>
<div
className="page__inner"
>
<h1
className="page__title"
>
Tags
</h1>
<div
className="page__body"
>
<ul>
<li>
<Link
to="/tags/test-0/"
>
test_0
(
1
)
</Link>
</li>
<li>
<Link
to="/tags/test-1/"
>
test_1
(
2
)
</Link>
</li>
</ul>
</div>
</div>
</div>
</div>
`;

View File

@@ -0,0 +1,53 @@
import React from 'react';
import { Link, graphql } from 'gatsby';
import kebabCase from 'lodash/kebabCase';
import Sidebar from '../components/Sidebar';
import Layout from '../components/Layout';
import Page from '../components/Page';
const CategoriesListTemplate = ({ data }) => {
const {
title,
subtitle
} = data.site.siteMetadata;
const { group } = data.allMarkdownRemark;
return (
<Layout title={`Categories - ${title}`} description={subtitle}>
<Sidebar />
<Page title="Categories">
<ul>
{group.map((category) => (
<li key={category.fieldValue}>
<Link to={`/categories/${kebabCase(category.fieldValue)}/`}>
{category.fieldValue} ({category.totalCount})
</Link>
</li>
))}
</ul>
</Page>
</Layout>
);
};
export const query = graphql`
query CategoriesListQuery {
site {
siteMetadata {
title
subtitle
}
}
allMarkdownRemark(
filter: { frontmatter: { layout: { eq: "post" }, draft: { ne: true } } }
) {
group(field: frontmatter___category) {
fieldValue
totalCount
}
}
}
`;
export default CategoriesListTemplate;

View File

@@ -0,0 +1,33 @@
import React from 'react';
import renderer from 'react-test-renderer';
import CategoriesListTemplate from './categories-list-template';
describe('CategoriesListTemplate', () => {
const props = {
data: {
allMarkdownRemark: {
group: [
{
fieldValue: 'test_0',
totalCount: 1
},
{
fieldValue: 'test_1',
totalCount: 2
}
]
},
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
}
};
it('renders correctly', () => {
const tree = renderer.create(<CategoriesListTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,64 @@
import React from 'react';
import { graphql } from 'gatsby';
import Layout from '../components/Layout';
import Sidebar from '../components/Sidebar';
import Feed from '../components/Feed';
import Page from '../components/Page';
const CategoryTemplate = ({ data, pageContext }) => {
const {
title: siteTitle,
subtitle: siteSubtitle
} = data.site.siteMetadata;
const {
category,
page
} = pageContext;
const { edges } = data.allMarkdownRemark;
const pageTitle = page > 0 ? `${category} - Page ${page} - ${siteTitle}` : `${category} - ${siteTitle}`;
return (
<Layout title={pageTitle} description={siteSubtitle}>
<Sidebar />
<Page title={category}>
<Feed edges={edges} />
</Page>
</Layout>
);
};
export const query = graphql`
query CategoryPage($category: String, $limit: Int!, $skip: Int!) {
site {
siteMetadata {
title
subtitle
}
}
allMarkdownRemark(
limit: $limit,
skip: $skip,
filter: { frontmatter: { category: { eq: $category }, layout: { eq: "post" }, draft: { ne: true } } },
sort: { order: DESC, fields: [frontmatter___date] }
){
edges {
node {
fields {
categorySlug
slug
}
frontmatter {
date
description
category
title
}
}
}
}
}
`;
export default CategoryTemplate;

View File

@@ -1,52 +0,0 @@
import React from 'react';
import Helmet from 'react-helmet';
import Sidebar from '../components/Sidebar';
import CategoryTemplateDetails from '../components/CategoryTemplateDetails';
class CategoryTemplate extends React.Component {
render() {
const title = this.props.data.site.siteMetadata.title;
const category = this.props.pathContext.category;
const posts = this.props.data.allMarkdownRemark.edges;
return (
<div>
<Helmet title={`${category} - ${title}`} />
<Sidebar siteMetadata={this.props.data.site.siteMetadata} />
<CategoryTemplateDetails category={category} posts={posts} />
</div>
);
}
}
export default CategoryTemplate;
export const pageQuery = graphql`
query CategoryPage($category: String) {
site {
siteMetadata {
...sidebarFragment
}
}
allMarkdownRemark(
limit: 1000,
filter: { frontmatter: { category: { eq: $category }, layout: { eq: "post" }, draft: { ne: true } } },
sort: { order: DESC, fields: [frontmatter___date] }
){
edges {
node {
fields {
slug
categorySlug
}
frontmatter {
title
date
category
description
}
}
}
}
}
`;

View File

@@ -0,0 +1,67 @@
import React from 'react';
import renderer from 'react-test-renderer';
import CategoryTemplate from './category-template';
describe('CategoryTemplate', () => {
const props = {
data: {
allMarkdownRemark: {
group: [
{
fieldValue: 'test_0',
totalCount: 1
},
{
fieldValue: 'test_1',
totalCount: 2
}
],
edges: [
{
node: {
fields: {
slug: '/test_0',
categorySlug: '/test'
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test_0',
category: 'test',
title: 'test_0'
}
}
},
{
node: {
fields: {
slug: '/test_1',
categorySlug: '/test'
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test_1',
category: 'test',
title: 'test_1'
}
}
}
]
},
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
},
pageContext: {
category: 'test',
page: 1
}
};
it('renders correctly', () => {
const tree = renderer.create(<CategoryTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,60 @@
import React from 'react';
import { graphql } from 'gatsby';
import Layout from '../components/Layout';
import Sidebar from '../components/Sidebar';
import Feed from '../components/Feed';
import Page from '../components/Page';
const IndexTemplate = ({ data, pageContext }) => {
const {
title: siteTitle,
subtitle: siteSubtitle
} = data.site.siteMetadata;
const { page } = pageContext;
const { edges } = data.allMarkdownRemark;
const pageTitle = page > 0 ? `Posts - Page ${page} - ${siteTitle}` : siteTitle;
return (
<Layout title={`${pageTitle}`} description={siteSubtitle}>
<Sidebar />
<Page>
<Feed edges={edges} />
</Page>
</Layout>
);
};
export const query = graphql`
query IndexTemplate($limit: Int!, $skip: Int!) {
site {
siteMetadata {
title
subtitle
}
}
allMarkdownRemark(
limit: $limit,
skip: $skip,
filter: { frontmatter: { layout: { eq: "post" }, draft: { ne: true } } },
sort: { order: DESC, fields: [frontmatter___date] }
){
edges {
node {
fields {
slug
categorySlug
}
frontmatter {
title
date
category
description
}
}
}
}
}
`;
export default IndexTemplate;

View File

@@ -0,0 +1,56 @@
import React from 'react';
import renderer from 'react-test-renderer';
import IndexTemplate from './index-template';
describe('IndexTemplate', () => {
const props = {
data: {
allMarkdownRemark: {
edges: [
{
node: {
fields: {
slug: '/test_0',
categorySlug: '/test_0'
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test_0',
category: 'test_0',
title: 'test_0'
}
}
},
{
node: {
fields: {
slug: '/test_1',
categorySlug: '/test_1'
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test_1',
category: 'test_1',
title: 'test_1'
}
}
}
]
},
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
},
pageContext: {
page: 1
}
};
it('renders correctly', () => {
const tree = renderer.create(<IndexTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,34 @@
import React from 'react';
import { graphql } from 'gatsby';
import Sidebar from '../components/Sidebar';
import Layout from '../components/Layout';
import Page from '../components/Page';
const NotFoundTemplate = ({ data }) => {
const {
title,
subtitle
} = data.site.siteMetadata;
return (
<Layout title={`Not Found - ${title}`} description={subtitle}>
<Sidebar />
<Page title="NOT FOUND">
<p>You just hit a route that doesn&#39;t exist... the sadness.</p>
</Page>
</Layout>
);
};
export const query = graphql`
query NotFoundQuery {
site {
siteMetadata {
title
subtitle
}
}
}
`;
export default NotFoundTemplate;

View File

@@ -0,0 +1,21 @@
import React from 'react';
import renderer from 'react-test-renderer';
import NotFoundTemplate from './not-found-template';
describe('NotFoundTemplate', () => {
const props = {
data: {
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
}
};
it('renders correctly', () => {
const tree = renderer.create(<NotFoundTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,52 @@
import React from 'react';
import { graphql } from 'gatsby';
import Layout from '../components/Layout';
import Sidebar from '../components/Sidebar';
import Page from '../components/Page';
const PageTemplate = ({ data }) => {
const {
title: siteTitle,
subtitle: siteSubtitle
} = data.site.siteMetadata;
const {
title: pageTitle,
description: pageDescription
} = data.markdownRemark.frontmatter;
const { html: pageBody } = data.markdownRemark;
const metaDescription = pageDescription !== null ? pageDescription : siteSubtitle;
return (
<Layout title={`${pageTitle} - ${siteTitle}`} description={metaDescription}>
<Sidebar />
<Page title={pageTitle}>
<div dangerouslySetInnerHTML={{ __html: pageBody }} />
</Page>
</Layout>
);
};
export const query = graphql`
query PageBySlug($slug: String!) {
site {
siteMetadata {
title
subtitle
}
}
markdownRemark(fields: { slug: { eq: $slug } }) {
id
html
frontmatter {
title
date
description
}
}
}
`;
export default PageTemplate;

View File

@@ -1,47 +0,0 @@
import React from 'react';
import Helmet from 'react-helmet';
import PageTemplateDetails from '../components/PageTemplateDetails';
class PageTemplate extends React.Component {
render() {
const siteMetadata = this.props.data.site.siteMetadata;
const { title, subtitle } = siteMetadata;
const page = this.props.data.markdownRemark;
const { title: pageTitle, description: pageDescription } = page.frontmatter;
const description = pageDescription !== null ? pageDescription : subtitle;
return (
<div>
<Helmet>
<title>{`${pageTitle} - ${title}`}</title>
<meta name="description" content={description} />
</Helmet>
<PageTemplateDetails
siteMetadata={siteMetadata}
page={page}
/>
</div>
);
}
}
export default PageTemplate;
export const pageQuery = graphql`
query PageBySlug($slug: String!) {
site {
siteMetadata {
...sidebarFragment
}
}
markdownRemark(fields: { slug: { eq: $slug } }) {
id
html
frontmatter {
title
date
description
}
}
}
`;

View File

@@ -0,0 +1,28 @@
import React from 'react';
import renderer from 'react-test-renderer';
import PageTemplate from './page-template';
describe('PageTemplate', () => {
const props = {
data: {
markdownRemark: {
html: '<p>test</p>',
frontmatter: {
title: 'test',
description: 'test'
}
},
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
}
};
it('renders correctly', () => {
const tree = renderer.create(<PageTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,58 @@
import React from 'react';
import { graphql } from 'gatsby';
import Layout from '../components/Layout';
import Post from '../components/Post';
const PostTemplate = ({ data }) => {
const {
title: siteTitle,
subtitle: siteSubtitle
} = data.site.siteMetadata;
const {
title: postTitle,
description: postDescription
} = data.markdownRemark.frontmatter;
const metaDescription = postDescription !== null ? postDescription : siteSubtitle;
return (
<Layout title={`${postTitle} - ${siteTitle}`} description={metaDescription}>
<Post post={data.markdownRemark} />
</Layout>
);
};
export const query = graphql`
query PostBySlug($slug: String!) {
site {
siteMetadata {
author {
name
contacts {
twitter
}
}
disqusShortname
subtitle
title
url
}
}
markdownRemark(fields: { slug: { eq: $slug } }) {
id
html
fields {
tagSlugs
}
frontmatter {
date
description
tags
title
}
}
}
`;
export default PostTemplate;

View File

@@ -1,55 +0,0 @@
import React from 'react';
import Helmet from 'react-helmet';
import PostTemplateDetails from '../components/PostTemplateDetails';
class PostTemplate extends React.Component {
render() {
const siteMetadata = this.props.data.site.siteMetadata;
const { title, subtitle } = siteMetadata;
const post = this.props.data.markdownRemark;
const { title: postTitle, description: postDescription } = post.frontmatter;
const description = postDescription !== null ? postDescription : subtitle;
return (
<div>
<Helmet>
<title>{`${postTitle} - ${title}`}</title>
<meta name="description" content={description} />
</Helmet>
<PostTemplateDetails siteMetadata={siteMetadata} post={post} />
</div>
);
}
}
export default PostTemplate;
export const pageQuery = graphql`
query PostBySlug($slug: String!) {
site {
siteMetadata {
title
subtitle
author {
name
twitter
}
disqusShortname
url
}
}
markdownRemark(fields: { slug: { eq: $slug } }) {
id
html
fields {
tagSlugs
}
frontmatter {
title
tags
date
description
}
}
}
`;

View File

@@ -0,0 +1,39 @@
import React from 'react';
import renderer from 'react-test-renderer';
import PostTemplate from './post-template';
describe('PostTemplate', () => {
const props = {
data: {
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
},
markdownRemark: {
html: '<p>test</p>',
fields: {
tagSlugs: [
'/test_0',
'/test_1'
]
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test',
title: 'test',
tags: [
'test_0',
'test_1'
]
}
}
}
};
it('renders correctly', () => {
const tree = renderer.create(<PostTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,64 @@
import React from 'react';
import { graphql } from 'gatsby';
import Layout from '../components/Layout';
import Sidebar from '../components/Sidebar';
import Feed from '../components/Feed';
import Page from '../components/Page';
const TagTemplate = ({ data, pageContext }) => {
const {
title: siteTitle,
subtitle: siteSubtitle
} = data.site.siteMetadata;
const {
page,
tag
} = pageContext;
const { edges } = data.allMarkdownRemark;
const pageTitle = page > 0 ? `All Posts tagged as "${tag}" - Page ${page} - ${siteTitle}` : `All Posts tagged as "${tag}" - ${siteTitle}`;
return (
<Layout title={pageTitle} description={siteSubtitle}>
<Sidebar />
<Page title={tag}>
<Feed edges={edges} />
</Page>
</Layout>
);
};
export const query = graphql`
query TagPage($tag: String, $limit: Int!, $skip: Int!) {
site {
siteMetadata {
title
subtitle
}
}
allMarkdownRemark(
limit: $limit,
skip: $skip,
filter: { frontmatter: { tags: { in: [$tag] }, layout: { eq: "post" }, draft: { ne: true } } },
sort: { order: DESC, fields: [frontmatter___date] }
){
edges {
node {
fields {
slug
categorySlug
}
frontmatter {
title
date
category
description
}
}
}
}
}
`;
export default TagTemplate;

View File

@@ -1,51 +0,0 @@
import React from 'react';
import Helmet from 'react-helmet';
import Sidebar from '../components/Sidebar';
import TagTemplateDetails from '../components/TagTemplateDetails';
class TagTemplate extends React.Component {
render() {
const { title } = this.props.data.site.siteMetadata;
const { tag } = this.props.pathContext;
return (
<div>
<Helmet title={`All Posts tagged as "${tag}" - ${title}`} />
<Sidebar siteMetadata={this.props.data.site.siteMetadata} />
<TagTemplateDetails posts={this.props.data.allMarkdownRemark.edges} tag={tag} />
</div>
);
}
}
export default TagTemplate;
export const pageQuery = graphql`
query TagPage($tag: String) {
site {
siteMetadata {
...sidebarFragment
}
}
allMarkdownRemark(
limit: 1000,
filter: { frontmatter: { tags: { in: [$tag] }, layout: { eq: "post" }, draft: { ne: true } } },
sort: { order: DESC, fields: [frontmatter___date] }
){
edges {
node {
fields {
slug
categorySlug
}
frontmatter {
title
date
category
description
}
}
}
}
}
`;

View File

@@ -0,0 +1,67 @@
import React from 'react';
import renderer from 'react-test-renderer';
import TagTemplate from './tag-template';
describe('TagTemplate', () => {
const props = {
data: {
allMarkdownRemark: {
group: [
{
fieldValue: 'test_0',
totalCount: 1
},
{
fieldValue: 'test_1',
totalCount: 2
}
],
edges: [
{
node: {
fields: {
slug: '/test_0',
categorySlug: '/test'
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test_0',
category: 'test',
title: 'test_0'
}
}
},
{
node: {
fields: {
slug: '/test_1',
categorySlug: '/test'
},
frontmatter: {
date: '2016-09-01T23:46:37.121Z',
description: 'test_1',
category: 'test',
title: 'test_1'
}
}
}
]
},
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
},
pageContext: {
tag: 'test',
page: 1
}
};
it('renders correctly', () => {
const tree = renderer.create(<TagTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -0,0 +1,52 @@
import React from 'react';
import { Link, graphql } from 'gatsby';
import kebabCase from 'lodash/kebabCase';
import Layout from '../components/Layout';
import Sidebar from '../components/Sidebar';
import Page from '../components/Page';
const TagsListTemplate = ({ data }) => {
const {
title,
subtitle
} = data.site.siteMetadata;
const { group } = data.allMarkdownRemark;
return (
<Layout title={`Tags - ${title}`} description={subtitle}>
<Sidebar />
<Page title="Tags">
<ul>
{group.map((tag) => (
<li key={tag.fieldValue}>
<Link to={`/tags/${kebabCase(tag.fieldValue)}/`}>
{tag.fieldValue} ({tag.totalCount})
</Link>
</li>
))}
</ul>
</Page>
</Layout>
);
};
export const query = graphql`
query TagsListQuery {
site {
siteMetadata {
title,
subtitle
}
}
allMarkdownRemark(
filter: { frontmatter: { layout: { eq: "post" }, draft: { ne: true } } }
) {
group(field: frontmatter___tags) {
fieldValue
totalCount
}
}
}
`;
export default TagsListTemplate;

View File

@@ -0,0 +1,33 @@
import React from 'react';
import renderer from 'react-test-renderer';
import TagsListTemplate from './tags-list-template';
describe('TagsListTemplate', () => {
const props = {
data: {
allMarkdownRemark: {
group: [
{
fieldValue: 'test_0',
totalCount: 1
},
{
fieldValue: 'test_1',
totalCount: 2
}
]
},
site: {
siteMetadata: {
title: 'test',
subtitle: 'test'
}
}
}
};
it('renders correctly', () => {
const tree = renderer.create(<TagsListTemplate {...props} />).toJSON();
expect(tree).toMatchSnapshot();
});
});