mirror of
https://github.com/meshtastic/meshtastic.git
synced 2024-12-27 14:39:54 -08:00
Merge pull request #1372 from rcarteraz/add-blog-comments
Add Comments To Blog
This commit is contained in:
commit
cfa895ca16
|
@ -19,6 +19,7 @@
|
||||||
"@docusaurus/preset-classic": "3.1.1",
|
"@docusaurus/preset-classic": "3.1.1",
|
||||||
"@docusaurus/theme-common": "3.1.1",
|
"@docusaurus/theme-common": "3.1.1",
|
||||||
"@docusaurus/theme-mermaid": "3.1.1",
|
"@docusaurus/theme-mermaid": "3.1.1",
|
||||||
|
"@giscus/react": "^3.0.0",
|
||||||
"@heroicons/react": "^2.1.1",
|
"@heroicons/react": "^2.1.1",
|
||||||
"@mdx-js/react": "^3.0.1",
|
"@mdx-js/react": "^3.0.1",
|
||||||
"@meshtastic/js": "2.2.23-0",
|
"@meshtastic/js": "2.2.23-0",
|
||||||
|
|
|
@ -23,6 +23,9 @@ dependencies:
|
||||||
'@docusaurus/theme-mermaid':
|
'@docusaurus/theme-mermaid':
|
||||||
specifier: 3.1.1
|
specifier: 3.1.1
|
||||||
version: 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)
|
version: 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)
|
||||||
|
'@giscus/react':
|
||||||
|
specifier: ^3.0.0
|
||||||
|
version: 3.0.0(react-dom@18.2.0)(react@18.2.0)
|
||||||
'@heroicons/react':
|
'@heroicons/react':
|
||||||
specifier: ^2.1.1
|
specifier: ^2.1.1
|
||||||
version: 2.1.1(react@18.2.0)
|
version: 2.1.1(react@18.2.0)
|
||||||
|
@ -1655,7 +1658,7 @@ packages:
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@buf/meshtastic_protobufs.bufbuild_es@1.7.2-20240216123215-6b07c41c68c9.1(@bufbuild/protobuf@1.7.2):
|
/@buf/meshtastic_protobufs.bufbuild_es@1.7.2-20240216123215-6b07c41c68c9.1(@bufbuild/protobuf@1.7.2):
|
||||||
resolution: {tarball: https://buf.build/gen/npm/v1/@buf/meshtastic_protobufs.bufbuild_es/-/meshtastic_protobufs.bufbuild_es-1.7.2-20240216123215-6b07c41c68c9.1.tgz}
|
resolution: {registry: https://buf.build/gen/npm/v1, tarball: https://buf.build/gen/npm/v1/@buf/meshtastic_protobufs.bufbuild_es/-/meshtastic_protobufs.bufbuild_es-1.7.2-20240216123215-6b07c41c68c9.1.tgz}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@bufbuild/protobuf': ^1.7.2
|
'@bufbuild/protobuf': ^1.7.2
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2519,6 +2522,17 @@ packages:
|
||||||
- webpack-cli
|
- webpack-cli
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@giscus/react@3.0.0(react-dom@18.2.0)(react@18.2.0):
|
||||||
|
resolution: {integrity: sha512-hgCjLpg3Wgh8VbTF5p8ZLcIHI74wvDk1VIFv12+eKhenNVUDjgwNg2B1aq/3puyHOad47u/ZSyqiMtohjy/OOA==}
|
||||||
|
peerDependencies:
|
||||||
|
react: ^16 || ^17 || ^18
|
||||||
|
react-dom: ^16 || ^17 || ^18
|
||||||
|
dependencies:
|
||||||
|
giscus: 1.5.0
|
||||||
|
react: 18.2.0
|
||||||
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@hapi/hoek@9.3.0:
|
/@hapi/hoek@9.3.0:
|
||||||
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
|
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
|
||||||
|
|
||||||
|
@ -2600,6 +2614,16 @@ packages:
|
||||||
resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==}
|
resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@lit-labs/ssr-dom-shim@1.2.1:
|
||||||
|
resolution: {integrity: sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@lit/reactive-element@2.0.4:
|
||||||
|
resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==}
|
||||||
|
dependencies:
|
||||||
|
'@lit-labs/ssr-dom-shim': 1.2.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@mdx-js/mdx@3.0.1:
|
/@mdx-js/mdx@3.0.1:
|
||||||
resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==}
|
resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -3193,6 +3217,10 @@ packages:
|
||||||
'@types/node': 20.11.19
|
'@types/node': 20.11.19
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@types/trusted-types@2.0.7:
|
||||||
|
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@types/unist@2.0.10:
|
/@types/unist@2.0.10:
|
||||||
resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
|
resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
|
||||||
|
|
||||||
|
@ -5534,6 +5562,12 @@ packages:
|
||||||
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
|
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
/giscus@1.5.0:
|
||||||
|
resolution: {integrity: sha512-t3LL0qbSO3JXq3uyQeKpF5CegstGfKX/0gI6eDe1cmnI7D56R7j52yLdzw4pdKrg3VnufwCgCM3FDz7G1Qr6lg==}
|
||||||
|
dependencies:
|
||||||
|
lit: 3.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/github-slugger@1.5.0:
|
/github-slugger@1.5.0:
|
||||||
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
|
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -6563,6 +6597,28 @@ packages:
|
||||||
/lines-and-columns@1.2.4:
|
/lines-and-columns@1.2.4:
|
||||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||||
|
|
||||||
|
/lit-element@4.1.0:
|
||||||
|
resolution: {integrity: sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==}
|
||||||
|
dependencies:
|
||||||
|
'@lit-labs/ssr-dom-shim': 1.2.1
|
||||||
|
'@lit/reactive-element': 2.0.4
|
||||||
|
lit-html: 3.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/lit-html@3.2.0:
|
||||||
|
resolution: {integrity: sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA==}
|
||||||
|
dependencies:
|
||||||
|
'@types/trusted-types': 2.0.7
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/lit@3.2.0:
|
||||||
|
resolution: {integrity: sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==}
|
||||||
|
dependencies:
|
||||||
|
'@lit/reactive-element': 2.0.4
|
||||||
|
lit-element: 4.1.0
|
||||||
|
lit-html: 3.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/loader-runner@4.3.0:
|
/loader-runner@4.3.0:
|
||||||
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
|
resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
|
||||||
engines: {node: '>=6.11.5'}
|
engines: {node: '>=6.11.5'}
|
||||||
|
|
27
src/components/GiscusComponent/index.js
Normal file
27
src/components/GiscusComponent/index.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import { useColorMode } from "@docusaurus/theme-common";
|
||||||
|
import Giscus from "@giscus/react";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export default function GiscusComponent() {
|
||||||
|
const { colorMode } = useColorMode();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Giscus
|
||||||
|
repo="meshtastic/meshtastic"
|
||||||
|
repoId="MDEwOlJlcG9zaXRvcnkzMzkzMDEyMjI="
|
||||||
|
category="Blog Post Comments"
|
||||||
|
categoryId="DIC_kwDOFDlTZs4Choq7"
|
||||||
|
mapping="pathname"
|
||||||
|
term="specific-term" //If you didn't select "Discussion title contains a specific term", omit.
|
||||||
|
strict="1"
|
||||||
|
reactionsEnabled="1"
|
||||||
|
emitMetadata="0"
|
||||||
|
inputPosition="top"
|
||||||
|
theme={colorMode}
|
||||||
|
lang="en"
|
||||||
|
loading="lazy"
|
||||||
|
crossorigin="anonymous"
|
||||||
|
async
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
37
src/theme/BlogPostPage/Metadata/index.js
Normal file
37
src/theme/BlogPostPage/Metadata/index.js
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import { PageMetadata } from "@docusaurus/theme-common";
|
||||||
|
import { useBlogPost } from "@docusaurus/theme-common/internal";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export default function BlogPostPageMetadata() {
|
||||||
|
const { assets, metadata } = useBlogPost();
|
||||||
|
const { title, description, date, tags, authors, frontMatter } = metadata;
|
||||||
|
const { keywords } = frontMatter;
|
||||||
|
const image = assets.image ?? frontMatter.image;
|
||||||
|
return (
|
||||||
|
<PageMetadata
|
||||||
|
title={title}
|
||||||
|
description={description}
|
||||||
|
keywords={keywords}
|
||||||
|
image={image}
|
||||||
|
>
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="article:published_time" content={date} />
|
||||||
|
{/* TODO double check those article meta array syntaxes, see https://ogp.me/#array */}
|
||||||
|
{authors.some((author) => author.url) && (
|
||||||
|
<meta
|
||||||
|
property="article:author"
|
||||||
|
content={authors
|
||||||
|
.map((author) => author.url)
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(",")}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{tags.length > 0 && (
|
||||||
|
<meta
|
||||||
|
property="article:tag"
|
||||||
|
content={tags.map((tag) => tag.label).join(",")}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</PageMetadata>
|
||||||
|
);
|
||||||
|
}
|
67
src/theme/BlogPostPage/index.js
Normal file
67
src/theme/BlogPostPage/index.js
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
import {
|
||||||
|
HtmlClassNameProvider,
|
||||||
|
ThemeClassNames,
|
||||||
|
} from "@docusaurus/theme-common";
|
||||||
|
import {
|
||||||
|
BlogPostProvider,
|
||||||
|
useBlogPost,
|
||||||
|
} from "@docusaurus/theme-common/internal";
|
||||||
|
import GiscusComponent from "@site/src/components/GiscusComponent";
|
||||||
|
import BlogLayout from "@theme/BlogLayout";
|
||||||
|
import BlogPostItem from "@theme/BlogPostItem";
|
||||||
|
import BlogPostPageMetadata from "@theme/BlogPostPage/Metadata";
|
||||||
|
import BlogPostPaginator from "@theme/BlogPostPaginator";
|
||||||
|
import TOC from "@theme/TOC";
|
||||||
|
import Unlisted from "@theme/Unlisted";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import React from "react";
|
||||||
|
function BlogPostPageContent({ sidebar, children }) {
|
||||||
|
const { metadata, toc } = useBlogPost();
|
||||||
|
const { nextItem, prevItem, frontMatter, unlisted } = metadata;
|
||||||
|
const {
|
||||||
|
hide_table_of_contents: hideTableOfContents,
|
||||||
|
toc_min_heading_level: tocMinHeadingLevel,
|
||||||
|
toc_max_heading_level: tocMaxHeadingLevel,
|
||||||
|
} = frontMatter;
|
||||||
|
return (
|
||||||
|
<BlogLayout
|
||||||
|
sidebar={sidebar}
|
||||||
|
toc={
|
||||||
|
!hideTableOfContents && toc.length > 0 ? (
|
||||||
|
<TOC
|
||||||
|
toc={toc}
|
||||||
|
minHeadingLevel={tocMinHeadingLevel}
|
||||||
|
maxHeadingLevel={tocMaxHeadingLevel}
|
||||||
|
/>
|
||||||
|
) : undefined
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{unlisted && <Unlisted />}
|
||||||
|
<BlogPostItem>{children}</BlogPostItem>
|
||||||
|
<GiscusComponent />
|
||||||
|
|
||||||
|
{(nextItem || prevItem) && (
|
||||||
|
<BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
|
||||||
|
)}
|
||||||
|
</BlogLayout>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function BlogPostPage(props) {
|
||||||
|
const BlogPostContent = props.content;
|
||||||
|
return (
|
||||||
|
<BlogPostProvider content={props.content} isBlogPostPage>
|
||||||
|
<HtmlClassNameProvider
|
||||||
|
className={clsx(
|
||||||
|
ThemeClassNames.wrapper.blogPages,
|
||||||
|
ThemeClassNames.page.blogPostPage,
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<BlogPostPageMetadata />
|
||||||
|
<BlogPostPageContent sidebar={props.sidebar}>
|
||||||
|
<BlogPostContent />
|
||||||
|
</BlogPostPageContent>
|
||||||
|
</HtmlClassNameProvider>
|
||||||
|
</BlogPostProvider>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in a new issue