index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import {
  2. memo,
  3. useMemo,
  4. } from 'react'
  5. import { useTranslation } from 'react-i18next'
  6. import type { OnFeaturesChange } from '../types'
  7. import { useFeatures } from '../hooks'
  8. import FileUpload from './file-upload'
  9. import OpeningStatement from './opening-statement'
  10. import type { OpeningStatementProps } from './opening-statement'
  11. import SuggestedQuestionsAfterAnswer from './suggested-questions-after-answer'
  12. import TextToSpeech from './text-to-speech'
  13. import SpeechToText from './speech-to-text'
  14. import Citation from './citation'
  15. import Moderation from './moderation'
  16. import type { InputVar } from '@/app/components/workflow/types'
  17. export type FeaturePanelProps = {
  18. onChange?: OnFeaturesChange
  19. openingStatementProps: OpeningStatementProps
  20. disabled?: boolean
  21. workflowVariables: InputVar[]
  22. }
  23. const FeaturePanel = ({
  24. onChange,
  25. openingStatementProps,
  26. disabled,
  27. workflowVariables,
  28. }: FeaturePanelProps) => {
  29. const { t } = useTranslation()
  30. const features = useFeatures(s => s.features)
  31. const showAdvanceFeature = useMemo(() => {
  32. return features.opening?.enabled || features.suggested?.enabled || features.speech2text?.enabled || features.text2speech?.enabled || features.citation?.enabled
  33. }, [features])
  34. const showToolFeature = useMemo(() => {
  35. return features.moderation?.enabled
  36. }, [features])
  37. return (
  38. <div className='space-y-3'>
  39. <FileUpload
  40. onChange={onChange}
  41. disabled={disabled}
  42. />
  43. {
  44. showAdvanceFeature && (
  45. <div>
  46. <div className='flex items-center'>
  47. <div className='shrink-0 text-xs font-semibold text-gray-500'>
  48. {t('appDebug.feature.groupChat.title')}
  49. </div>
  50. <div
  51. className='grow ml-3 h-[1px]'
  52. style={{ background: 'linear-gradient(270deg, rgba(243, 244, 246, 0) 0%, #F3F4F6 100%)' }}
  53. ></div>
  54. </div>
  55. <div className='py-2 space-y-2'>
  56. {
  57. features.opening?.enabled && (
  58. <OpeningStatement
  59. {...openingStatementProps}
  60. onChange={onChange}
  61. readonly={disabled}
  62. workflowVariables={workflowVariables}
  63. />
  64. )
  65. }
  66. {
  67. features.suggested?.enabled && (
  68. <SuggestedQuestionsAfterAnswer />
  69. )
  70. }
  71. {
  72. features.text2speech?.enabled && (
  73. <TextToSpeech onChange={onChange} disabled={disabled} />
  74. )
  75. }
  76. {
  77. features.speech2text?.enabled && (
  78. <SpeechToText />
  79. )
  80. }
  81. {
  82. features.citation?.enabled && (
  83. <Citation />
  84. )
  85. }
  86. </div>
  87. </div>
  88. )
  89. }
  90. {
  91. showToolFeature && (
  92. <div>
  93. <div className='flex items-center'>
  94. <div className='shrink-0 text-xs font-semibold text-gray-500'>
  95. {t('appDebug.feature.groupChat.title')}
  96. </div>
  97. <div
  98. className='grow ml-3 h-[1px]'
  99. style={{ background: 'linear-gradient(270deg, rgba(243, 244, 246, 0) 0%, #F3F4F6 100%)' }}
  100. ></div>
  101. </div>
  102. <div className='py-2 space-y-2'>
  103. {
  104. features.moderation?.enabled && (
  105. <Moderation onChange={onChange} disabled={disabled} />
  106. )
  107. }
  108. </div>
  109. </div>
  110. )
  111. }
  112. </div>
  113. )
  114. }
  115. export default memo(FeaturePanel)