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

setting-form.tsx 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { z } from 'zod';
  2. import {
  3. FileUpload,
  4. FileUploadDropzone,
  5. FileUploadItem,
  6. FileUploadItemDelete,
  7. FileUploadItemMetadata,
  8. FileUploadItemPreview,
  9. FileUploadList,
  10. FileUploadTrigger,
  11. } from '@/components/file-upload';
  12. import { RAGFlowFormItem } from '@/components/ragflow-form';
  13. import { Button } from '@/components/ui/button';
  14. import { Form, FormControl, FormItem, FormLabel } from '@/components/ui/form';
  15. import { Input } from '@/components/ui/input';
  16. import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
  17. import { Textarea } from '@/components/ui/textarea';
  18. import { useTranslate } from '@/hooks/common-hooks';
  19. import { useFetchAgent } from '@/hooks/use-agent-request';
  20. import { transformBase64ToFile } from '@/utils/file-util';
  21. import { zodResolver } from '@hookform/resolvers/zod';
  22. import { CloudUpload, X } from 'lucide-react';
  23. import { useEffect } from 'react';
  24. import { useForm } from 'react-hook-form';
  25. const formSchema = z.object({
  26. title: z.string().min(1, {}),
  27. avatar: z.array(z.custom<File>()),
  28. description: z.string(),
  29. permission: z.string(),
  30. });
  31. export type SettingFormSchemaType = z.infer<typeof formSchema>;
  32. export const AgentSettingId = 'agentSettingId';
  33. type SettingFormProps = {
  34. submit: (values: SettingFormSchemaType) => void;
  35. };
  36. export function SettingForm({ submit }: SettingFormProps) {
  37. const { t } = useTranslate('flow.settings');
  38. const { data } = useFetchAgent();
  39. const form = useForm<SettingFormSchemaType>({
  40. resolver: zodResolver(formSchema),
  41. defaultValues: {
  42. title: '',
  43. permission: 'me',
  44. },
  45. });
  46. useEffect(() => {
  47. form.reset({
  48. title: data?.title,
  49. description: data?.description,
  50. avatar: data.avatar ? [transformBase64ToFile(data.avatar)] : [],
  51. permission: data?.permission,
  52. });
  53. }, [data, form]);
  54. return (
  55. <Form {...form}>
  56. <form
  57. onSubmit={form.handleSubmit(submit)}
  58. className="space-y-8"
  59. id={AgentSettingId}
  60. >
  61. <RAGFlowFormItem name="title" label={t('title')}>
  62. <Input />
  63. </RAGFlowFormItem>
  64. <RAGFlowFormItem name="avatar" label={t('photo')}>
  65. {(field) => (
  66. <FileUpload
  67. value={field.value}
  68. onValueChange={field.onChange}
  69. accept="image/*"
  70. maxFiles={1}
  71. onFileReject={(_, message) => {
  72. form.setError('avatar', {
  73. message,
  74. });
  75. }}
  76. multiple
  77. >
  78. <FileUploadDropzone className="flex-row flex-wrap border-dotted text-center">
  79. <CloudUpload className="size-4" />
  80. Drag and drop or
  81. <FileUploadTrigger asChild>
  82. <Button variant="link" size="sm" className="p-0">
  83. choose files
  84. </Button>
  85. </FileUploadTrigger>
  86. to upload
  87. </FileUploadDropzone>
  88. <FileUploadList>
  89. {field.value?.map((file: File, index: number) => (
  90. <FileUploadItem key={index} value={file}>
  91. <FileUploadItemPreview />
  92. <FileUploadItemMetadata />
  93. <FileUploadItemDelete asChild>
  94. <Button variant="ghost" size="icon" className="size-7">
  95. <X />
  96. <span className="sr-only">Delete</span>
  97. </Button>
  98. </FileUploadItemDelete>
  99. </FileUploadItem>
  100. ))}
  101. </FileUploadList>
  102. </FileUpload>
  103. )}
  104. </RAGFlowFormItem>
  105. <RAGFlowFormItem name="description" label={t('description')}>
  106. <Textarea rows={4} />
  107. </RAGFlowFormItem>
  108. <RAGFlowFormItem
  109. name="permission"
  110. label={t('permissions')}
  111. tooltip={t('permissionsTip')}
  112. >
  113. {(field) => (
  114. <RadioGroup
  115. onValueChange={field.onChange}
  116. value={field.value}
  117. className="flex"
  118. >
  119. <FormItem className="flex items-center gap-3">
  120. <FormControl>
  121. <RadioGroupItem value="me" id="me" />
  122. </FormControl>
  123. <FormLabel
  124. className="font-normal !m-0 cursor-pointer"
  125. htmlFor="me"
  126. >
  127. {t('me')}
  128. </FormLabel>
  129. </FormItem>
  130. <FormItem className="flex items-center gap-3">
  131. <FormControl>
  132. <RadioGroupItem value="team" id="team" />
  133. </FormControl>
  134. <FormLabel
  135. className="font-normal !m-0 cursor-pointer"
  136. htmlFor="team"
  137. >
  138. {t('team')}
  139. </FormLabel>
  140. </FormItem>
  141. </RadioGroup>
  142. )}
  143. </RAGFlowFormItem>
  144. </form>
  145. </Form>
  146. );
  147. }