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.

page.tsx 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. "use client";
  2. import { useState, useEffect } from 'react'
  3. import PageTitle from '@/components/ui/PageTitle';
  4. import { Upload, Select, Switch, Form, Button } from 'antd'
  5. import { UploadOutlined } from '@ant-design/icons';
  6. import InputList from '@/components/ui/InputList';
  7. import type { SelectProps } from 'antd';
  8. import TextArea from 'antd/es/input/TextArea';
  9. import { useQuery } from '@tanstack/react-query';
  10. import { getPersona } from '@/app/api/user/personaService';
  11. const CreatePersona: React.FC = () => {
  12. const [name, setName] = useState<string | undefined>("")
  13. const [isPremium, setIsPremium] = useState<boolean>(true)
  14. const [options, setOptions] = useState<SelectProps[] | undefined>()
  15. const [enabled, setEnabled] = useState({
  16. isWebSearch: false,
  17. isEcommerceShop: false,
  18. isCanvas: false,
  19. isDalleImageGeneration: false,
  20. isCodeInterpreter: false
  21. });
  22. const { data: personas } = useQuery({
  23. queryKey: ["getPersona"],
  24. queryFn: () => getPersona()
  25. })
  26. const uploadProps = {
  27. beforeUpload: (file: File) => {
  28. console.log('File uploaded:', file);
  29. return false; // Prevent automatic upload
  30. },
  31. };
  32. useEffect(() => {
  33. const latestData: SelectProps[] | undefined = personas?.map(persona => {
  34. return {
  35. label: persona.name,
  36. value: persona.id
  37. }
  38. })
  39. setOptions(latestData)
  40. }, [personas])
  41. return (
  42. <div className="flex flex-col bg-white">
  43. <PageTitle title='ADD KNOWLEDGE SOURCE' />
  44. <div className='px-4 py-6'>
  45. <Form layout="vertical">
  46. <Form.Item label={<p className='font-bold'>Select Persona</p>}>
  47. <Select
  48. allowClear
  49. style={{ width: '100%' }}
  50. placeholder="Select from list ..."
  51. options={options}
  52. />
  53. </Form.Item>
  54. <Form.Item label={<p className='font-bold'>Description</p>}>
  55. <TextArea
  56. placeholder='Add a short description about what Persona does'
  57. style={{ padding: 10 }}
  58. rows={2}
  59. value={name}
  60. onChange={(e) => setName(e.target.value)}
  61. />
  62. </Form.Item>
  63. <Form.Item label={<p className='font-bold'>Instruction</p>}>
  64. <TextArea
  65. placeholder='What does this Persona do?, How does it behave?, What should it avoid doing? '
  66. style={{ padding: 10 }}
  67. rows={4}
  68. value={name}
  69. onChange={(e) => setName(e.target.value)}
  70. />
  71. </Form.Item>
  72. <div className={`${isPremium ? 'visible' : 'hidden'}`}>
  73. <Form.Item
  74. label={
  75. <p className='font-bold'>
  76. Capabilities
  77. <span className='text-xs font-semibold px-2 py-1 bg-teal-200 rounded-full mx-2'>Premium</span>
  78. </p>
  79. }
  80. >
  81. <div className='flex flex-col gap-4'>
  82. {/* Web Search */}
  83. <div style={{maxHeight:"65px"}}>
  84. <div className='flex items-center gap-2'>
  85. <Switch
  86. checked={enabled.isWebSearch}
  87. onChange={(checked) =>
  88. setEnabled({ ...enabled, isWebSearch: checked })
  89. }
  90. />
  91. <span className='font-bold'>Web Search</span>
  92. </div>
  93. {enabled.isWebSearch && <InputList />}
  94. </div>
  95. {/* Commerce & Shop */}
  96. <div>
  97. <div className='flex items-center gap-2'>
  98. <Switch
  99. checked={enabled.isEcommerceShop}
  100. onChange={(checked) =>
  101. setEnabled({ ...enabled, isEcommerceShop: checked })
  102. }
  103. />
  104. <span className='font-bold'>Commerce & Shop</span>
  105. </div>
  106. {enabled.isEcommerceShop && (
  107. <Upload {...uploadProps} className='!mt-2 block'>
  108. <Button icon={<UploadOutlined />}>Upload Shop Catalog</Button>
  109. </Upload>
  110. )}
  111. </div>
  112. {/* Canvas */}
  113. <div>
  114. <div className='flex items-center gap-2'>
  115. <Switch
  116. checked={enabled.isCanvas}
  117. onChange={(checked) =>
  118. setEnabled({ ...enabled, isCanvas: checked })
  119. }
  120. />
  121. <span className='font-bold'>Canvas</span>
  122. </div>
  123. {enabled.isCanvas && (
  124. <Upload {...uploadProps} className='!mt-2 block'>
  125. <Button icon={<UploadOutlined />}>Upload Canvas File</Button>
  126. </Upload>
  127. )}
  128. </div>
  129. {/* DALL·E Image Generation */}
  130. <div>
  131. <div className='flex items-center gap-2'>
  132. <Switch
  133. checked={enabled.isDalleImageGeneration}
  134. onChange={(checked) =>
  135. setEnabled({ ...enabled, isDalleImageGeneration: checked })
  136. }
  137. />
  138. <span className='font-bold'>DALL-E Image Generation</span>
  139. </div>
  140. {enabled.isDalleImageGeneration && (
  141. <Upload {...uploadProps} className='!mt-2 block'>
  142. <Button icon={<UploadOutlined />}>Upload Prompt CSV</Button>
  143. </Upload>
  144. )}
  145. </div>
  146. {/* Code Interpreter */}
  147. <div>
  148. <div className='flex items-center gap-2'>
  149. <Switch
  150. checked={enabled.isCodeInterpreter}
  151. onChange={(checked) =>
  152. setEnabled({ ...enabled, isCodeInterpreter: checked })
  153. }
  154. />
  155. <span className='font-bold'>Code Interpreter & Data Analysis</span>
  156. </div>
  157. {enabled.isCodeInterpreter && (
  158. <Upload {...uploadProps} className='!mt-2 block'>
  159. <Button icon={<UploadOutlined />}>Upload Data File</Button>
  160. </Upload>
  161. )}
  162. </div>
  163. </div>
  164. </Form.Item>
  165. </div>
  166. <div className='text-center'>
  167. <Button type="primary" className='!w-fit !py-3 !text-xs !font-bold !px-10'>SUBMIT</Button>
  168. </div>
  169. </Form>
  170. </div>
  171. </div>
  172. )
  173. }
  174. export default CreatePersona;