import { useMemo } from "react"; import { useInView } from "react-intersection-observer"; import dynamic from "next/dynamic"; import { NextSeo, ArticleJsonLd } from "next-seo"; import { escape } from "html-escaper"; import { getMDXComponent } from "mdx-bundler/client"; import Content from "../../components/Content"; import Meta from "../../components/notes/Meta"; import Loading from "../../components/loading/Loading"; import CustomCode from "../../components/code-block/Code"; import { getNote, getNoteSlugs } from "../../lib/parse-notes"; import * as config from "../../lib/config"; import type { GetStaticProps, GetStaticPaths } from "next"; import type { NoteType } from "../../types"; const Note = ({ frontMatter, mdxSource }: NoteType) => { const MDXComponent = useMemo(() => getMDXComponent(mdxSource, { process }), [mdxSource]); const [commentsRef, commentsInView] = useInView({ rootMargin: "100px", // start loading comments script 100px from end of content triggerOnce: true, // don't unload one it's loaded (if user scrolls back up) fallbackInView: true, }); const Comments = dynamic(() => import("../../components/notes/Comments"), { ssr: false, loading: () => (
), }); return ( <> {frontMatter.noComments !== true && (
{commentsInView && }
)} ); }; export const getStaticProps: GetStaticProps = async ({ params }) => { const { frontMatter, mdxSource } = await getNote(params.slug as string); return { props: { frontMatter, mdxSource, }, }; }; export const getStaticPaths: GetStaticPaths = async () => { const paths = getNoteSlugs().map((slug) => ({ params: { slug } })); return { paths, fallback: false, }; }; export default Note;