dify-run
/
web
/app
/components
/base
/features
/new-feature-panel
/annotation-reply
/annotation-ctrl-btn
/index.tsx
'use client' | |
import type { FC } from 'react' | |
import React, { useRef, useState } from 'react' | |
import { useHover } from 'ahooks' | |
import { useTranslation } from 'react-i18next' | |
import cn from '@/utils/classnames' | |
import { MessageCheckRemove, MessageFastPlus } from '@/app/components/base/icons/src/vender/line/communication' | |
import { MessageFast } from '@/app/components/base/icons/src/vender/solid/communication' | |
import { Edit04 } from '@/app/components/base/icons/src/vender/line/general' | |
import RemoveAnnotationConfirmModal from '@/app/components/app/annotation/remove-annotation-confirm-modal' | |
import Tooltip from '@/app/components/base/tooltip' | |
import { addAnnotation, delAnnotation } from '@/service/annotation' | |
import Toast from '@/app/components/base/toast' | |
import { useProviderContext } from '@/context/provider-context' | |
import { useModalContext } from '@/context/modal-context' | |
type Props = { | |
appId: string | |
messageId?: string | |
annotationId?: string | |
className?: string | |
cached: boolean | |
query: string | |
answer: string | |
onAdded: (annotationId: string, authorName: string) => void | |
onEdit: () => void | |
onRemoved: () => void | |
} | |
const CacheCtrlBtn: FC<Props> = ({ | |
className, | |
cached, | |
query, | |
answer, | |
appId, | |
messageId, | |
annotationId, | |
onAdded, | |
onEdit, | |
onRemoved, | |
}) => { | |
const { t } = useTranslation() | |
const { plan, enableBilling } = useProviderContext() | |
const isAnnotationFull = (enableBilling && plan.usage.annotatedResponse >= plan.total.annotatedResponse) | |
const { setShowAnnotationFullModal } = useModalContext() | |
const [showModal, setShowModal] = useState(false) | |
const cachedBtnRef = useRef<HTMLDivElement>(null) | |
const isCachedBtnHovering = useHover(cachedBtnRef) | |
const handleAdd = async () => { | |
if (isAnnotationFull) { | |
setShowAnnotationFullModal() | |
return | |
} | |
const res: any = await addAnnotation(appId, { | |
message_id: messageId, | |
question: query, | |
answer, | |
}) | |
Toast.notify({ | |
message: t('common.api.actionSuccess') as string, | |
type: 'success', | |
}) | |
onAdded(res.id, res.account?.name) | |
} | |
const handleRemove = async () => { | |
await delAnnotation(appId, annotationId!) | |
Toast.notify({ | |
message: t('common.api.actionSuccess') as string, | |
type: 'success', | |
}) | |
onRemoved() | |
setShowModal(false) | |
} | |
return ( | |
<div className={cn('inline-block', className)}> | |
<div className='inline-flex p-0.5 space-x-0.5 rounded-lg bg-white border border-gray-100 shadow-md text-gray-500 cursor-pointer'> | |
{cached | |
? ( | |
<div> | |
<div | |
ref={cachedBtnRef} | |
className={cn(isCachedBtnHovering ? 'bg-[#FEF3F2] text-[#D92D20]' : 'bg-[#EEF4FF] text-[#444CE7]', 'flex p-1 space-x-1 items-center rounded-md leading-4 text-xs font-medium')} | |
onClick={() => setShowModal(true)} | |
> | |
{!isCachedBtnHovering | |
? ( | |
<> | |
<MessageFast className='w-4 h-4' /> | |
<div>{t('appDebug.feature.annotation.cached')}</div> | |
</> | |
) | |
: <> | |
<MessageCheckRemove className='w-4 h-4' /> | |
<div>{t('appDebug.feature.annotation.remove')}</div> | |
</>} | |
</div> | |
</div> | |
) | |
: answer | |
? ( | |
<Tooltip | |
popupContent={t('appDebug.feature.annotation.add')} | |
> | |
<div | |
className='p-1 rounded-md hover:bg-[#EEF4FF] hover:text-[#444CE7] cursor-pointer' | |
onClick={handleAdd} | |
> | |
<MessageFastPlus className='w-4 h-4' /> | |
</div> | |
</Tooltip> | |
) | |
: null | |
} | |
<Tooltip | |
popupContent={t('appDebug.feature.annotation.edit')} | |
> | |
<div | |
className='p-1 cursor-pointer rounded-md hover:bg-black/5' | |
onClick={onEdit} | |
> | |
<Edit04 className='w-4 h-4' /> | |
</div> | |
</Tooltip> | |
</div> | |
<RemoveAnnotationConfirmModal | |
isShow={showModal} | |
onHide={() => setShowModal(false)} | |
onRemove={handleRemove} | |
/> | |
</div> | |
) | |
} | |
export default React.memo(CacheCtrlBtn) | |