@strapi/content-type-builder 5.57.0 → 5.59.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 (167) hide show
  1. package/dist/admin/components/AIChat/FeedbackModal.js +13 -7
  2. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -1
  3. package/dist/admin/components/AIChat/FeedbackModal.mjs +14 -8
  4. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/UploadCodeModal.js +12 -6
  6. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -1
  7. package/dist/admin/components/AIChat/UploadCodeModal.mjs +13 -7
  8. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -1
  9. package/dist/admin/components/AIChat/UploadFigmaModal.js +12 -6
  10. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
  11. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +13 -7
  12. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
  13. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +6 -3
  14. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -1
  15. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +7 -4
  16. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -1
  17. package/dist/admin/components/AIChat/components/Collapsible.js +9 -4
  18. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
  19. package/dist/admin/components/AIChat/components/Collapsible.mjs +10 -5
  20. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
  21. package/dist/admin/components/AIChat/components/Dropzone.js +13 -6
  22. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -1
  23. package/dist/admin/components/AIChat/components/Dropzone.mjs +14 -7
  24. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -1
  25. package/dist/admin/components/AIChat/components/FloatingPanel.js +11 -4
  26. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -1
  27. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +12 -5
  28. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -1
  29. package/dist/admin/components/AIChat/components/FullScreenImage.js +16 -8
  30. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
  31. package/dist/admin/components/AIChat/components/FullScreenImage.mjs +17 -9
  32. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
  33. package/dist/admin/components/AIChat/components/Input.js +6 -3
  34. package/dist/admin/components/AIChat/components/Input.js.map +1 -1
  35. package/dist/admin/components/AIChat/components/Input.mjs +7 -4
  36. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -1
  37. package/dist/admin/components/AIChat/components/Messages/Message.js +88 -12
  38. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
  39. package/dist/admin/components/AIChat/components/Messages/Message.mjs +87 -13
  40. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
  41. package/dist/admin/components/AIChat/components/StepModal.js +44 -17
  42. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -1
  43. package/dist/admin/components/AIChat/components/StepModal.mjs +45 -18
  44. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -1
  45. package/dist/admin/components/AIChat/providers/ChatProvider.js +79 -27
  46. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
  47. package/dist/admin/components/AIChat/providers/ChatProvider.mjs +80 -28
  48. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
  49. package/dist/admin/components/AIChat/providers/SchemaProvider.js +6 -3
  50. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  51. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +7 -4
  52. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  53. package/dist/admin/components/AttributeOptions/AttributeOption.js +2 -2
  54. package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
  55. package/dist/admin/components/AttributeOptions/AttributeOption.mjs +2 -2
  56. package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
  57. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -1
  58. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -1
  59. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -1
  60. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -1
  61. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +2 -1
  62. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
  63. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +2 -1
  64. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
  65. package/dist/admin/components/DataManager/DataManagerProvider.js +317 -275
  66. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  67. package/dist/admin/components/DataManager/DataManagerProvider.mjs +319 -277
  68. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  69. package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -1
  70. package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -1
  71. package/dist/admin/components/DataManager/reducer.js +53 -4
  72. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  73. package/dist/admin/components/DataManager/reducer.mjs +53 -4
  74. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  75. package/dist/admin/components/DynamicZoneList.js +2 -1
  76. package/dist/admin/components/DynamicZoneList.js.map +1 -1
  77. package/dist/admin/components/DynamicZoneList.mjs +2 -1
  78. package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
  79. package/dist/admin/components/FormModal/FormModal.js +36 -62
  80. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  81. package/dist/admin/components/FormModal/FormModal.mjs +36 -62
  82. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/attributes/ConditionForm.js +2 -1
  84. package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
  85. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +2 -1
  86. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
  87. package/dist/admin/components/FormModal/attributes/types.js +2 -2
  88. package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
  89. package/dist/admin/components/FormModal/attributes/types.mjs +2 -2
  90. package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
  91. package/dist/admin/components/FormModal/forms/forms.js +1 -1
  92. package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
  93. package/dist/admin/components/FormModal/forms/forms.mjs +1 -1
  94. package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
  95. package/dist/admin/components/GenericInputs.js +2 -1
  96. package/dist/admin/components/GenericInputs.js.map +1 -1
  97. package/dist/admin/components/GenericInputs.mjs +2 -1
  98. package/dist/admin/components/GenericInputs.mjs.map +1 -1
  99. package/dist/admin/components/TabForm.js.map +1 -1
  100. package/dist/admin/components/TabForm.mjs.map +1 -1
  101. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +8 -0
  102. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +20 -0
  103. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +8 -8
  104. package/dist/admin/translations/cs.json.js +0 -2
  105. package/dist/admin/translations/cs.json.js.map +1 -1
  106. package/dist/admin/translations/cs.json.mjs +0 -2
  107. package/dist/admin/translations/cs.json.mjs.map +1 -1
  108. package/dist/admin/translations/de.json.js +0 -2
  109. package/dist/admin/translations/de.json.js.map +1 -1
  110. package/dist/admin/translations/de.json.mjs +0 -2
  111. package/dist/admin/translations/de.json.mjs.map +1 -1
  112. package/dist/admin/translations/en.json.js +0 -2
  113. package/dist/admin/translations/en.json.js.map +1 -1
  114. package/dist/admin/translations/en.json.mjs +0 -2
  115. package/dist/admin/translations/en.json.mjs.map +1 -1
  116. package/dist/admin/translations/ja.json.js +0 -2
  117. package/dist/admin/translations/ja.json.js.map +1 -1
  118. package/dist/admin/translations/ja.json.mjs +0 -2
  119. package/dist/admin/translations/ja.json.mjs.map +1 -1
  120. package/dist/admin/translations/ko.json.js +0 -2
  121. package/dist/admin/translations/ko.json.js.map +1 -1
  122. package/dist/admin/translations/ko.json.mjs +0 -2
  123. package/dist/admin/translations/ko.json.mjs.map +1 -1
  124. package/dist/admin/translations/nl.json.js +0 -2
  125. package/dist/admin/translations/nl.json.js.map +1 -1
  126. package/dist/admin/translations/nl.json.mjs +0 -2
  127. package/dist/admin/translations/nl.json.mjs.map +1 -1
  128. package/dist/admin/translations/pl.json.js +0 -2
  129. package/dist/admin/translations/pl.json.js.map +1 -1
  130. package/dist/admin/translations/pl.json.mjs +0 -2
  131. package/dist/admin/translations/pl.json.mjs.map +1 -1
  132. package/dist/admin/translations/ru.json.js +0 -2
  133. package/dist/admin/translations/ru.json.js.map +1 -1
  134. package/dist/admin/translations/ru.json.mjs +0 -2
  135. package/dist/admin/translations/ru.json.mjs.map +1 -1
  136. package/dist/admin/translations/sk.json.js +0 -2
  137. package/dist/admin/translations/sk.json.js.map +1 -1
  138. package/dist/admin/translations/sk.json.mjs +0 -2
  139. package/dist/admin/translations/sk.json.mjs.map +1 -1
  140. package/dist/admin/utils/folderTelemetry.js.map +1 -1
  141. package/dist/admin/utils/folderTelemetry.mjs.map +1 -1
  142. package/dist/admin/utils/formAPI.js.map +1 -1
  143. package/dist/admin/utils/formAPI.mjs.map +1 -1
  144. package/dist/server/controllers/validation/schema.js +3 -2
  145. package/dist/server/controllers/validation/schema.js.map +1 -1
  146. package/dist/server/controllers/validation/schema.mjs +4 -3
  147. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  148. package/dist/server/register.js.map +1 -1
  149. package/dist/server/register.mjs.map +1 -1
  150. package/dist/server/services/migration-builder/index.js.map +1 -1
  151. package/dist/server/services/migration-builder/index.mjs.map +1 -1
  152. package/dist/server/services/schema.js +87 -1
  153. package/dist/server/services/schema.js.map +1 -1
  154. package/dist/server/services/schema.mjs +87 -1
  155. package/dist/server/services/schema.mjs.map +1 -1
  156. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  157. package/dist/server/src/register.d.ts.map +1 -1
  158. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -1
  159. package/dist/server/src/services/schema-builder/types.d.ts.map +1 -1
  160. package/dist/server/src/services/schema.d.ts.map +1 -1
  161. package/dist/server/src/utils/uid-target.d.ts +18 -0
  162. package/dist/server/src/utils/uid-target.d.ts.map +1 -0
  163. package/dist/server/utils/uid-target.js +34 -0
  164. package/dist/server/utils/uid-target.js.map +1 -0
  165. package/dist/server/utils/uid-target.mjs +31 -0
  166. package/dist/server/utils/uid-target.mjs.map +1 -0
  167. package/package.json +6 -6
@@ -18,21 +18,27 @@ const useFeedbackModal = ()=>React.useContext(FeedbackModalContext);
18
18
  const FeedbackProvider = ({ children })=>{
19
19
  const [isFeedbackModalOpen, setIsFeedbackModalOpen] = React.useState(false);
20
20
  const [currentMessageId, setCurrentMessageId] = React.useState(null);
21
- const openFeedbackModal = (messageId)=>{
21
+ const openFeedbackModal = React.useCallback((messageId)=>{
22
22
  setCurrentMessageId(messageId);
23
23
  setIsFeedbackModalOpen(true);
24
- };
25
- const closeFeedbackModal = ()=>{
24
+ }, []);
25
+ const closeFeedbackModal = React.useCallback(()=>{
26
26
  setIsFeedbackModalOpen(false);
27
27
  setCurrentMessageId(null);
28
- };
29
- return /*#__PURE__*/ jsxRuntime.jsxs(FeedbackModalContext.Provider, {
30
- value: {
28
+ }, []);
29
+ const contextValue = React.useMemo(()=>({
31
30
  isFeedbackModalOpen,
32
31
  currentMessageId,
33
32
  openFeedbackModal,
34
33
  closeFeedbackModal
35
- },
34
+ }), [
35
+ isFeedbackModalOpen,
36
+ currentMessageId,
37
+ openFeedbackModal,
38
+ closeFeedbackModal
39
+ ]);
40
+ return /*#__PURE__*/ jsxRuntime.jsxs(FeedbackModalContext.Provider, {
41
+ value: contextValue,
36
42
  children: [
37
43
  isFeedbackModalOpen && currentMessageId && /*#__PURE__*/ jsxRuntime.jsx(FeedbackModal, {}),
38
44
  children
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackModal.js","sources":["../../../../admin/src/components/AIChat/FeedbackModal.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createContext, useContext, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Typography,\n Textarea,\n Button,\n Grid,\n Checkbox,\n Modal,\n} from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { useFeedback } from './hooks/useFeedback';\nimport { useTranslations } from './hooks/useTranslations';\n\nimport type { FeedbackReasonIds } from './lib/types/feedback';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface FeedbackModalContextType {\n isFeedbackModalOpen: boolean;\n currentMessageId: string | null;\n openFeedbackModal: (messageId: string) => void;\n closeFeedbackModal: () => void;\n}\n\nconst FeedbackModalContext = createContext<FeedbackModalContextType>({\n isFeedbackModalOpen: false,\n currentMessageId: null,\n openFeedbackModal: () => {},\n closeFeedbackModal: () => {},\n});\n\nexport const useFeedbackModal = () => useContext(FeedbackModalContext);\n\nexport const FeedbackProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFeedbackModalOpen, setIsFeedbackModalOpen] = useState(false);\n const [currentMessageId, setCurrentMessageId] = useState<string | null>(null);\n\n const openFeedbackModal = (messageId: string) => {\n setCurrentMessageId(messageId);\n setIsFeedbackModalOpen(true);\n };\n\n const closeFeedbackModal = () => {\n setIsFeedbackModalOpen(false);\n setCurrentMessageId(null);\n };\n\n return (\n <FeedbackModalContext.Provider\n value={{ isFeedbackModalOpen, currentMessageId, openFeedbackModal, closeFeedbackModal }}\n >\n {isFeedbackModalOpen && currentMessageId && <FeedbackModal />}\n {children}\n </FeedbackModalContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Feedback Option\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FeedbackOptionProps {\n id: FeedbackReasonIds;\n label: string;\n selected: boolean;\n onClick: (id: FeedbackReasonIds) => void;\n}\n\nconst FeedbackOptionWrapper = styled(Flex)`\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n\n &.selected {\n background-color: ${({ theme }) => theme.colors.primary100};\n border-color: ${({ theme }) => theme.colors.primary200};\n }\n`;\n\nconst FeedbackOption: React.FC<FeedbackOptionProps> = ({ id, label, selected, onClick }) => {\n return (\n <FeedbackOptionWrapper\n className={selected ? 'selected' : ''}\n justifyContent=\"space-between\"\n hasRadius\n width=\"100%\"\n cursor=\"pointer\"\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n onClick={() => onClick(id)}\n >\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {label}\n </Typography>\n <Checkbox\n name={`feedback-${id}`}\n value={id}\n checked={selected}\n onChange={() => onClick(id)}\n />\n </FeedbackOptionWrapper>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\n\nexport const FeedbackModal: React.FC = () => {\n const [feedbackText, setFeedbackText] = useState('');\n const [selectedReasons, setSelectedReasons] = useState<FeedbackReasonIds[]>([]);\n\n const { t } = useTranslations();\n const { toggleNotification } = useNotification();\n const { closeFeedbackModal, currentMessageId } = useFeedbackModal();\n const { downvoteMessage, isPending } = useFeedback();\n\n const feedbackReasons = [\n {\n id: 'invalid_schema',\n label: t('chat.feedback.reason.invalid_schema', 'Invalid schema'),\n },\n {\n id: 'bad_recommendation',\n label: t('chat.feedback.reason.bad_recommendation', 'Bad recommendation'),\n },\n {\n id: 'slow',\n label: t('chat.feedback.reason.slow', 'Slow'),\n },\n {\n id: 'instructions_ignored',\n label: t('chat.feedback.reason.instructions_ignored', 'Instructions ignored'),\n },\n {\n id: 'being_lazy',\n label: t('chat.feedback.reason.being_lazy', 'Being lazy'),\n },\n {\n id: 'other',\n label: t('chat.feedback.reason.other', 'Other'),\n },\n ] satisfies { id: FeedbackReasonIds; label: string }[];\n\n const handleReasonSelect = (id: FeedbackReasonIds) => {\n setSelectedReasons((prevSelected) => {\n // If already selected, remove it\n if (prevSelected.includes(id)) {\n return prevSelected.filter((reasonId) => reasonId !== id);\n }\n // Otherwise add it\n return [...prevSelected, id];\n });\n };\n\n const handleSubmitFeedback = async () => {\n if (selectedReasons.length === 0) return;\n\n try {\n await downvoteMessage(currentMessageId as string, feedbackText, selectedReasons);\n\n setFeedbackText('');\n setSelectedReasons([]);\n closeFeedbackModal();\n } catch {\n toggleNotification({\n type: 'danger',\n message: t('chat.feedback.error', 'An error occurred while submitting your feedback'),\n });\n }\n };\n\n return (\n <Modal.Root open onOpenChange={closeFeedbackModal}>\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"start\" gap={6} width=\"100%\">\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Typography variant=\"beta\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n <Typography variant=\"omega\">\n {t(\n 'chat.feedback.subtitle',\n 'Provide additional feedback on this message. Select all that apply.'\n )}\n </Typography>\n </Flex>\n <Grid.Root width=\"100%\" gap={2}>\n {feedbackReasons.map((reason) => (\n <Grid.Item key={reason.id} col={6} xs={12}>\n <FeedbackOption\n key={reason.id}\n id={reason.id}\n label={reason.label}\n selected={selectedReasons.includes(reason.id)}\n onClick={handleReasonSelect}\n />\n </Grid.Item>\n ))}\n </Grid.Root>\n <Flex direction=\"column\" gap={2} width=\"100%\" alignItems=\"start\">\n <Typography variant=\"omega\">\n {t('chat.feedback.comment.label', 'How can we improve? (optional)')}\n </Typography>\n <Box width=\"100%\">\n <Textarea\n name=\"feedback\"\n placeholder={t('chat.feedback.placeholder', 'Your feedback...')}\n onChange={(e) => setFeedbackText(e.target.value)}\n value={feedbackText}\n />\n </Box>\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={closeFeedbackModal}>\n {t('form.button.cancel', 'Cancel')}\n </Button>\n </Modal.Close>\n <Button\n onClick={handleSubmitFeedback}\n loading={isPending}\n disabled={selectedReasons.length === 0}\n >\n {t('form.button.submit', 'Submit')}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n"],"names":["FeedbackModalContext","createContext","isFeedbackModalOpen","currentMessageId","openFeedbackModal","closeFeedbackModal","useFeedbackModal","useContext","FeedbackProvider","children","setIsFeedbackModalOpen","useState","setCurrentMessageId","messageId","_jsxs","Provider","value","_jsx","FeedbackModal","FeedbackOptionWrapper","styled","Flex","theme","colors","neutral100","primary100","primary200","FeedbackOption","id","label","selected","onClick","className","justifyContent","hasRadius","width","cursor","borderColor","padding","gap","Typography","variant","fontWeight","Checkbox","name","checked","onChange","feedbackText","setFeedbackText","selectedReasons","setSelectedReasons","t","useTranslations","toggleNotification","useNotification","downvoteMessage","isPending","useFeedback","feedbackReasons","handleReasonSelect","prevSelected","includes","filter","reasonId","handleSubmitFeedback","length","type","message","Modal","Root","open","onOpenChange","Content","Header","Body","direction","alignItems","Grid","map","reason","Item","col","xs","Box","Textarea","placeholder","e","target","Footer","Close","Button","loading","disabled"],"mappings":";;;;;;;;;;AA+BA,MAAMA,qCAAuBC,mBAAAA,CAAwC;IACnEC,mBAAAA,EAAqB,KAAA;IACrBC,gBAAAA,EAAkB,IAAA;AAClBC,IAAAA,iBAAAA,EAAmB,IAAA,CAAO,CAAA;AAC1BC,IAAAA,kBAAAA,EAAoB,IAAA,CAAO;AAC7B,CAAA,CAAA;AAEO,MAAMC,gBAAAA,GAAmB,IAAMC,gBAAAA,CAAWP,oBAAAA;AAE1C,MAAMQ,gBAAAA,GAAmB,CAAC,EAAEC,QAAQ,EAAiC,GAAA;AAC1E,IAAA,MAAM,CAACP,mBAAAA,EAAqBQ,sBAAAA,CAAuB,GAAGC,cAAAA,CAAS,KAAA,CAAA;AAC/D,IAAA,MAAM,CAACR,gBAAAA,EAAkBS,mBAAAA,CAAoB,GAAGD,cAAAA,CAAwB,IAAA,CAAA;AAExE,IAAA,MAAMP,oBAAoB,CAACS,SAAAA,GAAAA;QACzBD,mBAAAA,CAAoBC,SAAAA,CAAAA;QACpBH,sBAAAA,CAAuB,IAAA,CAAA;AACzB,IAAA,CAAA;AAEA,IAAA,MAAML,kBAAAA,GAAqB,IAAA;QACzBK,sBAAAA,CAAuB,KAAA,CAAA;QACvBE,mBAAAA,CAAoB,IAAA,CAAA;AACtB,IAAA,CAAA;IAEA,qBACEE,eAAA,CAACd,qBAAqBe,QAAQ,EAAA;QAC5BC,KAAAA,EAAO;AAAEd,YAAAA,mBAAAA;AAAqBC,YAAAA,gBAAAA;AAAkBC,YAAAA,iBAAAA;AAAmBC,YAAAA;AAAmB,SAAA;;AAErFH,YAAAA,mBAAAA,IAAuBC,kCAAoBc,cAAA,CAACC,aAAAA,EAAAA,EAAAA,CAAAA;AAC5CT,YAAAA;;;AAGP;AAaA,MAAMU,qBAAAA,GAAwBC,uBAAAA,CAAOC,iBAAAA,CAAK;;sBAEpB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;;;sBAIzC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;kBAC7C,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;AAE3D,CAAC;AAED,MAAMC,cAAAA,GAAgD,CAAC,EAAEC,EAAE,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAA;AACrF,IAAA,qBACEjB,eAAA,CAACK,qBAAAA,EAAAA;AACCa,QAAAA,SAAAA,EAAWF,WAAW,UAAA,GAAa,EAAA;QACnCG,cAAAA,EAAe,eAAA;QACfC,SAAS,EAAA,IAAA;QACTC,KAAAA,EAAM,MAAA;QACNC,MAAAA,EAAO,SAAA;QACPC,WAAAA,EAAY,YAAA;QACZC,OAAAA,EAAS,CAAA;QACTC,GAAAA,EAAK,CAAA;AACLR,QAAAA,OAAAA,EAAS,IAAMA,OAAAA,CAAQH,EAAAA,CAAAA;;0BAEvBX,cAAA,CAACuB,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,UAAAA,EAAW,MAAA;AACpCb,gBAAAA,QAAAA,EAAAA;;0BAEHZ,cAAA,CAAC0B,qBAAAA,EAAAA;gBACCC,IAAAA,EAAM,CAAC,SAAS,EAAEhB,EAAAA,CAAAA,CAAI;gBACtBZ,KAAAA,EAAOY,EAAAA;gBACPiB,OAAAA,EAASf,QAAAA;AACTgB,gBAAAA,QAAAA,EAAU,IAAMf,OAAAA,CAAQH,EAAAA;;;;AAIhC,CAAA;AAEA;;2GAIaV,aAAAA,GAA0B,IAAA;AACrC,IAAA,MAAM,CAAC6B,YAAAA,EAAcC,eAAAA,CAAgB,GAAGrC,cAAAA,CAAS,EAAA,CAAA;AACjD,IAAA,MAAM,CAACsC,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAGvC,eAA8B,EAAE,CAAA;IAE9E,MAAM,EAAEwC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IACd,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEjD,kBAAkB,EAAEF,gBAAgB,EAAE,GAAGG,gBAAAA,EAAAA;AACjD,IAAA,MAAM,EAAEiD,eAAe,EAAEC,SAAS,EAAE,GAAGC,uBAAAA,EAAAA;AAEvC,IAAA,MAAMC,eAAAA,GAAkB;AACtB,QAAA;YACE9B,EAAAA,EAAI,gBAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,qCAAA,EAAuC,gBAAA;AAClD,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,oBAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,yCAAA,EAA2C,oBAAA;AACtD,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,MAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,2BAAA,EAA6B,MAAA;AACxC,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,sBAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,2CAAA,EAA6C,sBAAA;AACxD,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,YAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,iCAAA,EAAmC,YAAA;AAC9C,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,OAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,4BAAA,EAA8B,OAAA;AACzC;AACD,KAAA;AAED,IAAA,MAAMQ,qBAAqB,CAAC/B,EAAAA,GAAAA;AAC1BsB,QAAAA,kBAAAA,CAAmB,CAACU,YAAAA,GAAAA;;YAElB,IAAIA,YAAAA,CAAaC,QAAQ,CAACjC,EAAAA,CAAAA,EAAK;AAC7B,gBAAA,OAAOgC,YAAAA,CAAaE,MAAM,CAAC,CAACC,WAAaA,QAAAA,KAAanC,EAAAA,CAAAA;AACxD,YAAA;;YAEA,OAAO;AAAIgC,gBAAAA,GAAAA,YAAAA;AAAchC,gBAAAA;AAAG,aAAA;AAC9B,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMoC,oBAAAA,GAAuB,UAAA;QAC3B,IAAIf,eAAAA,CAAgBgB,MAAM,KAAK,CAAA,EAAG;QAElC,IAAI;YACF,MAAMV,eAAAA,CAAgBpD,kBAA4B4C,YAAAA,EAAcE,eAAAA,CAAAA;YAEhED,eAAAA,CAAgB,EAAA,CAAA;AAChBE,YAAAA,kBAAAA,CAAmB,EAAE,CAAA;AACrB7C,YAAAA,kBAAAA,EAAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACNgD,kBAAAA,CAAmB;gBACjBa,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAShB,EAAE,qBAAA,EAAuB,kDAAA;AACpC,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,qBACElC,cAAA,CAACmD,mBAAMC,IAAI,EAAA;QAACC,IAAI,EAAA,IAAA;QAACC,YAAAA,EAAclE,kBAAAA;gCAC7BS,eAAA,CAACsD,mBAAMI,OAAO,EAAA;;AACZ,8BAAAvD,cAAA,CAACmD,mBAAMK,MAAM,EAAA;AACX,oBAAA,QAAA,gBAAAxD,cAAA,CAACuB,uBAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,OAAA;wBAAQC,UAAAA,EAAW,MAAA;AACpCS,wBAAAA,QAAAA,EAAAA,CAAAA,CAAE,qBAAA,EAAuB,eAAA;;;AAG9B,8BAAAlC,cAAA,CAACmD,mBAAMM,IAAI,EAAA;AACT,oBAAA,QAAA,gBAAA5D,eAAA,CAACO,iBAAAA,EAAAA;wBAAKsD,SAAAA,EAAU,QAAA;wBAASC,UAAAA,EAAW,OAAA;wBAAQrC,GAAAA,EAAK,CAAA;wBAAGJ,KAAAA,EAAM,MAAA;;0CACxDrB,eAAA,CAACO,iBAAAA,EAAAA;gCAAKsD,SAAAA,EAAU,QAAA;gCAASC,UAAAA,EAAW,OAAA;gCAAQrC,GAAAA,EAAK,CAAA;;kDAC/CtB,cAAA,CAACuB,uBAAAA,EAAAA;wCAAWC,OAAAA,EAAQ,MAAA;wCAAOC,UAAAA,EAAW,MAAA;AACnCS,wCAAAA,QAAAA,EAAAA,CAAAA,CAAE,qBAAA,EAAuB,eAAA;;kDAE5BlC,cAAA,CAACuB,uBAAAA,EAAAA;wCAAWC,OAAAA,EAAQ,OAAA;AACjBU,wCAAAA,QAAAA,EAAAA,CAAAA,CACC,wBAAA,EACA,qEAAA;;;;AAIN,0CAAAlC,cAAA,CAAC4D,kBAAKR,IAAI,EAAA;gCAAClC,KAAAA,EAAM,MAAA;gCAAOI,GAAAA,EAAK,CAAA;AAC1BmB,gCAAAA,QAAAA,EAAAA,eAAAA,CAAgBoB,GAAG,CAAC,CAACC,MAAAA,iBACpB9D,cAAA,CAAC4D,kBAAKG,IAAI,EAAA;wCAAiBC,GAAAA,EAAK,CAAA;wCAAGC,EAAAA,EAAI,EAAA;AACrC,wCAAA,QAAA,gBAAAjE,cAAA,CAACU,cAAAA,EAAAA;AAECC,4CAAAA,EAAAA,EAAImD,OAAOnD,EAAE;AACbC,4CAAAA,KAAAA,EAAOkD,OAAOlD,KAAK;AACnBC,4CAAAA,QAAAA,EAAUmB,eAAAA,CAAgBY,QAAQ,CAACkB,MAAAA,CAAOnD,EAAE,CAAA;4CAC5CG,OAAAA,EAAS4B;AAJJoB,yCAAAA,EAAAA,MAAAA,CAAOnD,EAAE;AAFFmD,qCAAAA,EAAAA,MAAAA,CAAOnD,EAAE,CAAA;;0CAW7Bd,eAAA,CAACO,iBAAAA,EAAAA;gCAAKsD,SAAAA,EAAU,QAAA;gCAASpC,GAAAA,EAAK,CAAA;gCAAGJ,KAAAA,EAAM,MAAA;gCAAOyC,UAAAA,EAAW,OAAA;;kDACvD3D,cAAA,CAACuB,uBAAAA,EAAAA;wCAAWC,OAAAA,EAAQ,OAAA;AACjBU,wCAAAA,QAAAA,EAAAA,CAAAA,CAAE,6BAAA,EAA+B,gCAAA;;kDAEpClC,cAAA,CAACkE,gBAAAA,EAAAA;wCAAIhD,KAAAA,EAAM,MAAA;AACT,wCAAA,QAAA,gBAAAlB,cAAA,CAACmE,qBAAAA,EAAAA;4CACCxC,IAAAA,EAAK,UAAA;AACLyC,4CAAAA,WAAAA,EAAalC,EAAE,2BAAA,EAA6B,kBAAA,CAAA;AAC5CL,4CAAAA,QAAAA,EAAU,CAACwC,CAAAA,GAAMtC,eAAAA,CAAgBsC,CAAAA,CAAEC,MAAM,CAACvE,KAAK,CAAA;4CAC/CA,KAAAA,EAAO+B;;;;;;;;AAMjB,8BAAAjC,eAAA,CAACsD,mBAAMoB,MAAM,EAAA;;AACX,sCAAAvE,cAAA,CAACmD,mBAAMqB,KAAK,EAAA;AACV,4BAAA,QAAA,gBAAAxE,cAAA,CAACyE,mBAAAA,EAAAA;gCAAOjD,OAAAA,EAAQ,UAAA;gCAAWV,OAAAA,EAAS1B,kBAAAA;AACjC8C,gCAAAA,QAAAA,EAAAA,CAAAA,CAAE,oBAAA,EAAsB,QAAA;;;sCAG7BlC,cAAA,CAACyE,mBAAAA,EAAAA;4BACC3D,OAAAA,EAASiC,oBAAAA;4BACT2B,OAAAA,EAASnC,SAAAA;4BACToC,QAAAA,EAAU3C,eAAAA,CAAgBgB,MAAM,KAAK,CAAA;AAEpCd,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,oBAAA,EAAsB,QAAA;;;;;;;AAMrC;;;;;;"}
1
+ {"version":3,"file":"FeedbackModal.js","sources":["../../../../admin/src/components/AIChat/FeedbackModal.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Typography,\n Textarea,\n Button,\n Grid,\n Checkbox,\n Modal,\n} from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { useFeedback } from './hooks/useFeedback';\nimport { useTranslations } from './hooks/useTranslations';\n\nimport type { FeedbackReasonIds } from './lib/types/feedback';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface FeedbackModalContextType {\n isFeedbackModalOpen: boolean;\n currentMessageId: string | null;\n openFeedbackModal: (messageId: string) => void;\n closeFeedbackModal: () => void;\n}\n\nconst FeedbackModalContext = createContext<FeedbackModalContextType>({\n isFeedbackModalOpen: false,\n currentMessageId: null,\n openFeedbackModal: () => {},\n closeFeedbackModal: () => {},\n});\n\nexport const useFeedbackModal = () => useContext(FeedbackModalContext);\n\nexport const FeedbackProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFeedbackModalOpen, setIsFeedbackModalOpen] = useState(false);\n const [currentMessageId, setCurrentMessageId] = useState<string | null>(null);\n\n const openFeedbackModal = useCallback((messageId: string) => {\n setCurrentMessageId(messageId);\n setIsFeedbackModalOpen(true);\n }, []);\n\n const closeFeedbackModal = useCallback(() => {\n setIsFeedbackModalOpen(false);\n setCurrentMessageId(null);\n }, []);\n const contextValue = useMemo(\n () => ({\n isFeedbackModalOpen,\n currentMessageId,\n openFeedbackModal,\n closeFeedbackModal,\n }),\n [isFeedbackModalOpen, currentMessageId, openFeedbackModal, closeFeedbackModal]\n );\n\n return (\n <FeedbackModalContext.Provider value={contextValue}>\n {isFeedbackModalOpen && currentMessageId && <FeedbackModal />}\n {children}\n </FeedbackModalContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Feedback Option\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FeedbackOptionProps {\n id: FeedbackReasonIds;\n label: string;\n selected: boolean;\n onClick: (id: FeedbackReasonIds) => void;\n}\n\nconst FeedbackOptionWrapper = styled(Flex)`\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n\n &.selected {\n background-color: ${({ theme }) => theme.colors.primary100};\n border-color: ${({ theme }) => theme.colors.primary200};\n }\n`;\n\nconst FeedbackOption: React.FC<FeedbackOptionProps> = ({ id, label, selected, onClick }) => {\n return (\n <FeedbackOptionWrapper\n className={selected ? 'selected' : ''}\n justifyContent=\"space-between\"\n hasRadius\n width=\"100%\"\n cursor=\"pointer\"\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n onClick={() => onClick(id)}\n >\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {label}\n </Typography>\n <Checkbox\n name={`feedback-${id}`}\n value={id}\n checked={selected}\n onChange={() => onClick(id)}\n />\n </FeedbackOptionWrapper>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\n\nexport const FeedbackModal: React.FC = () => {\n const [feedbackText, setFeedbackText] = useState('');\n const [selectedReasons, setSelectedReasons] = useState<FeedbackReasonIds[]>([]);\n\n const { t } = useTranslations();\n const { toggleNotification } = useNotification();\n const { closeFeedbackModal, currentMessageId } = useFeedbackModal();\n const { downvoteMessage, isPending } = useFeedback();\n\n const feedbackReasons = [\n {\n id: 'invalid_schema',\n label: t('chat.feedback.reason.invalid_schema', 'Invalid schema'),\n },\n {\n id: 'bad_recommendation',\n label: t('chat.feedback.reason.bad_recommendation', 'Bad recommendation'),\n },\n {\n id: 'slow',\n label: t('chat.feedback.reason.slow', 'Slow'),\n },\n {\n id: 'instructions_ignored',\n label: t('chat.feedback.reason.instructions_ignored', 'Instructions ignored'),\n },\n {\n id: 'being_lazy',\n label: t('chat.feedback.reason.being_lazy', 'Being lazy'),\n },\n {\n id: 'other',\n label: t('chat.feedback.reason.other', 'Other'),\n },\n ] satisfies { id: FeedbackReasonIds; label: string }[];\n\n const handleReasonSelect = (id: FeedbackReasonIds) => {\n setSelectedReasons((prevSelected) => {\n // If already selected, remove it\n if (prevSelected.includes(id)) {\n return prevSelected.filter((reasonId) => reasonId !== id);\n }\n // Otherwise add it\n return [...prevSelected, id];\n });\n };\n\n const handleSubmitFeedback = async () => {\n if (selectedReasons.length === 0) return;\n\n try {\n await downvoteMessage(currentMessageId as string, feedbackText, selectedReasons);\n\n setFeedbackText('');\n setSelectedReasons([]);\n closeFeedbackModal();\n } catch {\n toggleNotification({\n type: 'danger',\n message: t('chat.feedback.error', 'An error occurred while submitting your feedback'),\n });\n }\n };\n\n return (\n <Modal.Root open onOpenChange={closeFeedbackModal}>\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"start\" gap={6} width=\"100%\">\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Typography variant=\"beta\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n <Typography variant=\"omega\">\n {t(\n 'chat.feedback.subtitle',\n 'Provide additional feedback on this message. Select all that apply.'\n )}\n </Typography>\n </Flex>\n <Grid.Root width=\"100%\" gap={2}>\n {feedbackReasons.map((reason) => (\n <Grid.Item key={reason.id} col={6} xs={12}>\n <FeedbackOption\n key={reason.id}\n id={reason.id}\n label={reason.label}\n selected={selectedReasons.includes(reason.id)}\n onClick={handleReasonSelect}\n />\n </Grid.Item>\n ))}\n </Grid.Root>\n <Flex direction=\"column\" gap={2} width=\"100%\" alignItems=\"start\">\n <Typography variant=\"omega\">\n {t('chat.feedback.comment.label', 'How can we improve? (optional)')}\n </Typography>\n <Box width=\"100%\">\n <Textarea\n name=\"feedback\"\n placeholder={t('chat.feedback.placeholder', 'Your feedback...')}\n onChange={(e) => setFeedbackText(e.target.value)}\n value={feedbackText}\n />\n </Box>\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={closeFeedbackModal}>\n {t('form.button.cancel', 'Cancel')}\n </Button>\n </Modal.Close>\n <Button\n onClick={handleSubmitFeedback}\n loading={isPending}\n disabled={selectedReasons.length === 0}\n >\n {t('form.button.submit', 'Submit')}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n"],"names":["FeedbackModalContext","createContext","isFeedbackModalOpen","currentMessageId","openFeedbackModal","closeFeedbackModal","useFeedbackModal","useContext","FeedbackProvider","children","setIsFeedbackModalOpen","useState","setCurrentMessageId","useCallback","messageId","contextValue","useMemo","_jsxs","Provider","value","_jsx","FeedbackModal","FeedbackOptionWrapper","styled","Flex","theme","colors","neutral100","primary100","primary200","FeedbackOption","id","label","selected","onClick","className","justifyContent","hasRadius","width","cursor","borderColor","padding","gap","Typography","variant","fontWeight","Checkbox","name","checked","onChange","feedbackText","setFeedbackText","selectedReasons","setSelectedReasons","t","useTranslations","toggleNotification","useNotification","downvoteMessage","isPending","useFeedback","feedbackReasons","handleReasonSelect","prevSelected","includes","filter","reasonId","handleSubmitFeedback","length","type","message","Modal","Root","open","onOpenChange","Content","Header","Body","direction","alignItems","Grid","map","reason","Item","col","xs","Box","Textarea","placeholder","e","target","Footer","Close","Button","loading","disabled"],"mappings":";;;;;;;;;;AA+BA,MAAMA,qCAAuBC,mBAAAA,CAAwC;IACnEC,mBAAAA,EAAqB,KAAA;IACrBC,gBAAAA,EAAkB,IAAA;AAClBC,IAAAA,iBAAAA,EAAmB,IAAA,CAAO,CAAA;AAC1BC,IAAAA,kBAAAA,EAAoB,IAAA,CAAO;AAC7B,CAAA,CAAA;AAEO,MAAMC,gBAAAA,GAAmB,IAAMC,gBAAAA,CAAWP,oBAAAA;AAE1C,MAAMQ,gBAAAA,GAAmB,CAAC,EAAEC,QAAQ,EAAiC,GAAA;AAC1E,IAAA,MAAM,CAACP,mBAAAA,EAAqBQ,sBAAAA,CAAuB,GAAGC,cAAAA,CAAS,KAAA,CAAA;AAC/D,IAAA,MAAM,CAACR,gBAAAA,EAAkBS,mBAAAA,CAAoB,GAAGD,cAAAA,CAAwB,IAAA,CAAA;IAExE,MAAMP,iBAAAA,GAAoBS,kBAAY,CAACC,SAAAA,GAAAA;QACrCF,mBAAAA,CAAoBE,SAAAA,CAAAA;QACpBJ,sBAAAA,CAAuB,IAAA,CAAA;AACzB,IAAA,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAML,qBAAqBQ,iBAAAA,CAAY,IAAA;QACrCH,sBAAAA,CAAuB,KAAA,CAAA;QACvBE,mBAAAA,CAAoB,IAAA,CAAA;AACtB,IAAA,CAAA,EAAG,EAAE,CAAA;IACL,MAAMG,YAAAA,GAAeC,aAAAA,CACnB,KAAO;AACLd,YAAAA,mBAAAA;AACAC,YAAAA,gBAAAA;AACAC,YAAAA,iBAAAA;AACAC,YAAAA;AACF,SAAA,CAAA,EACA;AAACH,QAAAA,mBAAAA;AAAqBC,QAAAA,gBAAAA;AAAkBC,QAAAA,iBAAAA;AAAmBC,QAAAA;AAAmB,KAAA,CAAA;IAGhF,qBACEY,eAAA,CAACjB,qBAAqBkB,QAAQ,EAAA;QAACC,KAAAA,EAAOJ,YAAAA;;AACnCb,YAAAA,mBAAAA,IAAuBC,kCAAoBiB,cAAA,CAACC,aAAAA,EAAAA,EAAAA,CAAAA;AAC5CZ,YAAAA;;;AAGP;AAaA,MAAMa,qBAAAA,GAAwBC,uBAAAA,CAAOC,iBAAAA,CAAK;;sBAEpB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;;;sBAIzC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;kBAC7C,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;AAE3D,CAAC;AAED,MAAMC,cAAAA,GAAgD,CAAC,EAAEC,EAAE,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAA;AACrF,IAAA,qBACEjB,eAAA,CAACK,qBAAAA,EAAAA;AACCa,QAAAA,SAAAA,EAAWF,WAAW,UAAA,GAAa,EAAA;QACnCG,cAAAA,EAAe,eAAA;QACfC,SAAS,EAAA,IAAA;QACTC,KAAAA,EAAM,MAAA;QACNC,MAAAA,EAAO,SAAA;QACPC,WAAAA,EAAY,YAAA;QACZC,OAAAA,EAAS,CAAA;QACTC,GAAAA,EAAK,CAAA;AACLR,QAAAA,OAAAA,EAAS,IAAMA,OAAAA,CAAQH,EAAAA,CAAAA;;0BAEvBX,cAAA,CAACuB,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,UAAAA,EAAW,MAAA;AACpCb,gBAAAA,QAAAA,EAAAA;;0BAEHZ,cAAA,CAAC0B,qBAAAA,EAAAA;gBACCC,IAAAA,EAAM,CAAC,SAAS,EAAEhB,EAAAA,CAAAA,CAAI;gBACtBZ,KAAAA,EAAOY,EAAAA;gBACPiB,OAAAA,EAASf,QAAAA;AACTgB,gBAAAA,QAAAA,EAAU,IAAMf,OAAAA,CAAQH,EAAAA;;;;AAIhC,CAAA;AAEA;;2GAIaV,aAAAA,GAA0B,IAAA;AACrC,IAAA,MAAM,CAAC6B,YAAAA,EAAcC,eAAAA,CAAgB,GAAGxC,cAAAA,CAAS,EAAA,CAAA;AACjD,IAAA,MAAM,CAACyC,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAG1C,eAA8B,EAAE,CAAA;IAE9E,MAAM,EAAE2C,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IACd,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEpD,kBAAkB,EAAEF,gBAAgB,EAAE,GAAGG,gBAAAA,EAAAA;AACjD,IAAA,MAAM,EAAEoD,eAAe,EAAEC,SAAS,EAAE,GAAGC,uBAAAA,EAAAA;AAEvC,IAAA,MAAMC,eAAAA,GAAkB;AACtB,QAAA;YACE9B,EAAAA,EAAI,gBAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,qCAAA,EAAuC,gBAAA;AAClD,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,oBAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,yCAAA,EAA2C,oBAAA;AACtD,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,MAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,2BAAA,EAA6B,MAAA;AACxC,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,sBAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,2CAAA,EAA6C,sBAAA;AACxD,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,YAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,iCAAA,EAAmC,YAAA;AAC9C,SAAA;AACA,QAAA;YACEvB,EAAAA,EAAI,OAAA;AACJC,YAAAA,KAAAA,EAAOsB,EAAE,4BAAA,EAA8B,OAAA;AACzC;AACD,KAAA;AAED,IAAA,MAAMQ,qBAAqB,CAAC/B,EAAAA,GAAAA;AAC1BsB,QAAAA,kBAAAA,CAAmB,CAACU,YAAAA,GAAAA;;YAElB,IAAIA,YAAAA,CAAaC,QAAQ,CAACjC,EAAAA,CAAAA,EAAK;AAC7B,gBAAA,OAAOgC,YAAAA,CAAaE,MAAM,CAAC,CAACC,WAAaA,QAAAA,KAAanC,EAAAA,CAAAA;AACxD,YAAA;;YAEA,OAAO;AAAIgC,gBAAAA,GAAAA,YAAAA;AAAchC,gBAAAA;AAAG,aAAA;AAC9B,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMoC,oBAAAA,GAAuB,UAAA;QAC3B,IAAIf,eAAAA,CAAgBgB,MAAM,KAAK,CAAA,EAAG;QAElC,IAAI;YACF,MAAMV,eAAAA,CAAgBvD,kBAA4B+C,YAAAA,EAAcE,eAAAA,CAAAA;YAEhED,eAAAA,CAAgB,EAAA,CAAA;AAChBE,YAAAA,kBAAAA,CAAmB,EAAE,CAAA;AACrBhD,YAAAA,kBAAAA,EAAAA;AACF,QAAA,CAAA,CAAE,OAAM;YACNmD,kBAAAA,CAAmB;gBACjBa,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAShB,EAAE,qBAAA,EAAuB,kDAAA;AACpC,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,qBACElC,cAAA,CAACmD,mBAAMC,IAAI,EAAA;QAACC,IAAI,EAAA,IAAA;QAACC,YAAAA,EAAcrE,kBAAAA;gCAC7BY,eAAA,CAACsD,mBAAMI,OAAO,EAAA;;AACZ,8BAAAvD,cAAA,CAACmD,mBAAMK,MAAM,EAAA;AACX,oBAAA,QAAA,gBAAAxD,cAAA,CAACuB,uBAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,OAAA;wBAAQC,UAAAA,EAAW,MAAA;AACpCS,wBAAAA,QAAAA,EAAAA,CAAAA,CAAE,qBAAA,EAAuB,eAAA;;;AAG9B,8BAAAlC,cAAA,CAACmD,mBAAMM,IAAI,EAAA;AACT,oBAAA,QAAA,gBAAA5D,eAAA,CAACO,iBAAAA,EAAAA;wBAAKsD,SAAAA,EAAU,QAAA;wBAASC,UAAAA,EAAW,OAAA;wBAAQrC,GAAAA,EAAK,CAAA;wBAAGJ,KAAAA,EAAM,MAAA;;0CACxDrB,eAAA,CAACO,iBAAAA,EAAAA;gCAAKsD,SAAAA,EAAU,QAAA;gCAASC,UAAAA,EAAW,OAAA;gCAAQrC,GAAAA,EAAK,CAAA;;kDAC/CtB,cAAA,CAACuB,uBAAAA,EAAAA;wCAAWC,OAAAA,EAAQ,MAAA;wCAAOC,UAAAA,EAAW,MAAA;AACnCS,wCAAAA,QAAAA,EAAAA,CAAAA,CAAE,qBAAA,EAAuB,eAAA;;kDAE5BlC,cAAA,CAACuB,uBAAAA,EAAAA;wCAAWC,OAAAA,EAAQ,OAAA;AACjBU,wCAAAA,QAAAA,EAAAA,CAAAA,CACC,wBAAA,EACA,qEAAA;;;;AAIN,0CAAAlC,cAAA,CAAC4D,kBAAKR,IAAI,EAAA;gCAAClC,KAAAA,EAAM,MAAA;gCAAOI,GAAAA,EAAK,CAAA;AAC1BmB,gCAAAA,QAAAA,EAAAA,eAAAA,CAAgBoB,GAAG,CAAC,CAACC,MAAAA,iBACpB9D,cAAA,CAAC4D,kBAAKG,IAAI,EAAA;wCAAiBC,GAAAA,EAAK,CAAA;wCAAGC,EAAAA,EAAI,EAAA;AACrC,wCAAA,QAAA,gBAAAjE,cAAA,CAACU,cAAAA,EAAAA;AAECC,4CAAAA,EAAAA,EAAImD,OAAOnD,EAAE;AACbC,4CAAAA,KAAAA,EAAOkD,OAAOlD,KAAK;AACnBC,4CAAAA,QAAAA,EAAUmB,eAAAA,CAAgBY,QAAQ,CAACkB,MAAAA,CAAOnD,EAAE,CAAA;4CAC5CG,OAAAA,EAAS4B;AAJJoB,yCAAAA,EAAAA,MAAAA,CAAOnD,EAAE;AAFFmD,qCAAAA,EAAAA,MAAAA,CAAOnD,EAAE,CAAA;;0CAW7Bd,eAAA,CAACO,iBAAAA,EAAAA;gCAAKsD,SAAAA,EAAU,QAAA;gCAASpC,GAAAA,EAAK,CAAA;gCAAGJ,KAAAA,EAAM,MAAA;gCAAOyC,UAAAA,EAAW,OAAA;;kDACvD3D,cAAA,CAACuB,uBAAAA,EAAAA;wCAAWC,OAAAA,EAAQ,OAAA;AACjBU,wCAAAA,QAAAA,EAAAA,CAAAA,CAAE,6BAAA,EAA+B,gCAAA;;kDAEpClC,cAAA,CAACkE,gBAAAA,EAAAA;wCAAIhD,KAAAA,EAAM,MAAA;AACT,wCAAA,QAAA,gBAAAlB,cAAA,CAACmE,qBAAAA,EAAAA;4CACCxC,IAAAA,EAAK,UAAA;AACLyC,4CAAAA,WAAAA,EAAalC,EAAE,2BAAA,EAA6B,kBAAA,CAAA;AAC5CL,4CAAAA,QAAAA,EAAU,CAACwC,CAAAA,GAAMtC,eAAAA,CAAgBsC,CAAAA,CAAEC,MAAM,CAACvE,KAAK,CAAA;4CAC/CA,KAAAA,EAAO+B;;;;;;;;AAMjB,8BAAAjC,eAAA,CAACsD,mBAAMoB,MAAM,EAAA;;AACX,sCAAAvE,cAAA,CAACmD,mBAAMqB,KAAK,EAAA;AACV,4BAAA,QAAA,gBAAAxE,cAAA,CAACyE,mBAAAA,EAAAA;gCAAOjD,OAAAA,EAAQ,UAAA;gCAAWV,OAAAA,EAAS7B,kBAAAA;AACjCiD,gCAAAA,QAAAA,EAAAA,CAAAA,CAAE,oBAAA,EAAsB,QAAA;;;sCAG7BlC,cAAA,CAACyE,mBAAAA,EAAAA;4BACC3D,OAAAA,EAASiC,oBAAAA;4BACT2B,OAAAA,EAASnC,SAAAA;4BACToC,QAAAA,EAAU3C,eAAAA,CAAgBgB,MAAM,KAAK,CAAA;AAEpCd,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,oBAAA,EAAsB,QAAA;;;;;;;AAMrC;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, createContext, useContext } from 'react';
2
+ import { useState, useCallback, useMemo, createContext, useContext } from 'react';
3
3
  import { useNotification } from '@strapi/admin/strapi-admin';
4
4
  import { Modal, Typography, Flex, Grid, Box, Textarea, Button, Checkbox } from '@strapi/design-system';
5
5
  import { styled } from 'styled-components';
@@ -16,21 +16,27 @@ const useFeedbackModal = ()=>useContext(FeedbackModalContext);
16
16
  const FeedbackProvider = ({ children })=>{
17
17
  const [isFeedbackModalOpen, setIsFeedbackModalOpen] = useState(false);
18
18
  const [currentMessageId, setCurrentMessageId] = useState(null);
19
- const openFeedbackModal = (messageId)=>{
19
+ const openFeedbackModal = useCallback((messageId)=>{
20
20
  setCurrentMessageId(messageId);
21
21
  setIsFeedbackModalOpen(true);
22
- };
23
- const closeFeedbackModal = ()=>{
22
+ }, []);
23
+ const closeFeedbackModal = useCallback(()=>{
24
24
  setIsFeedbackModalOpen(false);
25
25
  setCurrentMessageId(null);
26
- };
27
- return /*#__PURE__*/ jsxs(FeedbackModalContext.Provider, {
28
- value: {
26
+ }, []);
27
+ const contextValue = useMemo(()=>({
29
28
  isFeedbackModalOpen,
30
29
  currentMessageId,
31
30
  openFeedbackModal,
32
31
  closeFeedbackModal
33
- },
32
+ }), [
33
+ isFeedbackModalOpen,
34
+ currentMessageId,
35
+ openFeedbackModal,
36
+ closeFeedbackModal
37
+ ]);
38
+ return /*#__PURE__*/ jsxs(FeedbackModalContext.Provider, {
39
+ value: contextValue,
34
40
  children: [
35
41
  isFeedbackModalOpen && currentMessageId && /*#__PURE__*/ jsx(FeedbackModal, {}),
36
42
  children
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackModal.mjs","sources":["../../../../admin/src/components/AIChat/FeedbackModal.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createContext, useContext, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Typography,\n Textarea,\n Button,\n Grid,\n Checkbox,\n Modal,\n} from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { useFeedback } from './hooks/useFeedback';\nimport { useTranslations } from './hooks/useTranslations';\n\nimport type { FeedbackReasonIds } from './lib/types/feedback';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface FeedbackModalContextType {\n isFeedbackModalOpen: boolean;\n currentMessageId: string | null;\n openFeedbackModal: (messageId: string) => void;\n closeFeedbackModal: () => void;\n}\n\nconst FeedbackModalContext = createContext<FeedbackModalContextType>({\n isFeedbackModalOpen: false,\n currentMessageId: null,\n openFeedbackModal: () => {},\n closeFeedbackModal: () => {},\n});\n\nexport const useFeedbackModal = () => useContext(FeedbackModalContext);\n\nexport const FeedbackProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFeedbackModalOpen, setIsFeedbackModalOpen] = useState(false);\n const [currentMessageId, setCurrentMessageId] = useState<string | null>(null);\n\n const openFeedbackModal = (messageId: string) => {\n setCurrentMessageId(messageId);\n setIsFeedbackModalOpen(true);\n };\n\n const closeFeedbackModal = () => {\n setIsFeedbackModalOpen(false);\n setCurrentMessageId(null);\n };\n\n return (\n <FeedbackModalContext.Provider\n value={{ isFeedbackModalOpen, currentMessageId, openFeedbackModal, closeFeedbackModal }}\n >\n {isFeedbackModalOpen && currentMessageId && <FeedbackModal />}\n {children}\n </FeedbackModalContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Feedback Option\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FeedbackOptionProps {\n id: FeedbackReasonIds;\n label: string;\n selected: boolean;\n onClick: (id: FeedbackReasonIds) => void;\n}\n\nconst FeedbackOptionWrapper = styled(Flex)`\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n\n &.selected {\n background-color: ${({ theme }) => theme.colors.primary100};\n border-color: ${({ theme }) => theme.colors.primary200};\n }\n`;\n\nconst FeedbackOption: React.FC<FeedbackOptionProps> = ({ id, label, selected, onClick }) => {\n return (\n <FeedbackOptionWrapper\n className={selected ? 'selected' : ''}\n justifyContent=\"space-between\"\n hasRadius\n width=\"100%\"\n cursor=\"pointer\"\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n onClick={() => onClick(id)}\n >\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {label}\n </Typography>\n <Checkbox\n name={`feedback-${id}`}\n value={id}\n checked={selected}\n onChange={() => onClick(id)}\n />\n </FeedbackOptionWrapper>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\n\nexport const FeedbackModal: React.FC = () => {\n const [feedbackText, setFeedbackText] = useState('');\n const [selectedReasons, setSelectedReasons] = useState<FeedbackReasonIds[]>([]);\n\n const { t } = useTranslations();\n const { toggleNotification } = useNotification();\n const { closeFeedbackModal, currentMessageId } = useFeedbackModal();\n const { downvoteMessage, isPending } = useFeedback();\n\n const feedbackReasons = [\n {\n id: 'invalid_schema',\n label: t('chat.feedback.reason.invalid_schema', 'Invalid schema'),\n },\n {\n id: 'bad_recommendation',\n label: t('chat.feedback.reason.bad_recommendation', 'Bad recommendation'),\n },\n {\n id: 'slow',\n label: t('chat.feedback.reason.slow', 'Slow'),\n },\n {\n id: 'instructions_ignored',\n label: t('chat.feedback.reason.instructions_ignored', 'Instructions ignored'),\n },\n {\n id: 'being_lazy',\n label: t('chat.feedback.reason.being_lazy', 'Being lazy'),\n },\n {\n id: 'other',\n label: t('chat.feedback.reason.other', 'Other'),\n },\n ] satisfies { id: FeedbackReasonIds; label: string }[];\n\n const handleReasonSelect = (id: FeedbackReasonIds) => {\n setSelectedReasons((prevSelected) => {\n // If already selected, remove it\n if (prevSelected.includes(id)) {\n return prevSelected.filter((reasonId) => reasonId !== id);\n }\n // Otherwise add it\n return [...prevSelected, id];\n });\n };\n\n const handleSubmitFeedback = async () => {\n if (selectedReasons.length === 0) return;\n\n try {\n await downvoteMessage(currentMessageId as string, feedbackText, selectedReasons);\n\n setFeedbackText('');\n setSelectedReasons([]);\n closeFeedbackModal();\n } catch {\n toggleNotification({\n type: 'danger',\n message: t('chat.feedback.error', 'An error occurred while submitting your feedback'),\n });\n }\n };\n\n return (\n <Modal.Root open onOpenChange={closeFeedbackModal}>\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"start\" gap={6} width=\"100%\">\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Typography variant=\"beta\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n <Typography variant=\"omega\">\n {t(\n 'chat.feedback.subtitle',\n 'Provide additional feedback on this message. Select all that apply.'\n )}\n </Typography>\n </Flex>\n <Grid.Root width=\"100%\" gap={2}>\n {feedbackReasons.map((reason) => (\n <Grid.Item key={reason.id} col={6} xs={12}>\n <FeedbackOption\n key={reason.id}\n id={reason.id}\n label={reason.label}\n selected={selectedReasons.includes(reason.id)}\n onClick={handleReasonSelect}\n />\n </Grid.Item>\n ))}\n </Grid.Root>\n <Flex direction=\"column\" gap={2} width=\"100%\" alignItems=\"start\">\n <Typography variant=\"omega\">\n {t('chat.feedback.comment.label', 'How can we improve? (optional)')}\n </Typography>\n <Box width=\"100%\">\n <Textarea\n name=\"feedback\"\n placeholder={t('chat.feedback.placeholder', 'Your feedback...')}\n onChange={(e) => setFeedbackText(e.target.value)}\n value={feedbackText}\n />\n </Box>\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={closeFeedbackModal}>\n {t('form.button.cancel', 'Cancel')}\n </Button>\n </Modal.Close>\n <Button\n onClick={handleSubmitFeedback}\n loading={isPending}\n disabled={selectedReasons.length === 0}\n >\n {t('form.button.submit', 'Submit')}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n"],"names":["FeedbackModalContext","createContext","isFeedbackModalOpen","currentMessageId","openFeedbackModal","closeFeedbackModal","useFeedbackModal","useContext","FeedbackProvider","children","setIsFeedbackModalOpen","useState","setCurrentMessageId","messageId","_jsxs","Provider","value","_jsx","FeedbackModal","FeedbackOptionWrapper","styled","Flex","theme","colors","neutral100","primary100","primary200","FeedbackOption","id","label","selected","onClick","className","justifyContent","hasRadius","width","cursor","borderColor","padding","gap","Typography","variant","fontWeight","Checkbox","name","checked","onChange","feedbackText","setFeedbackText","selectedReasons","setSelectedReasons","t","useTranslations","toggleNotification","useNotification","downvoteMessage","isPending","useFeedback","feedbackReasons","handleReasonSelect","prevSelected","includes","filter","reasonId","handleSubmitFeedback","length","type","message","Modal","Root","open","onOpenChange","Content","Header","Body","direction","alignItems","Grid","map","reason","Item","col","xs","Box","Textarea","placeholder","e","target","Footer","Close","Button","loading","disabled"],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackModal.mjs","sources":["../../../../admin/src/components/AIChat/FeedbackModal.tsx"],"sourcesContent":["import * as React from 'react';\nimport { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n Typography,\n Textarea,\n Button,\n Grid,\n Checkbox,\n Modal,\n} from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { useFeedback } from './hooks/useFeedback';\nimport { useTranslations } from './hooks/useTranslations';\n\nimport type { FeedbackReasonIds } from './lib/types/feedback';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface FeedbackModalContextType {\n isFeedbackModalOpen: boolean;\n currentMessageId: string | null;\n openFeedbackModal: (messageId: string) => void;\n closeFeedbackModal: () => void;\n}\n\nconst FeedbackModalContext = createContext<FeedbackModalContextType>({\n isFeedbackModalOpen: false,\n currentMessageId: null,\n openFeedbackModal: () => {},\n closeFeedbackModal: () => {},\n});\n\nexport const useFeedbackModal = () => useContext(FeedbackModalContext);\n\nexport const FeedbackProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFeedbackModalOpen, setIsFeedbackModalOpen] = useState(false);\n const [currentMessageId, setCurrentMessageId] = useState<string | null>(null);\n\n const openFeedbackModal = useCallback((messageId: string) => {\n setCurrentMessageId(messageId);\n setIsFeedbackModalOpen(true);\n }, []);\n\n const closeFeedbackModal = useCallback(() => {\n setIsFeedbackModalOpen(false);\n setCurrentMessageId(null);\n }, []);\n const contextValue = useMemo(\n () => ({\n isFeedbackModalOpen,\n currentMessageId,\n openFeedbackModal,\n closeFeedbackModal,\n }),\n [isFeedbackModalOpen, currentMessageId, openFeedbackModal, closeFeedbackModal]\n );\n\n return (\n <FeedbackModalContext.Provider value={contextValue}>\n {isFeedbackModalOpen && currentMessageId && <FeedbackModal />}\n {children}\n </FeedbackModalContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Feedback Option\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FeedbackOptionProps {\n id: FeedbackReasonIds;\n label: string;\n selected: boolean;\n onClick: (id: FeedbackReasonIds) => void;\n}\n\nconst FeedbackOptionWrapper = styled(Flex)`\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n\n &.selected {\n background-color: ${({ theme }) => theme.colors.primary100};\n border-color: ${({ theme }) => theme.colors.primary200};\n }\n`;\n\nconst FeedbackOption: React.FC<FeedbackOptionProps> = ({ id, label, selected, onClick }) => {\n return (\n <FeedbackOptionWrapper\n className={selected ? 'selected' : ''}\n justifyContent=\"space-between\"\n hasRadius\n width=\"100%\"\n cursor=\"pointer\"\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n onClick={() => onClick(id)}\n >\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {label}\n </Typography>\n <Checkbox\n name={`feedback-${id}`}\n value={id}\n checked={selected}\n onChange={() => onClick(id)}\n />\n </FeedbackOptionWrapper>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\n\nexport const FeedbackModal: React.FC = () => {\n const [feedbackText, setFeedbackText] = useState('');\n const [selectedReasons, setSelectedReasons] = useState<FeedbackReasonIds[]>([]);\n\n const { t } = useTranslations();\n const { toggleNotification } = useNotification();\n const { closeFeedbackModal, currentMessageId } = useFeedbackModal();\n const { downvoteMessage, isPending } = useFeedback();\n\n const feedbackReasons = [\n {\n id: 'invalid_schema',\n label: t('chat.feedback.reason.invalid_schema', 'Invalid schema'),\n },\n {\n id: 'bad_recommendation',\n label: t('chat.feedback.reason.bad_recommendation', 'Bad recommendation'),\n },\n {\n id: 'slow',\n label: t('chat.feedback.reason.slow', 'Slow'),\n },\n {\n id: 'instructions_ignored',\n label: t('chat.feedback.reason.instructions_ignored', 'Instructions ignored'),\n },\n {\n id: 'being_lazy',\n label: t('chat.feedback.reason.being_lazy', 'Being lazy'),\n },\n {\n id: 'other',\n label: t('chat.feedback.reason.other', 'Other'),\n },\n ] satisfies { id: FeedbackReasonIds; label: string }[];\n\n const handleReasonSelect = (id: FeedbackReasonIds) => {\n setSelectedReasons((prevSelected) => {\n // If already selected, remove it\n if (prevSelected.includes(id)) {\n return prevSelected.filter((reasonId) => reasonId !== id);\n }\n // Otherwise add it\n return [...prevSelected, id];\n });\n };\n\n const handleSubmitFeedback = async () => {\n if (selectedReasons.length === 0) return;\n\n try {\n await downvoteMessage(currentMessageId as string, feedbackText, selectedReasons);\n\n setFeedbackText('');\n setSelectedReasons([]);\n closeFeedbackModal();\n } catch {\n toggleNotification({\n type: 'danger',\n message: t('chat.feedback.error', 'An error occurred while submitting your feedback'),\n });\n }\n };\n\n return (\n <Modal.Root open onOpenChange={closeFeedbackModal}>\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"start\" gap={6} width=\"100%\">\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Typography variant=\"beta\" fontWeight=\"bold\">\n {t('chat.feedback.title', 'Give feedback')}\n </Typography>\n <Typography variant=\"omega\">\n {t(\n 'chat.feedback.subtitle',\n 'Provide additional feedback on this message. Select all that apply.'\n )}\n </Typography>\n </Flex>\n <Grid.Root width=\"100%\" gap={2}>\n {feedbackReasons.map((reason) => (\n <Grid.Item key={reason.id} col={6} xs={12}>\n <FeedbackOption\n key={reason.id}\n id={reason.id}\n label={reason.label}\n selected={selectedReasons.includes(reason.id)}\n onClick={handleReasonSelect}\n />\n </Grid.Item>\n ))}\n </Grid.Root>\n <Flex direction=\"column\" gap={2} width=\"100%\" alignItems=\"start\">\n <Typography variant=\"omega\">\n {t('chat.feedback.comment.label', 'How can we improve? (optional)')}\n </Typography>\n <Box width=\"100%\">\n <Textarea\n name=\"feedback\"\n placeholder={t('chat.feedback.placeholder', 'Your feedback...')}\n onChange={(e) => setFeedbackText(e.target.value)}\n value={feedbackText}\n />\n </Box>\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={closeFeedbackModal}>\n {t('form.button.cancel', 'Cancel')}\n </Button>\n </Modal.Close>\n <Button\n onClick={handleSubmitFeedback}\n loading={isPending}\n disabled={selectedReasons.length === 0}\n >\n {t('form.button.submit', 'Submit')}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n"],"names":["FeedbackModalContext","createContext","isFeedbackModalOpen","currentMessageId","openFeedbackModal","closeFeedbackModal","useFeedbackModal","useContext","FeedbackProvider","children","setIsFeedbackModalOpen","useState","setCurrentMessageId","useCallback","messageId","contextValue","useMemo","_jsxs","Provider","value","_jsx","FeedbackModal","FeedbackOptionWrapper","styled","Flex","theme","colors","neutral100","primary100","primary200","FeedbackOption","id","label","selected","onClick","className","justifyContent","hasRadius","width","cursor","borderColor","padding","gap","Typography","variant","fontWeight","Checkbox","name","checked","onChange","feedbackText","setFeedbackText","selectedReasons","setSelectedReasons","t","useTranslations","toggleNotification","useNotification","downvoteMessage","isPending","useFeedback","feedbackReasons","handleReasonSelect","prevSelected","includes","filter","reasonId","handleSubmitFeedback","length","type","message","Modal","Root","open","onOpenChange","Content","Header","Body","direction","alignItems","Grid","map","reason","Item","col","xs","Box","Textarea","placeholder","e","target","Footer","Close","Button","loading","disabled"],"mappings":"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"}
@@ -23,18 +23,24 @@ const useUploadProjectToChat = ()=>React.useContext(UploadProjectContext);
23
23
  const UploadProjectToChatProvider = ({ children })=>{
24
24
  const [isCodeUploadOpen, setIsCodeUploadOpen] = React.useState(false);
25
25
  const [submitOnFinish, setSubmitOnFinish] = React.useState(false);
26
- const openCodeUpload = (submitOnFinish)=>{
26
+ const openCodeUpload = React.useCallback((submitOnFinish)=>{
27
27
  setIsCodeUploadOpen(true);
28
28
  setSubmitOnFinish(submitOnFinish ?? false);
29
- };
30
- const closeCodeUpload = ()=>setIsCodeUploadOpen(false);
31
- return /*#__PURE__*/ jsxRuntime.jsxs(UploadProjectContext.Provider, {
32
- value: {
29
+ }, []);
30
+ const closeCodeUpload = React.useCallback(()=>setIsCodeUploadOpen(false), []);
31
+ const contextValue = React.useMemo(()=>({
33
32
  isCodeUploadOpen,
34
33
  submitOnFinish,
35
34
  openCodeUpload,
36
35
  closeCodeUpload
37
- },
36
+ }), [
37
+ isCodeUploadOpen,
38
+ submitOnFinish,
39
+ openCodeUpload,
40
+ closeCodeUpload
41
+ ]);
42
+ return /*#__PURE__*/ jsxRuntime.jsxs(UploadProjectContext.Provider, {
43
+ value: contextValue,
38
44
  children: [
39
45
  isCodeUploadOpen && /*#__PURE__*/ jsxRuntime.jsx(UploadCodeModal, {}),
40
46
  children
@@ -1 +1 @@
1
- {"version":3,"file":"UploadCodeModal.js","sources":["../../../../admin/src/components/AIChat/UploadCodeModal.tsx"],"sourcesContent":["import { createContext, useContext, useRef, useState } from 'react';\n\nimport { Flex, Typography, Box } from '@strapi/design-system';\nimport { Folder, FileZip } from '@strapi/icons';\n\nimport { AttachmentPreview } from './components/Attachments/AttachmentPreview';\nimport { StepModal, useStepModal } from './components/StepModal';\nimport { useAttachments } from './hooks/useAttachments';\nimport { useCodeUpload } from './hooks/useCodeUpload';\nimport { useTranslations } from './hooks/useTranslations';\nimport { STRAPI_CODE_MIME_TYPE } from './lib/constants';\nimport { generateId } from './lib/misc';\nimport { Attachment } from './lib/types/attachments';\nimport { useStrapiChat } from './providers/ChatProvider';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface UploadProjectContextType {\n isCodeUploadOpen: boolean;\n submitOnFinish: boolean;\n openCodeUpload: (submitOnFinish?: boolean) => void;\n closeCodeUpload: () => void;\n}\n\nconst UploadProjectContext = createContext<UploadProjectContextType>({\n isCodeUploadOpen: false,\n submitOnFinish: false,\n openCodeUpload: () => {},\n closeCodeUpload: () => {},\n});\n\nexport const useUploadProjectToChat = () => useContext(UploadProjectContext);\n\nexport const UploadProjectToChatProvider = ({ children }: { children: React.ReactNode }) => {\n const [isCodeUploadOpen, setIsCodeUploadOpen] = useState(false);\n const [submitOnFinish, setSubmitOnFinish] = useState(false);\n\n const openCodeUpload = (submitOnFinish?: boolean) => {\n setIsCodeUploadOpen(true);\n setSubmitOnFinish(submitOnFinish ?? false);\n };\n\n const closeCodeUpload = () => setIsCodeUploadOpen(false);\n\n return (\n <UploadProjectContext.Provider\n value={{ isCodeUploadOpen, submitOnFinish, openCodeUpload, closeCodeUpload }}\n >\n {isCodeUploadOpen && <UploadCodeModal />}\n {children}\n </UploadProjectContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Drop Zone\n * -----------------------------------------------------------------------------------------------*/\ninterface DropZoneProps {\n importType: 'folder' | 'zip';\n onAddFiles: (files: File[]) => void;\n error?: string | null;\n}\n\nconst DropZone = ({ importType, onAddFiles, error }: DropZoneProps) => {\n const [dragOver, setDragOver] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslations();\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n };\n\n const handleDragEnter = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n inputRef.current?.click();\n };\n\n const handleChange = () => {\n const files = inputRef.current?.files;\n if (files) {\n onAddFiles(Array.from(files));\n }\n };\n\n /**\n * Recursively reads a directory and its contents\n */\n const readDirectory = async (entry: FileSystemDirectoryEntry): Promise<File[]> => {\n const reader = entry.createReader();\n const getEntries = (): Promise<FileSystemEntry[]> => {\n return new Promise((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n };\n\n const files: File[] = [];\n let entries: FileSystemEntry[] = [];\n\n // Read entries in batches until no more entries are left\n do {\n entries = await getEntries();\n for (const entry of entries) {\n if (entry.isFile) {\n const fileEntry = entry as FileSystemFileEntry;\n const file = await new Promise<File>((resolve, reject) => {\n fileEntry.file(resolve, reject);\n });\n\n // Store the full path including the directory structure\n Object.defineProperty(file, 'webkitRelativePath', {\n writable: true,\n value: entry.fullPath.substring(1), // Remove leading slash\n });\n\n files.push(file);\n } else if (entry.isDirectory) {\n // Recursively process subdirectories\n const dirEntry = entry as FileSystemDirectoryEntry;\n const subFiles = await readDirectory(dirEntry);\n files.push(...subFiles);\n }\n }\n } while (entries.length > 0);\n\n return files;\n };\n\n const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragOver(false);\n\n if (!e.dataTransfer?.items) {\n return;\n }\n\n // For folder upload, process directories recursively\n if (importType === 'folder') {\n const items = e.dataTransfer.items;\n const allFiles: File[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n // Use webkitGetAsEntry to access the file system entry\n const entry = item.webkitGetAsEntry?.();\n\n if (entry) {\n if (entry.isDirectory) {\n const files = await readDirectory(entry as FileSystemDirectoryEntry);\n allFiles.push(...files);\n } else if (entry.isFile) {\n const file = await new Promise<File>((resolve, reject) => {\n (entry as FileSystemFileEntry).file(resolve, reject);\n });\n allFiles.push(file);\n }\n }\n }\n\n if (allFiles.length > 0) {\n onAddFiles(allFiles);\n }\n } else {\n // For zip files, just import them regularly\n if (e.dataTransfer.files) {\n onAddFiles(Array.from(e.dataTransfer.files));\n }\n }\n };\n\n return (\n <Flex\n position=\"relative\"\n cursor=\"pointer\"\n width=\"100%\"\n height=\"100%\"\n minHeight=\"140px\"\n borderStyle=\"dashed\"\n borderColor={dragOver ? 'primary500' : error ? 'danger600' : 'neutral200'}\n background={dragOver ? 'primary100' : error ? 'danger100' : 'neutral100'}\n hasRadius\n padding={7}\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n gap={2}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {importType === 'zip' ? (\n <FileZip width={'24px'} height={'24px'} />\n ) : (\n <Folder width={'24px'} height={'24px'} />\n )}\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {importType === 'zip'\n ? t('chat.code-upload.drop-zone', 'Drop here a .zip file here or')\n : t('chat.code-upload.drop-zone-folder', 'Drop here a folder here or')}{' '}\n <Typography variant=\"omega\" textColor=\"primary600\" onClick={handleClick}>\n {t('chat.code-upload.drop-zone-browse', 'browse files')}\n </Typography>\n </Typography>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n )}\n </Flex>\n <Box\n tag=\"input\"\n position=\"absolute\"\n left={0}\n right={0}\n bottom={0}\n top={0}\n width=\"100%\"\n name=\"code\"\n aria-label=\"Upload project\"\n tabIndex={-1}\n zIndex={1}\n ref={inputRef}\n onChange={handleChange}\n style={{ opacity: 0, cursor: 'pointer' }}\n type=\"file\"\n {...(importType === 'zip'\n ? { accept: '.zip', multiple: false }\n : { multiple: true, webkitdirectory: '', directory: '' })}\n />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 1 - Upload Code\n * -----------------------------------------------------------------------------------------------*/\ninterface CodeUploadStepProps {\n setFileName: (name: string | null) => void;\n error: string | null;\n processZipFile: (file: File) => void;\n processFolder: (files: File[]) => Promise<Attachment>;\n}\n\nconst CodeUploadStep = ({\n setFileName,\n error,\n processZipFile,\n processFolder,\n}: CodeUploadStepProps) => {\n const { t } = useTranslations();\n const { nextStep } = useStepModal();\n\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\" width=\"100%\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">{t('chat.code-upload.title', 'Import code')}</Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.code-upload.description',\n 'Your app will be analyzed by AI. Make sure to remove all sensitive data before importation.'\n )}\n </Typography>\n </Flex>\n\n <Flex gap={3} width=\"100%\" wrap=\"wrap\">\n <Box flex={1} minWidth=\"200px\">\n <DropZone\n importType=\"zip\"\n onAddFiles={(files: FileList | File[]) => {\n if (files.length > 0) {\n const file = files[0];\n setFileName(file.name.replace('.zip', ''));\n nextStep();\n processZipFile(file);\n }\n }}\n error={error}\n />\n </Box>\n <Box flex={1} minWidth=\"200px\">\n <DropZone\n importType=\"folder\"\n onAddFiles={async (files: File[]) => {\n if (files.length > 0) {\n try {\n // Get the folder name from the first file's path\n const firstFile = files[0];\n const folderPath = firstFile.webkitRelativePath || '';\n const folderName = folderPath.split('/')[0] || 'Project';\n\n setFileName(folderName);\n nextStep();\n\n // Process the folder files\n await processFolder(files);\n } catch (err) {\n console.error('Error processing folder:', err);\n }\n }\n }}\n error={error}\n />\n </Box>\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 2 - Confirmation\n * -----------------------------------------------------------------------------------------------*/\ninterface CodeConfirmationStepProps {\n projectName: string | null;\n isLoading: boolean;\n error: string | null;\n}\n\nconst CodeConfirmationStep = ({ projectName, isLoading, error }: CodeConfirmationStepProps) => {\n const { t } = useTranslations();\n\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\" width=\"100%\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">\n {t('chat.code-upload.confirmation-title', 'Confirm Code Import')}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.code-upload.confirmation-description',\n 'Your code is ready to be imported. Click finish to add it to your chat.'\n )}\n </Typography>\n </Flex>\n\n <Box width=\"100%\">\n <AttachmentPreview\n attachment={{\n id: generateId(),\n status: isLoading ? 'loading' : 'ready',\n filename: projectName || '',\n url: '',\n type: 'file',\n mediaType: STRAPI_CODE_MIME_TYPE,\n }}\n error={error}\n minWidth=\"256px\"\n />\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\nexport const UploadCodeModal = () => {\n const [projectName, setProjectName] = useState<string | null>(null);\n const [projectAttachment, setProjectAttachment] = useState<Attachment | null>(null);\n const { t } = useTranslations();\n\n // Attach files to the chat\n const { addAttachments } = useAttachments();\n\n const { processZipFile, processFolder, isLoading, error } = useCodeUpload({\n onSuccess: (file) => setProjectAttachment(file),\n });\n\n const { isCodeUploadOpen, closeCodeUpload, submitOnFinish } = useUploadProjectToChat();\n const { sendMessage, openChat, input, setInput } = useStrapiChat();\n\n const handleCancel = () => {\n setProjectName(null);\n setProjectAttachment(null);\n closeCodeUpload();\n };\n\n const handleComplete = async () => {\n // Ensure chat is opened\n openChat();\n\n if (projectAttachment && submitOnFinish) {\n sendMessage({\n role: 'user',\n parts: [\n {\n type: 'text',\n text: 'Create schemas from my uploaded project',\n },\n projectAttachment,\n ],\n });\n } else if (projectAttachment) {\n // If input is empty, set a predefined message\n if (!input) {\n setInput('Create schemas from my uploaded project');\n }\n // Attach files to the chat input\n addAttachments([projectAttachment]);\n }\n\n closeCodeUpload();\n };\n\n const validateUploadStep = () => {\n return !!projectAttachment;\n };\n\n return (\n <StepModal\n open={isCodeUploadOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleCancel();\n }}\n title={t('chat.code-upload.header', 'Import code')}\n onCancel={handleCancel}\n onComplete={handleComplete}\n >\n <StepModal.Step\n title={t('chat.code-upload.step1-title', 'Import code')}\n nextLabel={t('chat.code-upload.continue-button', 'Continue')}\n cancelLabel={t('common.cancel', 'Cancel')}\n disableNext={!projectAttachment || isLoading}\n onNext={validateUploadStep}\n >\n <CodeUploadStep\n setFileName={setProjectName}\n error={error}\n processZipFile={processZipFile}\n processFolder={processFolder}\n />\n </StepModal.Step>\n\n <StepModal.Step\n title={t('chat.code-upload.step2-title', 'Confirm')}\n nextLabel={t('common.finish', 'Finish')}\n backLabel={t('form.button.back', 'Back')}\n disableNext={!projectAttachment || isLoading}\n >\n <CodeConfirmationStep projectName={projectName} isLoading={isLoading} error={error} />\n </StepModal.Step>\n </StepModal>\n );\n};\n"],"names":["UploadProjectContext","createContext","isCodeUploadOpen","submitOnFinish","openCodeUpload","closeCodeUpload","useUploadProjectToChat","useContext","UploadProjectToChatProvider","children","setIsCodeUploadOpen","useState","setSubmitOnFinish","_jsxs","Provider","value","_jsx","UploadCodeModal","DropZone","importType","onAddFiles","error","dragOver","setDragOver","inputRef","useRef","t","useTranslations","handleDragOver","event","preventDefault","handleDragEnter","handleDragLeave","handleClick","e","current","click","handleChange","files","Array","from","readDirectory","entry","reader","createReader","getEntries","Promise","resolve","reject","readEntries","entries","isFile","fileEntry","file","Object","defineProperty","writable","fullPath","substring","push","isDirectory","dirEntry","subFiles","length","handleDrop","dataTransfer","items","allFiles","i","item","webkitGetAsEntry","Flex","position","cursor","width","height","minHeight","borderStyle","borderColor","background","hasRadius","padding","justifyContent","direction","alignItems","gap","onDragEnter","onDragLeave","onDragOver","onDrop","FileZip","Folder","Typography","variant","textColor","textAlign","onClick","Box","tag","left","right","bottom","top","name","aria-label","tabIndex","zIndex","ref","onChange","style","opacity","type","accept","multiple","webkitdirectory","directory","CodeUploadStep","setFileName","processZipFile","processFolder","nextStep","useStepModal","wrap","flex","minWidth","replace","firstFile","folderPath","webkitRelativePath","folderName","split","err","console","CodeConfirmationStep","projectName","isLoading","AttachmentPreview","attachment","id","generateId","status","filename","url","mediaType","STRAPI_CODE_MIME_TYPE","setProjectName","projectAttachment","setProjectAttachment","addAttachments","useAttachments","useCodeUpload","onSuccess","sendMessage","openChat","input","setInput","useStrapiChat","handleCancel","handleComplete","role","parts","text","validateUploadStep","StepModal","open","onOpenChange","isOpen","title","onCancel","onComplete","Step","nextLabel","cancelLabel","disableNext","onNext","backLabel"],"mappings":"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"}
1
+ {"version":3,"file":"UploadCodeModal.js","sources":["../../../../admin/src/components/AIChat/UploadCodeModal.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\n\nimport { Flex, Typography, Box } from '@strapi/design-system';\nimport { Folder, FileZip } from '@strapi/icons';\n\nimport { AttachmentPreview } from './components/Attachments/AttachmentPreview';\nimport { StepModal, useStepModal } from './components/StepModal';\nimport { useAttachments } from './hooks/useAttachments';\nimport { useCodeUpload } from './hooks/useCodeUpload';\nimport { useTranslations } from './hooks/useTranslations';\nimport { STRAPI_CODE_MIME_TYPE } from './lib/constants';\nimport { generateId } from './lib/misc';\nimport { Attachment } from './lib/types/attachments';\nimport { useStrapiChat } from './providers/ChatProvider';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface UploadProjectContextType {\n isCodeUploadOpen: boolean;\n submitOnFinish: boolean;\n openCodeUpload: (submitOnFinish?: boolean) => void;\n closeCodeUpload: () => void;\n}\n\nconst UploadProjectContext = createContext<UploadProjectContextType>({\n isCodeUploadOpen: false,\n submitOnFinish: false,\n openCodeUpload: () => {},\n closeCodeUpload: () => {},\n});\n\nexport const useUploadProjectToChat = () => useContext(UploadProjectContext);\n\nexport const UploadProjectToChatProvider = ({ children }: { children: React.ReactNode }) => {\n const [isCodeUploadOpen, setIsCodeUploadOpen] = useState(false);\n const [submitOnFinish, setSubmitOnFinish] = useState(false);\n\n const openCodeUpload = useCallback((submitOnFinish?: boolean) => {\n setIsCodeUploadOpen(true);\n setSubmitOnFinish(submitOnFinish ?? false);\n }, []);\n\n const closeCodeUpload = useCallback(() => setIsCodeUploadOpen(false), []);\n const contextValue = useMemo(\n () => ({ isCodeUploadOpen, submitOnFinish, openCodeUpload, closeCodeUpload }),\n [isCodeUploadOpen, submitOnFinish, openCodeUpload, closeCodeUpload]\n );\n\n return (\n <UploadProjectContext.Provider value={contextValue}>\n {isCodeUploadOpen && <UploadCodeModal />}\n {children}\n </UploadProjectContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Drop Zone\n * -----------------------------------------------------------------------------------------------*/\ninterface DropZoneProps {\n importType: 'folder' | 'zip';\n onAddFiles: (files: File[]) => void;\n error?: string | null;\n}\n\nconst DropZone = ({ importType, onAddFiles, error }: DropZoneProps) => {\n const [dragOver, setDragOver] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslations();\n\n const handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n };\n\n const handleDragEnter = (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setDragOver(true);\n };\n\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n inputRef.current?.click();\n };\n\n const handleChange = () => {\n const files = inputRef.current?.files;\n if (files) {\n onAddFiles(Array.from(files));\n }\n };\n\n /**\n * Recursively reads a directory and its contents\n */\n const readDirectory = async (entry: FileSystemDirectoryEntry): Promise<File[]> => {\n const reader = entry.createReader();\n const getEntries = (): Promise<FileSystemEntry[]> => {\n return new Promise((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n };\n\n const files: File[] = [];\n let entries: FileSystemEntry[] = [];\n\n // Read entries in batches until no more entries are left\n do {\n entries = await getEntries();\n for (const entry of entries) {\n if (entry.isFile) {\n const fileEntry = entry as FileSystemFileEntry;\n const file = await new Promise<File>((resolve, reject) => {\n fileEntry.file(resolve, reject);\n });\n\n // Store the full path including the directory structure\n Object.defineProperty(file, 'webkitRelativePath', {\n writable: true,\n value: entry.fullPath.substring(1), // Remove leading slash\n });\n\n files.push(file);\n } else if (entry.isDirectory) {\n // Recursively process subdirectories\n const dirEntry = entry as FileSystemDirectoryEntry;\n const subFiles = await readDirectory(dirEntry);\n files.push(...subFiles);\n }\n }\n } while (entries.length > 0);\n\n return files;\n };\n\n const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setDragOver(false);\n\n if (!e.dataTransfer?.items) {\n return;\n }\n\n // For folder upload, process directories recursively\n if (importType === 'folder') {\n const items = e.dataTransfer.items;\n const allFiles: File[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n // Use webkitGetAsEntry to access the file system entry\n const entry = item.webkitGetAsEntry?.();\n\n if (entry) {\n if (entry.isDirectory) {\n const files = await readDirectory(entry as FileSystemDirectoryEntry);\n allFiles.push(...files);\n } else if (entry.isFile) {\n const file = await new Promise<File>((resolve, reject) => {\n (entry as FileSystemFileEntry).file(resolve, reject);\n });\n allFiles.push(file);\n }\n }\n }\n\n if (allFiles.length > 0) {\n onAddFiles(allFiles);\n }\n } else {\n // For zip files, just import them regularly\n if (e.dataTransfer.files) {\n onAddFiles(Array.from(e.dataTransfer.files));\n }\n }\n };\n\n return (\n <Flex\n position=\"relative\"\n cursor=\"pointer\"\n width=\"100%\"\n height=\"100%\"\n minHeight=\"140px\"\n borderStyle=\"dashed\"\n borderColor={dragOver ? 'primary500' : error ? 'danger600' : 'neutral200'}\n background={dragOver ? 'primary100' : error ? 'danger100' : 'neutral100'}\n hasRadius\n padding={7}\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n gap={2}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {importType === 'zip' ? (\n <FileZip width={'24px'} height={'24px'} />\n ) : (\n <Folder width={'24px'} height={'24px'} />\n )}\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {importType === 'zip'\n ? t('chat.code-upload.drop-zone', 'Drop here a .zip file here or')\n : t('chat.code-upload.drop-zone-folder', 'Drop here a folder here or')}{' '}\n <Typography variant=\"omega\" textColor=\"primary600\" onClick={handleClick}>\n {t('chat.code-upload.drop-zone-browse', 'browse files')}\n </Typography>\n </Typography>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n {error}\n </Typography>\n )}\n </Flex>\n <Box\n tag=\"input\"\n position=\"absolute\"\n left={0}\n right={0}\n bottom={0}\n top={0}\n width=\"100%\"\n name=\"code\"\n aria-label=\"Upload project\"\n tabIndex={-1}\n zIndex={1}\n ref={inputRef}\n onChange={handleChange}\n style={{ opacity: 0, cursor: 'pointer' }}\n type=\"file\"\n {...(importType === 'zip'\n ? { accept: '.zip', multiple: false }\n : { multiple: true, webkitdirectory: '', directory: '' })}\n />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 1 - Upload Code\n * -----------------------------------------------------------------------------------------------*/\ninterface CodeUploadStepProps {\n setFileName: (name: string | null) => void;\n error: string | null;\n processZipFile: (file: File) => void;\n processFolder: (files: File[]) => Promise<Attachment>;\n}\n\nconst CodeUploadStep = ({\n setFileName,\n error,\n processZipFile,\n processFolder,\n}: CodeUploadStepProps) => {\n const { t } = useTranslations();\n const { nextStep } = useStepModal();\n\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\" width=\"100%\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">{t('chat.code-upload.title', 'Import code')}</Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.code-upload.description',\n 'Your app will be analyzed by AI. Make sure to remove all sensitive data before importation.'\n )}\n </Typography>\n </Flex>\n\n <Flex gap={3} width=\"100%\" wrap=\"wrap\">\n <Box flex={1} minWidth=\"200px\">\n <DropZone\n importType=\"zip\"\n onAddFiles={(files: FileList | File[]) => {\n if (files.length > 0) {\n const file = files[0];\n setFileName(file.name.replace('.zip', ''));\n nextStep();\n processZipFile(file);\n }\n }}\n error={error}\n />\n </Box>\n <Box flex={1} minWidth=\"200px\">\n <DropZone\n importType=\"folder\"\n onAddFiles={async (files: File[]) => {\n if (files.length > 0) {\n try {\n // Get the folder name from the first file's path\n const firstFile = files[0];\n const folderPath = firstFile.webkitRelativePath || '';\n const folderName = folderPath.split('/')[0] || 'Project';\n\n setFileName(folderName);\n nextStep();\n\n // Process the folder files\n await processFolder(files);\n } catch (err) {\n console.error('Error processing folder:', err);\n }\n }\n }}\n error={error}\n />\n </Box>\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 2 - Confirmation\n * -----------------------------------------------------------------------------------------------*/\ninterface CodeConfirmationStepProps {\n projectName: string | null;\n isLoading: boolean;\n error: string | null;\n}\n\nconst CodeConfirmationStep = ({ projectName, isLoading, error }: CodeConfirmationStepProps) => {\n const { t } = useTranslations();\n\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\" width=\"100%\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">\n {t('chat.code-upload.confirmation-title', 'Confirm Code Import')}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.code-upload.confirmation-description',\n 'Your code is ready to be imported. Click finish to add it to your chat.'\n )}\n </Typography>\n </Flex>\n\n <Box width=\"100%\">\n <AttachmentPreview\n attachment={{\n id: generateId(),\n status: isLoading ? 'loading' : 'ready',\n filename: projectName || '',\n url: '',\n type: 'file',\n mediaType: STRAPI_CODE_MIME_TYPE,\n }}\n error={error}\n minWidth=\"256px\"\n />\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\nexport const UploadCodeModal = () => {\n const [projectName, setProjectName] = useState<string | null>(null);\n const [projectAttachment, setProjectAttachment] = useState<Attachment | null>(null);\n const { t } = useTranslations();\n\n // Attach files to the chat\n const { addAttachments } = useAttachments();\n\n const { processZipFile, processFolder, isLoading, error } = useCodeUpload({\n onSuccess: (file) => setProjectAttachment(file),\n });\n\n const { isCodeUploadOpen, closeCodeUpload, submitOnFinish } = useUploadProjectToChat();\n const { sendMessage, openChat, input, setInput } = useStrapiChat();\n\n const handleCancel = () => {\n setProjectName(null);\n setProjectAttachment(null);\n closeCodeUpload();\n };\n\n const handleComplete = async () => {\n // Ensure chat is opened\n openChat();\n\n if (projectAttachment && submitOnFinish) {\n sendMessage({\n role: 'user',\n parts: [\n {\n type: 'text',\n text: 'Create schemas from my uploaded project',\n },\n projectAttachment,\n ],\n });\n } else if (projectAttachment) {\n // If input is empty, set a predefined message\n if (!input) {\n setInput('Create schemas from my uploaded project');\n }\n // Attach files to the chat input\n addAttachments([projectAttachment]);\n }\n\n closeCodeUpload();\n };\n\n const validateUploadStep = () => {\n return !!projectAttachment;\n };\n\n return (\n <StepModal\n open={isCodeUploadOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleCancel();\n }}\n title={t('chat.code-upload.header', 'Import code')}\n onCancel={handleCancel}\n onComplete={handleComplete}\n >\n <StepModal.Step\n title={t('chat.code-upload.step1-title', 'Import code')}\n nextLabel={t('chat.code-upload.continue-button', 'Continue')}\n cancelLabel={t('common.cancel', 'Cancel')}\n disableNext={!projectAttachment || isLoading}\n onNext={validateUploadStep}\n >\n <CodeUploadStep\n setFileName={setProjectName}\n error={error}\n processZipFile={processZipFile}\n processFolder={processFolder}\n />\n </StepModal.Step>\n\n <StepModal.Step\n title={t('chat.code-upload.step2-title', 'Confirm')}\n nextLabel={t('common.finish', 'Finish')}\n backLabel={t('form.button.back', 'Back')}\n disableNext={!projectAttachment || isLoading}\n >\n <CodeConfirmationStep projectName={projectName} isLoading={isLoading} error={error} />\n </StepModal.Step>\n </StepModal>\n );\n};\n"],"names":["UploadProjectContext","createContext","isCodeUploadOpen","submitOnFinish","openCodeUpload","closeCodeUpload","useUploadProjectToChat","useContext","UploadProjectToChatProvider","children","setIsCodeUploadOpen","useState","setSubmitOnFinish","useCallback","contextValue","useMemo","_jsxs","Provider","value","_jsx","UploadCodeModal","DropZone","importType","onAddFiles","error","dragOver","setDragOver","inputRef","useRef","t","useTranslations","handleDragOver","event","preventDefault","handleDragEnter","handleDragLeave","handleClick","e","current","click","handleChange","files","Array","from","readDirectory","entry","reader","createReader","getEntries","Promise","resolve","reject","readEntries","entries","isFile","fileEntry","file","Object","defineProperty","writable","fullPath","substring","push","isDirectory","dirEntry","subFiles","length","handleDrop","dataTransfer","items","allFiles","i","item","webkitGetAsEntry","Flex","position","cursor","width","height","minHeight","borderStyle","borderColor","background","hasRadius","padding","justifyContent","direction","alignItems","gap","onDragEnter","onDragLeave","onDragOver","onDrop","FileZip","Folder","Typography","variant","textColor","textAlign","onClick","Box","tag","left","right","bottom","top","name","aria-label","tabIndex","zIndex","ref","onChange","style","opacity","type","accept","multiple","webkitdirectory","directory","CodeUploadStep","setFileName","processZipFile","processFolder","nextStep","useStepModal","wrap","flex","minWidth","replace","firstFile","folderPath","webkitRelativePath","folderName","split","err","console","CodeConfirmationStep","projectName","isLoading","AttachmentPreview","attachment","id","generateId","status","filename","url","mediaType","STRAPI_CODE_MIME_TYPE","setProjectName","projectAttachment","setProjectAttachment","addAttachments","useAttachments","useCodeUpload","onSuccess","sendMessage","openChat","input","setInput","useStrapiChat","handleCancel","handleComplete","role","parts","text","validateUploadStep","StepModal","open","onOpenChange","isOpen","title","onCancel","onComplete","Step","nextLabel","cancelLabel","disableNext","onNext","backLabel"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useContext, createContext, useRef } from 'react';
2
+ import { useState, useCallback, useMemo, useContext, createContext, useRef } from 'react';
3
3
  import { Flex, Typography, Box } from '@strapi/design-system';
4
4
  import { FileZip, Folder } from '@strapi/icons';
5
5
  import { AttachmentPreview } from './components/Attachments/AttachmentPreview.mjs';
@@ -21,18 +21,24 @@ const useUploadProjectToChat = ()=>useContext(UploadProjectContext);
21
21
  const UploadProjectToChatProvider = ({ children })=>{
22
22
  const [isCodeUploadOpen, setIsCodeUploadOpen] = useState(false);
23
23
  const [submitOnFinish, setSubmitOnFinish] = useState(false);
24
- const openCodeUpload = (submitOnFinish)=>{
24
+ const openCodeUpload = useCallback((submitOnFinish)=>{
25
25
  setIsCodeUploadOpen(true);
26
26
  setSubmitOnFinish(submitOnFinish ?? false);
27
- };
28
- const closeCodeUpload = ()=>setIsCodeUploadOpen(false);
29
- return /*#__PURE__*/ jsxs(UploadProjectContext.Provider, {
30
- value: {
27
+ }, []);
28
+ const closeCodeUpload = useCallback(()=>setIsCodeUploadOpen(false), []);
29
+ const contextValue = useMemo(()=>({
31
30
  isCodeUploadOpen,
32
31
  submitOnFinish,
33
32
  openCodeUpload,
34
33
  closeCodeUpload
35
- },
34
+ }), [
35
+ isCodeUploadOpen,
36
+ submitOnFinish,
37
+ openCodeUpload,
38
+ closeCodeUpload
39
+ ]);
40
+ return /*#__PURE__*/ jsxs(UploadProjectContext.Provider, {
41
+ value: contextValue,
36
42
  children: [
37
43
  isCodeUploadOpen && /*#__PURE__*/ jsx(UploadCodeModal, {}),
38
44
  children