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-available-nodes-meta-data.ts 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { useMemo } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { useGetLanguage } from '@/context/i18n'
  4. import StartDefault from '@/app/components/workflow/nodes/start/default'
  5. import EndDefault from '@/app/components/workflow/nodes/end/default'
  6. import AnswerDefault from '@/app/components/workflow/nodes/answer/default'
  7. import { WORKFLOW_COMMON_NODES } from '@/app/components/workflow/constants/node'
  8. import type { AvailableNodesMetaData } from '@/app/components/workflow/hooks-store/store'
  9. import { useIsChatMode } from './use-is-chat-mode'
  10. import { BlockEnum } from '@/app/components/workflow/types'
  11. export const useAvailableNodesMetaData = () => {
  12. const { t } = useTranslation()
  13. const isChatMode = useIsChatMode()
  14. const language = useGetLanguage()
  15. const mergedNodesMetaData = useMemo(() => [
  16. ...WORKFLOW_COMMON_NODES,
  17. StartDefault,
  18. ...(
  19. isChatMode
  20. ? [AnswerDefault]
  21. : [EndDefault]
  22. ),
  23. ], [isChatMode])
  24. const prefixLink = useMemo(() => {
  25. if (language === 'zh_Hans')
  26. return 'https://docs.dify.ai/zh-hans/guides/workflow/node/'
  27. return 'https://docs.dify.ai/guides/workflow/node/'
  28. }, [language])
  29. const availableNodesMetaData = useMemo(() => mergedNodesMetaData.map((node) => {
  30. const { metaData } = node
  31. const title = t(`workflow.blocks.${metaData.type}`)
  32. const description = t(`workflow.blocksAbout.${metaData.type}`)
  33. return {
  34. ...node,
  35. metaData: {
  36. ...metaData,
  37. title,
  38. description,
  39. helpLinkUri: `${prefixLink}${metaData.helpLinkUri}`,
  40. },
  41. defaultValue: {
  42. ...node.defaultValue,
  43. type: metaData.type,
  44. title,
  45. },
  46. }
  47. }), [mergedNodesMetaData, t, prefixLink])
  48. const availableNodesMetaDataMap = useMemo(() => availableNodesMetaData.reduce((acc, node) => {
  49. acc![node.metaData.type] = node
  50. return acc
  51. }, {} as AvailableNodesMetaData['nodesMap']), [availableNodesMetaData])
  52. return useMemo(() => {
  53. return {
  54. nodes: availableNodesMetaData,
  55. nodesMap: {
  56. ...availableNodesMetaDataMap,
  57. [BlockEnum.VariableAssigner]: availableNodesMetaDataMap?.[BlockEnum.VariableAggregator],
  58. },
  59. }
  60. }, [availableNodesMetaData, availableNodesMetaDataMap])
  61. }