dify/web/app/components/base/features/new-feature-panel/file-upload/setting-content.tsx

97 lines
3.5 KiB
TypeScript

import type { OnFeaturesChange } from '@/app/components/base/features/types'
import type { UploadFileSetting } from '@/app/components/workflow/types'
import { Button } from '@langgenius/dify-ui/button'
import { produce } from 'immer'
import * as React from 'react'
import { useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useFeatures, useFeaturesStore } from '@/app/components/base/features/hooks'
import { FILE_EXTS } from '@/app/components/base/prompt-editor/constants'
import FileUploadSetting from '@/app/components/workflow/nodes/_base/components/file-upload-setting'
import { SupportUploadFileTypes } from '@/app/components/workflow/types'
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="system-xl-semibold text-text-primary">{!imageUpload ? t('feature.fileUpload.modalTitle', { ns: 'appDebug' }) : t('feature.imageUpload.modalTitle', { ns: 'appDebug' })}</div>
<button
type="button"
aria-label={t('operation.close', { ns: 'common' })}
className="cursor-pointer border-none bg-transparent p-1 focus-visible:ring-1 focus-visible:ring-components-input-border-active focus-visible:outline-hidden"
onClick={onClose}
>
<span className="i-ri-close-line h-4 w-4 text-text-tertiary" aria-hidden="true" />
</button>
</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('operation.cancel', { ns: 'common' })}
</Button>
<Button
variant="primary"
onClick={handleChange}
disabled={tempPayload.allowed_file_types.length === 0}
>
{t('operation.save', { ns: 'common' })}
</Button>
</div>
</>
)
}
export default React.memo(SettingContent)