您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

use-available-nodes-meta-data.ts 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. export const useAvailableNodesMetaData = () => {
  11. const { t } = useTranslation()
  12. const isChatMode = useIsChatMode()
  13. const language = useGetLanguage()
  14. const mergedNodesMetaData = useMemo(() => [
  15. ...WORKFLOW_COMMON_NODES,
  16. {
  17. ...StartDefault,
  18. metaData: {
  19. ...StartDefault.metaData,
  20. isStart: true,
  21. isRequired: true,
  22. isUndeletable: true,
  23. },
  24. },
  25. ...(
  26. isChatMode
  27. ? [
  28. {
  29. ...AnswerDefault,
  30. metaData: {
  31. ...AnswerDefault.metaData,
  32. isRequired: true,
  33. },
  34. },
  35. ]
  36. : [
  37. {
  38. ...EndDefault,
  39. metaData: {
  40. ...EndDefault.metaData,
  41. isRequired: true,
  42. },
  43. },
  44. ]
  45. ),
  46. ], [isChatMode])
  47. const prefixLink = useMemo(() => {
  48. if (language === 'zh_Hans')
  49. return 'https://docs.dify.ai/zh-hans/guides/workflow/node/'
  50. return 'https://docs.dify.ai/guides/workflow/node/'
  51. }, [language])
  52. const availableNodesMetaData = useMemo(() => mergedNodesMetaData.map((node) => {
  53. const { metaData } = node
  54. const title = t(`workflow.blocks.${metaData.type}`)
  55. const description = t(`workflow.blocksAbout.${metaData.type}`)
  56. return {
  57. ...node,
  58. metaData: {
  59. ...metaData,
  60. title,
  61. description,
  62. helpLinkUri: `${prefixLink}${metaData.helpLinkUri}`,
  63. },
  64. defaultValue: {
  65. ...node.defaultValue,
  66. type: metaData.type,
  67. title,
  68. },
  69. }
  70. }), [mergedNodesMetaData, t, prefixLink])
  71. const availableNodesMetaDataMap = useMemo(() => availableNodesMetaData.reduce((acc, node) => {
  72. acc![node.metaData.type] = node
  73. return acc
  74. }, {} as AvailableNodesMetaData['nodesMap']), [availableNodesMetaData])
  75. return useMemo(() => {
  76. return {
  77. nodes: availableNodesMetaData,
  78. nodesMap: availableNodesMetaDataMap,
  79. }
  80. }, [availableNodesMetaData, availableNodesMetaDataMap])
  81. }