import { categorizeRelatedDocuments, ProcessedDocument, RelatedDocument, } from '@nx/nx-dev/models-document'; import { Breadcrumbs, Footer, GitHubStarWidget } from '@nx/nx-dev/ui-common'; import { renderMarkdown } from '@nx/nx-dev/ui-markdoc'; import { NextSeo } from 'next-seo'; import { useRouter } from 'next/router'; import { cx } from '@nx/nx-dev/ui-primitives'; import { useRef, useState } from 'react'; import { collectHeadings, TableOfContents } from './table-of-contents'; import { RelatedDocumentsSection } from './related-documents-section'; import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; import { FeedbackDialog } from '@nx/nx-dev/feature-feedback'; export function DocViewer({ document, relatedDocuments, widgetData, }: { document: ProcessedDocument; relatedDocuments: RelatedDocument[]; widgetData: { githubStarsCount: number }; }): JSX.Element { const router = useRouter(); const hideTableOfContent = router.asPath.includes('/getting-started/intro') || router.asPath.includes('/ci/intro/ci-with-nx') || router.asPath.includes('/extending-nx/intro/getting-started') || router.asPath.includes('/nx-api/devkit') || router.asPath.includes('/reference/glossary') || router.asPath.includes('/ci/reference/release-notes'); const ref = useRef(null); const { metadata, node, treeNode } = renderMarkdown( document.content.toString(), { filePath: document.filePath, headingClass: 'scroll-mt-8', } ); const vm = { title: metadata['title'] ?? document.name, description: metadata['description'] ?? document.description, mediaImage: document.mediaImage, content: node, relatedContentData: categorizeRelatedDocuments(relatedDocuments), tableOfContent: collectHeadings(treeNode), }; function getExtension(path: string): string { const splits = path.split('.'); return splits[splits.length - 1]; } const [showFeedback, setShowFeedback] = useState(false); function submitIdeaFeedback(feedback: string) { // sanitize the feedback from the user script tags/other malicious code const sanitizedFeedback = feedback.replace(/(<([^>]+)>)/gi, ''); sendCustomEvent('feedback', 'feedback', 'idea', undefined, { feedback: sanitizedFeedback, }); } return ( <>
{/*MAIN CONTENT*/}
{vm.content}
{!hideTableOfContent && ( )}
{/*RELATED CONTENT*/}
{document.filePath ? ( ) : null}
setShowFeedback(false)} onFeedbackSubmit={submitIdeaFeedback} />