Skip to content

Commit f8f6aee

Browse files
committed
refactor blog post list page
1 parent cf99e19 commit f8f6aee

File tree

4 files changed

+75
-85
lines changed

4 files changed

+75
-85
lines changed

src/components/BlogPost/index.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import Marked from "../Marked"
55
export const fragments = graphql`
66
fragment BlogPost_post on BlogPost {
77
title
8-
excerpt
98
rawContent
109
date
1110
authors
@@ -15,31 +14,27 @@ export const fragments = graphql`
1514

1615
interface Props {
1716
post: GatsbyTypes.BlogPost_postFragment,
18-
showExcerpt?: boolean,
1917
}
2018

2119
const BlogPost: React.FC<Props> = ({
2220
post,
23-
showExcerpt = false,
2421
}) => (
2522
<div className="inner-content">
2623
<h1>{post.title}</h1>
24+
2725
<p>
2826
{new Date(post.date).toLocaleDateString()} by {post.authors.join(', ')}
2927
</p>
28+
3029
<div className="tag-wrapper">
3130
{post.tags.map(tag => (
3231
<span key={tag} className="tag">
33-
<Link to={`/tags/${tag}`}>{tag}</Link>
32+
<Link to={`/tags/${tag}/`}>{tag}</Link>
3433
</span>
3534
))}
3635
</div>
3736

38-
{showExcerpt ? (
39-
<p>{post.excerpt}</p>
40-
) : (
41-
<Marked>{post.rawContent}</Marked>
42-
)}
37+
<Marked>{post.rawContent}</Marked>
4338
</div>
4439
)
4540

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import * as React from "react"
2+
import { graphql, Link } from "gatsby"
3+
4+
export const fragments = graphql`
5+
fragment BlogPostPreview_post on BlogPost {
6+
title
7+
excerpt
8+
date
9+
authors
10+
tags
11+
postPath: gatsbyPath(filePath: "/blog/{BlogPost.postId}")
12+
}
13+
`;
14+
15+
interface Props {
16+
post: GatsbyTypes.BlogPostPreview_postFragment,
17+
}
18+
19+
const BlogPostPreview: React.FC<Props> = ({
20+
post,
21+
}) => (
22+
<div className="inner-content">
23+
<h1>
24+
<Link to={post.postPath!}>{post.title}</Link>
25+
</h1>
26+
27+
<p>
28+
{new Date(post.date).toLocaleDateString()} by {post.authors.join(', ')}
29+
</p>
30+
31+
<div className="tag-wrapper">
32+
{post.tags.map(tag => (
33+
<span key={tag} className="tag">
34+
<Link to={`/tags/${tag}/`}>{tag}</Link>
35+
</span>
36+
))}
37+
</div>
38+
39+
<p>{post.excerpt}</p>
40+
</div>
41+
)
42+
43+
export default BlogPostPreview

src/components/BlogSidebar/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const BlogSidebar: React.FC = () => {
4040
<h3>Categories</h3>
4141
<ul>
4242
{tags.map(tag => {
43-
const formattedTag = tag.toUpperCase() + tag.substring(1)
43+
const formattedTag = tag[0].toUpperCase() + tag.substring(1)
4444
const pathname = `/tags/${tag}/`;
4545
return (
4646
<li key={tag}>

src/pages/blog.tsx

Lines changed: 27 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,43 @@
1-
import React from "react"
1+
import * as React from "react"
2+
import { graphql } from "gatsby"
3+
import type { PageProps } from "gatsby"
24
import Layout from "../components/Layout"
3-
import BlogPost from "../components/BlogPost"
5+
import BlogPostPreview from "../components/BlogPostPreview"
46
import BlogSidebar from "../components/BlogSidebar"
5-
import { graphql } from "gatsby"
6-
import type { PageProps } from "gatsby";
77

8-
export default ({ pageContext, data }: PageProps<GatsbyTypes.GetAllBlogPostsQuery, GatsbyTypes.SitePageContext>) => {
9-
const posts = data.allMarkdownRemark.edges
10-
.map(e => e.node)
11-
.sort((a, b) => {
12-
const aDate = new Date(a?.frontmatter?.date ?? 0)
13-
const bDate = new Date(b?.frontmatter?.date ?? 0)
14-
if (aDate > bDate) {
15-
return -1
16-
} else if (aDate < bDate) {
17-
return 1
8+
export const query = graphql`
9+
query BlogPostListPage {
10+
allBlogPost(
11+
sort: { fields: [date], order: DESC }
12+
) {
13+
nodes {
14+
id
15+
...BlogPostPreview_post
1816
}
19-
return 0
20-
})
17+
}
18+
}
19+
`
2120

21+
type Props = PageProps<GatsbyTypes.BlogPostListPageQuery, GatsbyTypes.SitePageContext>
22+
23+
const BlogPostListPage: React.FC<Props> = ({ data }) => {
2224
return (
23-
<Layout title="Blog | GraphQL" pageContext={pageContext}>
25+
<Layout title="Blog | GraphQL" pageContext={{}}>
2426
<section>
2527
<div className="documentationContent">
2628
<div>
27-
{posts.map(
28-
(
29-
{
30-
frontmatter: {
31-
title,
32-
date,
33-
permalink,
34-
byline,
35-
guestBio,
36-
tags,
37-
},
38-
rawMarkdownBody,
39-
excerpt,
40-
}: any,
41-
i
42-
) => (
43-
<BlogPost
44-
key={i}
45-
title={title}
46-
date={date}
47-
permalink={permalink}
48-
byline={byline}
49-
guestBio={guestBio}
50-
rawMarkdownBody={rawMarkdownBody}
51-
isPermalink={false}
52-
pageContext={pageContext}
53-
excerpt={excerpt}
54-
showExcerpt
55-
tags={tags}
56-
/>
57-
)
58-
)}
29+
{data.allBlogPost.nodes.map(post => (
30+
<BlogPostPreview
31+
key={post.id}
32+
post={post}
33+
/>
34+
))}
5935
</div>
60-
<BlogSidebar posts={posts} />
36+
<BlogSidebar />
6137
</div>
6238
</section>
6339
</Layout>
6440
)
6541
}
6642

67-
export const query = graphql`
68-
query GetAllBlogPosts {
69-
allMarkdownRemark(
70-
filter: { frontmatter: { permalink: { regex: "/blog/" } } }
71-
) {
72-
edges {
73-
node {
74-
frontmatter {
75-
title
76-
date
77-
permalink
78-
byline
79-
guestBio
80-
sublinks
81-
layout
82-
tags
83-
}
84-
id
85-
excerpt
86-
rawMarkdownBody
87-
}
88-
}
89-
}
90-
}
91-
`
43+
export default BlogPostListPage

0 commit comments

Comments
 (0)