feat: add TOC to app develop doc (#10799)

This commit is contained in:
非法操作 2024-11-19 09:06:12 +08:00 committed by GitHub
parent 49e88322de
commit 22be0816aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 67 additions and 21 deletions

View File

@ -1,5 +1,7 @@
'use client' 'use client'
import { useEffect, useState } from 'react'
import { useContext } from 'use-context-selector' import { useContext } from 'use-context-selector'
import { useTranslation } from 'react-i18next'
import TemplateEn from './template/template.en.mdx' import TemplateEn from './template/template.en.mdx'
import TemplateZh from './template/template.zh.mdx' import TemplateZh from './template/template.zh.mdx'
import TemplateAdvancedChatEn from './template/template_advanced_chat.en.mdx' import TemplateAdvancedChatEn from './template/template_advanced_chat.en.mdx'
@ -17,6 +19,8 @@ type IDocProps = {
const Doc = ({ appDetail }: IDocProps) => { const Doc = ({ appDetail }: IDocProps) => {
const { locale } = useContext(I18n) const { locale } = useContext(I18n)
const { t } = useTranslation()
const [toc, setToc] = useState<Array<{ href: string; text: string }>>([])
const variables = appDetail?.model_config?.configs?.prompt_variables || [] const variables = appDetail?.model_config?.configs?.prompt_variables || []
const inputs = variables.reduce((res: any, variable: any) => { const inputs = variables.reduce((res: any, variable: any) => {
@ -24,21 +28,61 @@ const Doc = ({ appDetail }: IDocProps) => {
return res return res
}, {}) }, {})
useEffect(() => {
const extractTOC = () => {
const article = document.querySelector('article')
if (article) {
const headings = article.querySelectorAll('h2')
const tocItems = Array.from(headings).map((heading) => {
const anchor = heading.querySelector('a')
if (anchor) {
return {
href: anchor.getAttribute('href') || '',
text: anchor.textContent || '',
}
}
return null
}).filter((item): item is { href: string; text: string } => item !== null)
setToc(tocItems)
}
}
// Run after component has rendered
setTimeout(extractTOC, 0)
}, [appDetail, locale])
return ( return (
<article className="prose prose-xl" > <div className="flex">
{(appDetail?.mode === 'chat' || appDetail?.mode === 'agent-chat') && ( <nav className="toc w-64 fixed right-8 top-32 bg-gray-50 p-4 rounded-lg shadow-md z-10">
locale !== LanguagesSupported[1] ? <TemplateChatEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateChatZh appDetail={appDetail} variables={variables} inputs={inputs} /> <h3 className="text-lg font-semibold mb-4">{t('appApi.develop.toc')}</h3>
)} <ul className="space-y-2">
{appDetail?.mode === 'advanced-chat' && ( {toc.map((item, index) => (
locale !== LanguagesSupported[1] ? <TemplateAdvancedChatEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateAdvancedChatZh appDetail={appDetail} variables={variables} inputs={inputs} /> <li key={index}>
)} <a
{appDetail?.mode === 'workflow' && ( href={item.href}
locale !== LanguagesSupported[1] ? <TemplateWorkflowEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateWorkflowZh appDetail={appDetail} variables={variables} inputs={inputs} /> className="text-gray-600 hover:text-gray-900 hover:underline transition-colors duration-200"
)} >
{appDetail?.mode === 'completion' && ( {item.text}
locale !== LanguagesSupported[1] ? <TemplateEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateZh appDetail={appDetail} variables={variables} inputs={inputs} /> </a>
)} </li>
</article> ))}
</ul>
</nav>
<article className="prose prose-xl" >
{(appDetail?.mode === 'chat' || appDetail?.mode === 'agent-chat') && (
locale !== LanguagesSupported[1] ? <TemplateChatEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateChatZh appDetail={appDetail} variables={variables} inputs={inputs} />
)}
{appDetail?.mode === 'advanced-chat' && (
locale !== LanguagesSupported[1] ? <TemplateAdvancedChatEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateAdvancedChatZh appDetail={appDetail} variables={variables} inputs={inputs} />
)}
{appDetail?.mode === 'workflow' && (
locale !== LanguagesSupported[1] ? <TemplateWorkflowEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateWorkflowZh appDetail={appDetail} variables={variables} inputs={inputs} />
)}
{appDetail?.mode === 'completion' && (
locale !== LanguagesSupported[1] ? <TemplateEn appDetail={appDetail} variables={variables} inputs={inputs} /> : <TemplateZh appDetail={appDetail} variables={variables} inputs={inputs} />
)}
</article>
</div>
) )
} }

View File

@ -503,7 +503,7 @@ The text generation application offers non-session support and is ideal for tran
<Heading <Heading
url='/text-to-audio' url='/text-to-audio'
method='POST' method='POST'
title='text to audio' title='Text to Audio'
name='#audio' name='#audio'
/> />
<Row> <Row>

View File

@ -480,7 +480,7 @@ Chat applications support session persistence, allowing previous chat history to
<Heading <Heading
url='/messages/{message_id}/suggested' url='/messages/{message_id}/suggested'
method='GET' method='GET'
title='next suggested questions' title='Next Suggested Questions'
name='#suggested' name='#suggested'
/> />
<Row> <Row>
@ -884,7 +884,7 @@ Chat applications support session persistence, allowing previous chat history to
<Heading <Heading
url='/text-to-audio' url='/text-to-audio'
method='POST' method='POST'
title='text to audio' title='Text to Audio'
name='#audio' name='#audio'
/> />
<Row> <Row>

View File

@ -444,7 +444,7 @@ Chat applications support session persistence, allowing previous chat history to
<Heading <Heading
url='/messages/{message_id}/suggested' url='/messages/{message_id}/suggested'
method='GET' method='GET'
title='next suggested questions' title='Next Suggested Questions'
name='#suggested' name='#suggested'
/> />
<Row> <Row>
@ -918,7 +918,7 @@ Chat applications support session persistence, allowing previous chat history to
<Heading <Heading
url='/text-to-audio' url='/text-to-audio'
method='POST' method='POST'
title='text to audio' title='Text to Audio'
name='#audio' name='#audio'
/> />
<Row> <Row>

View File

@ -32,7 +32,7 @@ Workflow applications offers non-session support and is ideal for translation, a
<Heading <Heading
url='/workflows/run' url='/workflows/run'
method='POST' method='POST'
title='Execute workflow' title='Execute Workflow'
name='#Execute-Workflow' name='#Execute-Workflow'
/> />
<Row> <Row>
@ -505,7 +505,7 @@ Workflow applications offers non-session support and is ideal for translation, a
<Heading <Heading
url='/workflows/logs' url='/workflows/logs'
method='GET' method='GET'
title='Get workflow logs' title='Get Workflow Logs'
name='#Get-Workflow-Logs' name='#Get-Workflow-Logs'
/> />
<Row> <Row>

View File

@ -78,6 +78,7 @@ const translation = {
requestBody: 'Request Body', requestBody: 'Request Body',
pathParams: 'Path Params', pathParams: 'Path Params',
query: 'Query', query: 'Query',
toc: 'Contents',
}, },
} }

View File

@ -78,6 +78,7 @@ const translation = {
requestBody: 'Request Body', requestBody: 'Request Body',
pathParams: 'Path Params', pathParams: 'Path Params',
query: 'Query', query: 'Query',
toc: '目录',
}, },
} }