123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- 'use client'
- import type { FC } from 'react'
- import React, { useMemo } from 'react'
- import { useTranslation } from 'react-i18next'
- import {
- RiArrowLeftLine,
- RiCloseLine,
- } from '@remixicon/react'
- import Drawer from '@/app/components/base/drawer'
- import ActionButton from '@/app/components/base/action-button'
- import Icon from '@/app/components/plugins/card/base/card-icon'
- import Description from '@/app/components/plugins/card/base/description'
- import Divider from '@/app/components/base/divider'
- import type {
- StrategyDetail,
- } from '@/app/components/plugins/types'
- import type { Locale } from '@/i18n'
- import { useRenderI18nObject } from '@/hooks/use-i18n'
- import { API_PREFIX } from '@/config'
- import cn from '@/utils/classnames'
- type Props = {
- provider: {
- author: string
- name: string
- description: Record<Locale, string>
- tenant_id: string
- icon: string
- label: Record<Locale, string>
- tags: string[]
- }
- detail: StrategyDetail
- onHide: () => void
- }
- const StrategyDetail: FC<Props> = ({
- provider,
- detail,
- onHide,
- }) => {
- const getValueFromI18nObject = useRenderI18nObject()
- const { t } = useTranslation()
- const outputSchema = useMemo(() => {
- const res: any[] = []
- if (!detail.output_schema)
- return []
- Object.keys(detail.output_schema.properties).forEach((outputKey) => {
- const output = detail.output_schema.properties[outputKey]
- res.push({
- name: outputKey,
- type: output.type === 'array'
- ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
- : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
- description: output.description,
- })
- })
- return res
- }, [detail.output_schema])
- const getType = (type: string) => {
- if (type === 'number-input')
- return t('tools.setBuiltInTools.number')
- if (type === 'text-input')
- return t('tools.setBuiltInTools.string')
- if (type === 'file')
- return t('tools.setBuiltInTools.file')
- if (type === 'array[tools]')
- return 'multiple-tool-select'
- return type
- }
- return (
- <Drawer
- isOpen
- clickOutsideNotOpen={false}
- onClose={onHide}
- footer={null}
- mask={false}
- positionCenter={false}
- panelClassname={cn('justify-start mt-[64px] mr-2 mb-2 !w-[420px] !max-w-[420px] !p-0 !bg-components-panel-bg rounded-2xl border-[0.5px] border-components-panel-border shadow-xl')}
- >
- <>
- {/* header */}
- <div className='relative p-4 pb-3 border-b border-divider-subtle'>
- <div className='absolute top-3 right-3'>
- <ActionButton onClick={onHide}>
- <RiCloseLine className='w-4 h-4' />
- </ActionButton>
- </div>
- <div
- className='mb-2 flex items-center gap-1 text-text-accent-secondary system-xs-semibold-uppercase cursor-pointer'
- onClick={onHide}
- >
- <RiArrowLeftLine className='w-4 h-4' />
- BACK
- </div>
- <div className='flex items-center gap-1'>
- <Icon size='tiny' className='w-6 h-6' src={`${API_PREFIX}/workspaces/current/plugin/icon?tenant_id=${provider.tenant_id}&filename=${provider.icon}`} />
- <div className=''>{getValueFromI18nObject(provider.label)}</div>
- </div>
- <div className='mt-1 text-text-primary system-md-semibold'>{getValueFromI18nObject(detail.identity.label)}</div>
- <Description className='mt-3' text={getValueFromI18nObject(detail.description)} descriptionLineRows={2}></Description>
- </div>
- {/* form */}
- <div className='h-full'>
- <div className='flex flex-col h-full overflow-y-auto'>
- <div className='p-4 pb-1 text-text-primary system-sm-semibold-uppercase'>{t('tools.setBuiltInTools.parameters')}</div>
- <div className='px-4'>
- {detail.parameters.length > 0 && (
- <div className='py-2 space-y-1'>
- {detail.parameters.map((item: any, index) => (
- <div key={index} className='py-1'>
- <div className='flex items-center gap-2'>
- <div className='text-text-secondary code-sm-semibold'>{getValueFromI18nObject(item.label)}</div>
- <div className='text-text-tertiary system-xs-regular'>
- {getType(item.type)}
- </div>
- {item.required && (
- <div className='text-text-warning-secondary system-xs-medium'>{t('tools.setBuiltInTools.required')}</div>
- )}
- </div>
- {item.human_description && (
- <div className='mt-0.5 text-text-tertiary system-xs-regular'>
- {getValueFromI18nObject(item.human_description)}
- </div>
- )}
- </div>
- ))}
- </div>
- )}
- </div>
- {detail.output_schema && (
- <>
- <div className='px-4'>
- <Divider className="!mt-2" />
- </div>
- <div className='p-4 pb-1 text-text-primary system-sm-semibold-uppercase'>OUTPUT</div>
- {outputSchema.length > 0 && (
- <div className='px-4 py-2 space-y-1'>
- {outputSchema.map((outputItem, index) => (
- <div key={index} className='py-1'>
- <div className='flex items-center gap-2'>
- <div className='text-text-secondary code-sm-semibold'>{outputItem.name}</div>
- <div className='text-text-tertiary system-xs-regular'>{outputItem.type}</div>
- </div>
- {outputItem.description && (
- <div className='mt-0.5 text-text-tertiary system-xs-regular'>
- {outputItem.description}
- </div>
- )}
- </div>
- ))}
- </div>
- )}
- </>
- )}
- </div>
- </div>
- </>
- </Drawer>
- )
- }
- export default StrategyDetail
|