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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { SelectWithSearch } from '@/components/originui/select-with-search';
  2. import {
  3. Form,
  4. FormControl,
  5. FormField,
  6. FormItem,
  7. FormLabel,
  8. FormMessage,
  9. } from '@/components/ui/form';
  10. import { Input } from '@/components/ui/input';
  11. import { useTranslate } from '@/hooks/common-hooks';
  12. import { zodResolver } from '@hookform/resolvers/zod';
  13. import { memo, useMemo } from 'react';
  14. import { useForm, useFormContext } from 'react-hook-form';
  15. import { z } from 'zod';
  16. import { initialCrawlerValues } from '../../constant';
  17. import { useWatchFormChange } from '../../hooks/use-watch-form-change';
  18. import { INextOperatorForm } from '../../interface';
  19. import { CrawlerResultOptions } from '../../options';
  20. import { QueryVariable } from '../components/query-variable';
  21. export function CrawlerProxyFormField() {
  22. const { t } = useTranslate('flow');
  23. const form = useFormContext();
  24. return (
  25. <FormField
  26. control={form.control}
  27. name="proxy"
  28. render={({ field }) => (
  29. <FormItem>
  30. <FormLabel>{t('proxy')}</FormLabel>
  31. <FormControl>
  32. <Input placeholder="like: http://127.0.0.1:8888" {...field} />
  33. </FormControl>
  34. <FormMessage />
  35. </FormItem>
  36. )}
  37. />
  38. );
  39. }
  40. export function CrawlerExtractTypeFormField() {
  41. const { t } = useTranslate('flow');
  42. const form = useFormContext();
  43. const crawlerResultOptions = useMemo(() => {
  44. return CrawlerResultOptions.map((x) => ({
  45. value: x,
  46. label: t(`crawlerResultOptions.${x}`),
  47. }));
  48. }, [t]);
  49. return (
  50. <FormField
  51. control={form.control}
  52. name="extract_type"
  53. render={({ field }) => (
  54. <FormItem>
  55. <FormLabel>{t('extractType')}</FormLabel>
  56. <FormControl>
  57. <SelectWithSearch {...field} options={crawlerResultOptions} />
  58. </FormControl>
  59. <FormMessage />
  60. </FormItem>
  61. )}
  62. />
  63. );
  64. }
  65. export const CrawlerFormSchema = {
  66. proxy: z.string().url(),
  67. extract_type: z.string(),
  68. };
  69. const FormSchema = z.object({
  70. query: z.string().optional(),
  71. ...CrawlerFormSchema,
  72. });
  73. function CrawlerForm({ node }: INextOperatorForm) {
  74. const form = useForm<z.infer<typeof FormSchema>>({
  75. resolver: zodResolver(FormSchema),
  76. defaultValues: initialCrawlerValues,
  77. mode: 'onChange',
  78. });
  79. useWatchFormChange(node?.id, form);
  80. return (
  81. <Form {...form}>
  82. <form
  83. className="space-y-6 p-4"
  84. onSubmit={(e) => {
  85. e.preventDefault();
  86. }}
  87. >
  88. <QueryVariable></QueryVariable>
  89. <CrawlerProxyFormField></CrawlerProxyFormField>
  90. <CrawlerExtractTypeFormField></CrawlerExtractTypeFormField>
  91. </form>
  92. </Form>
  93. );
  94. }
  95. export default memo(CrawlerForm);