| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | import React, { useCallback, useMemo, useState } from 'react'import produce from 'immer'import { useTranslation } from 'react-i18next'import { RiCloseLine } from '@remixicon/react'import FileUploadSetting from '@/app/components/workflow/nodes/_base/components/file-upload-setting'import Button from '@/app/components/base/button'import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'import type { OnFeaturesChange } from '@/app/components/base/features/types'import type { UploadFileSetting } from '@/app/components/workflow/types'import { SupportUploadFileTypes } from '@/app/components/workflow/types'import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'type SettingContentProps = {  imageUpload?: boolean  onClose: () => void  onChange?: OnFeaturesChange}const SettingContent = ({  imageUpload,  onClose,  onChange,}: SettingContentProps) => {  const { t } = useTranslation()  const featuresStore = useFeaturesStore()  const file = useFeatures(state => state.features.file)  const fileSettingPayload = useMemo(() => {    return {      allowed_file_upload_methods: file?.allowed_file_upload_methods || ['local_file', 'remote_url'],      allowed_file_types: file?.allowed_file_types || [SupportUploadFileTypes.image],      allowed_file_extensions: file?.allowed_file_extensions || FILE_EXTS[SupportUploadFileTypes.image],      max_length: file?.number_limits || 3,    } as UploadFileSetting  }, [file])  const [tempPayload, setTempPayload] = useState<UploadFileSetting>(fileSettingPayload)  const handleChange = useCallback(() => {    const {      features,      setFeatures,    } = featuresStore!.getState()    const newFeatures = produce(features, (draft) => {      draft.file = {        ...draft.file,        allowed_file_upload_methods: tempPayload.allowed_file_upload_methods,        number_limits: tempPayload.max_length,        allowed_file_types: tempPayload.allowed_file_types,        allowed_file_extensions: tempPayload.allowed_file_extensions,      }    })    setFeatures(newFeatures)    if (onChange)      onChange()  }, [featuresStore, onChange, tempPayload])  return (    <>      <div className='mb-4 flex items-center justify-between'>        <div className='text-text-primary system-xl-semibold'>{!imageUpload ? t('appDebug.feature.fileUpload.modalTitle') : t('appDebug.feature.imageUpload.modalTitle')}</div>        <div className='p-1 cursor-pointer' onClick={onClose}><RiCloseLine className='w-4 h-4 text-text-tertiary'/></div>      </div>      <FileUploadSetting        isMultiple        inFeaturePanel        hideSupportFileType={imageUpload}        payload={tempPayload}        onChange={(p: UploadFileSetting) => setTempPayload(p)}      />      <div className='mt-4 flex items-center justify-end'>        <Button          onClick={onClose}          className='mr-2'        >          {t('common.operation.cancel')}        </Button>        <Button          variant='primary'          onClick={handleChange}          disabled={tempPayload.allowed_file_types.length === 0}        >          {t('common.operation.save')}        </Button>      </div>    </>  )}export default React.memo(SettingContent)
 |