Skip to content

Commit

Permalink
Blog post, previews, all blog posts
Browse files Browse the repository at this point in the history
  • Loading branch information
UnsignedArduino committed Mar 16, 2024
1 parent bf5cd58 commit f0498cc
Show file tree
Hide file tree
Showing 10 changed files with 316 additions and 56 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Awesome Arcade's First Blog!
author: content/authors/UnsignedArduino.md
description: "Last time I started a blog, I forgot about it after two posts. Hopefully that doesn't happen this time! \U0001F92A\n"
description: "*The last time I started a blog, I forgot about it after two posts. Hopefully, that doesn't happen this time! \U0001F92A*\n"
tags:
- Experiences
- Tips and tricks
Expand All @@ -10,9 +10,11 @@ tags:
- Games
- First blog post
- First blog
datePosted: 2024-03-15T04:00:00.000Z
datePosted: 2024-03-16T19:53:00.000Z
---

Hey, welcome to Awesome Arcade's first blog post!
Hey, welcome to Awesome Arcade's developer blog!

In this blog, I will be writing about all things related to MakeCode Arcade, including games, extensions, tools, tips and tricks, and experiences developing in MakeCode Arcade.

I promise the next blog post will have more content than this!
43 changes: 43 additions & 0 deletions src/components/Blog/Elements.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { TinaMarkdown } from "tinacms/dist/rich-text";
import React from "react";
import { Authors } from "../../../tina/__generated__/types";

const PageSection = (props: any) => {
return (
<>
<h2>{props.heading}</h2>
<p>{props.content}</p>
</>
);
};

const components = {
PageSection,
};

export function RichTextSectionRenderer({ content }: { content: any }) {
return <TinaMarkdown components={components} content={content} />;
}

export function AuthorRenderer({
author,
}: {
author: Authors;
}): React.ReactNode {
return (
<>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={author.avatarURL as string | undefined}
alt={`Profile picture of ${author.name}`}
style={{
width: "1em",
height: "1em",
objectFit: "contain",
borderRadius: "50%",
}}
/>{" "}
{author.name}
</>
);
}
41 changes: 41 additions & 0 deletions src/components/Blog/Post.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import React from "react";
import { formatDateAndTime } from "@/scripts/Utils/DateAndTime/Format";
import { Authors, PostQuery } from "../../../tina/__generated__/types";
import {
AuthorRenderer,
RichTextSectionRenderer,
} from "@/components/Blog/Elements";

export default function BlogPost({
data,
}: {
data: PostQuery;
}): React.ReactNode {
return (
<>
<h1>{data.post.title}</h1>
<p>
<AuthorRenderer author={data.post.author as Authors} />
<br />
{data.post.datePosted != null ? (
<>Posted on {formatDateAndTime(new Date(data.post.datePosted))}.</>
) : null}
</p>
<small>
<RichTextSectionRenderer content={data.post.description} />
</small>
<RichTextSectionRenderer content={data.post.body} />
<small>
<p>
{(data.post.tags?.length ?? 0) > 0 ? (
<>
Tags: <i>{(data.post.tags ?? []).join(", ")}</i>
</>
) : (
<i>No tags on this blog post.</i>
)}
</p>
</small>
</>
);
}
48 changes: 48 additions & 0 deletions src/components/Blog/Preview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Authors } from "../../../tina/__generated__/types";
import React from "react";
import {
AuthorRenderer,
RichTextSectionRenderer,
} from "@/components/Blog/Elements";
import { formatDateAndTime } from "@/scripts/Utils/DateAndTime/Format";
import Link from "next/link";

export type BlogPostPreview = {
title: string;
author: Authors;
description: string;
postedDate: string | null;
link: string;
};

export default function BlogPostPreviewRenderer({
preview,
}: {
preview: BlogPostPreview;
}): React.ReactNode {
return (
<>
<div className="card mb-2">
<div className="card-body">
<h5 className="card-title">{preview.title}</h5>
<h6 className="card-subtitle mb-2 text-body-secondary">
{preview.postedDate !== null ? (
<>
Posted by <AuthorRenderer author={preview.author} /> on{" "}
{formatDateAndTime(new Date(preview.postedDate))}.
</>
) : (
<AuthorRenderer author={preview.author} />
)}
</h6>
<div className="card-text">
<RichTextSectionRenderer content={preview.description} />
</div>
<Link href={preview.link} className="card-link">
View post
</Link>
</div>
</div>
</>
);
}
1 change: 1 addition & 0 deletions src/components/Navbar/navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const NavbarPages = {
Home: "/",
Extensions: "/extensions",
Tools: "/tools",
Blog: "/blog",
Help: "/help",
GitHub:
"https://github.com/UnsignedArduino/Awesome-Arcade-Extensions-Website",
Expand Down
55 changes: 2 additions & 53 deletions src/pages/blog/[filename].tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { useTina } from "tinacms/dist/react";
import { TinaMarkdown } from "tinacms/dist/rich-text";
import client from "../../../tina/__generated__/client";
import getAppProps, { AppProps } from "@/components/WithAppProps";
import { GetStaticPathsResult } from "next";
import Layout from "@/components/Layout";
import { PostQuery } from "../../../tina/__generated__/types";
import React from "react";
import { formatDateLong } from "@/scripts/Utils/DateAndTime/Format";
import { createBreadCrumbSegment } from "@/components/Layout/layout";
import BlogPost from "@/components/Blog/Post";

type BlogProps = {
variables: { relativePath: string };
Expand Down Expand Up @@ -41,40 +40,7 @@ export default function BlogPage(props: BlogProps) {
]}
>
{/*<code>{JSON.stringify(data, null, 2)}</code>*/}
<h1>{data.post.title}</h1>
<p>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={data.post.author.avatarURL as string | undefined}
alt={`Profile picture of ${data.post.author.name}`}
style={{
width: "1em",
height: "1em",
objectFit: "contain",
borderRadius: "50%",
}}
/>{" "}
{data.post.author.name}
<br />
{data.post.datePosted != null ? (
<>Posted on {formatDateLong(new Date(data.post.datePosted))}.</>
) : null}
</p>
<small>
<ContentSection content={data.post.description} />
</small>
<ContentSection content={data.post.body} />
<small>
<p>
{(data.post.tags?.length ?? 0) > 0 ? (
<>
Tags: <i>{(data.post.tags ?? []).join(", ")}</i>
</>
) : (
<i>No tags on this blog post.</i>
)}
</p>
</small>
<BlogPost data={data} />
</Layout>
);
}
Expand Down Expand Up @@ -116,20 +82,3 @@ export async function getStaticPaths(): Promise<
fallback: false,
};
}

const PageSection = (props: any) => {
return (
<>
<h2>{props.heading}</h2>
<p>{props.content}</p>
</>
);
};

const components = {
PageSection,
};

const ContentSection = ({ content }: { content: any }) => {
return <TinaMarkdown components={components} content={content} />;
};
83 changes: 83 additions & 0 deletions src/pages/blog/all.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import client from "../../../tina/__generated__/client";
import getAppProps, { AppProps } from "@/components/WithAppProps";
import Layout from "@/components/Layout";
import { Authors } from "../../../tina/__generated__/types";
import React from "react";
import BlogPostPreviewRenderer, {
BlogPostPreview,
} from "@/components/Blog/Preview";
import { createBreadCrumbSegment } from "@/components/Layout/layout";

type BlogProps = {
blogPostPreviews: BlogPostPreview[];
appProps: AppProps;
};

const pageName = `All blog posts | Blog`;

export default function AllBlogPosts(props: BlogProps) {
return (
<Layout
title={pageName}
currentPage={pageName}
appProps={props.appProps}
description="All of Awesome Arcade's blog posts!"
keywords="Game development, Awesome, Modules, Libraries, Extensions, Tools, Curated, Arcade, Useful, Curated list, MakeCode, Awesome extensions, Useful extensions, MakeCode Arcade, MakeCode Arcade Extensions, Arcade Extensions, Awesome tools, Useful tools, MakeCode Arcade, MakeCode Arcade tools, Arcade tools, Blog, Awesome Arcade blog, Blog post, Awesome Arcade blog post, All blog posts, All Awesome Arcade blog posts"
breadCrumbs={[
createBreadCrumbSegment("Blog", "/blog"),
createBreadCrumbSegment("All blog posts", "/blog/all"),
]}
>
<h1>All blog posts</h1>
<p>Here is a list of all blog posts on Awesome Arcade. Enjoy reading!</p>
{
<>
{props.blogPostPreviews.map((preview) => {
return (
<BlogPostPreviewRenderer preview={preview} key={preview.title} />
);
})}
</>
}
</Layout>
);
}

export async function getStaticProps(): Promise<{
props: BlogProps;
}> {
const postsListData = await client.queries.postConnection();

const previews: BlogPostPreview[] = [];

for (const edge of postsListData.data.postConnection.edges ?? []) {
if (!edge || !edge.node) {
continue;
}
const post = edge.node;
previews.push({
title: post.title,
author: post.author as Authors,
description: post.description ?? "",
postedDate: post.datePosted == null ? null : post.datePosted,
link: `/blog/${post._sys.filename}`,
});
}

previews.sort((a, b) => {
if (a.postedDate === null) {
return 1;
}
if (b.postedDate === null) {
return -1;
}
return new Date(b.postedDate).getTime() - new Date(a.postedDate).getTime();
});

return {
props: {
blogPostPreviews: previews,
appProps: await getAppProps(),
},
};
}
Loading

0 comments on commit f0498cc

Please sign in to comment.