Skip to content

Commit a8ce063

Browse files
committed
fix(BlogPostTpl): typescript, reinstate reading timer
1 parent b5f180d commit a8ce063

File tree

3 files changed

+96
-86
lines changed

3 files changed

+96
-86
lines changed

gatsby-node.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ exports.createPages = async ({ graphql, actions }) => {
9494
},
9595
{
9696
src: posts,
97-
component: path.resolve("lib/ui/templates/BlogPostTpl.js"),
97+
component: path.resolve("lib/ui/templates/BlogPostTpl.tsx"),
9898
prefix: "tldr"
9999
},
100100
{

lib/ui/templates/BlogPostTpl.js

Lines changed: 0 additions & 85 deletions
This file was deleted.

lib/ui/templates/BlogPostTpl.tsx

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import React, { useEffect, useState } from "react";
2+
import { graphql, type PageProps } from "gatsby";
3+
import { GatsbyImage } from "gatsby-plugin-image";
4+
5+
import { Body, Header, Helmet, Layout } from "ui/partials";
6+
import { Copy, Tile } from "ui/components";
7+
8+
const BlogPostReadTimer = () => {
9+
const [readingTime, setReadingTime] = useState<number>(Math.random() * 300);
10+
11+
function tick() {
12+
setReadingTime((previous) => previous + Math.random() * 15 - 4);
13+
}
14+
15+
useEffect(() => {
16+
let timer: number;
17+
if (typeof window !== "undefined") {
18+
timer = window.setInterval(tick, 3000);
19+
}
20+
21+
return () => {
22+
if (typeof window !== "undefined") {
23+
window.clearInterval(timer);
24+
}
25+
};
26+
}, []);
27+
28+
return <span>{readingTime.toFixed(2)}</span>;
29+
};
30+
31+
const BlogPostTpl = ({
32+
data,
33+
...props
34+
}: PageProps<Queries.BlogPostsByUIDQuery>) => {
35+
const blogPost = data.markdownRemark;
36+
const { frontmatter, html } = blogPost ?? {};
37+
const { cover, date, title } = frontmatter ?? {};
38+
39+
return (
40+
<>
41+
<Helmet {...props} title={title ?? ""} />
42+
<Layout {...props}>
43+
<Header>
44+
<span className="small">
45+
Reading Time: <BlogPostReadTimer /> seconds
46+
</span>
47+
<h1 className="hero">{title}</h1>
48+
<span className="small">{date}</span>
49+
</Header>
50+
<Body
51+
style={{
52+
marginLeft: "auto",
53+
marginRight: "auto",
54+
maxWidth: "900px",
55+
}}
56+
>
57+
{cover?.childImageSharp?.gatsbyImageData ? (
58+
<GatsbyImage
59+
image={cover.childImageSharp.gatsbyImageData}
60+
alt={title ?? ""}
61+
/>
62+
) : null}
63+
<Tile space="h">
64+
<Copy dangerouslySetInnerHTML={{ __html: html ?? "" }} />
65+
</Tile>
66+
</Body>
67+
</Layout>
68+
</>
69+
);
70+
};
71+
72+
export default BlogPostTpl;
73+
74+
export const pageQuery = graphql`
75+
query BlogPostsByUID($uid: String!) {
76+
markdownRemark(frontmatter: { uid: { eq: $uid } }) {
77+
html
78+
frontmatter {
79+
uid
80+
date(formatString: "MMMM DD, YYYY")
81+
title
82+
cover {
83+
childImageSharp {
84+
gatsbyImageData(
85+
width: 900
86+
quality: 90
87+
placeholder: DOMINANT_COLOR
88+
layout: CONSTRAINED
89+
)
90+
}
91+
}
92+
}
93+
}
94+
}
95+
`;

0 commit comments

Comments
 (0)