mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-05-24 23:28:32 +08:00
148 lines
4.6 KiB
TypeScript
148 lines
4.6 KiB
TypeScript
import { PLUGIN_TYPE_SEARCH_MAP } from './plugin-type-switch'
|
|
import type { Plugin } from '@/app/components/plugins/types'
|
|
import { PluginType } from '@/app/components/plugins/types'
|
|
import type {
|
|
CollectionsAndPluginsSearchParams,
|
|
MarketplaceCollection,
|
|
PluginsSearchParams,
|
|
} from '@/app/components/plugins/marketplace/types'
|
|
import {
|
|
MARKETPLACE_API_PREFIX,
|
|
MARKETPLACE_URL_PREFIX,
|
|
} from '@/config'
|
|
|
|
export const getPluginIconInMarketplace = (plugin: Plugin) => {
|
|
if (plugin.type === 'bundle')
|
|
return `${MARKETPLACE_API_PREFIX}/bundles/${plugin.org}/${plugin.name}/icon`
|
|
return `${MARKETPLACE_API_PREFIX}/plugins/${plugin.org}/${plugin.name}/icon`
|
|
}
|
|
|
|
export const getFormattedPlugin = (bundle: any) => {
|
|
if (bundle.type === 'bundle') {
|
|
return {
|
|
...bundle,
|
|
icon: getPluginIconInMarketplace(bundle),
|
|
brief: bundle.description,
|
|
label: bundle.labels,
|
|
}
|
|
}
|
|
return {
|
|
...bundle,
|
|
icon: getPluginIconInMarketplace(bundle),
|
|
}
|
|
}
|
|
|
|
export const getPluginLinkInMarketplace = (plugin: Plugin) => {
|
|
if (plugin.type === 'bundle')
|
|
return `${MARKETPLACE_URL_PREFIX}/bundles/${plugin.org}/${plugin.name}`
|
|
return `${MARKETPLACE_URL_PREFIX}/plugins/${plugin.org}/${plugin.name}`
|
|
}
|
|
|
|
export const getMarketplacePluginsByCollectionId = async (collectionId: string, query?: CollectionsAndPluginsSearchParams) => {
|
|
let plugins = [] as Plugin[]
|
|
|
|
try {
|
|
const url = `${MARKETPLACE_API_PREFIX}/collections/${collectionId}/plugins`
|
|
const marketplaceCollectionPluginsData = await globalThis.fetch(
|
|
url,
|
|
{
|
|
cache: 'no-store',
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
category: query?.category,
|
|
exclude: query?.exclude,
|
|
type: query?.type,
|
|
}),
|
|
},
|
|
)
|
|
const marketplaceCollectionPluginsDataJson = await marketplaceCollectionPluginsData.json()
|
|
plugins = marketplaceCollectionPluginsDataJson.data.plugins.map((plugin: Plugin) => {
|
|
return getFormattedPlugin(plugin)
|
|
})
|
|
}
|
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
catch (e) {
|
|
plugins = []
|
|
}
|
|
|
|
return plugins
|
|
}
|
|
|
|
export const getMarketplaceCollectionsAndPlugins = async (query?: CollectionsAndPluginsSearchParams) => {
|
|
let marketplaceCollections = [] as MarketplaceCollection[]
|
|
let marketplaceCollectionPluginsMap = {} as Record<string, Plugin[]>
|
|
try {
|
|
let marketplaceUrl = `${MARKETPLACE_API_PREFIX}/collections?page=1&page_size=100`
|
|
if (query?.condition)
|
|
marketplaceUrl += `&condition=${query.condition}`
|
|
if (query?.type)
|
|
marketplaceUrl += `&type=${query.type}`
|
|
const marketplaceCollectionsData = await globalThis.fetch(marketplaceUrl, { cache: 'no-store' })
|
|
const marketplaceCollectionsDataJson = await marketplaceCollectionsData.json()
|
|
marketplaceCollections = marketplaceCollectionsDataJson.data.collections
|
|
await Promise.all(marketplaceCollections.map(async (collection: MarketplaceCollection) => {
|
|
const plugins = await getMarketplacePluginsByCollectionId(collection.name, query)
|
|
|
|
marketplaceCollectionPluginsMap[collection.name] = plugins
|
|
}))
|
|
}
|
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
catch (e) {
|
|
marketplaceCollections = []
|
|
marketplaceCollectionPluginsMap = {}
|
|
}
|
|
|
|
return {
|
|
marketplaceCollections,
|
|
marketplaceCollectionPluginsMap,
|
|
}
|
|
}
|
|
|
|
export const getMarketplaceListCondition = (pluginType: string) => {
|
|
if (pluginType === PluginType.tool)
|
|
return 'category=tool'
|
|
|
|
if (pluginType === PluginType.agent)
|
|
return 'category=agent-strategy'
|
|
|
|
if (pluginType === PluginType.model)
|
|
return 'category=model'
|
|
|
|
if (pluginType === PluginType.extension)
|
|
return 'category=endpoint'
|
|
|
|
if (pluginType === 'bundle')
|
|
return 'type=bundle'
|
|
|
|
return ''
|
|
}
|
|
|
|
export const getMarketplaceListFilterType = (category: string) => {
|
|
if (category === PLUGIN_TYPE_SEARCH_MAP.all)
|
|
return undefined
|
|
|
|
if (category === PLUGIN_TYPE_SEARCH_MAP.bundle)
|
|
return 'bundle'
|
|
|
|
return 'plugin'
|
|
}
|
|
|
|
export const updateSearchParams = (pluginsSearchParams: PluginsSearchParams) => {
|
|
const { query, category, tags } = pluginsSearchParams
|
|
const url = new URL(window.location.href)
|
|
const categoryChanged = url.searchParams.get('category') !== category
|
|
if (query)
|
|
url.searchParams.set('q', query)
|
|
else
|
|
url.searchParams.delete('q')
|
|
if (category)
|
|
url.searchParams.set('category', category)
|
|
else
|
|
url.searchParams.delete('category')
|
|
if (tags && tags.length)
|
|
url.searchParams.set('tags', tags.join(','))
|
|
else
|
|
url.searchParams.delete('tags')
|
|
history[`${categoryChanged ? 'pushState' : 'replaceState'}`]({}, '', url)
|
|
}
|