@strapi/content-type-builder 5.25.0 → 5.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/dist/admin/components/AIChat/Chat.js +431 -0
  2. package/dist/admin/components/AIChat/Chat.js.map +1 -0
  3. package/dist/admin/components/AIChat/Chat.mjs +429 -0
  4. package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
  5. package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
  6. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
  7. package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
  8. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
  9. package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
  10. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
  11. package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
  12. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
  13. package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
  14. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
  15. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
  16. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
  17. package/dist/admin/components/AIChat/components/Alert.js +46 -0
  18. package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
  19. package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
  20. package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
  21. package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
  22. package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
  23. package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
  24. package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
  25. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
  26. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
  27. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
  28. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
  29. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
  30. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
  31. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
  32. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
  33. package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
  34. package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
  35. package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
  36. package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
  37. package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
  38. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
  39. package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
  40. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
  41. package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
  42. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
  43. package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
  44. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
  45. package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
  46. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
  47. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
  48. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
  49. package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
  50. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
  51. package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
  52. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
  53. package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
  54. package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
  55. package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
  56. package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
  57. package/dist/admin/components/AIChat/components/Input.js +126 -0
  58. package/dist/admin/components/AIChat/components/Input.js.map +1 -0
  59. package/dist/admin/components/AIChat/components/Input.mjs +121 -0
  60. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
  61. package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
  62. package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
  63. package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
  64. package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
  65. package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
  66. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
  67. package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
  68. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
  69. package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
  70. package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
  71. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
  72. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
  73. package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
  74. package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
  75. package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
  76. package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
  77. package/dist/admin/components/AIChat/components/StepModal.js +175 -0
  78. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
  79. package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
  80. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
  81. package/dist/admin/components/AIChat/components/animations.js +67 -0
  82. package/dist/admin/components/AIChat/components/animations.js.map +1 -0
  83. package/dist/admin/components/AIChat/components/animations.mjs +65 -0
  84. package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
  85. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
  86. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
  87. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
  88. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
  89. package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
  90. package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
  91. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
  92. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
  93. package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
  94. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
  95. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
  96. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
  97. package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
  98. package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
  99. package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
  100. package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
  101. package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
  102. package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
  103. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
  104. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
  105. package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
  106. package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
  107. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
  108. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
  109. package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
  110. package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
  111. package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
  112. package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
  113. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
  114. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
  115. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
  116. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
  117. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
  118. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
  119. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
  120. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
  121. package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
  122. package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
  123. package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
  124. package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
  125. package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
  126. package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
  127. package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
  128. package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
  129. package/dist/admin/components/AIChat/lib/constants.js +16 -0
  130. package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
  131. package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
  132. package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
  133. package/dist/admin/components/AIChat/lib/misc.js +8 -0
  134. package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
  135. package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
  136. package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
  137. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
  138. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
  139. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
  140. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
  141. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
  142. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
  143. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
  144. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
  145. package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
  146. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
  147. package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
  148. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
  149. package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
  150. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
  151. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
  152. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
  153. package/dist/admin/components/ComponentList.js +1 -0
  154. package/dist/admin/components/ComponentList.js.map +1 -1
  155. package/dist/admin/components/ComponentList.mjs +1 -0
  156. package/dist/admin/components/ComponentList.mjs.map +1 -1
  157. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  158. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  159. package/dist/admin/components/DataManager/reducer.js +48 -6
  160. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  161. package/dist/admin/components/DataManager/reducer.mjs +48 -6
  162. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  163. package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
  164. package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
  165. package/dist/admin/pages/App/index.js +60 -29
  166. package/dist/admin/pages/App/index.js.map +1 -1
  167. package/dist/admin/pages/App/index.mjs +62 -31
  168. package/dist/admin/pages/App/index.mjs.map +1 -1
  169. package/dist/admin/pages/ListView/EmptyState.js +75 -9
  170. package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
  171. package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
  172. package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
  173. package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
  174. package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
  175. package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
  176. package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
  177. package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
  178. package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
  179. package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
  180. package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
  181. package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
  182. package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
  183. package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
  184. package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
  185. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
  186. package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
  187. package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
  188. package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
  189. package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
  190. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
  191. package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
  192. package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
  193. package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
  194. package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
  195. package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
  196. package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
  197. package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
  198. package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
  199. package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
  200. package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
  201. package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
  202. package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
  203. package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
  204. package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
  205. package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
  206. package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
  207. package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
  208. package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
  209. package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
  210. package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
  211. package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
  212. package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
  213. package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
  214. package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
  215. package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
  216. package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
  217. package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
  218. package/dist/admin/src/components/ComponentList.d.ts +1 -1
  219. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
  220. package/dist/admin/translations/ar.json.js +187 -2
  221. package/dist/admin/translations/ar.json.js.map +1 -1
  222. package/dist/admin/translations/ar.json.mjs +187 -3
  223. package/dist/admin/translations/ar.json.mjs.map +1 -1
  224. package/dist/admin/translations/de.json.js +42 -7
  225. package/dist/admin/translations/de.json.js.map +1 -1
  226. package/dist/admin/translations/de.json.mjs +42 -7
  227. package/dist/admin/translations/de.json.mjs.map +1 -1
  228. package/dist/admin/translations/en.json.js +53 -2
  229. package/dist/admin/translations/en.json.js.map +1 -1
  230. package/dist/admin/translations/en.json.mjs +53 -2
  231. package/dist/admin/translations/en.json.mjs.map +1 -1
  232. package/dist/admin/translations/es.json.js +37 -15
  233. package/dist/admin/translations/es.json.js.map +1 -1
  234. package/dist/admin/translations/es.json.mjs +37 -15
  235. package/dist/admin/translations/es.json.mjs.map +1 -1
  236. package/dist/admin/translations/fr.json.js +165 -3
  237. package/dist/admin/translations/fr.json.js.map +1 -1
  238. package/dist/admin/translations/fr.json.mjs +165 -4
  239. package/dist/admin/translations/fr.json.mjs.map +1 -1
  240. package/dist/admin/translations/id.json.js +93 -23
  241. package/dist/admin/translations/id.json.js.map +1 -1
  242. package/dist/admin/translations/id.json.mjs +93 -23
  243. package/dist/admin/translations/id.json.mjs.map +1 -1
  244. package/dist/admin/translations/it.json.js +75 -6
  245. package/dist/admin/translations/it.json.js.map +1 -1
  246. package/dist/admin/translations/it.json.mjs +75 -6
  247. package/dist/admin/translations/it.json.mjs.map +1 -1
  248. package/dist/admin/translations/ja.json.js +191 -5
  249. package/dist/admin/translations/ja.json.js.map +1 -1
  250. package/dist/admin/translations/ja.json.mjs +191 -6
  251. package/dist/admin/translations/ja.json.mjs.map +1 -1
  252. package/dist/admin/translations/ko.json.js +70 -16
  253. package/dist/admin/translations/ko.json.js.map +1 -1
  254. package/dist/admin/translations/ko.json.mjs +70 -16
  255. package/dist/admin/translations/ko.json.mjs.map +1 -1
  256. package/dist/admin/translations/ms.json.js +104 -31
  257. package/dist/admin/translations/ms.json.js.map +1 -1
  258. package/dist/admin/translations/ms.json.mjs +104 -31
  259. package/dist/admin/translations/ms.json.mjs.map +1 -1
  260. package/dist/admin/translations/nl.json.js +95 -15
  261. package/dist/admin/translations/nl.json.js.map +1 -1
  262. package/dist/admin/translations/nl.json.mjs +95 -15
  263. package/dist/admin/translations/nl.json.mjs.map +1 -1
  264. package/dist/admin/translations/pl.json.js +55 -11
  265. package/dist/admin/translations/pl.json.js.map +1 -1
  266. package/dist/admin/translations/pl.json.mjs +55 -11
  267. package/dist/admin/translations/pl.json.mjs.map +1 -1
  268. package/dist/admin/translations/pt-BR.json.js +54 -10
  269. package/dist/admin/translations/pt-BR.json.js.map +1 -1
  270. package/dist/admin/translations/pt-BR.json.mjs +54 -10
  271. package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
  272. package/dist/admin/translations/pt.json.js +187 -2
  273. package/dist/admin/translations/pt.json.js.map +1 -1
  274. package/dist/admin/translations/pt.json.mjs +187 -3
  275. package/dist/admin/translations/pt.json.mjs.map +1 -1
  276. package/dist/admin/translations/ru.json.js +26 -1
  277. package/dist/admin/translations/ru.json.js.map +1 -1
  278. package/dist/admin/translations/ru.json.mjs +26 -1
  279. package/dist/admin/translations/ru.json.mjs.map +1 -1
  280. package/dist/admin/translations/sk.json.js +21 -1
  281. package/dist/admin/translations/sk.json.js.map +1 -1
  282. package/dist/admin/translations/sk.json.mjs +21 -1
  283. package/dist/admin/translations/sk.json.mjs.map +1 -1
  284. package/dist/admin/translations/sv.json.js +21 -1
  285. package/dist/admin/translations/sv.json.js.map +1 -1
  286. package/dist/admin/translations/sv.json.mjs +21 -1
  287. package/dist/admin/translations/sv.json.mjs.map +1 -1
  288. package/dist/admin/translations/th.json.js +21 -1
  289. package/dist/admin/translations/th.json.js.map +1 -1
  290. package/dist/admin/translations/th.json.mjs +21 -1
  291. package/dist/admin/translations/th.json.mjs.map +1 -1
  292. package/dist/admin/translations/tr.json.js +21 -1
  293. package/dist/admin/translations/tr.json.js.map +1 -1
  294. package/dist/admin/translations/tr.json.mjs +21 -1
  295. package/dist/admin/translations/tr.json.mjs.map +1 -1
  296. package/dist/admin/translations/uk.json.js +21 -2
  297. package/dist/admin/translations/uk.json.js.map +1 -1
  298. package/dist/admin/translations/uk.json.mjs +21 -2
  299. package/dist/admin/translations/uk.json.mjs.map +1 -1
  300. package/dist/admin/translations/zh-Hans.json.js +222 -133
  301. package/dist/admin/translations/zh-Hans.json.js.map +1 -1
  302. package/dist/admin/translations/zh-Hans.json.mjs +222 -133
  303. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
  304. package/dist/admin/translations/zh.json.js +21 -1
  305. package/dist/admin/translations/zh.json.js.map +1 -1
  306. package/dist/admin/translations/zh.json.mjs +21 -1
  307. package/dist/admin/translations/zh.json.mjs.map +1 -1
  308. package/dist/server/index.js +2 -0
  309. package/dist/server/index.js.map +1 -1
  310. package/dist/server/index.mjs +2 -0
  311. package/dist/server/index.mjs.map +1 -1
  312. package/dist/server/register.js +98 -0
  313. package/dist/server/register.js.map +1 -0
  314. package/dist/server/register.mjs +96 -0
  315. package/dist/server/register.mjs.map +1 -0
  316. package/dist/server/src/controllers/ai/auth.d.ts +1 -0
  317. package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
  318. package/dist/server/src/controllers/ai/index.d.ts +1 -0
  319. package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
  320. package/dist/server/src/index.d.ts +1 -0
  321. package/dist/server/src/index.d.ts.map +1 -1
  322. package/dist/server/src/register.d.ts +11 -0
  323. package/dist/server/src/register.d.ts.map +1 -0
  324. package/package.json +12 -5
  325. package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
  326. package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
  327. package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
  328. package/dist/admin/components/DataManager/utils/formatSchemas.mjs.map +0 -1
@@ -0,0 +1,65 @@
1
+ import { keyframes } from 'styled-components';
2
+
3
+ const ANIMATIONS = {
4
+ fadeIn: keyframes`
5
+ from {
6
+ opacity: 0;
7
+ }
8
+ to {
9
+ opacity: 1;
10
+ }
11
+ `,
12
+ scaleIn: keyframes`
13
+ from {
14
+ opacity: 0;
15
+ transform: scale(0.7);
16
+ }
17
+ to {
18
+ opacity: 1;
19
+ transform: scale(1);
20
+ }
21
+ `,
22
+ slideUpIn: keyframes`
23
+ from {
24
+ opacity: 0;
25
+ transform: translateY(10px);
26
+ }
27
+ to {
28
+ opacity: 1;
29
+ transform: translateY(0);
30
+ }
31
+ `,
32
+ slideUpOut: keyframes`
33
+ from {
34
+ opacity: 1;
35
+ transform: translateY(0);
36
+ }
37
+ to {
38
+ opacity: 0;
39
+ transform: translateY(10px);
40
+ }
41
+ `,
42
+ slideDownIn: keyframes`
43
+ from {
44
+ opacity: 0;
45
+ transform: translateY(-10px);
46
+ }
47
+ to {
48
+ opacity: 1;
49
+ transform: translateY(0);
50
+ }
51
+ `,
52
+ slideDownOut: keyframes`
53
+ from {
54
+ opacity: 1;
55
+ transform: translateY(0);
56
+ }
57
+ to {
58
+ opacity: 0;
59
+ transform: translateY(-10px);
60
+ }
61
+ `
62
+ };
63
+
64
+ export { ANIMATIONS };
65
+ //# sourceMappingURL=animations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.mjs","sources":["../../../../../admin/src/components/AIChat/components/animations.ts"],"sourcesContent":["import { keyframes } from 'styled-components';\n\nexport const ANIMATIONS = {\n fadeIn: keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n `,\n\n scaleIn: keyframes`\n from {\n opacity: 0;\n transform: scale(0.7);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n `,\n\n slideUpIn: keyframes`\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n `,\n\n slideUpOut: keyframes`\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(10px);\n }\n `,\n\n slideDownIn: keyframes`\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n `,\n\n slideDownOut: keyframes`\n from {\n opacity: 1;\n transform: translateY(0);\n }\n to {\n opacity: 0;\n transform: translateY(-10px);\n }\n `,\n};\n"],"names":["ANIMATIONS","fadeIn","keyframes","scaleIn","slideUpIn","slideUpOut","slideDownIn","slideDownOut"],"mappings":";;MAEaA,UAAa,GAAA;AACxBC,IAAAA,MAAAA,EAAQC,SAAS;;;;;;;EAOjB,CAAC;AAEDC,IAAAA,OAAAA,EAASD,SAAS;;;;;;;;;EASlB,CAAC;AAEDE,IAAAA,SAAAA,EAAWF,SAAS;;;;;;;;;EASpB,CAAC;AAEDG,IAAAA,UAAAA,EAAYH,SAAS;;;;;;;;;EASrB,CAAC;AAEDI,IAAAA,WAAAA,EAAaJ,SAAS;;;;;;;;;EAStB,CAAC;AAEDK,IAAAA,YAAAA,EAAcL,SAAS;;;;;;;;;EASvB;AACF;;;;"}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ const FigmaIcon = (props)=>{
6
+ return /*#__PURE__*/ jsxRuntime.jsxs("svg", {
7
+ width: props.width || 16,
8
+ height: props.height || 16,
9
+ viewBox: "0 0 200 300",
10
+ xmlns: "http://www.w3.org/2000/svg",
11
+ "aria-label": "Figma logo",
12
+ style: {
13
+ display: 'block',
14
+ margin: '0 auto',
15
+ ...props.style
16
+ },
17
+ ...props,
18
+ children: [
19
+ /*#__PURE__*/ jsxRuntime.jsx("title", {
20
+ children: "Figma.logo"
21
+ }),
22
+ /*#__PURE__*/ jsxRuntime.jsx("desc", {
23
+ children: "Created using Figma"
24
+ }),
25
+ /*#__PURE__*/ jsxRuntime.jsx("path", {
26
+ d: "M50 300c27.6 0 50-22.4 50-50v-50H50c-27.6 0-50 22.4-50 50s22.4 50 50 50z",
27
+ fill: "#0acf83"
28
+ }),
29
+ /*#__PURE__*/ jsxRuntime.jsx("path", {
30
+ d: "M50 200c-27.6 0-50-22.4-50-50s22.4-50 50-50h50v100H50z",
31
+ fill: "#a259ff"
32
+ }),
33
+ /*#__PURE__*/ jsxRuntime.jsx("path", {
34
+ d: "M0 50C0 22.4 22.4 0 50 0h50v100H50C22.4 100 0 77.6 0 50z",
35
+ fill: "#f24e1e"
36
+ }),
37
+ /*#__PURE__*/ jsxRuntime.jsx("path", {
38
+ d: "M100 0h50c27.6 0 50 22.4 50 50s-22.4 50-50 50h-50V0z",
39
+ fill: "#ff7262"
40
+ }),
41
+ /*#__PURE__*/ jsxRuntime.jsx("path", {
42
+ d: "M200 150c0 27.6-22.4 50-50 50s-50-22.4-50-50 22.4-50 50-50 50 22.4 50 50z",
43
+ fill: "#1abcfe"
44
+ })
45
+ ]
46
+ });
47
+ };
48
+
49
+ exports.FigmaIcon = FigmaIcon;
50
+ //# sourceMappingURL=FigmaIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FigmaIcon.js","sources":["../../../../../../admin/src/components/AIChat/components/icons/FigmaIcon.tsx"],"sourcesContent":["interface FigmaIconProps extends React.SVGProps<SVGSVGElement> {}\n\nexport const FigmaIcon = (props: FigmaIconProps) => {\n return (\n <svg\n width={props.width || 16}\n height={props.height || 16}\n viewBox=\"0 0 200 300\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"Figma logo\"\n style={{ display: 'block', margin: '0 auto', ...props.style }}\n {...props}\n >\n <title>Figma.logo</title>\n <desc>Created using Figma</desc>\n <path\n d=\"M50 300c27.6 0 50-22.4 50-50v-50H50c-27.6 0-50 22.4-50 50s22.4 50 50 50z\"\n fill=\"#0acf83\"\n />\n <path d=\"M50 200c-27.6 0-50-22.4-50-50s22.4-50 50-50h50v100H50z\" fill=\"#a259ff\" />\n <path d=\"M0 50C0 22.4 22.4 0 50 0h50v100H50C22.4 100 0 77.6 0 50z\" fill=\"#f24e1e\" />\n <path d=\"M100 0h50c27.6 0 50 22.4 50 50s-22.4 50-50 50h-50V0z\" fill=\"#ff7262\" />\n <path\n d=\"M200 150c0 27.6-22.4 50-50 50s-50-22.4-50-50 22.4-50 50-50 50 22.4 50 50z\"\n fill=\"#1abcfe\"\n />\n </svg>\n );\n};\n"],"names":["FigmaIcon","props","_jsxs","svg","width","height","viewBox","xmlns","aria-label","style","display","margin","_jsx","title","desc","path","d","fill"],"mappings":";;;;AAEO,MAAMA,YAAY,CAACC,KAAAA,GAAAA;AACxB,IAAA,qBACEC,eAACC,CAAAA,KAAAA,EAAAA;QACCC,KAAOH,EAAAA,KAAAA,CAAMG,KAAK,IAAI,EAAA;QACtBC,MAAQJ,EAAAA,KAAAA,CAAMI,MAAM,IAAI,EAAA;QACxBC,OAAQ,EAAA,aAAA;QACRC,KAAM,EAAA,4BAAA;QACNC,YAAW,EAAA,YAAA;QACXC,KAAO,EAAA;YAAEC,OAAS,EAAA,OAAA;YAASC,MAAQ,EAAA,QAAA;AAAU,YAAA,GAAGV,MAAMQ;AAAM,SAAA;AAC3D,QAAA,GAAGR,KAAK;;0BAETW,cAACC,CAAAA,OAAAA,EAAAA;AAAM,gBAAA,QAAA,EAAA;;0BACPD,cAACE,CAAAA,MAAAA,EAAAA;AAAK,gBAAA,QAAA,EAAA;;0BACNF,cAACG,CAAAA,MAAAA,EAAAA;gBACCC,CAAE,EAAA,0EAAA;gBACFC,IAAK,EAAA;;0BAEPL,cAACG,CAAAA,MAAAA,EAAAA;gBAAKC,CAAE,EAAA,wDAAA;gBAAyDC,IAAK,EAAA;;0BACtEL,cAACG,CAAAA,MAAAA,EAAAA;gBAAKC,CAAE,EAAA,0DAAA;gBAA2DC,IAAK,EAAA;;0BACxEL,cAACG,CAAAA,MAAAA,EAAAA;gBAAKC,CAAE,EAAA,sDAAA;gBAAuDC,IAAK,EAAA;;0BACpEL,cAACG,CAAAA,MAAAA,EAAAA;gBACCC,CAAE,EAAA,2EAAA;gBACFC,IAAK,EAAA;;;;AAIb;;;;"}
@@ -0,0 +1,48 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ const FigmaIcon = (props)=>{
4
+ return /*#__PURE__*/ jsxs("svg", {
5
+ width: props.width || 16,
6
+ height: props.height || 16,
7
+ viewBox: "0 0 200 300",
8
+ xmlns: "http://www.w3.org/2000/svg",
9
+ "aria-label": "Figma logo",
10
+ style: {
11
+ display: 'block',
12
+ margin: '0 auto',
13
+ ...props.style
14
+ },
15
+ ...props,
16
+ children: [
17
+ /*#__PURE__*/ jsx("title", {
18
+ children: "Figma.logo"
19
+ }),
20
+ /*#__PURE__*/ jsx("desc", {
21
+ children: "Created using Figma"
22
+ }),
23
+ /*#__PURE__*/ jsx("path", {
24
+ d: "M50 300c27.6 0 50-22.4 50-50v-50H50c-27.6 0-50 22.4-50 50s22.4 50 50 50z",
25
+ fill: "#0acf83"
26
+ }),
27
+ /*#__PURE__*/ jsx("path", {
28
+ d: "M50 200c-27.6 0-50-22.4-50-50s22.4-50 50-50h50v100H50z",
29
+ fill: "#a259ff"
30
+ }),
31
+ /*#__PURE__*/ jsx("path", {
32
+ d: "M0 50C0 22.4 22.4 0 50 0h50v100H50C22.4 100 0 77.6 0 50z",
33
+ fill: "#f24e1e"
34
+ }),
35
+ /*#__PURE__*/ jsx("path", {
36
+ d: "M100 0h50c27.6 0 50 22.4 50 50s-22.4 50-50 50h-50V0z",
37
+ fill: "#ff7262"
38
+ }),
39
+ /*#__PURE__*/ jsx("path", {
40
+ d: "M200 150c0 27.6-22.4 50-50 50s-50-22.4-50-50 22.4-50 50-50 50 22.4 50 50z",
41
+ fill: "#1abcfe"
42
+ })
43
+ ]
44
+ });
45
+ };
46
+
47
+ export { FigmaIcon };
48
+ //# sourceMappingURL=FigmaIcon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FigmaIcon.mjs","sources":["../../../../../../admin/src/components/AIChat/components/icons/FigmaIcon.tsx"],"sourcesContent":["interface FigmaIconProps extends React.SVGProps<SVGSVGElement> {}\n\nexport const FigmaIcon = (props: FigmaIconProps) => {\n return (\n <svg\n width={props.width || 16}\n height={props.height || 16}\n viewBox=\"0 0 200 300\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-label=\"Figma logo\"\n style={{ display: 'block', margin: '0 auto', ...props.style }}\n {...props}\n >\n <title>Figma.logo</title>\n <desc>Created using Figma</desc>\n <path\n d=\"M50 300c27.6 0 50-22.4 50-50v-50H50c-27.6 0-50 22.4-50 50s22.4 50 50 50z\"\n fill=\"#0acf83\"\n />\n <path d=\"M50 200c-27.6 0-50-22.4-50-50s22.4-50 50-50h50v100H50z\" fill=\"#a259ff\" />\n <path d=\"M0 50C0 22.4 22.4 0 50 0h50v100H50C22.4 100 0 77.6 0 50z\" fill=\"#f24e1e\" />\n <path d=\"M100 0h50c27.6 0 50 22.4 50 50s-22.4 50-50 50h-50V0z\" fill=\"#ff7262\" />\n <path\n d=\"M200 150c0 27.6-22.4 50-50 50s-50-22.4-50-50 22.4-50 50-50 50 22.4 50 50z\"\n fill=\"#1abcfe\"\n />\n </svg>\n );\n};\n"],"names":["FigmaIcon","props","_jsxs","svg","width","height","viewBox","xmlns","aria-label","style","display","margin","_jsx","title","desc","path","d","fill"],"mappings":";;AAEO,MAAMA,YAAY,CAACC,KAAAA,GAAAA;AACxB,IAAA,qBACEC,IAACC,CAAAA,KAAAA,EAAAA;QACCC,KAAOH,EAAAA,KAAAA,CAAMG,KAAK,IAAI,EAAA;QACtBC,MAAQJ,EAAAA,KAAAA,CAAMI,MAAM,IAAI,EAAA;QACxBC,OAAQ,EAAA,aAAA;QACRC,KAAM,EAAA,4BAAA;QACNC,YAAW,EAAA,YAAA;QACXC,KAAO,EAAA;YAAEC,OAAS,EAAA,OAAA;YAASC,MAAQ,EAAA,QAAA;AAAU,YAAA,GAAGV,MAAMQ;AAAM,SAAA;AAC3D,QAAA,GAAGR,KAAK;;0BAETW,GAACC,CAAAA,OAAAA,EAAAA;AAAM,gBAAA,QAAA,EAAA;;0BACPD,GAACE,CAAAA,MAAAA,EAAAA;AAAK,gBAAA,QAAA,EAAA;;0BACNF,GAACG,CAAAA,MAAAA,EAAAA;gBACCC,CAAE,EAAA,0EAAA;gBACFC,IAAK,EAAA;;0BAEPL,GAACG,CAAAA,MAAAA,EAAAA;gBAAKC,CAAE,EAAA,wDAAA;gBAAyDC,IAAK,EAAA;;0BACtEL,GAACG,CAAAA,MAAAA,EAAAA;gBAAKC,CAAE,EAAA,0DAAA;gBAA2DC,IAAK,EAAA;;0BACxEL,GAACG,CAAAA,MAAAA,EAAAA;gBAAKC,CAAE,EAAA,sDAAA;gBAAuDC,IAAK,EAAA;;0BACpEL,GAACG,CAAAA,MAAAA,EAAAA;gBACCC,CAAE,EAAA,2EAAA;gBACFC,IAAK,EAAA;;;;AAIb;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+
5
+ const StopIcon = (props)=>{
6
+ return /*#__PURE__*/ jsxRuntime.jsx("svg", {
7
+ width: "16",
8
+ height: "16",
9
+ viewBox: "0 0 16 16",
10
+ fill: "none",
11
+ xmlns: "http://www.w3.org/2000/svg",
12
+ ...props,
13
+ children: /*#__PURE__*/ jsxRuntime.jsx("rect", {
14
+ x: "2",
15
+ y: "2",
16
+ width: "11",
17
+ height: "11",
18
+ rx: "2",
19
+ fill: "white"
20
+ })
21
+ });
22
+ };
23
+
24
+ exports.StopIcon = StopIcon;
25
+ //# sourceMappingURL=StopIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopIcon.js","sources":["../../../../../../admin/src/components/AIChat/components/icons/StopIcon.tsx"],"sourcesContent":["interface StopIconProps extends React.SVGProps<SVGSVGElement> {}\n\nexport const StopIcon = (props: StopIconProps) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"11\" height=\"11\" rx=\"2\" fill=\"white\" />\n </svg>\n );\n};\n"],"names":["StopIcon","props","_jsx","svg","width","height","viewBox","fill","xmlns","rect","x","y","rx"],"mappings":";;;;AAEO,MAAMA,WAAW,CAACC,KAAAA,GAAAA;AACvB,IAAA,qBACEC,cAACC,CAAAA,KAAAA,EAAAA;QACCC,KAAM,EAAA,IAAA;QACNC,MAAO,EAAA,IAAA;QACPC,OAAQ,EAAA,WAAA;QACRC,IAAK,EAAA,MAAA;QACLC,KAAM,EAAA,4BAAA;AACL,QAAA,GAAGP,KAAK;AAET,QAAA,QAAA,gBAAAC,cAACO,CAAAA,MAAAA,EAAAA;YAAKC,CAAE,EAAA,GAAA;YAAIC,CAAE,EAAA,GAAA;YAAIP,KAAM,EAAA,IAAA;YAAKC,MAAO,EAAA,IAAA;YAAKO,EAAG,EAAA,GAAA;YAAIL,IAAK,EAAA;;;AAG3D;;;;"}
@@ -0,0 +1,23 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+
3
+ const StopIcon = (props)=>{
4
+ return /*#__PURE__*/ jsx("svg", {
5
+ width: "16",
6
+ height: "16",
7
+ viewBox: "0 0 16 16",
8
+ fill: "none",
9
+ xmlns: "http://www.w3.org/2000/svg",
10
+ ...props,
11
+ children: /*#__PURE__*/ jsx("rect", {
12
+ x: "2",
13
+ y: "2",
14
+ width: "11",
15
+ height: "11",
16
+ rx: "2",
17
+ fill: "white"
18
+ })
19
+ });
20
+ };
21
+
22
+ export { StopIcon };
23
+ //# sourceMappingURL=StopIcon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopIcon.mjs","sources":["../../../../../../admin/src/components/AIChat/components/icons/StopIcon.tsx"],"sourcesContent":["interface StopIconProps extends React.SVGProps<SVGSVGElement> {}\n\nexport const StopIcon = (props: StopIconProps) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <rect x=\"2\" y=\"2\" width=\"11\" height=\"11\" rx=\"2\" fill=\"white\" />\n </svg>\n );\n};\n"],"names":["StopIcon","props","_jsx","svg","width","height","viewBox","fill","xmlns","rect","x","y","rx"],"mappings":";;AAEO,MAAMA,WAAW,CAACC,KAAAA,GAAAA;AACvB,IAAA,qBACEC,GAACC,CAAAA,KAAAA,EAAAA;QACCC,KAAM,EAAA,IAAA;QACNC,MAAO,EAAA,IAAA;QACPC,OAAQ,EAAA,WAAA;QACRC,IAAK,EAAA,MAAA;QACLC,KAAM,EAAA,4BAAA;AACL,QAAA,GAAGP,KAAK;AAET,QAAA,QAAA,gBAAAC,GAACO,CAAAA,MAAAA,EAAAA;YAAKC,CAAE,EAAA,GAAA;YAAIC,CAAE,EAAA,GAAA;YAAIP,KAAM,EAAA,IAAA;YAAKC,MAAO,EAAA,IAAA;YAAKO,EAAG,EAAA,GAAA;YAAIL,IAAK,EAAA;;;AAG3D;;;;"}
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var react = require('@ai-sdk/react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var ee = require('@strapi/admin/strapi-admin/ee');
7
+ var ai = require('ai');
8
+ var aiClient = require('../lib/aiClient.js');
9
+ var constants = require('../lib/constants.js');
10
+
11
+ /* -------------------------------------------------------------------------------------------------
12
+ * Hooks
13
+ * -----------------------------------------------------------------------------------------------*/ const TOO_MANY_REQUESTS_ERROR = 'Too many requests';
14
+ const LICENSE_LIMIT_REACHED_ERROR = 'License limit';
15
+ const LICENSE_LIMIT_EXCEEDED_ERROR = 'AI credit limit exceeded';
16
+ const CHAT_TOO_LONG_ERROR = 'Chat too long';
17
+ /**
18
+ * Base hook factory for making type-safe API calls to Strapi AI endpoints.
19
+ * Creates a hook specific to a single endpoint.
20
+ */ const createAIFetchHook = (endpoint)=>{
21
+ return ()=>{
22
+ const strapiVersion = strapiAdmin.useAppInfo('useAIFetch', (state)=>state.strapiVersion);
23
+ const projectId = strapiAdmin.useAppInfo('useAIFetch', (state)=>state.projectId);
24
+ const userId = strapiAdmin.useAppInfo('useAIFetch-user', (state)=>state.userId);
25
+ const aiUsage = ee.useGetAIUsageQuery(undefined, {
26
+ refetchOnMountOrArgChange: true
27
+ });
28
+ const [isPending, setIsPending] = React.useState(false);
29
+ const [error, setError] = React.useState(null);
30
+ /**
31
+ * Make a type-safe API call to the specified Strapi AI endpoint with retry logic
32
+ */ const fetchData = async (options = {})=>{
33
+ setIsPending(true);
34
+ setError(null);
35
+ try {
36
+ const fullUrl = `${constants.STRAPI_AI_URL}${endpoint}`;
37
+ const isJson = !!options.body && !options.formData;
38
+ const response = await aiClient.fetchAI(fullUrl, {
39
+ method: 'POST',
40
+ headers: isJson ? {
41
+ 'Content-Type': 'application/json',
42
+ ...options.headers || {}
43
+ } : options.headers,
44
+ body: options.formData ? options.formData : isJson ? JSON.stringify(options.body || {}) : undefined,
45
+ ctx: {
46
+ strapiVersion,
47
+ projectId,
48
+ userId
49
+ }
50
+ });
51
+ // refetch ai usage data on every successful request
52
+ aiUsage.refetch();
53
+ const body = await aiClient.safeParseJson(response);
54
+ if (!response.ok) {
55
+ throw new Error(`Error: ${response.statusText}`);
56
+ }
57
+ return body;
58
+ } catch (err) {
59
+ setError(err instanceof Error ? err.message : `Failed to fetch data from ${endpoint}`);
60
+ return null;
61
+ } finally{
62
+ setIsPending(false);
63
+ }
64
+ };
65
+ return {
66
+ isPending,
67
+ error,
68
+ fetch: fetchData
69
+ };
70
+ };
71
+ };
72
+ // Create specific hooks for each endpoint
73
+ const useFetchGenerateTitle = createAIFetchHook('/schemas/chat/generate-title');
74
+ const useFetchUploadProject = createAIFetchHook('/schemas/chat/attachment');
75
+ const useFetchSendFeedback = createAIFetchHook('/schemas/chat/feedback');
76
+ const useFetchUploadMedia = createAIFetchHook('/media/upload');
77
+ /**
78
+ * Hook wrapper for AI SDK's useChat with Strapi-specific configuration
79
+ */ const useAIChat = (props)=>{
80
+ const strapiVersion = strapiAdmin.useAppInfo('useAIChat', (state)=>state.strapiVersion);
81
+ const projectId = strapiAdmin.useAppInfo('useAIFetch', (state)=>state.projectId);
82
+ const userId = strapiAdmin.useAppInfo('useAIChat-user', (state)=>state.userId);
83
+ const customFetch = aiClient.makeChatFetch({
84
+ strapiVersion,
85
+ projectId,
86
+ userId
87
+ });
88
+ return react.useChat({
89
+ ...props,
90
+ transport: new ai.DefaultChatTransport({
91
+ api: constants.STRAPI_AI_CHAT_URL,
92
+ fetch: customFetch
93
+ })
94
+ });
95
+ };
96
+
97
+ exports.CHAT_TOO_LONG_ERROR = CHAT_TOO_LONG_ERROR;
98
+ exports.LICENSE_LIMIT_EXCEEDED_ERROR = LICENSE_LIMIT_EXCEEDED_ERROR;
99
+ exports.LICENSE_LIMIT_REACHED_ERROR = LICENSE_LIMIT_REACHED_ERROR;
100
+ exports.TOO_MANY_REQUESTS_ERROR = TOO_MANY_REQUESTS_ERROR;
101
+ exports.createAIFetchHook = createAIFetchHook;
102
+ exports.useAIChat = useAIChat;
103
+ exports.useFetchGenerateTitle = useFetchGenerateTitle;
104
+ exports.useFetchSendFeedback = useFetchSendFeedback;
105
+ exports.useFetchUploadMedia = useFetchUploadMedia;
106
+ exports.useFetchUploadProject = useFetchUploadProject;
107
+ //# sourceMappingURL=useAIFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAIFetch.js","sources":["../../../../../admin/src/components/AIChat/hooks/useAIFetch.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\n\n/**\n * In charge of fetching data from Strapi AI endpoints\n */\n\nimport { useState } from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useAppInfo } from '@strapi/admin/strapi-admin';\nimport { useGetAIUsageQuery } from '@strapi/admin/strapi-admin/ee';\nimport { DefaultChatTransport } from 'ai';\n\nimport { fetchAI, makeChatFetch, safeParseJson } from '../lib/aiClient';\nimport { STRAPI_AI_CHAT_URL, STRAPI_AI_URL } from '../lib/constants';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Chat title\n */\nexport namespace GenerateTitle {\n export interface Request {\n body: {\n chatId: string;\n message: string;\n };\n }\n export interface Response {\n data: {\n title: string;\n };\n error?: string;\n }\n}\n\n/**\n * Upload a project to the chat\n */\nexport namespace UploadProject {\n export interface Request {\n body: {\n chatId: string;\n name: string;\n type: 'code';\n files: {\n path: string;\n content: string;\n }[];\n };\n }\n export interface Response {\n data: Attachment;\n error?: string;\n }\n}\n\n/**\n * Send chat feedback\n */\nexport type FeedbackReasonIds =\n | 'invalid_schema'\n | 'bad_recommendation'\n | 'slow'\n | 'instructions_ignored'\n | 'being_lazy'\n | 'other';\n\nnamespace SendFeedback {\n export interface Request {\n body: {\n chatId: string;\n type: 'upvote' | 'downvote';\n feedback?: string;\n reasons?: FeedbackReasonIds[];\n messageId: string;\n messages: UIMessage[];\n schemas: Schema[];\n };\n }\n}\n\n/**\n * Upload media\n */\nexport namespace UploadMedia {\n export interface Request {\n body: {\n url: string; // base64 image\n filename: string;\n chatId: string;\n };\n }\n export interface Response {\n data: Attachment;\n error?: string;\n }\n}\n\n/**\n * Collection of API endpoints and their corresponding request/response types\n */\ntype AIEndpoints = {\n '/schemas/chat/generate-title': {\n request: GenerateTitle.Request;\n response: GenerateTitle.Response;\n };\n '/schemas/chat/attachment': {\n request: UploadProject.Request;\n response: UploadProject.Response;\n };\n '/schemas/chat/feedback': {\n request: SendFeedback.Request;\n response: void;\n };\n '/media/upload': {\n request: UploadMedia.Request;\n response: UploadMedia.Response;\n };\n};\n\n// Helper type to extract the request type for a given endpoint\ntype RequestType<T extends keyof AIEndpoints> = AIEndpoints[T]['request'];\n\n// Helper type to extract the response type for a given endpoint\ntype ResponseType<T extends keyof AIEndpoints> = AIEndpoints[T]['response'];\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * -----------------------------------------------------------------------------------------------*/\n\nexport const TOO_MANY_REQUESTS_ERROR = 'Too many requests';\nexport const LICENSE_LIMIT_REACHED_ERROR = 'License limit';\nexport const LICENSE_LIMIT_EXCEEDED_ERROR = 'AI credit limit exceeded';\nexport const CHAT_TOO_LONG_ERROR = 'Chat too long';\nexport const ATTACHMENT_TOO_BIG_ERROR = 'Attachment too big';\nexport const ATTACHMENT_NOT_FOUND_ERROR = 'Attachment not found';\nexport const INVALID_REQUEST_ERROR = 'Invalid request';\n\n/**\n * Base hook factory for making type-safe API calls to Strapi AI endpoints.\n * Creates a hook specific to a single endpoint.\n */\nexport const createAIFetchHook = <T extends keyof AIEndpoints>(endpoint: T) => {\n return () => {\n const strapiVersion = useAppInfo('useAIFetch', (state) => state.strapiVersion);\n const projectId = useAppInfo('useAIFetch', (state) => state.projectId);\n const userId = useAppInfo('useAIFetch-user', (state) => state.userId);\n const aiUsage = useGetAIUsageQuery(undefined, { refetchOnMountOrArgChange: true });\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Make a type-safe API call to the specified Strapi AI endpoint with retry logic\n */\n const fetchData = async (\n options: Omit<RequestInit, 'body'> & Partial<RequestType<T>> & { formData?: FormData } = {}\n ): Promise<ResponseType<T> | null> => {\n setIsPending(true);\n setError(null);\n\n try {\n const fullUrl = `${STRAPI_AI_URL}${endpoint}`;\n const isJson = !!options.body && !options.formData;\n\n const response = await fetchAI(fullUrl, {\n method: 'POST',\n headers: isJson\n ? { 'Content-Type': 'application/json', ...(options.headers || {}) }\n : options.headers,\n body: options.formData\n ? options.formData\n : isJson\n ? JSON.stringify(options.body || {})\n : undefined,\n ctx: { strapiVersion, projectId, userId },\n });\n // refetch ai usage data on every successful request\n aiUsage.refetch();\n\n const body = await safeParseJson(response);\n\n if (!response.ok) {\n throw new Error(`Error: ${response.statusText}`);\n }\n return body as ResponseType<T>;\n } catch (err) {\n setError(err instanceof Error ? err.message : `Failed to fetch data from ${endpoint}`);\n return null;\n } finally {\n setIsPending(false);\n }\n };\n\n return {\n isPending,\n error,\n fetch: fetchData,\n };\n };\n};\n\n// Create specific hooks for each endpoint\nexport const useFetchGenerateTitle = createAIFetchHook('/schemas/chat/generate-title');\nexport const useFetchUploadProject = createAIFetchHook('/schemas/chat/attachment');\nexport const useFetchSendFeedback = createAIFetchHook('/schemas/chat/feedback');\nexport const useFetchUploadMedia = createAIFetchHook('/media/upload');\n\n/**\n * Hook wrapper for AI SDK's useChat with Strapi-specific configuration\n */\nexport const useAIChat: typeof useChat = (props) => {\n const strapiVersion = useAppInfo('useAIChat', (state) => state.strapiVersion);\n const projectId = useAppInfo('useAIFetch', (state) => state.projectId);\n const userId = useAppInfo('useAIChat-user', (state) => state.userId);\n\n const customFetch = makeChatFetch({ strapiVersion, projectId, userId });\n\n return useChat({\n ...props,\n transport: new DefaultChatTransport({\n api: STRAPI_AI_CHAT_URL,\n fetch: customFetch,\n }),\n });\n};\n"],"names":["TOO_MANY_REQUESTS_ERROR","LICENSE_LIMIT_REACHED_ERROR","LICENSE_LIMIT_EXCEEDED_ERROR","CHAT_TOO_LONG_ERROR","createAIFetchHook","endpoint","strapiVersion","useAppInfo","state","projectId","userId","aiUsage","useGetAIUsageQuery","undefined","refetchOnMountOrArgChange","isPending","setIsPending","useState","error","setError","fetchData","options","fullUrl","STRAPI_AI_URL","isJson","body","formData","response","fetchAI","method","headers","JSON","stringify","ctx","refetch","safeParseJson","ok","Error","statusText","err","message","fetch","useFetchGenerateTitle","useFetchUploadProject","useFetchSendFeedback","useFetchUploadMedia","useAIChat","props","customFetch","makeChatFetch","useChat","transport","DefaultChatTransport","api","STRAPI_AI_CHAT_URL"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { useState } from 'react';
2
+ import { useChat } from '@ai-sdk/react';
3
+ import { useAppInfo } from '@strapi/admin/strapi-admin';
4
+ import { useGetAIUsageQuery } from '@strapi/admin/strapi-admin/ee';
5
+ import { DefaultChatTransport } from 'ai';
6
+ import { makeChatFetch, fetchAI, safeParseJson } from '../lib/aiClient.mjs';
7
+ import { STRAPI_AI_CHAT_URL, STRAPI_AI_URL } from '../lib/constants.mjs';
8
+
9
+ /* -------------------------------------------------------------------------------------------------
10
+ * Hooks
11
+ * -----------------------------------------------------------------------------------------------*/ const TOO_MANY_REQUESTS_ERROR = 'Too many requests';
12
+ const LICENSE_LIMIT_REACHED_ERROR = 'License limit';
13
+ const LICENSE_LIMIT_EXCEEDED_ERROR = 'AI credit limit exceeded';
14
+ const CHAT_TOO_LONG_ERROR = 'Chat too long';
15
+ /**
16
+ * Base hook factory for making type-safe API calls to Strapi AI endpoints.
17
+ * Creates a hook specific to a single endpoint.
18
+ */ const createAIFetchHook = (endpoint)=>{
19
+ return ()=>{
20
+ const strapiVersion = useAppInfo('useAIFetch', (state)=>state.strapiVersion);
21
+ const projectId = useAppInfo('useAIFetch', (state)=>state.projectId);
22
+ const userId = useAppInfo('useAIFetch-user', (state)=>state.userId);
23
+ const aiUsage = useGetAIUsageQuery(undefined, {
24
+ refetchOnMountOrArgChange: true
25
+ });
26
+ const [isPending, setIsPending] = useState(false);
27
+ const [error, setError] = useState(null);
28
+ /**
29
+ * Make a type-safe API call to the specified Strapi AI endpoint with retry logic
30
+ */ const fetchData = async (options = {})=>{
31
+ setIsPending(true);
32
+ setError(null);
33
+ try {
34
+ const fullUrl = `${STRAPI_AI_URL}${endpoint}`;
35
+ const isJson = !!options.body && !options.formData;
36
+ const response = await fetchAI(fullUrl, {
37
+ method: 'POST',
38
+ headers: isJson ? {
39
+ 'Content-Type': 'application/json',
40
+ ...options.headers || {}
41
+ } : options.headers,
42
+ body: options.formData ? options.formData : isJson ? JSON.stringify(options.body || {}) : undefined,
43
+ ctx: {
44
+ strapiVersion,
45
+ projectId,
46
+ userId
47
+ }
48
+ });
49
+ // refetch ai usage data on every successful request
50
+ aiUsage.refetch();
51
+ const body = await safeParseJson(response);
52
+ if (!response.ok) {
53
+ throw new Error(`Error: ${response.statusText}`);
54
+ }
55
+ return body;
56
+ } catch (err) {
57
+ setError(err instanceof Error ? err.message : `Failed to fetch data from ${endpoint}`);
58
+ return null;
59
+ } finally{
60
+ setIsPending(false);
61
+ }
62
+ };
63
+ return {
64
+ isPending,
65
+ error,
66
+ fetch: fetchData
67
+ };
68
+ };
69
+ };
70
+ // Create specific hooks for each endpoint
71
+ const useFetchGenerateTitle = createAIFetchHook('/schemas/chat/generate-title');
72
+ const useFetchUploadProject = createAIFetchHook('/schemas/chat/attachment');
73
+ const useFetchSendFeedback = createAIFetchHook('/schemas/chat/feedback');
74
+ const useFetchUploadMedia = createAIFetchHook('/media/upload');
75
+ /**
76
+ * Hook wrapper for AI SDK's useChat with Strapi-specific configuration
77
+ */ const useAIChat = (props)=>{
78
+ const strapiVersion = useAppInfo('useAIChat', (state)=>state.strapiVersion);
79
+ const projectId = useAppInfo('useAIFetch', (state)=>state.projectId);
80
+ const userId = useAppInfo('useAIChat-user', (state)=>state.userId);
81
+ const customFetch = makeChatFetch({
82
+ strapiVersion,
83
+ projectId,
84
+ userId
85
+ });
86
+ return useChat({
87
+ ...props,
88
+ transport: new DefaultChatTransport({
89
+ api: STRAPI_AI_CHAT_URL,
90
+ fetch: customFetch
91
+ })
92
+ });
93
+ };
94
+
95
+ export { CHAT_TOO_LONG_ERROR, LICENSE_LIMIT_EXCEEDED_ERROR, LICENSE_LIMIT_REACHED_ERROR, TOO_MANY_REQUESTS_ERROR, createAIFetchHook, useAIChat, useFetchGenerateTitle, useFetchSendFeedback, useFetchUploadMedia, useFetchUploadProject };
96
+ //# sourceMappingURL=useAIFetch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAIFetch.mjs","sources":["../../../../../admin/src/components/AIChat/hooks/useAIFetch.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\n\n/**\n * In charge of fetching data from Strapi AI endpoints\n */\n\nimport { useState } from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useAppInfo } from '@strapi/admin/strapi-admin';\nimport { useGetAIUsageQuery } from '@strapi/admin/strapi-admin/ee';\nimport { DefaultChatTransport } from 'ai';\n\nimport { fetchAI, makeChatFetch, safeParseJson } from '../lib/aiClient';\nimport { STRAPI_AI_CHAT_URL, STRAPI_AI_URL } from '../lib/constants';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Chat title\n */\nexport namespace GenerateTitle {\n export interface Request {\n body: {\n chatId: string;\n message: string;\n };\n }\n export interface Response {\n data: {\n title: string;\n };\n error?: string;\n }\n}\n\n/**\n * Upload a project to the chat\n */\nexport namespace UploadProject {\n export interface Request {\n body: {\n chatId: string;\n name: string;\n type: 'code';\n files: {\n path: string;\n content: string;\n }[];\n };\n }\n export interface Response {\n data: Attachment;\n error?: string;\n }\n}\n\n/**\n * Send chat feedback\n */\nexport type FeedbackReasonIds =\n | 'invalid_schema'\n | 'bad_recommendation'\n | 'slow'\n | 'instructions_ignored'\n | 'being_lazy'\n | 'other';\n\nnamespace SendFeedback {\n export interface Request {\n body: {\n chatId: string;\n type: 'upvote' | 'downvote';\n feedback?: string;\n reasons?: FeedbackReasonIds[];\n messageId: string;\n messages: UIMessage[];\n schemas: Schema[];\n };\n }\n}\n\n/**\n * Upload media\n */\nexport namespace UploadMedia {\n export interface Request {\n body: {\n url: string; // base64 image\n filename: string;\n chatId: string;\n };\n }\n export interface Response {\n data: Attachment;\n error?: string;\n }\n}\n\n/**\n * Collection of API endpoints and their corresponding request/response types\n */\ntype AIEndpoints = {\n '/schemas/chat/generate-title': {\n request: GenerateTitle.Request;\n response: GenerateTitle.Response;\n };\n '/schemas/chat/attachment': {\n request: UploadProject.Request;\n response: UploadProject.Response;\n };\n '/schemas/chat/feedback': {\n request: SendFeedback.Request;\n response: void;\n };\n '/media/upload': {\n request: UploadMedia.Request;\n response: UploadMedia.Response;\n };\n};\n\n// Helper type to extract the request type for a given endpoint\ntype RequestType<T extends keyof AIEndpoints> = AIEndpoints[T]['request'];\n\n// Helper type to extract the response type for a given endpoint\ntype ResponseType<T extends keyof AIEndpoints> = AIEndpoints[T]['response'];\n\n/* -------------------------------------------------------------------------------------------------\n * Hooks\n * -----------------------------------------------------------------------------------------------*/\n\nexport const TOO_MANY_REQUESTS_ERROR = 'Too many requests';\nexport const LICENSE_LIMIT_REACHED_ERROR = 'License limit';\nexport const LICENSE_LIMIT_EXCEEDED_ERROR = 'AI credit limit exceeded';\nexport const CHAT_TOO_LONG_ERROR = 'Chat too long';\nexport const ATTACHMENT_TOO_BIG_ERROR = 'Attachment too big';\nexport const ATTACHMENT_NOT_FOUND_ERROR = 'Attachment not found';\nexport const INVALID_REQUEST_ERROR = 'Invalid request';\n\n/**\n * Base hook factory for making type-safe API calls to Strapi AI endpoints.\n * Creates a hook specific to a single endpoint.\n */\nexport const createAIFetchHook = <T extends keyof AIEndpoints>(endpoint: T) => {\n return () => {\n const strapiVersion = useAppInfo('useAIFetch', (state) => state.strapiVersion);\n const projectId = useAppInfo('useAIFetch', (state) => state.projectId);\n const userId = useAppInfo('useAIFetch-user', (state) => state.userId);\n const aiUsage = useGetAIUsageQuery(undefined, { refetchOnMountOrArgChange: true });\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Make a type-safe API call to the specified Strapi AI endpoint with retry logic\n */\n const fetchData = async (\n options: Omit<RequestInit, 'body'> & Partial<RequestType<T>> & { formData?: FormData } = {}\n ): Promise<ResponseType<T> | null> => {\n setIsPending(true);\n setError(null);\n\n try {\n const fullUrl = `${STRAPI_AI_URL}${endpoint}`;\n const isJson = !!options.body && !options.formData;\n\n const response = await fetchAI(fullUrl, {\n method: 'POST',\n headers: isJson\n ? { 'Content-Type': 'application/json', ...(options.headers || {}) }\n : options.headers,\n body: options.formData\n ? options.formData\n : isJson\n ? JSON.stringify(options.body || {})\n : undefined,\n ctx: { strapiVersion, projectId, userId },\n });\n // refetch ai usage data on every successful request\n aiUsage.refetch();\n\n const body = await safeParseJson(response);\n\n if (!response.ok) {\n throw new Error(`Error: ${response.statusText}`);\n }\n return body as ResponseType<T>;\n } catch (err) {\n setError(err instanceof Error ? err.message : `Failed to fetch data from ${endpoint}`);\n return null;\n } finally {\n setIsPending(false);\n }\n };\n\n return {\n isPending,\n error,\n fetch: fetchData,\n };\n };\n};\n\n// Create specific hooks for each endpoint\nexport const useFetchGenerateTitle = createAIFetchHook('/schemas/chat/generate-title');\nexport const useFetchUploadProject = createAIFetchHook('/schemas/chat/attachment');\nexport const useFetchSendFeedback = createAIFetchHook('/schemas/chat/feedback');\nexport const useFetchUploadMedia = createAIFetchHook('/media/upload');\n\n/**\n * Hook wrapper for AI SDK's useChat with Strapi-specific configuration\n */\nexport const useAIChat: typeof useChat = (props) => {\n const strapiVersion = useAppInfo('useAIChat', (state) => state.strapiVersion);\n const projectId = useAppInfo('useAIFetch', (state) => state.projectId);\n const userId = useAppInfo('useAIChat-user', (state) => state.userId);\n\n const customFetch = makeChatFetch({ strapiVersion, projectId, userId });\n\n return useChat({\n ...props,\n transport: new DefaultChatTransport({\n api: STRAPI_AI_CHAT_URL,\n fetch: customFetch,\n }),\n });\n};\n"],"names":["TOO_MANY_REQUESTS_ERROR","LICENSE_LIMIT_REACHED_ERROR","LICENSE_LIMIT_EXCEEDED_ERROR","CHAT_TOO_LONG_ERROR","createAIFetchHook","endpoint","strapiVersion","useAppInfo","state","projectId","userId","aiUsage","useGetAIUsageQuery","undefined","refetchOnMountOrArgChange","isPending","setIsPending","useState","error","setError","fetchData","options","fullUrl","STRAPI_AI_URL","isJson","body","formData","response","fetchAI","method","headers","JSON","stringify","ctx","refetch","safeParseJson","ok","Error","statusText","err","message","fetch","useFetchGenerateTitle","useFetchUploadProject","useFetchSendFeedback","useFetchUploadMedia","useAIChat","props","customFetch","makeChatFetch","useChat","transport","DefaultChatTransport","api","STRAPI_AI_CHAT_URL"],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
+ var constants = require('../lib/constants.js');
6
+ var misc = require('../lib/misc.js');
7
+ var ChatProvider = require('../providers/ChatProvider.js');
8
+ var useAIFetch = require('./useAIFetch.js');
9
+
10
+ function useAttachments() {
11
+ const { setAttachments, attachments, id: chatId } = ChatProvider.useStrapiChat();
12
+ const { toggleNotification } = strapiAdmin.useNotification();
13
+ const { fetch: fetchUploadMedia } = useAIFetch.useFetchUploadMedia();
14
+ /**
15
+ * Add an attachment directly
16
+ */ const addAttachments = React.useCallback((newAttachments)=>{
17
+ // TODO: Limits
18
+ if (!newAttachments) return;
19
+ setAttachments((prev)=>[
20
+ ...prev,
21
+ ...newAttachments
22
+ ]);
23
+ }, [
24
+ setAttachments
25
+ ]);
26
+ /**
27
+ * Update an attachment
28
+ */ const updateAttachment = React.useCallback((attachment)=>{
29
+ setAttachments((prev)=>prev.map((a)=>a.id === attachment.id ? {
30
+ ...a,
31
+ ...attachment
32
+ } : a));
33
+ }, [
34
+ setAttachments
35
+ ]);
36
+ /**
37
+ * Remove an attachment
38
+ */ const removeAttachment = React.useCallback((attachment)=>{
39
+ setAttachments((prev)=>prev.filter((a)=>a.id !== attachment.id));
40
+ }, [
41
+ setAttachments
42
+ ]);
43
+ /**
44
+ * Attach files to the chat
45
+ */ const attachFiles = React.useCallback(async (newFiles, description)=>{
46
+ // Attachment number limit
47
+ const attachmentCount = attachments?.length || 0;
48
+ const attachedFileCount = Array.from(newFiles).length;
49
+ let limitedFiles = newFiles;
50
+ if (attachmentCount + attachedFileCount > constants.STRAPI_MAX_ATTACHMENTS) {
51
+ toggleNotification({
52
+ type: 'danger',
53
+ title: 'File limit reached: ',
54
+ message: `You can only upload up to ${constants.STRAPI_MAX_ATTACHMENTS} files`
55
+ });
56
+ // Prune the ones that would exceed the limit
57
+ const limit = constants.STRAPI_MAX_ATTACHMENTS - attachmentCount;
58
+ limitedFiles = newFiles.slice(0, limit);
59
+ }
60
+ // Size limit
61
+ for (const file of limitedFiles){
62
+ if (file.size > constants.STRAPI_MAX_ATTACHMENT_SIZE) {
63
+ toggleNotification({
64
+ type: 'danger',
65
+ title: 'File too large: ',
66
+ message: 'One of the files is too large (15MB limit)'
67
+ });
68
+ // Remove from list
69
+ limitedFiles = limitedFiles.filter((f)=>f !== file);
70
+ }
71
+ }
72
+ // Upload
73
+ for (const file of limitedFiles){
74
+ const pendingAttachment = {
75
+ id: misc.generateId(),
76
+ type: 'file',
77
+ status: 'loading',
78
+ filename: file.name,
79
+ mediaType: file.type,
80
+ url: ''
81
+ };
82
+ // Store the attachment as loading
83
+ setAttachments((prev)=>[
84
+ ...prev,
85
+ pendingAttachment
86
+ ]);
87
+ // Prepare form data
88
+ const formData = new FormData();
89
+ formData.append('file', file);
90
+ formData.append('fileInfo', JSON.stringify({
91
+ name: file.name,
92
+ chatId: chatId
93
+ }));
94
+ // Upload file
95
+ fetchUploadMedia({
96
+ formData
97
+ }).then((result)=>{
98
+ const attachment = result?.data;
99
+ // Remove attachment if there is an error
100
+ if (!result || result.error) {
101
+ toggleNotification({
102
+ type: 'danger',
103
+ title: 'Failed to upload file: ',
104
+ message: result?.error || 'Unknown error',
105
+ timeout: 5000
106
+ });
107
+ removeAttachment(pendingAttachment);
108
+ return;
109
+ }
110
+ // Update the pending attachment
111
+ updateAttachment({
112
+ id: pendingAttachment.id,
113
+ url: attachment?.url || '',
114
+ status: 'ready'
115
+ });
116
+ }).catch(()=>removeAttachment(pendingAttachment));
117
+ }
118
+ if (description) {
119
+ toggleNotification({
120
+ title: 'Files attached',
121
+ message: description
122
+ });
123
+ }
124
+ }, [
125
+ attachments,
126
+ setAttachments,
127
+ toggleNotification,
128
+ chatId,
129
+ fetchUploadMedia,
130
+ removeAttachment,
131
+ updateAttachment
132
+ ]);
133
+ /**
134
+ * Remove an attachment by index
135
+ */ const removeAttachmentByIndex = React.useCallback((index)=>{
136
+ if (!attachments) return;
137
+ setAttachments(attachments.filter((_, i)=>i !== index));
138
+ }, [
139
+ setAttachments,
140
+ attachments
141
+ ]);
142
+ return {
143
+ attachments,
144
+ attachFiles,
145
+ addAttachments,
146
+ removeAttachment,
147
+ removeAttachmentByIndex
148
+ };
149
+ }
150
+
151
+ exports.useAttachments = useAttachments;
152
+ //# sourceMappingURL=useAttachments.js.map