Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dify
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
dify
Commits
17a67e79
Commit
17a67e79
authored
Mar 08, 2024
by
StyleZhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove annatation
parent
328a3e2e
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
3 additions
and
515 deletions
+3
-515
feature-modal.tsx
...components/base/features/feature-choose/feature-modal.tsx
+1
-12
index.tsx
...es/feature-panel/annotation/annotation-ctrl-btn/index.tsx
+0
-135
config-param-modal.tsx
.../features/feature-panel/annotation/config-param-modal.tsx
+0
-140
index.tsx
...mponents/base/features/feature-panel/annotation/index.tsx
+0
-124
type.ts
...components/base/features/feature-panel/annotation/type.ts
+0
-4
use-annotation-config.ts
...eatures/feature-panel/annotation/use-annotation-config.ts
+0
-89
index.tsx
web/app/components/base/features/feature-panel/index.tsx
+0
-9
index.tsx
.../workflow/nodes/_base/components/panel-operator/index.tsx
+2
-2
No files found.
web/app/components/base/features/feature-choose/feature-modal.tsx
View file @
17a67e79
...
...
@@ -15,10 +15,7 @@ import SuggestedQuestionsAfterAnswerIcon from '@/app/components/app/configuratio
import
{
Microphone01
,
Speaker
}
from
'@/app/components/base/icons/src/vender/solid/mediaAndDevices'
import
{
Citations
}
from
'@/app/components/base/icons/src/vender/solid/editor'
import
{
FileSearch02
}
from
'@/app/components/base/icons/src/vender/solid/files'
import
{
MessageFast
,
MessageHeartCircle
,
}
from
'@/app/components/base/icons/src/vender/solid/communication'
import
{
MessageHeartCircle
}
from
'@/app/components/base/icons/src/vender/solid/communication'
import
{
FeatureEnum
}
from
'@/app/components/base/features/types'
import
{
useDefaultModel
}
from
'@/app/components/header/account-setting/model-provider-page/hooks'
...
...
@@ -137,14 +134,6 @@ const FeatureModal: FC<FeatureModalProps> = ({
onChange=
{
handleChange
}
type=
{
FeatureEnum
.
moderation
}
/>
<
FeatureItem
icon=
{
<
MessageFast
className=
'w-4 h-4 text-[#444CE7]'
/>
}
title=
{
t
(
'appDebug.feature.annotation.title'
)
}
description=
{
t
(
'appDebug.feature.annotation.description'
)
}
value=
{
!!
features
.
annotation
.
enabled
}
onChange=
{
handleChange
}
type=
{
FeatureEnum
.
annotation
}
/>
</>
</
FeatureGroup
>
</
div
>
...
...
web/app/components/base/features/feature-panel/annotation/annotation-ctrl-btn/index.tsx
deleted
100644 → 0
View file @
328a3e2e
'use client'
import
type
{
FC
}
from
'react'
import
React
,
{
useRef
,
useState
}
from
'react'
import
{
useHover
}
from
'ahooks'
import
cn
from
'classnames'
import
{
useTranslation
}
from
'react-i18next'
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
TooltipPlus
from
'@/app/components/base/tooltip-plus'
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
(
className
,
'inline-block'
)
}
>
<
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
?
(
<
TooltipPlus
popupContent=
{
t
(
'appDebug.feature.annotation.add'
)
as
string
}
>
<
div
className=
'p-1 rounded-md hover:bg-[#EEF4FF] hover:text-[#444CE7] cursor-pointer'
onClick=
{
handleAdd
}
>
<
MessageFastPlus
className=
'w-4 h-4'
/>
</
div
>
</
TooltipPlus
>
)
:
null
}
<
TooltipPlus
popupContent=
{
t
(
'appDebug.feature.annotation.edit'
)
as
string
}
>
<
div
className=
'p-1 cursor-pointer rounded-md hover:bg-black/5'
onClick=
{
onEdit
}
>
<
Edit04
className=
'w-4 h-4'
/>
</
div
>
</
TooltipPlus
>
</
div
>
<
RemoveAnnotationConfirmModal
isShow=
{
showModal
}
onHide=
{
()
=>
setShowModal
(
false
)
}
onRemove=
{
handleRemove
}
/>
</
div
>
)
}
export
default
React
.
memo
(
CacheCtrlBtn
)
web/app/components/base/features/feature-panel/annotation/config-param-modal.tsx
deleted
100644 → 0
View file @
328a3e2e
'use client'
import
type
{
FC
}
from
'react'
import
React
,
{
useState
}
from
'react'
import
{
useTranslation
}
from
'react-i18next'
import
ScoreSlider
from
'../score-slider'
import
{
Item
}
from
'./index'
import
Modal
from
'@/app/components/base/modal'
import
Button
from
'@/app/components/base/button'
import
Toast
from
'@/app/components/base/toast'
import
type
{
AnnotationReplyConfig
}
from
'@/models/debug'
import
{
ANNOTATION_DEFAULT
}
from
'@/config'
import
ModelSelector
from
'@/app/components/header/account-setting/model-provider-page/model-selector'
import
{
useModelListAndDefaultModelAndCurrentProviderAndModel
}
from
'@/app/components/header/account-setting/model-provider-page/hooks'
type
Props
=
{
appId
:
string
isShow
:
boolean
onHide
:
()
=>
void
onSave
:
(
embeddingModel
:
{
embedding_provider_name
:
string
embedding_model_name
:
string
},
score
:
number
)
=>
void
isInit
?:
boolean
annotationConfig
:
AnnotationReplyConfig
}
const
ConfigParamModal
:
FC
<
Props
>
=
({
isShow
,
onHide
:
doHide
,
onSave
,
isInit
,
annotationConfig
:
oldAnnotationConfig
,
})
=>
{
const
{
t
}
=
useTranslation
()
const
{
modelList
:
embeddingsModelList
,
defaultModel
:
embeddingsDefaultModel
,
currentModel
:
isEmbeddingsDefaultModelValid
,
}
=
useModelListAndDefaultModelAndCurrentProviderAndModel
(
2
)
const
[
annotationConfig
,
setAnnotationConfig
]
=
useState
(
oldAnnotationConfig
)
const
[
isLoading
,
setLoading
]
=
useState
(
false
)
const
[
embeddingModel
,
setEmbeddingModel
]
=
useState
(
oldAnnotationConfig
.
embedding_model
?
{
providerName
:
oldAnnotationConfig
.
embedding_model
.
embedding_provider_name
,
modelName
:
oldAnnotationConfig
.
embedding_model
.
embedding_model_name
,
}
:
(
embeddingsDefaultModel
?
{
providerName
:
embeddingsDefaultModel
.
provider
.
provider
,
modelName
:
embeddingsDefaultModel
.
model
,
}
:
undefined
))
const
onHide
=
()
=>
{
if
(
!
isLoading
)
doHide
()
}
const
handleSave
=
async
()
=>
{
if
(
!
embeddingModel
||
!
embeddingModel
.
modelName
||
(
embeddingModel
.
modelName
===
embeddingsDefaultModel
?.
model
&&
!
isEmbeddingsDefaultModelValid
))
{
Toast
.
notify
({
message
:
t
(
'common.modelProvider.embeddingModel.required'
),
type
:
'error'
,
})
return
}
setLoading
(
true
)
await
onSave
({
embedding_provider_name
:
embeddingModel
.
providerName
,
embedding_model_name
:
embeddingModel
.
modelName
,
},
annotationConfig
.
score_threshold
)
setLoading
(
false
)
}
return
(
<
Modal
isShow=
{
isShow
}
onClose=
{
onHide
}
className=
'!p-8 !pb-6 !mt-14 !max-w-none !w-[640px]'
wrapperClassName=
'!z-50'
>
<
div
className=
'mb-2 text-xl font-semibold text-[#1D2939]'
>
{
t
(
`appAnnotation.initSetup.${isInit ? 'title' : 'configTitle'}`
)
}
</
div
>
<
div
className=
'mt-6 space-y-3'
>
<
Item
title=
{
t
(
'appDebug.feature.annotation.scoreThreshold.title'
)
}
tooltip=
{
t
(
'appDebug.feature.annotation.scoreThreshold.description'
)
}
>
<
ScoreSlider
className=
'mt-1'
value=
{
(
annotationConfig
.
score_threshold
||
ANNOTATION_DEFAULT
.
score_threshold
)
*
100
}
onChange=
{
(
val
)
=>
{
setAnnotationConfig
({
...
annotationConfig
,
score_threshold
:
val
/
100
,
})
}
}
/>
</
Item
>
<
Item
title=
{
t
(
'common.modelProvider.embeddingModel.key'
)
}
tooltip=
{
t
(
'appAnnotation.embeddingModelSwitchTip'
)
}
>
<
div
className=
'pt-1'
>
<
ModelSelector
defaultModel=
{
embeddingModel
&&
{
provider
:
embeddingModel
.
providerName
,
model
:
embeddingModel
.
modelName
,
}
}
modelList=
{
embeddingsModelList
}
onSelect=
{
(
val
)
=>
{
setEmbeddingModel
({
providerName
:
val
.
provider
,
modelName
:
val
.
model
,
})
}
}
/>
</
div
>
</
Item
>
</
div
>
<
div
className=
'mt-6 flex gap-2 justify-end'
>
<
Button
className=
'!text-sm'
onClick=
{
onHide
}
>
{
t
(
'common.operation.cancel'
)
}
</
Button
>
<
Button
type=
'primary'
onClick=
{
handleSave
}
className=
'flex items-center border-[0.5px] !text-sm'
loading=
{
isLoading
}
>
<
div
></
div
>
<
div
>
{
t
(
`appAnnotation.initSetup.${isInit ? 'confirmBtn' : 'configConfirmBtn'}`
)
}
</
div
>
</
Button
>
</
div
>
</
Modal
>
)
}
export
default
React
.
memo
(
ConfigParamModal
)
web/app/components/base/features/feature-panel/annotation/index.tsx
deleted
100644 → 0
View file @
328a3e2e
'use client'
import
type
{
FC
}
from
'react'
import
React
from
'react'
import
{
useTranslation
}
from
'react-i18next'
import
{
useContext
}
from
'use-context-selector'
import
{
usePathname
,
useRouter
}
from
'next/navigation'
import
ConfigParamModal
from
'./config-param-modal'
import
Panel
from
'@/app/components/app/configuration/base/feature-panel'
import
{
MessageFast
}
from
'@/app/components/base/icons/src/vender/solid/communication'
import
TooltipPlus
from
'@/app/components/base/tooltip-plus'
import
{
HelpCircle
,
LinkExternal02
,
Settings04
}
from
'@/app/components/base/icons/src/vender/line/general'
import
ConfigContext
from
'@/context/debug-configuration'
import
type
{
EmbeddingModelConfig
}
from
'@/app/components/app/annotation/type'
import
{
updateAnnotationScore
}
from
'@/service/annotation'
export
type
AnnotationProps
=
{
onEmbeddingChange
:
(
embeddingModel
:
EmbeddingModelConfig
)
=>
void
onScoreChange
:
(
score
:
number
,
embeddingModel
?:
EmbeddingModelConfig
)
=>
void
}
export
const
Item
:
FC
<
{
title
:
string
;
tooltip
:
string
;
children
:
JSX
.
Element
}
>
=
({
title
,
tooltip
,
children
,
})
=>
{
return
(
<
div
>
<
div
className=
'flex items-center space-x-1'
>
<
div
>
{
title
}
</
div
>
<
TooltipPlus
popupContent=
{
<
div
className=
'max-w-[200px] leading-[18px] text-[13px] font-medium text-gray-800'
>
{
tooltip
}
</
div
>
}
>
<
HelpCircle
className=
'w-3.5 h-3.5 text-gray-400'
/>
</
TooltipPlus
>
</
div
>
<
div
>
{
children
}
</
div
>
</
div
>
)
}
const
AnnotationReplyConfig
:
FC
<
AnnotationProps
>
=
({
onEmbeddingChange
,
onScoreChange
,
})
=>
{
const
{
t
}
=
useTranslation
()
const
router
=
useRouter
()
const
pathname
=
usePathname
()
const
matched
=
pathname
.
match
(
/
\/
app
\/([^/]
+
)
/
)
const
appId
=
(
matched
?.
length
&&
matched
[
1
])
?
matched
[
1
]
:
''
const
{
annotationConfig
,
}
=
useContext
(
ConfigContext
)
const
[
isShowEdit
,
setIsShowEdit
]
=
React
.
useState
(
false
)
return
(
<>
<
Panel
className=
"mt-4"
headerIcon=
{
<
MessageFast
className=
'w-4 h-4 text-[#444CE7]'
/>
}
title=
{
t
(
'appDebug.feature.annotation.title'
)
}
headerRight=
{
<
div
className=
'flex items-center'
>
<
div
className=
'flex items-center rounded-md h-7 px-3 space-x-1 text-gray-700 cursor-pointer hover:bg-gray-200'
onClick=
{
()
=>
{
setIsShowEdit
(
true
)
}
}
>
<
Settings04
className=
"w-[14px] h-[14px]"
/>
<
div
className=
'text-xs font-medium'
>
{
t
(
'common.operation.params'
)
}
</
div
>
</
div
>
<
div
className=
'ml-1 flex items-center h-7 px-3 space-x-1 leading-[18px] text-xs font-medium text-gray-700 rounded-md cursor-pointer hover:bg-gray-200'
onClick=
{
()
=>
{
router
.
push
(
`/app/${appId}/annotations`
)
}
}
>
<
div
>
{
t
(
'appDebug.feature.annotation.cacheManagement'
)
}
</
div
>
<
LinkExternal02
className=
'w-3.5 h-3.5'
/>
</
div
>
</
div
>
}
noBodySpacing
/>
{
isShowEdit
&&
(
<
ConfigParamModal
appId=
{
appId
}
isShow
onHide=
{
()
=>
{
setIsShowEdit
(
false
)
}
}
onSave=
{
async
(
embeddingModel
,
score
)
=>
{
let
isEmbeddingModelChanged
=
false
if
(
embeddingModel
.
embedding_model_name
!==
annotationConfig
.
embedding_model
.
embedding_model_name
&&
embeddingModel
.
embedding_provider_name
!==
annotationConfig
.
embedding_model
.
embedding_provider_name
)
{
await
onEmbeddingChange
(
embeddingModel
)
isEmbeddingModelChanged
=
true
}
if
(
score
!==
annotationConfig
.
score_threshold
)
{
await
updateAnnotationScore
(
appId
,
annotationConfig
.
id
,
score
)
if
(
isEmbeddingModelChanged
)
onScoreChange
(
score
,
embeddingModel
)
else
onScoreChange
(
score
)
}
setIsShowEdit
(
false
)
}
}
annotationConfig=
{
annotationConfig
}
/>
)
}
</>
)
}
export
default
React
.
memo
(
AnnotationReplyConfig
)
web/app/components/base/features/feature-panel/annotation/type.ts
deleted
100644 → 0
View file @
328a3e2e
export
enum
PageType
{
log
=
'log'
,
annotation
=
'annotation'
,
}
web/app/components/base/features/feature-panel/annotation/use-annotation-config.ts
deleted
100644 → 0
View file @
328a3e2e
import
React
,
{
useState
}
from
'react'
import
produce
from
'immer'
import
type
{
AnnotationReplyConfig
}
from
'@/models/debug'
import
{
queryAnnotationJobStatus
,
updateAnnotationStatus
}
from
'@/service/annotation'
import
type
{
EmbeddingModelConfig
}
from
'@/app/components/app/annotation/type'
import
{
AnnotationEnableStatus
,
JobStatus
}
from
'@/app/components/app/annotation/type'
import
{
sleep
}
from
'@/utils'
import
{
ANNOTATION_DEFAULT
}
from
'@/config'
import
{
useProviderContext
}
from
'@/context/provider-context'
type
Params
=
{
appId
:
string
annotationConfig
:
AnnotationReplyConfig
setAnnotationConfig
:
(
annotationConfig
:
AnnotationReplyConfig
)
=>
void
}
const
useAnnotationConfig
=
({
appId
,
annotationConfig
,
setAnnotationConfig
,
}:
Params
)
=>
{
const
{
plan
,
enableBilling
}
=
useProviderContext
()
const
isAnnotationFull
=
(
enableBilling
&&
plan
.
usage
.
annotatedResponse
>=
plan
.
total
.
annotatedResponse
)
const
[
isShowAnnotationFullModal
,
setIsShowAnnotationFullModal
]
=
useState
(
false
)
const
[
isShowAnnotationConfigInit
,
doSetIsShowAnnotationConfigInit
]
=
React
.
useState
(
false
)
const
setIsShowAnnotationConfigInit
=
(
isShow
:
boolean
)
=>
{
if
(
isShow
)
{
if
(
isAnnotationFull
)
{
setIsShowAnnotationFullModal
(
true
)
return
}
}
doSetIsShowAnnotationConfigInit
(
isShow
)
}
const
ensureJobCompleted
=
async
(
jobId
:
string
,
status
:
AnnotationEnableStatus
)
=>
{
let
isCompleted
=
false
while
(
!
isCompleted
)
{
const
res
:
any
=
await
queryAnnotationJobStatus
(
appId
,
status
,
jobId
)
isCompleted
=
res
.
job_status
===
JobStatus
.
completed
if
(
isCompleted
)
break
await
sleep
(
2000
)
}
}
const
handleEnableAnnotation
=
async
(
embeddingModel
:
EmbeddingModelConfig
,
score
?:
number
)
=>
{
if
(
isAnnotationFull
)
return
const
{
job_id
:
jobId
}:
any
=
await
updateAnnotationStatus
(
appId
,
AnnotationEnableStatus
.
enable
,
embeddingModel
,
score
)
await
ensureJobCompleted
(
jobId
,
AnnotationEnableStatus
.
enable
)
setAnnotationConfig
(
produce
(
annotationConfig
,
(
draft
:
AnnotationReplyConfig
)
=>
{
draft
.
enabled
=
true
draft
.
embedding_model
=
embeddingModel
if
(
!
draft
.
score_threshold
)
draft
.
score_threshold
=
ANNOTATION_DEFAULT
.
score_threshold
}))
}
const
setScore
=
(
score
:
number
,
embeddingModel
?:
EmbeddingModelConfig
)
=>
{
setAnnotationConfig
(
produce
(
annotationConfig
,
(
draft
:
AnnotationReplyConfig
)
=>
{
draft
.
score_threshold
=
score
if
(
embeddingModel
)
draft
.
embedding_model
=
embeddingModel
}))
}
const
handleDisableAnnotation
=
async
(
embeddingModel
:
EmbeddingModelConfig
)
=>
{
if
(
!
annotationConfig
.
enabled
)
return
await
updateAnnotationStatus
(
appId
,
AnnotationEnableStatus
.
disable
,
embeddingModel
)
setAnnotationConfig
(
produce
(
annotationConfig
,
(
draft
:
AnnotationReplyConfig
)
=>
{
draft
.
enabled
=
false
}))
}
return
{
handleEnableAnnotation
,
handleDisableAnnotation
,
isShowAnnotationConfigInit
,
setIsShowAnnotationConfigInit
,
isShowAnnotationFullModal
,
setIsShowAnnotationFullModal
,
setScore
,
}
}
export
default
useAnnotationConfig
web/app/components/base/features/feature-panel/index.tsx
View file @
17a67e79
...
...
@@ -12,18 +12,14 @@ import TextToSpeech from './text-to-speech'
import
SpeechToText
from
'./speech-to-text'
import
Citation
from
'./citation'
import
Moderation
from
'./moderation'
import
Annotation
from
'./annotation'
import
type
{
AnnotationProps
}
from
'./annotation'
export
type
FeaturePanelProps
=
{
onChange
?:
OnFeaturesChange
openingStatementProps
:
OpeningStatementProps
annotationProps
:
AnnotationProps
}
const
FeaturePanel
=
({
onChange
,
openingStatementProps
,
annotationProps
,
}:
FeaturePanelProps
)
=>
{
const
{
t
}
=
useTranslation
()
const
features
=
useFeatures
(
s
=>
s
.
features
)
...
...
@@ -98,11 +94,6 @@ const FeaturePanel = ({
<
Moderation
onChange=
{
onChange
}
/>
)
}
{
features
.
annotation
.
enabled
&&
(
<
Annotation
{
...
annotationProps
}
/>
)
}
</
div
>
</
div
>
)
...
...
web/app/components/workflow/nodes/_base/components/panel-operator/index.tsx
View file @
17a67e79
...
...
@@ -54,14 +54,14 @@ const PanelOperator = ({
},
[
toolsets
,
data
.
provider_id
])
const
handleGetAbout
=
useCallback
(()
=>
{
if
(
data
.
provider_id
&&
!
toolsMap
[
data
.
provider_id
]?.
length
)
{
if
(
data
.
provider_id
&&
!
toolsMap
[
data
.
provider_id
]?.
length
&&
open
)
{
fetchToolList
(
data
.
provider_id
).
then
((
list
:
any
)
=>
{
setToolsMap
(
produce
(
toolsMap
,
(
draft
)
=>
{
draft
[
data
.
provider_id
as
string
]
=
list
}))
})
}
},
[
data
,
toolsMap
,
fetchToolList
,
setToolsMap
])
},
[
data
,
toolsMap
,
fetchToolList
,
setToolsMap
,
open
])
useEffect
(()
=>
{
handleGetAbout
()
},
[
handleGetAbout
])
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment