|
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) |
|
|