refactor: some field name in strategy status

This commit is contained in:
AkaraChen 2025-01-07 09:30:35 +08:00
parent 61d2f70927
commit 15f3e46c49
6 changed files with 115 additions and 11 deletions

View File

@ -1,10 +1,11 @@
import type { ReactNode } from 'react'
import { memo } from 'react' import { memo } from 'react'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
type BadgeProps = { type BadgeProps = {
className?: string className?: string
text?: string text?: ReactNode
children?: React.ReactNode children?: ReactNode
uppercase?: boolean uppercase?: boolean
hasRedCornerMark?: boolean hasRedCornerMark?: boolean
} }

View File

@ -18,6 +18,7 @@ import type { ToolWithProvider } from '../../../types'
import { CollectionType } from '@/app/components/tools/types' import { CollectionType } from '@/app/components/tools/types'
import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon' import useGetIcon from '@/app/components/plugins/install-plugin/base/use-get-icon'
import { useStrategyInfo } from '../../agent/use-config' import { useStrategyInfo } from '../../agent/use-config'
import { SwitchPluginVersion } from './switch-plugin-version'
const NotFoundWarn = (props: { const NotFoundWarn = (props: {
title: ReactNode, title: ReactNode,
@ -100,17 +101,18 @@ export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) =>
value?.agent_strategy_provider_name, value?.agent_strategy_provider_name,
value?.agent_strategy_name, value?.agent_strategy_name,
) )
const showPluginNotInstalledWarn = strategyStatus?.plugin?.source === 'external' const showPluginNotInstalledWarn = strategyStatus?.plugin?.source === 'external'
&& !strategyStatus.plugin.installed && !strategyStatus.plugin.installed
const showUnsupportedStrategy = strategyStatus?.plugin.source === 'external' const showUnsupportedStrategy = strategyStatus?.plugin.source === 'external'
&& strategyStatus.strategy === 'not-found' && !strategyStatus?.isExistInPlugin
const showSwitchVersion = strategyStatus?.strategy === 'not-found' const showSwitchVersion = !strategyStatus?.isExistInPlugin
&& strategyStatus.plugin.source === 'marketplace' && strategyStatus.plugin.installed && strategyStatus?.plugin.source === 'marketplace' && strategyStatus.plugin.installed
const showInstallButton = strategyStatus?.strategy === 'not-found' const showInstallButton = !strategyStatus?.isExistInPlugin
&& strategyStatus.plugin.source === 'marketplace' && !strategyStatus.plugin.installed && strategyStatus?.plugin.source === 'marketplace' && !strategyStatus.plugin.installed
const icon = list?.find( const icon = list?.find(
coll => coll.tools?.find(tool => tool.name === value?.agent_strategy_name), coll => coll.tools?.find(tool => tool.name === value?.agent_strategy_name),
@ -154,6 +156,11 @@ export const AgentStrategySelector = memo((props: AgentStrategySelectorProps) =>
/> />
: <RiArrowDownSLine className='size-4 text-text-tertiary' /> : <RiArrowDownSLine className='size-4 text-text-tertiary' />
} }
{showSwitchVersion && <SwitchPluginVersion
uniqueIdentifier={'langgenius/openai:12'}
onSelect={console.error}
version={''}
/>}
</div>} </div>}
</div> </div>
</PortalToFollowElemTrigger> </PortalToFollowElemTrigger>

View File

@ -0,0 +1,80 @@
'use client'
import Badge from '@/app/components/base/badge'
import Tooltip from '@/app/components/base/tooltip'
import PluginVersionPicker from '@/app/components/plugins/update-plugin/plugin-version-picker'
import { RiArrowLeftRightLine } from '@remixicon/react'
import { type FC, useCallback, useState } from 'react'
import cn from '@/utils/classnames'
import UpdateFromMarketplace from '@/app/components/plugins/update-plugin/from-market-place'
import { useBoolean } from 'ahooks'
import { useCheckInstalled } from '@/service/use-plugins'
export type SwitchPluginVersionProps = {
uniqueIdentifier: string
tooltip?: string
version: string
onSelect: (version: string) => void
}
export const SwitchPluginVersion: FC<SwitchPluginVersionProps> = (props) => {
const { uniqueIdentifier, tooltip, onSelect, version } = props
const [pluginId] = uniqueIdentifier.split(':')
const [isShow, setIsShow] = useState(false)
const [isShowUpdateModal, { setTrue: showUpdateModal, setFalse: hideUpdateModal }] = useBoolean(false)
const [targetVersion, setTargetVersion] = useState<string>()
const pluginDetails = useCheckInstalled({
pluginIds: [pluginId],
enabled: true,
})
const pluginDetail = pluginDetails.data?.plugins.at(0)
const handleUpdatedFromMarketplace = useCallback(() => {
hideUpdateModal()
onSelect(targetVersion!)
}, [hideUpdateModal, onSelect, targetVersion])
return <Tooltip popupContent={!isShow && tooltip} triggerMethod='hover'>
<div>
{isShowUpdateModal && pluginDetail && <UpdateFromMarketplace
payload={{
originalPackageInfo: {
id: uniqueIdentifier,
payload: pluginDetail.declaration,
},
targetPackageInfo: {
id: uniqueIdentifier,
version: targetVersion!,
},
}}
onCancel={hideUpdateModal}
onSave={handleUpdatedFromMarketplace}
/>}
<PluginVersionPicker
isShow={isShow}
onShowChange={setIsShow}
pluginID={pluginId}
currentVersion={version}
onSelect={(state) => {
setTargetVersion(state.version)
showUpdateModal()
}}
trigger={
<Badge
className={cn(
'mx-1 hover:bg-state-base-hover',
isShow && 'bg-state-base-hover',
)}
uppercase={true}
text={
<>
<div>{version}</div>
<RiArrowLeftRightLine className='ml-1 w-3 h-3 text-text-tertiary' />
</>
}
hasRedCornerMark={true}
/>
}
/>
</div>
</Tooltip>
}

View File

@ -89,9 +89,9 @@ const AgentNode: FC<NodeProps<AgentNodeType>> = (props) => {
{inputs.agent_strategy_name {inputs.agent_strategy_name
? <SettingItem ? <SettingItem
label={t('workflow.nodes.agent.strategy.shortLabel')} label={t('workflow.nodes.agent.strategy.shortLabel')}
status={currentStrategyStatus?.strategy === 'not-found' ? 'error' : undefined} status={!currentStrategyStatus?.isExistInPlugin ? 'error' : undefined}
tooltip={ tooltip={
currentStrategyStatus?.strategy === 'not-found' ? t('workflow.nodes.agent.strategyNotInstallTooltip', { !currentStrategyStatus?.isExistInPlugin ? t('workflow.nodes.agent.strategyNotInstallTooltip', {
plugin: pluginDetail?.declaration.label plugin: pluginDetail?.declaration.label
? renderI18nObject(pluginDetail?.declaration.label) ? renderI18nObject(pluginDetail?.declaration.label)
: undefined, : undefined,

View File

@ -18,7 +18,7 @@ export type StrategyStatus = {
source: 'external' | 'marketplace' source: 'external' | 'marketplace'
installed: boolean installed: boolean
} }
strategy: 'not-found' | 'normal' isExistInPlugin: boolean
} }
export const useStrategyInfo = ( export const useStrategyInfo = (
@ -46,7 +46,7 @@ export const useStrategyInfo = (
source: isInMarketplace ? 'marketplace' : 'external', source: isInMarketplace ? 'marketplace' : 'external',
installed: isPluginInstalled, installed: isPluginInstalled,
}, },
strategy: strategyExist ? 'normal' : 'not-found', isExistInPlugin: strategyExist,
} }
}, [strategy, marketplace, strategyProvider.isError, strategyProvider.isLoading]) }, [strategy, marketplace, strategyProvider.isError, strategyProvider.isLoading])
return { return {

View File

@ -0,0 +1,16 @@
'use client'
import { useState } from 'react'
import { SwitchPluginVersion } from '../components/workflow/nodes/_base/components/switch-plugin-version'
export default function Page() {
const [version, setVersion] = useState('0.0.1')
return <div className="p-20">
<SwitchPluginVersion
uniqueIdentifier={'langgenius/openai:12'}
onSelect={setVersion}
version={version}
tooltip='Switch to new version'
/>
</div>
}