import { NextSeo } from "next-seo"; import LiteYouTubeEmbed from "react-lite-youtube-embed"; import { useState, useEffect } from "react"; import { YOUTUBE_REGEX } from "../lib/constants"; import siteConfig from "../config/siteConfig"; import getMDXComponents from "./_getMDXComponents"; import getObserver from "./_getIntersectionObserver" import MdxContent from "./MdxContent" // import { Paragraph } from "./Paragraph"; // import { Anchor } from "./Anchor"; // const Anchor = dynamic(() => import('./Anchor').then(module => module.Anchor), { // ssr: false // }) // const Paragraph = dynamic(() => import("./Paragraph").then(mod => mod.Paragraph)) export default function MdxPage({ body, frontMatter, editUrl }) { const [activeHeading, setActiveHeading] = useState(""); const [observer, setObserver] = useState(null); // run only after first render, in order to preserve the observer // between component rerenders useEffect((() => { const observer = getObserver((entry) => { if (entry.isIntersecting) { setActiveHeading(entry.target.id); } }); setObserver(observer); return observer.disconnect(); }), []) useEffect(() => { // on initial render activeHeading will be `null` // however, we still want to highlight the current heading in the toc // based on the current url if (!activeHeading) { try { const path = window.location.hash; if (path) { setActiveHeading(path.slice(1)) } else { const firstTocHeading = document.querySelector(".toc-link"); const href = firstTocHeading.href; setActiveHeading(href.match(/.+#(.+)/)[1]); } } finally { return } } const tocLink = document.querySelector(`.toc-link[href="#${activeHeading}"]`) tocLink.classList.add("active"); return () => { tocLink.classList.remove("active") } }, [activeHeading]) const { title, description, date, authors, youtube, podcast, image, _raw } = frontMatter let youtubeThumnbnail; const youtubeId = youtube && YOUTUBE_REGEX.test(youtube) && youtube.split(/^|=|\//).pop(); if (youtubeId && !image) { // get the youtube thumbnail image from https://img.youtube.com/vi//maxresdefault.jpg youtubeThumnbnail = youtube.replace( YOUTUBE_REGEX, `https://img.youtube.com/vi/${youtubeId}/maxresdefault.jpg` ); } const PodcastIcon = siteConfig.social.find((s) => s.name === "Podcast").icon; const titleFromUrl = _raw.flattenedPath .split("/") .pop() .replace(/-/g, " ") // capitalize first char of each word .replace(/(^\w{1})|(\s{1}\w{1})/g, (str) => str.toUpperCase()); const SeoTitle = title ?? titleFromUrl; const imageUrl = image ? siteConfig.url + image : youtubeThumnbnail ? youtubeThumnbnail : null; // enable editing content only for claims, concepts, and guide for now const editUrl = ["claims", "concepts", "guide"].includes(_raw.sourceFileDir) ? siteConfig.repoRoot + siteConfig.repoEditPath + _raw.sourceFilePath : null; return ( <> ); }