update model provider list after deleting plugin

pull/12372/head
JzoNg 2 years ago
parent 5947e38ea0
commit 788f9de843

@ -9,7 +9,7 @@ import {
RiVerifiedBadgeLine, RiVerifiedBadgeLine,
} from '@remixicon/react' } from '@remixicon/react'
import type { PluginDetail } from '../types' import type { PluginDetail } from '../types'
import { PluginSource } from '../types' import { PluginSource, PluginType } from '../types'
import Description from '../card/base/description' import Description from '../card/base/description'
import Icon from '../card/base/card-icon' import Icon from '../card/base/card-icon'
import Title from '../card/base/title' import Title from '../card/base/title'
@ -30,6 +30,7 @@ import { Github } from '@/app/components/base/icons/src/public/common'
import { uninstallPlugin } from '@/service/plugins' import { uninstallPlugin } from '@/service/plugins'
import { useGetLanguage } from '@/context/i18n' import { useGetLanguage } from '@/context/i18n'
import { useModalContext } from '@/context/modal-context' import { useModalContext } from '@/context/modal-context'
import { useProviderContext } from '@/context/provider-context'
import { API_PREFIX, MARKETPLACE_URL_PREFIX } from '@/config' import { API_PREFIX, MARKETPLACE_URL_PREFIX } from '@/config'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
@ -38,7 +39,7 @@ const i18nPrefix = 'plugin.action'
type Props = { type Props = {
detail: PluginDetail detail: PluginDetail
onHide: () => void onHide: () => void
onUpdate: () => void onUpdate: (isDelete?: boolean) => void
} }
const DetailHeader = ({ const DetailHeader = ({
@ -50,6 +51,7 @@ const DetailHeader = ({
const locale = useGetLanguage() const locale = useGetLanguage()
const { checkForUpdates, fetchReleases } = useGitHubReleases() const { checkForUpdates, fetchReleases } = useGitHubReleases()
const { setShowUpdatePluginModal } = useModalContext() const { setShowUpdatePluginModal } = useModalContext()
const { refreshModelProviders } = useProviderContext()
const { const {
installation_id, installation_id,
@ -61,7 +63,7 @@ const DetailHeader = ({
meta, meta,
plugin_id, plugin_id,
} = detail } = detail
const { author, name, label, description, icon, verified } = detail.declaration const { author, category, name, label, description, icon, verified } = detail.declaration
const isFromGitHub = source === PluginSource.github const isFromGitHub = source === PluginSource.github
const isFromMarketplace = source === PluginSource.marketplace const isFromMarketplace = source === PluginSource.marketplace
@ -139,9 +141,11 @@ const DetailHeader = ({
hideDeleting() hideDeleting()
if (res.success) { if (res.success) {
hideDeleteConfirm() hideDeleteConfirm()
onUpdate() onUpdate(true)
if (category === PluginType.model)
refreshModelProviders()
} }
}, [hideDeleteConfirm, hideDeleting, installation_id, showDeleting, onUpdate]) }, [showDeleting, installation_id, hideDeleting, hideDeleteConfirm, onUpdate, category, refreshModelProviders])
// #plugin TODO# used in apps // #plugin TODO# used in apps
// const usedInApps = 3 // const usedInApps = 3

@ -21,6 +21,12 @@ const PluginDetailPanel: FC<Props> = ({
const handleHide = () => setCurrentPluginDetail(undefined) const handleHide = () => setCurrentPluginDetail(undefined)
const handleUpdate = (isDelete = false) => {
if (isDelete)
handleHide()
onUpdate()
}
if (!pluginDetail) if (!pluginDetail)
return null return null
@ -39,7 +45,7 @@ const PluginDetailPanel: FC<Props> = ({
<DetailHeader <DetailHeader
detail={pluginDetail} detail={pluginDetail}
onHide={handleHide} onHide={handleHide}
onUpdate={onUpdate} onUpdate={handleUpdate}
/> />
<div className='grow overflow-y-auto'> <div className='grow overflow-y-auto'>
{!!pluginDetail.declaration.tool && <ActionList />} {!!pluginDetail.declaration.tool && <ActionList />}

@ -12,7 +12,7 @@ import { useTranslation } from 'react-i18next'
import { usePluginPageContext } from '../plugin-page/context' import { usePluginPageContext } from '../plugin-page/context'
import { Github } from '../../base/icons/src/public/common' import { Github } from '../../base/icons/src/public/common'
import Badge from '../../base/badge' import Badge from '../../base/badge'
import { type PluginDetail, PluginSource } from '../types' import { type PluginDetail, PluginSource, PluginType } from '../types'
import CornerMark from '../card/base/corner-mark' import CornerMark from '../card/base/corner-mark'
import Description from '../card/base/description' import Description from '../card/base/description'
import OrgInfo from '../card/base/org-info' import OrgInfo from '../card/base/org-info'
@ -23,6 +23,7 @@ import { API_PREFIX, MARKETPLACE_URL_PREFIX } from '@/config'
import { useLanguage } from '../../header/account-setting/model-provider-page/hooks' import { useLanguage } from '../../header/account-setting/model-provider-page/hooks'
import { useInvalidateInstalledPluginList } from '@/service/use-plugins' import { useInvalidateInstalledPluginList } from '@/service/use-plugins'
import { useCategories } from '../hooks' import { useCategories } from '../hooks'
import { useProviderContext } from '@/context/provider-context'
type Props = { type Props = {
className?: string className?: string
@ -39,6 +40,7 @@ const PluginItem: FC<Props> = ({
const currentPluginDetail = usePluginPageContext(v => v.currentPluginDetail) const currentPluginDetail = usePluginPageContext(v => v.currentPluginDetail)
const setCurrentPluginDetail = usePluginPageContext(v => v.setCurrentPluginDetail) const setCurrentPluginDetail = usePluginPageContext(v => v.setCurrentPluginDetail)
const invalidateInstalledPluginList = useInvalidateInstalledPluginList() const invalidateInstalledPluginList = useInvalidateInstalledPluginList()
const { refreshModelProviders } = useProviderContext()
const { const {
source, source,
@ -54,6 +56,12 @@ const PluginItem: FC<Props> = ({
const orgName = useMemo(() => { const orgName = useMemo(() => {
return [PluginSource.github, PluginSource.marketplace].includes(source) ? author : '' return [PluginSource.github, PluginSource.marketplace].includes(source) ? author : ''
}, [source, author]) }, [source, author])
const handleDelete = () => {
invalidateInstalledPluginList()
if (category === PluginType.model)
refreshModelProviders()
}
return ( return (
<div <div
className={cn( className={cn(
@ -97,9 +105,7 @@ const PluginItem: FC<Props> = ({
isShowInfo={source === PluginSource.github} isShowInfo={source === PluginSource.github}
isShowDelete isShowDelete
meta={meta} meta={meta}
onDelete={() => { onDelete={handleDelete}
invalidateInstalledPluginList()
}}
/> />
</div> </div>
</div> </div>

@ -21,6 +21,7 @@ import { defaultPlan } from '@/app/components/billing/config'
type ProviderContextState = { type ProviderContextState = {
modelProviders: ModelProvider[] modelProviders: ModelProvider[]
refreshModelProviders: () => void
textGenerationModelList: Model[] textGenerationModelList: Model[]
supportRetrievalMethods: RETRIEVE_METHOD[] supportRetrievalMethods: RETRIEVE_METHOD[]
isAPIKeySet: boolean isAPIKeySet: boolean
@ -38,6 +39,7 @@ type ProviderContextState = {
} }
const ProviderContext = createContext<ProviderContextState>({ const ProviderContext = createContext<ProviderContextState>({
modelProviders: [], modelProviders: [],
refreshModelProviders: () => { },
textGenerationModelList: [], textGenerationModelList: [],
supportRetrievalMethods: [], supportRetrievalMethods: [],
isAPIKeySet: true, isAPIKeySet: true,
@ -79,7 +81,7 @@ type ProviderContextProviderProps = {
export const ProviderContextProvider = ({ export const ProviderContextProvider = ({
children, children,
}: ProviderContextProviderProps) => { }: ProviderContextProviderProps) => {
const { data: providersData } = useSWR('/workspaces/current/model-providers', fetchModelProviders) const { data: providersData, mutate: refreshModelProviders } = useSWR('/workspaces/current/model-providers', fetchModelProviders)
const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/' const fetchModelListUrlPrefix = '/workspaces/current/models/model-types/'
const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList) const { data: textGenerationModelList } = useSWR(`${fetchModelListUrlPrefix}${ModelTypeEnum.textGeneration}`, fetchModelList)
const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods) const { data: supportRetrievalMethods } = useSWR('/datasets/retrieval-setting', fetchSupportRetrievalMethods)
@ -112,6 +114,7 @@ export const ProviderContextProvider = ({
return ( return (
<ProviderContext.Provider value={{ <ProviderContext.Provider value={{
modelProviders: providersData?.data || [], modelProviders: providersData?.data || [],
refreshModelProviders,
textGenerationModelList: textGenerationModelList?.data || [], textGenerationModelList: textGenerationModelList?.data || [],
isAPIKeySet: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active), isAPIKeySet: !!textGenerationModelList?.data.some(model => model.status === ModelStatusEnum.active),
supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [], supportRetrievalMethods: supportRetrievalMethods?.retrieval_method || [],

Loading…
Cancel
Save