dify/web/app/components/integrations/section-renderer.tsx
Jingyi 9b74df21d0
feat(web): refine onboarding UI (#37433)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: yyh <yuanyouhuilyz@gmail.com>
Co-authored-by: Joel <iamjoel007@gmail.com>
Co-authored-by: hjlarry <hjlarry@163.com>
Co-authored-by: fatelei <fatelei@gmail.com>
Co-authored-by: Asuka Minato <i@asukaminato.eu.org>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
Co-authored-by: gigglewang <gigglewang@dify.ai>
Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai>
Co-authored-by: chariri <w@chariri.moe>
Co-authored-by: Evan <2869018789@qq.com>
Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com>
2026-06-15 08:47:15 +00:00

106 lines
4.2 KiB
TypeScript

'use client'
import type { ReactNode } from 'react'
import type { IntegrationSection } from './routes'
import { ApiBasedExtensionPage } from '@/app/components/header/account-setting/api-based-extension-page'
import DataSourcePage from '@/app/components/header/account-setting/data-source-page-new'
import ModelProviderPage from '@/app/components/header/account-setting/model-provider-page'
import { PluginCategoryEnum } from '@/app/components/plugins/types'
import { toolsContentFrameClassNames, toolsContentInsetClassNames } from '@/app/components/tools/content-inset'
import { IntegrationPageHeader } from './page-header'
import PluginCategoryPage from './plugin-category-page'
import { IntegrationSectionLayout } from './section-layout'
import ToolProviderList from './tool-provider-list'
type IntegrationSectionRendererProps = {
canInstallPlugin?: boolean
description?: ReactNode
onProviderSearchTextChange: (value: string) => void
onSwitchToMarketplace?: () => void
pluginCategoryToolbarAction?: ReactNode
providerSearchText: string
scrollAreaLabel?: string
section: IntegrationSection
title?: ReactNode
}
const IntegrationSectionRenderer = ({
canInstallPlugin = true,
description,
onProviderSearchTextChange,
onSwitchToMarketplace,
pluginCategoryToolbarAction,
providerSearchText,
scrollAreaLabel,
section,
title,
}: IntegrationSectionRendererProps) => {
const compactFrameClassName = `${toolsContentFrameClassNames.compact} ${toolsContentInsetClassNames.compact}`
const renderHeader = (toolbar?: ReactNode) => (
<IntegrationPageHeader
align="start"
title={title}
description={description}
descriptionClassName="system-xs-regular"
frameClassName={compactFrameClassName}
toolbar={toolbar}
/>
)
const renderScrollBody = (body: ReactNode) => (
<IntegrationSectionLayout
label={scrollAreaLabel}
bodyClassName={`${compactFrameClassName} pt-1`}
>
{body}
</IntegrationSectionLayout>
)
const renderScrollableLayout = ({ body, toolbar }: { body: ReactNode, toolbar: ReactNode }) => (
<>
{renderHeader(toolbar)}
{renderScrollBody(body)}
</>
)
const renderDirectLayout = ({ body, toolbar }: { body: ReactNode, toolbar: ReactNode }) => (
<>
{renderHeader(toolbar)}
{body}
</>
)
switch (section) {
case 'provider':
return (
<ModelProviderPage
hideSystemModelSelectorProviderSettingsFooter
layout={renderScrollableLayout}
searchText={providerSearchText}
stickyToolbar
onSearchTextChange={onProviderSearchTextChange}
/>
)
case 'builtin':
return <PluginCategoryPage canInstall={canInstallPlugin} category={PluginCategoryEnum.tool} layout={renderDirectLayout} onSwitchToMarketplace={onSwitchToMarketplace} toolbarAction={pluginCategoryToolbarAction} />
case 'mcp':
return <ToolProviderList category="mcp" contentInset="compact" layout={renderDirectLayout} />
case 'custom-tool':
return <ToolProviderList category="api" contentInset="compact" layout={renderDirectLayout} />
case 'workflow-tool':
return <ToolProviderList category="workflow" contentInset="compact" layout={renderDirectLayout} />
case 'data-source':
return (
<DataSourcePage stickyToolbar layout={renderScrollableLayout} />
)
case 'custom-endpoint':
return <ApiBasedExtensionPage layout={renderScrollableLayout} />
case 'trigger':
return <PluginCategoryPage canInstall={canInstallPlugin} category={PluginCategoryEnum.trigger} layout={renderDirectLayout} onSwitchToMarketplace={onSwitchToMarketplace} toolbarAction={pluginCategoryToolbarAction} />
case 'agent-strategy':
return <PluginCategoryPage canInstall={canInstallPlugin} category={PluginCategoryEnum.agent} layout={renderDirectLayout} onSwitchToMarketplace={onSwitchToMarketplace} toolbarAction={pluginCategoryToolbarAction} />
case 'extension':
return <PluginCategoryPage canInstall={canInstallPlugin} category={PluginCategoryEnum.extension} layout={renderDirectLayout} onSwitchToMarketplace={onSwitchToMarketplace} toolbarAction={pluginCategoryToolbarAction} />
default:
return null
}
}
export default IntegrationSectionRenderer