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.

use-config.ts 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import {
  2. useCallback,
  3. useEffect,
  4. useMemo,
  5. } from 'react'
  6. import { useStoreApi } from 'reactflow'
  7. import { useNodeDataUpdate } from '@/app/components/workflow/hooks'
  8. import type {
  9. DataSourceNodeType,
  10. ToolVarInputs,
  11. } from '../types'
  12. export const useConfig = (id: string, dataSourceList?: any[]) => {
  13. const store = useStoreApi()
  14. const { handleNodeDataUpdateWithSyncDraft } = useNodeDataUpdate()
  15. const getNodeData = useCallback(() => {
  16. const { getNodes } = store.getState()
  17. const nodes = getNodes()
  18. return nodes.find(node => node.id === id)
  19. }, [store, id])
  20. const handleNodeDataUpdate = useCallback((data: Partial<DataSourceNodeType>) => {
  21. handleNodeDataUpdateWithSyncDraft({
  22. id,
  23. data,
  24. })
  25. }, [id, handleNodeDataUpdateWithSyncDraft])
  26. const handleLocalFileDataSourceInit = useCallback(() => {
  27. const nodeData = getNodeData()
  28. if (nodeData?.data._dataSourceStartToAdd && nodeData?.data.provider_type === 'local_file') {
  29. handleNodeDataUpdate({
  30. ...nodeData.data,
  31. _dataSourceStartToAdd: false,
  32. })
  33. }
  34. }, [getNodeData, handleNodeDataUpdate])
  35. useEffect(() => {
  36. handleLocalFileDataSourceInit()
  37. }, [handleLocalFileDataSourceInit])
  38. const handleFileExtensionsChange = useCallback((fileExtensions: string[]) => {
  39. const nodeData = getNodeData()
  40. handleNodeDataUpdate({
  41. ...nodeData?.data,
  42. fileExtensions,
  43. })
  44. }, [handleNodeDataUpdate, getNodeData])
  45. const handleParametersChange = useCallback((datasource_parameters: ToolVarInputs) => {
  46. const nodeData = getNodeData()
  47. handleNodeDataUpdate({
  48. ...nodeData?.data,
  49. datasource_parameters,
  50. })
  51. }, [handleNodeDataUpdate, getNodeData])
  52. const outputSchema = useMemo(() => {
  53. const nodeData = getNodeData()
  54. if (!nodeData?.data || !dataSourceList) return []
  55. const currentDataSource = dataSourceList.find((ds: any) => ds.plugin_id === nodeData.data.plugin_id)
  56. const currentDataSourceItem = currentDataSource?.tools?.find((tool: any) => tool.name === nodeData.data.datasource_name)
  57. const output_schema = currentDataSourceItem?.output_schema
  58. const res: any[] = []
  59. if (!output_schema || !output_schema.properties)
  60. return res
  61. Object.keys(output_schema.properties).forEach((outputKey) => {
  62. const output = output_schema.properties[outputKey]
  63. const type = output.type
  64. if (type === 'object') {
  65. res.push({
  66. name: outputKey,
  67. value: output,
  68. })
  69. }
  70. else {
  71. res.push({
  72. name: outputKey,
  73. type: output.type === 'array'
  74. ? `Array[${output.items?.type.slice(0, 1).toLocaleUpperCase()}${output.items?.type.slice(1)}]`
  75. : `${output.type.slice(0, 1).toLocaleUpperCase()}${output.type.slice(1)}`,
  76. description: output.description,
  77. })
  78. }
  79. })
  80. return res
  81. }, [getNodeData, dataSourceList])
  82. const hasObjectOutput = useMemo(() => {
  83. const nodeData = getNodeData()
  84. if (!nodeData?.data || !dataSourceList) return false
  85. const currentDataSource = dataSourceList.find((ds: any) => ds.plugin_id === nodeData.data.plugin_id)
  86. const currentDataSourceItem = currentDataSource?.tools?.find((tool: any) => tool.name === nodeData.data.datasource_name)
  87. const output_schema = currentDataSourceItem?.output_schema
  88. if (!output_schema || !output_schema.properties)
  89. return false
  90. const properties = output_schema.properties
  91. return Object.keys(properties).some(key => properties[key].type === 'object')
  92. }, [getNodeData, dataSourceList])
  93. return {
  94. handleFileExtensionsChange,
  95. handleParametersChange,
  96. outputSchema,
  97. hasObjectOutput,
  98. }
  99. }