validate-flow-value.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
  3. * SPDX-License-Identifier: MIT
  4. */
  5. import React from 'react';
  6. import { Field } from '@flowgram.ai/free-layout-editor';
  7. import { validateFlowValue } from '@flowgram.ai/form-materials';
  8. import { Button } from '@douyinfe/semi-ui';
  9. import { FreeFormMetaStoryBuilder, FormHeader } from '../../free-form-meta-story-builder';
  10. const DynamicValueInput = React.lazy(() =>
  11. import('@flowgram.ai/form-materials').then((module) => ({
  12. default: module.DynamicValueInput,
  13. }))
  14. );
  15. const PromptEditorWithVariables = React.lazy(() =>
  16. import('@flowgram.ai/form-materials').then((module) => ({
  17. default: module.PromptEditorWithVariables,
  18. }))
  19. );
  20. export const BasicStory = () => (
  21. <FreeFormMetaStoryBuilder
  22. filterEndNode
  23. transformInitialNode={{
  24. custom_0: (node) => {
  25. node.data.dynamic_value_input = {
  26. type: 'ref',
  27. content: ['start_0', 'unknown_key'],
  28. };
  29. node.data.required_dynamic_value_input = {
  30. type: 'constant',
  31. content: '',
  32. };
  33. node.data.prompt_editor = {
  34. type: 'template',
  35. content: 'Hello {{start_0.unknown_key}}',
  36. };
  37. return node;
  38. },
  39. }}
  40. formMeta={{
  41. validate: {
  42. dynamic_value_input: ({ value, context }) =>
  43. validateFlowValue(value, {
  44. node: context.node,
  45. errorMessages: {
  46. required: 'Value is required',
  47. unknownVariable: 'Unknown Variable',
  48. },
  49. }),
  50. required_dynamic_value_input: ({ value, context }) =>
  51. validateFlowValue(value, {
  52. node: context.node,
  53. required: true,
  54. errorMessages: {
  55. required: 'Value is required',
  56. unknownVariable: 'Unknown Variable',
  57. },
  58. }),
  59. prompt_editor: ({ value, context }) =>
  60. validateFlowValue(value, {
  61. node: context.node,
  62. required: true,
  63. errorMessages: {
  64. required: 'Prompt is required',
  65. unknownVariable: 'Unknown Variable In Template',
  66. },
  67. }),
  68. },
  69. render: ({ form }) => (
  70. <>
  71. <FormHeader />
  72. <b>Validate variable valid</b>
  73. <Field<any> name="dynamic_value_input">
  74. {({ field, fieldState }) => (
  75. <>
  76. <DynamicValueInput
  77. value={field.value}
  78. onChange={(value) => field.onChange(value)}
  79. />
  80. <span style={{ color: 'red' }}>
  81. {fieldState.errors?.map((e) => e.message).join('\n')}
  82. </span>
  83. </>
  84. )}
  85. </Field>
  86. <br />
  87. <b>Validate required value</b>
  88. <Field<any> name="required_dynamic_value_input">
  89. {({ field, fieldState }) => (
  90. <>
  91. <DynamicValueInput
  92. value={field.value}
  93. onChange={(value) => field.onChange(value)}
  94. />
  95. <span style={{ color: 'red' }}>
  96. {fieldState.errors?.map((e) => e.message).join('\n')}
  97. </span>
  98. </>
  99. )}
  100. </Field>
  101. <br />
  102. <b>Validate required and variables valid in prompt</b>
  103. <Field<any> name="prompt_editor">
  104. {({ field, fieldState }) => (
  105. <>
  106. <PromptEditorWithVariables
  107. value={field.value}
  108. onChange={(value) => field.onChange(value)}
  109. />
  110. <span style={{ color: 'red' }}>
  111. {fieldState.errors?.map((e) => e.message).join('\n')}
  112. </span>
  113. </>
  114. )}
  115. </Field>
  116. <br />
  117. <Button onClick={() => form.validate()}>Trigger Validate</Button>
  118. </>
  119. ),
  120. }}
  121. />
  122. );