You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

plugin.tsx 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import type { ActionItem, PluginSearchResult } from './types'
  2. import { renderI18nObject } from '@/i18n-config'
  3. import Icon from '../../plugins/card/base/card-icon'
  4. import { postMarketplace } from '@/service/base'
  5. import type { Plugin, PluginsFromMarketplaceResponse } from '../../plugins/types'
  6. import { getPluginIconInMarketplace } from '../../plugins/marketplace/utils'
  7. const parser = (plugins: Plugin[], locale: string): PluginSearchResult[] => {
  8. return plugins.map((plugin) => {
  9. return {
  10. id: plugin.name,
  11. title: renderI18nObject(plugin.label, locale) || plugin.name,
  12. description: renderI18nObject(plugin.brief, locale) || '',
  13. type: 'plugin' as const,
  14. icon: <Icon src={plugin.icon} />,
  15. data: plugin,
  16. }
  17. })
  18. }
  19. export const pluginAction: ActionItem = {
  20. key: '@plugin',
  21. shortcut: '@plugin',
  22. title: 'Search Plugins',
  23. description: 'Search and navigate to your plugins',
  24. search: async (_, searchTerm = '', locale) => {
  25. try {
  26. const response = await postMarketplace<{ data: PluginsFromMarketplaceResponse }>('/plugins/search/advanced', {
  27. body: {
  28. page: 1,
  29. page_size: 10,
  30. query: searchTerm,
  31. type: 'plugin',
  32. },
  33. })
  34. if (!response?.data?.plugins) {
  35. console.warn('Plugin search: Unexpected response structure', response)
  36. return []
  37. }
  38. const list = response.data.plugins.map(plugin => ({
  39. ...plugin,
  40. icon: getPluginIconInMarketplace(plugin),
  41. }))
  42. return parser(list, locale!)
  43. }
  44. catch (error) {
  45. console.warn('Plugin search failed:', error)
  46. return []
  47. }
  48. },
  49. }