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

use-show-drawer.tsx 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { useSetModalState } from '@/hooks/common-hooks';
  2. import { NodeMouseHandler } from '@xyflow/react';
  3. import get from 'lodash/get';
  4. import React, { useCallback, useEffect } from 'react';
  5. import { Operator } from '../constant';
  6. import useGraphStore from '../store';
  7. import { useCacheChatLog } from './use-cache-chat-log';
  8. import { useGetBeginNodeDataInputs } from './use-get-begin-query';
  9. import { useSaveGraph } from './use-save-graph';
  10. export const useShowFormDrawer = () => {
  11. const {
  12. clickedNodeId: clickNodeId,
  13. setClickedNodeId,
  14. getNode,
  15. setClickedToolId,
  16. } = useGraphStore((state) => state);
  17. const {
  18. visible: formDrawerVisible,
  19. hideModal: hideFormDrawer,
  20. showModal: showFormDrawer,
  21. } = useSetModalState();
  22. const handleShow = useCallback(
  23. (e: React.MouseEvent<Element>, nodeId: string) => {
  24. setClickedNodeId(nodeId);
  25. setClickedToolId(get(e.target, 'dataset.tool'));
  26. showFormDrawer();
  27. },
  28. [setClickedNodeId, setClickedToolId, showFormDrawer],
  29. );
  30. return {
  31. formDrawerVisible,
  32. hideFormDrawer,
  33. showFormDrawer: handleShow,
  34. clickedNode: getNode(clickNodeId),
  35. };
  36. };
  37. export const useShowSingleDebugDrawer = () => {
  38. const { visible, showModal, hideModal } = useSetModalState();
  39. const { saveGraph } = useSaveGraph();
  40. const showSingleDebugDrawer = useCallback(async () => {
  41. const saveRet = await saveGraph();
  42. if (saveRet?.code === 0) {
  43. showModal();
  44. }
  45. }, [saveGraph, showModal]);
  46. return {
  47. singleDebugDrawerVisible: visible,
  48. hideSingleDebugDrawer: hideModal,
  49. showSingleDebugDrawer,
  50. };
  51. };
  52. const ExcludedNodes = [Operator.Note];
  53. export function useShowDrawer({
  54. drawerVisible,
  55. hideDrawer,
  56. }: {
  57. drawerVisible: boolean;
  58. hideDrawer(): void;
  59. }) {
  60. const {
  61. visible: runVisible,
  62. showModal: showRunModal,
  63. hideModal: hideRunModal,
  64. } = useSetModalState();
  65. const {
  66. visible: chatVisible,
  67. showModal: showChatModal,
  68. hideModal: hideChatModal,
  69. } = useSetModalState();
  70. const {
  71. singleDebugDrawerVisible,
  72. showSingleDebugDrawer,
  73. hideSingleDebugDrawer,
  74. } = useShowSingleDebugDrawer();
  75. const { formDrawerVisible, hideFormDrawer, showFormDrawer, clickedNode } =
  76. useShowFormDrawer();
  77. const inputs = useGetBeginNodeDataInputs();
  78. useEffect(() => {
  79. if (drawerVisible) {
  80. if (inputs.length > 0) {
  81. showRunModal();
  82. hideChatModal();
  83. } else {
  84. showChatModal();
  85. hideRunModal();
  86. }
  87. }
  88. }, [
  89. hideChatModal,
  90. hideRunModal,
  91. showChatModal,
  92. showRunModal,
  93. drawerVisible,
  94. inputs,
  95. ]);
  96. const hideRunOrChatDrawer = useCallback(() => {
  97. hideChatModal();
  98. hideRunModal();
  99. hideDrawer();
  100. }, [hideChatModal, hideDrawer, hideRunModal]);
  101. const onPaneClick = useCallback(() => {
  102. hideFormDrawer();
  103. }, [hideFormDrawer]);
  104. const onNodeClick: NodeMouseHandler = useCallback(
  105. (e, node) => {
  106. if (!ExcludedNodes.some((x) => x === node.data.label)) {
  107. hideSingleDebugDrawer();
  108. // hideRunOrChatDrawer();
  109. showFormDrawer(e, node.id);
  110. }
  111. // handle single debug icon click
  112. if (
  113. get(e.target, 'dataset.play') === 'true' ||
  114. get(e.target, 'parentNode.dataset.play') === 'true'
  115. ) {
  116. showSingleDebugDrawer();
  117. }
  118. },
  119. [hideSingleDebugDrawer, showFormDrawer, showSingleDebugDrawer],
  120. );
  121. return {
  122. chatVisible,
  123. runVisible,
  124. onPaneClick,
  125. singleDebugDrawerVisible,
  126. showSingleDebugDrawer,
  127. hideSingleDebugDrawer,
  128. formDrawerVisible,
  129. showFormDrawer,
  130. clickedNode,
  131. onNodeClick,
  132. hideFormDrawer,
  133. hideRunOrChatDrawer,
  134. showChatModal,
  135. };
  136. }
  137. export function useShowLogSheet({
  138. setCurrentMessageId,
  139. }: Pick<ReturnType<typeof useCacheChatLog>, 'setCurrentMessageId'>) {
  140. const { visible, showModal, hideModal } = useSetModalState();
  141. const handleShow = useCallback(
  142. (messageId: string) => {
  143. setCurrentMessageId(messageId);
  144. showModal();
  145. },
  146. [setCurrentMessageId, showModal],
  147. );
  148. return {
  149. logSheetVisible: visible,
  150. hideLogSheet: hideModal,
  151. showLogSheet: handleShow,
  152. };
  153. }
  154. export function useHideFormSheetOnNodeDeletion({
  155. hideFormDrawer,
  156. }: Pick<ReturnType<typeof useShowFormDrawer>, 'hideFormDrawer'>) {
  157. const { nodes, clickedNodeId } = useGraphStore((state) => state);
  158. useEffect(() => {
  159. if (!nodes.some((x) => x.id === clickedNodeId)) {
  160. hideFormDrawer();
  161. }
  162. }, [clickedNodeId, hideFormDrawer, nodes]);
  163. }