|
|
|
@ -11,6 +11,7 @@ import cn from '@/utils/classnames'
|
|
|
|
import { debounce } from 'lodash-es'
|
|
|
|
import { debounce } from 'lodash-es'
|
|
|
|
import { useGetLanguage } from '@/context/i18n'
|
|
|
|
import { useGetLanguage } from '@/context/i18n'
|
|
|
|
import Button from '@/app/components/base/button'
|
|
|
|
import Button from '@/app/components/base/button'
|
|
|
|
|
|
|
|
import { RiPushpinLine } from '@remixicon/react'
|
|
|
|
|
|
|
|
|
|
|
|
type ApoToolsPreviewProps = {
|
|
|
|
type ApoToolsPreviewProps = {
|
|
|
|
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void;
|
|
|
|
onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void;
|
|
|
|
@ -74,6 +75,7 @@ const ApoToolsPreview = ({ onSelect, apoToolType, hidePopover }: ApoToolsPreview
|
|
|
|
const [provider, setProvider] = useState()
|
|
|
|
const [provider, setProvider] = useState()
|
|
|
|
const [searchText, setSearchText] = useState<string>()
|
|
|
|
const [searchText, setSearchText] = useState<string>()
|
|
|
|
const [openKey, setOpenKey] = useState<string | null>(null)
|
|
|
|
const [openKey, setOpenKey] = useState<string | null>(null)
|
|
|
|
|
|
|
|
const [selectedKey, setSelectedKey] = useState<string | null>(null)
|
|
|
|
|
|
|
|
|
|
|
|
const getAllTools = async () => {
|
|
|
|
const getAllTools = async () => {
|
|
|
|
const tools = await fetchApoTools(apoToolType, searchText, language)
|
|
|
|
const tools = await fetchApoTools(apoToolType, searchText, language)
|
|
|
|
@ -107,12 +109,27 @@ const ApoToolsPreview = ({ onSelect, apoToolType, hidePopover }: ApoToolsPreview
|
|
|
|
<div
|
|
|
|
<div
|
|
|
|
key={item.name + index}
|
|
|
|
key={item.name + index}
|
|
|
|
className={cn(
|
|
|
|
className={cn(
|
|
|
|
'flex items-center justify-between pl-3 pr-1 w-full rounded-lg hover:bg-state-base-hover cursor-pointer select-none',
|
|
|
|
'relative flex items-center justify-between pr-1 w-full rounded-lg hover:bg-state-base-hover cursor-pointer select-none',
|
|
|
|
(item.name + index) === openKey && 'bg-state-base-active text-red-500',
|
|
|
|
(item.name + index) === openKey && 'bg-state-base-active text-red-500',
|
|
|
|
)}
|
|
|
|
)}
|
|
|
|
onMouseEnter={() => setOpenKey(item.name + index)}
|
|
|
|
// onMouseEnter={() => setOpenKey(item.name + index)}
|
|
|
|
|
|
|
|
onMouseEnter={() => {
|
|
|
|
|
|
|
|
if (!selectedKey) setOpenKey(item.name + index)
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
onClick={() => {
|
|
|
|
|
|
|
|
const key = item.name + index
|
|
|
|
|
|
|
|
if (selectedKey === key) {
|
|
|
|
|
|
|
|
setSelectedKey(null)
|
|
|
|
|
|
|
|
setOpenKey(null)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
setSelectedKey(key)
|
|
|
|
|
|
|
|
setOpenKey(key)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<div className="flex grow items-center h-8">
|
|
|
|
{selectedKey === item.name + index && <RiPushpinLine className='absolute left-0' color="#feb137"/>}
|
|
|
|
|
|
|
|
<div className="flex grow items-center h-8 pl-4">
|
|
|
|
{/* <BlockIcon
|
|
|
|
{/* <BlockIcon
|
|
|
|
className='shrink-0'
|
|
|
|
className='shrink-0'
|
|
|
|
type={BlockEnum.Tool}
|
|
|
|
type={BlockEnum.Tool}
|
|
|
|
@ -124,7 +141,7 @@ const ApoToolsPreview = ({ onSelect, apoToolType, hidePopover }: ApoToolsPreview
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
))
|
|
|
|
))
|
|
|
|
}, [tools, toolDetail, openKey])
|
|
|
|
}, [tools, toolDetail, openKey, selectedKey])
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
useEffect(() => {
|
|
|
|
const fetchTools = debounce(() => {
|
|
|
|
const fetchTools = debounce(() => {
|
|
|
|
@ -151,13 +168,22 @@ const ApoToolsPreview = ({ onSelect, apoToolType, hidePopover }: ApoToolsPreview
|
|
|
|
{tools?.length > 0 && convertMetricsListToMenuItems()}
|
|
|
|
{tools?.length > 0 && convertMetricsListToMenuItems()}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{openKey && tools?.length > 0 && <div className="relative flex-1 min-w-[500px] overflow-auto max-w-[800px]">
|
|
|
|
{(selectedKey || openKey) && tools?.length > 0 && (
|
|
|
|
|
|
|
|
<div className="relative flex-1 min-w-[500px] overflow-auto max-w-[800px]">
|
|
|
|
{
|
|
|
|
{
|
|
|
|
tools?.map((item, index) => (
|
|
|
|
tools?.map((item, index) => {
|
|
|
|
<div key={item + index} className={(item.name + index) === openKey ? 'block' : 'hidden'}><ToolDetail toolDetail={item} handleSelect={handleSelect} apoToolType={apoToolType} /></div>
|
|
|
|
const key = item.name + index
|
|
|
|
))
|
|
|
|
const isVisible = key === (selectedKey ?? openKey)
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
|
|
<div key={key} className={isVisible ? 'block' : 'hidden'}>
|
|
|
|
|
|
|
|
<ToolDetail toolDetail={item} handleSelect={handleSelect} apoToolType={apoToolType} />
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</div>}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|