index.tsx 3.5 KB

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