index.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React, { useCallback, useEffect, useState } from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import { useBoolean } from 'ahooks'
  6. import cn from 'classnames'
  7. import Panel from '../panel'
  8. import { DataSourceType } from '../panel/types'
  9. import ConfigFirecrawlModal from './config-firecrawl-modal'
  10. import { fetchFirecrawlApiKey, removeFirecrawlApiKey } from '@/service/datasets'
  11. import type {
  12. DataSourceWebsiteItem,
  13. } from '@/models/common'
  14. import { useAppContext } from '@/context/app-context'
  15. import {
  16. WebsiteProvider,
  17. } from '@/models/common'
  18. import Toast from '@/app/components/base/toast'
  19. type Props = {}
  20. const DataSourceWebsite: FC<Props> = () => {
  21. const { t } = useTranslation()
  22. const { isCurrentWorkspaceManager } = useAppContext()
  23. const [list, setList] = useState<DataSourceWebsiteItem[]>([])
  24. const checkSetApiKey = useCallback(async () => {
  25. const res = await fetchFirecrawlApiKey() as any
  26. const list = res.settings.filter((item: DataSourceWebsiteItem) => item.provider === WebsiteProvider.fireCrawl && !item.disabled)
  27. setList(list)
  28. }, [])
  29. useEffect(() => {
  30. checkSetApiKey()
  31. // eslint-disable-next-line react-hooks/exhaustive-deps
  32. }, [])
  33. const [isShowConfig, {
  34. setTrue: showConfig,
  35. setFalse: hideConfig,
  36. }] = useBoolean(false)
  37. const handleAdded = useCallback(() => {
  38. checkSetApiKey()
  39. hideConfig()
  40. }, [checkSetApiKey, hideConfig])
  41. const handleRemove = useCallback(async () => {
  42. await removeFirecrawlApiKey(list[0].id)
  43. setList([])
  44. Toast.notify({
  45. type: 'success',
  46. message: t('common.api.remove'),
  47. })
  48. }, [list, t])
  49. return (
  50. <>
  51. <Panel
  52. type={DataSourceType.website}
  53. isConfigured={list.length > 0}
  54. onConfigure={showConfig}
  55. readonly={!isCurrentWorkspaceManager}
  56. configuredList={list.map(item => ({
  57. id: item.id,
  58. logo: ({ className }: { className: string }) => (
  59. <div className={cn(className, 'flex items-center justify-center w-5 h-5 bg-white border border-gray-100 text-xs font-medium text-gray-500 rounded ml-3')}>🔥</div>
  60. ),
  61. name: 'FireCrawl',
  62. isActive: true,
  63. }))}
  64. onRemove={handleRemove}
  65. />
  66. {isShowConfig && (
  67. <ConfigFirecrawlModal onSaved={handleAdded} onCancel={hideConfig} />
  68. )}
  69. </>
  70. )
  71. }
  72. export default React.memo(DataSourceWebsite)