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.

form-hooks.ts 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { useCallback } from 'react';
  2. import { Operator } from './constant';
  3. import useGraphStore from './store';
  4. const ExcludedNodesMap = {
  5. // exclude some nodes downstream of the classification node
  6. [Operator.Categorize]: [
  7. Operator.Categorize,
  8. Operator.Answer,
  9. Operator.Begin,
  10. Operator.Relevant,
  11. ],
  12. [Operator.Relevant]: [Operator.Begin, Operator.Answer, Operator.Relevant],
  13. [Operator.Generate]: [Operator.Begin],
  14. };
  15. export const useBuildFormSelectOptions = (
  16. operatorName: Operator,
  17. selfId?: string, // exclude the current node
  18. ) => {
  19. const nodes = useGraphStore((state) => state.nodes);
  20. const buildCategorizeToOptions = useCallback(
  21. (toList: string[]) => {
  22. const excludedNodes: Operator[] = ExcludedNodesMap[operatorName] ?? [];
  23. return nodes
  24. .filter(
  25. (x) =>
  26. excludedNodes.every((y) => y !== x.data.label) &&
  27. x.id !== selfId &&
  28. !toList.some((y) => y === x.id), // filter out selected values ​​in other to fields from the current drop-down box options
  29. )
  30. .map((x) => ({ label: x.data.name, value: x.id }));
  31. },
  32. [nodes, operatorName, selfId],
  33. );
  34. return buildCategorizeToOptions;
  35. };
  36. /**
  37. * dumped
  38. * @param nodeId
  39. * @returns
  40. */
  41. export const useHandleFormSelectChange = (nodeId?: string) => {
  42. const { addEdge, deleteEdgeBySourceAndSourceHandle } = useGraphStore(
  43. (state) => state,
  44. );
  45. const handleSelectChange = useCallback(
  46. (name?: string) => (value?: string) => {
  47. if (nodeId && name) {
  48. if (value) {
  49. addEdge({
  50. source: nodeId,
  51. target: value,
  52. sourceHandle: name,
  53. targetHandle: null,
  54. });
  55. } else {
  56. // clear selected value
  57. deleteEdgeBySourceAndSourceHandle({
  58. source: nodeId,
  59. sourceHandle: name,
  60. });
  61. }
  62. }
  63. },
  64. [addEdge, nodeId, deleteEdgeBySourceAndSourceHandle],
  65. );
  66. return { handleSelectChange };
  67. };