diff --git a/src/hooks/useApiDoc.js b/src/hooks/useApiDoc.js new file mode 100644 index 000000000..5ffbb1be2 --- /dev/null +++ b/src/hooks/useApiDoc.js @@ -0,0 +1,49 @@ +import { useMemo } from 'react'; + +const IGNORED_METHODS = [ + 'prototype', + 'length', + 'name', + 'propTypes', + 'getDerivedStateFromProps', + 'defaultProps', +]; + +const useApiDoc = (name) => { + if (typeof window === 'undefined') global.window = {}; + + return useMemo(() => { + const sdk = window.__NR1_SDK__?.default ?? {}; + const api = sdk[name]; + + if (!api) { + return null; + } + + const apiDocs = api?.__docs__; + + return { + description: apiDocs?.text, + usage: `import { ${name} } from 'nr1'`, + methods: Object.getOwnPropertyNames(api) + .filter( + (member) => + !IGNORED_METHODS.includes(member) && + typeof api[member] === 'function' + ) + .map((member) => { + const methodDocs = api[member].__docs__; + + return { + name: `${name}.${member}`, + description: methodDocs?.text, + returnValue: methodDocs?.tags.return?.[0] ?? { type: 'undefined' }, + params: methodDocs?.tags.param ?? [], + examples: methodDocs?.tags.examples ?? [], + }; + }), + }; + }, [name, window?.__NR1_SDK__]); +}; + +export default useApiDoc; diff --git a/src/markdown-pages/apis/logger.mdx b/src/markdown-pages/apis/logger.mdx index def6b5c6e..025674ced 100644 --- a/src/markdown-pages/apis/logger.mdx +++ b/src/markdown-pages/apis/logger.mdx @@ -2,6 +2,6 @@ path: '/apis/logger' title: 'PlatformStateContext' description: 'A logger component!' -component: 'logger' +api: 'logger' template: 'ApiDocTemplate' --- diff --git a/src/markdown-pages/apis/nerdlet.mdx b/src/markdown-pages/apis/nerdlet.mdx index a87056f73..90ef02c86 100644 --- a/src/markdown-pages/apis/nerdlet.mdx +++ b/src/markdown-pages/apis/nerdlet.mdx @@ -2,6 +2,6 @@ path: '/apis/nerdlet' title: 'Nerdlet' description: 'The nerdlet API' -component: 'nerdlet' +api: 'nerdlet' template: 'ApiDocTemplate' --- diff --git a/src/templates/ApiDocTemplate.js b/src/templates/ApiDocTemplate.js index 81e089e48..4f5dbd812 100644 --- a/src/templates/ApiDocTemplate.js +++ b/src/templates/ApiDocTemplate.js @@ -10,26 +10,17 @@ import FunctionDefinition from '../components/FunctionDefinition'; import Layout from '../components/Layout'; import Sidebar from '../components/Sidebar'; import SEO from '../components/Seo'; -import PropList from '../components/PropList'; import pages from '../data/sidenav.json'; import styles from './ApiDocTemplate.module.scss'; -import useComponentDoc from '../hooks/useComponentDoc'; - -const previewStyles = { - Spinner: { - height: '16px', - }, -}; +import useApiDoc from '../hooks/useApiDoc'; const ApiDocTemplate = ({ data }) => { const [isOpen, setIsOpen] = useState(false); const { mdx } = data; const { frontmatter } = mdx; - const { title, description, component } = frontmatter; - const componentDoc = useComponentDoc(component); - - const { description: componentDescription, methods = [], usage = '' } = - componentDoc ?? {}; + const { title, description, api } = frontmatter; + const { description: apiDescription, methods = [], usage = '' } = + useApiDoc(api) ?? {}; return ( @@ -42,10 +33,10 @@ const ApiDocTemplate = ({ data }) => { toggle={() => setIsOpen(!isOpen)} />
-

{component}

+

{api}

- +
@@ -96,7 +87,7 @@ export const pageQuery = graphql` path title description - component + api } } }