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.

install-from-marketplace.tsx 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useCallback, useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import Link from 'next/link'
  4. import {
  5. RiArrowDownSLine,
  6. RiArrowRightUpLine,
  7. } from '@remixicon/react'
  8. import type {
  9. ModelProvider,
  10. } from './declarations'
  11. import {
  12. useMarketplaceAllPlugins,
  13. } from './hooks'
  14. import Divider from '@/app/components/base/divider'
  15. import Loading from '@/app/components/base/loading'
  16. import ProviderCard from '@/app/components/plugins/provider-card'
  17. import List from '@/app/components/plugins/marketplace/list'
  18. import type { Plugin } from '@/app/components/plugins/types'
  19. import { MARKETPLACE_URL_PREFIX } from '@/config'
  20. import cn from '@/utils/classnames'
  21. import { getLocaleOnClient } from '@/i18n'
  22. type InstallFromMarketplaceProps = {
  23. providers: ModelProvider[]
  24. searchText: string
  25. }
  26. const InstallFromMarketplace = ({
  27. providers,
  28. searchText,
  29. }: InstallFromMarketplaceProps) => {
  30. const { t } = useTranslation()
  31. const [collapse, setCollapse] = useState(false)
  32. const locale = getLocaleOnClient()
  33. const {
  34. plugins: allPlugins,
  35. isLoading: isAllPluginsLoading,
  36. } = useMarketplaceAllPlugins(providers, searchText)
  37. const cardRender = useCallback((plugin: Plugin) => {
  38. if (plugin.type === 'bundle')
  39. return null
  40. return <ProviderCard key={plugin.plugin_id} payload={plugin} />
  41. }, [])
  42. return (
  43. <div className='mb-2'>
  44. <Divider className='!mt-4 h-px' />
  45. <div className='flex items-center justify-between'>
  46. <div className='system-md-semibold flex cursor-pointer items-center gap-1 text-text-primary' onClick={() => setCollapse(!collapse)}>
  47. <RiArrowDownSLine className={cn('h-4 w-4', collapse && '-rotate-90')} />
  48. {t('common.modelProvider.installProvider')}
  49. </div>
  50. <div className='mb-2 flex items-center pt-2'>
  51. <span className='system-sm-regular pr-1 text-text-tertiary'>{t('common.modelProvider.discoverMore')}</span>
  52. <Link target="_blank" href={`${MARKETPLACE_URL_PREFIX}`} className='system-sm-medium inline-flex items-center text-text-accent'>
  53. {t('plugin.marketplace.difyMarketplace')}
  54. <RiArrowRightUpLine className='h-4 w-4' />
  55. </Link>
  56. </div>
  57. </div>
  58. {!collapse && isAllPluginsLoading && <Loading type='area' />}
  59. {
  60. !isAllPluginsLoading && !collapse && (
  61. <List
  62. marketplaceCollections={[]}
  63. marketplaceCollectionPluginsMap={{}}
  64. plugins={allPlugins}
  65. showInstallButton
  66. locale={locale}
  67. cardContainerClassName='grid grid-cols-2 gap-2'
  68. cardRender={cardRender}
  69. emptyClassName='h-auto'
  70. />
  71. )
  72. }
  73. </div>
  74. )
  75. }
  76. export default InstallFromMarketplace