'use client' import type { FC } from 'react' import React, { useCallback, useRef, useState } from 'react' import type { BuiltInMetadataItem, MetadataItemWithValueLength } from '../types' import Drawer from '@/app/components/base/drawer' import Button from '@/app/components/base/button' import { RiAddLine, RiDeleteBinLine, RiEditLine } from '@remixicon/react' import { getIcon } from '../utils/get-icon' import cn from '@/utils/classnames' import Modal from '@/app/components/base/modal' import Field from './field' import Input from '@/app/components/base/input' import { useTranslation } from 'react-i18next' import Switch from '@/app/components/base/switch' import Tooltip from '@/app/components/base/tooltip' import CreateModal from '@/app/components/datasets/metadata/metadata-dataset/create-metadata-modal' import { useBoolean, useHover } from 'ahooks' import Confirm from '@/app/components/base/confirm' import Toast from '@/app/components/base/toast' const i18nPrefix = 'dataset.metadata.datasetMetadata' type Props = { userMetadata: MetadataItemWithValueLength[] builtInMetadata: BuiltInMetadataItem[] isBuiltInEnabled: boolean onIsBuiltInEnabledChange: (value: boolean) => void onClose: () => void onAdd: (payload: BuiltInMetadataItem) => void onRename: (payload: MetadataItemWithValueLength) => void onRemove: (metaDataId: string) => void } type ItemProps = { readonly?: boolean disabled?: boolean payload: MetadataItemWithValueLength onRename?: () => void onDelete?: () => void } const Item: FC = ({ readonly, disabled, payload, onRename, onDelete, }) => { const { t } = useTranslation() const Icon = getIcon(payload.type) const handleRename = useCallback(() => { onRename?.() }, [onRename]) const deleteBtnRef = useRef(null) const isDeleteHovering = useHover(deleteBtnRef) const [isShowDeleteConfirm, { setTrue: showDeleteConfirm, setFalse: hideDeleteConfirm, }] = useBoolean(false) const handleDelete = useCallback(() => { hideDeleteConfirm() onDelete?.() }, [hideDeleteConfirm, onDelete]) return (
{payload.name}
{payload.type}
{(!readonly || disabled) && (
{disabled ? t(`${i18nPrefix}.disabled`) : t(`${i18nPrefix}.values`, { num: payload.count || 0 })}
)}
{isShowDeleteConfirm && ( )}
) } const DatasetMetadataDrawer: FC = ({ userMetadata, builtInMetadata, isBuiltInEnabled, onIsBuiltInEnabledChange, onClose, onAdd, onRename, onRemove, }) => { const { t } = useTranslation() const [isShowRenameModal, setIsShowRenameModal] = useState(false) const [currPayload, setCurrPayload] = useState(null) const [templeName, setTempleName] = useState('') const handleRename = useCallback((payload: MetadataItemWithValueLength) => { return () => { setCurrPayload(payload) setTempleName(payload.name) setIsShowRenameModal(true) } }, [setCurrPayload, setIsShowRenameModal]) const [open, setOpen] = useState(false) const handleAdd = useCallback(async (data: MetadataItemWithValueLength) => { await onAdd(data) Toast.notify({ type: 'success', message: t('common.api.actionSuccess'), }) setOpen(false) }, [onAdd, t]) const handleRenamed = useCallback(async () => { const item = userMetadata.find(p => p.id === currPayload?.id) if (item) { await onRename({ ...item, name: templeName, }) Toast.notify({ type: 'success', message: t('common.api.actionSuccess'), }) } setIsShowRenameModal(false) }, [userMetadata, currPayload?.id, onRename, templeName, t]) const handleDelete = useCallback((payload: MetadataItemWithValueLength) => { return async () => { await onRemove(payload.id) Toast.notify({ type: 'success', message: t('common.api.actionSuccess'), }) } }, [onRemove, t]) return (
{t(`${i18nPrefix}.description`)}
{t(`${i18nPrefix}.addMetaData`)} } hasBack onSave={handleAdd} />
{userMetadata.map(payload => ( ))}
{t(`${i18nPrefix}.builtIn`)}
{t(`${i18nPrefix}.builtInDescription`)}
} />
{builtInMetadata.map(payload => ( ))}
{isShowRenameModal && ( setIsShowRenameModal(false)}> setTempleName(e.target.value)} placeholder={t(`${i18nPrefix}.namePlaceholder`)} />
)}
) } export default React.memo(DatasetMetadataDrawer)