@strapi/content-type-builder 5.58.0 → 5.60.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 (130) 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 +31 -4
  72. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  73. package/dist/admin/components/DataManager/reducer.mjs +31 -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/attributes/ConditionForm.js +2 -1
  80. package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
  81. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +2 -1
  82. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/attributes/types.js +2 -2
  84. package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
  85. package/dist/admin/components/FormModal/attributes/types.mjs +2 -2
  86. package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
  87. package/dist/admin/components/FormModal/forms/forms.js +1 -1
  88. package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
  89. package/dist/admin/components/FormModal/forms/forms.mjs +1 -1
  90. package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
  91. package/dist/admin/components/GenericInputs.js +2 -1
  92. package/dist/admin/components/GenericInputs.js.map +1 -1
  93. package/dist/admin/components/GenericInputs.mjs +2 -1
  94. package/dist/admin/components/GenericInputs.mjs.map +1 -1
  95. package/dist/admin/components/TabForm.js.map +1 -1
  96. package/dist/admin/components/TabForm.mjs.map +1 -1
  97. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +8 -0
  98. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +20 -0
  99. package/dist/admin/utils/folderTelemetry.js.map +1 -1
  100. package/dist/admin/utils/folderTelemetry.mjs.map +1 -1
  101. package/dist/admin/utils/formAPI.js.map +1 -1
  102. package/dist/admin/utils/formAPI.mjs.map +1 -1
  103. package/dist/server/controllers/validation/common.js +1 -1
  104. package/dist/server/controllers/validation/common.js.map +1 -1
  105. package/dist/server/controllers/validation/common.mjs +1 -1
  106. package/dist/server/controllers/validation/common.mjs.map +1 -1
  107. package/dist/server/controllers/validation/schema.js +3 -2
  108. package/dist/server/controllers/validation/schema.js.map +1 -1
  109. package/dist/server/controllers/validation/schema.mjs +4 -3
  110. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  111. package/dist/server/register.js.map +1 -1
  112. package/dist/server/register.mjs.map +1 -1
  113. package/dist/server/services/migration-builder/index.js.map +1 -1
  114. package/dist/server/services/migration-builder/index.mjs.map +1 -1
  115. package/dist/server/services/schema.js +34 -1
  116. package/dist/server/services/schema.js.map +1 -1
  117. package/dist/server/services/schema.mjs +34 -1
  118. package/dist/server/services/schema.mjs.map +1 -1
  119. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  120. package/dist/server/src/register.d.ts.map +1 -1
  121. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -1
  122. package/dist/server/src/services/schema-builder/types.d.ts.map +1 -1
  123. package/dist/server/src/services/schema.d.ts.map +1 -1
  124. package/dist/server/src/utils/uid-target.d.ts +18 -0
  125. package/dist/server/src/utils/uid-target.d.ts.map +1 -0
  126. package/dist/server/utils/uid-target.js +34 -0
  127. package/dist/server/utils/uid-target.js.map +1 -0
  128. package/dist/server/utils/uid-target.mjs +31 -0
  129. package/dist/server/utils/uid-target.mjs.map +1 -0
  130. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"UploadCodeModal.mjs","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.mjs","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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"}
@@ -26,18 +26,24 @@ const useUploadFigmaToChat = ()=>{
26
26
  const UploadFigmaToChatProvider = ({ children })=>{
27
27
  const [isFigmaUploadOpen, setIsFigmaUploadOpen] = React.useState(false); // Default to false
28
28
  const [submitOnFinish, setSubmitOnFinish] = React.useState(false);
29
- const openFigmaUpload = (submitOnFinishParam)=>{
29
+ const openFigmaUpload = React.useCallback((submitOnFinishParam)=>{
30
30
  setIsFigmaUploadOpen(true);
31
31
  setSubmitOnFinish(submitOnFinishParam ?? false);
32
- };
33
- const closeFigmaUpload = ()=>setIsFigmaUploadOpen(false);
34
- return /*#__PURE__*/ jsxRuntime.jsxs(UploadFigmaContext.Provider, {
35
- value: {
32
+ }, []);
33
+ const closeFigmaUpload = React.useCallback(()=>setIsFigmaUploadOpen(false), []);
34
+ const contextValue = React.useMemo(()=>({
36
35
  isFigmaUploadOpen,
37
36
  submitOnFinish,
38
37
  openFigmaUpload,
39
38
  closeFigmaUpload
40
- },
39
+ }), [
40
+ isFigmaUploadOpen,
41
+ submitOnFinish,
42
+ openFigmaUpload,
43
+ closeFigmaUpload
44
+ ]);
45
+ return /*#__PURE__*/ jsxRuntime.jsxs(UploadFigmaContext.Provider, {
46
+ value: contextValue,
41
47
  children: [
42
48
  isFigmaUploadOpen && /*#__PURE__*/ jsxRuntime.jsx(UploadFigmaModal, {}),
43
49
  children
@@ -1 +1 @@
1
- {"version":3,"file":"UploadFigmaModal.js","sources":["../../../../admin/src/components/AIChat/UploadFigmaModal.tsx"],"sourcesContent":["import { createContext, useContext, useState } from 'react';\n\nimport { Flex, Typography, Box, TextInput, Grid, Button, Link } from '@strapi/design-system'; // Added Link\n\nimport { ImagePreview } from './components/ImagePreview';\nimport { StepModal, useStepModal } from './components/StepModal';\nimport { useAttachments } from './hooks/useAttachments';\nimport {\n FigmaImage,\n useFigmaUpload,\n getFigmaToken,\n saveFigmaToken,\n hasFigmaToken,\n} from './hooks/useFigmaUpload';\nimport { useTranslations } from './hooks/useTranslations';\nimport { useStrapiChat } from './providers/ChatProvider';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface UploadFigmaContextType {\n isFigmaUploadOpen: boolean;\n submitOnFinish: boolean;\n openFigmaUpload: (submitOnFinish?: boolean) => void;\n closeFigmaUpload: () => void;\n}\n\nconst UploadFigmaContext = createContext<UploadFigmaContextType>({\n isFigmaUploadOpen: false,\n submitOnFinish: false,\n openFigmaUpload: () => {},\n closeFigmaUpload: () => {},\n});\n\nexport const useUploadFigmaToChat = () => {\n const context = useContext(UploadFigmaContext);\n if (!context) {\n throw new Error('useUploadFigmaToChat must be used within an UploadFigmaToChatProvider');\n }\n return context;\n};\n\nexport const UploadFigmaToChatProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFigmaUploadOpen, setIsFigmaUploadOpen] = useState(false); // Default to false\n const [submitOnFinish, setSubmitOnFinish] = useState(false);\n\n const openFigmaUpload = (submitOnFinishParam?: boolean) => {\n setIsFigmaUploadOpen(true);\n setSubmitOnFinish(submitOnFinishParam ?? false);\n };\n\n const closeFigmaUpload = () => setIsFigmaUploadOpen(false);\n\n return (\n <UploadFigmaContext.Provider\n value={{ isFigmaUploadOpen, submitOnFinish, openFigmaUpload, closeFigmaUpload }}\n >\n {isFigmaUploadOpen && <UploadFigmaModal />}\n {children}\n </UploadFigmaContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 1 - Input Figma URL\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaUrlInputStepProps {\n figmaUrl: string;\n setFigmaUrl: (url: string) => void;\n error: string | null; // Error state from useFigmaUpload\n}\n\nconst FigmaUrlInputStep = ({ figmaUrl, setFigmaUrl }: FigmaUrlInputStepProps) => {\n const { t } = useTranslations();\n const { isLoading } = useStepModal();\n const [showingTokenInput, setShowingTokenInput] = useState(!hasFigmaToken());\n const [figmaToken, setFigmaToken] = useState<string>(getFigmaToken);\n\n // Handle saving token and returning to URL input\n const handleSaveToken = () => {\n if (figmaToken.trim()) {\n saveFigmaToken(figmaToken);\n setShowingTokenInput(false);\n }\n };\n\n // If we need to show token step, render the token input\n if (showingTokenInput) {\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.token-title', 'Enter Figma API Token')}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.token-description',\n 'To access your Figma designs, you need to provide a personal access token. This will be stored securely in your browser.'\n )}\n </Typography>\n <Link\n href=\"https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens\"\n isExternal\n >\n {t('chat.figma-upload.token-help', 'How to get a Figma API token')}\n </Link>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-token\"\n placeholder={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n aria-label={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n value={figmaToken}\n onChange={(e) => setFigmaToken(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"password\"\n />\n </Box>\n\n <Flex gap={2}>\n <Button onClick={handleSaveToken} disabled={!figmaToken.trim()} variant=\"secondary\">\n {t('chat.figma-upload.save-token', 'Save token')}\n </Button>\n <Button\n onClick={() => setShowingTokenInput(false)}\n variant=\"tertiary\"\n disabled={!hasFigmaToken()}\n >\n {t('chat.figma-upload.cancel', 'Cancel')}\n </Button>\n </Flex>\n </Flex>\n );\n }\n\n // Otherwise render the URL input\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\" width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.title', 'Import Figma Design')}\n </Typography>\n <Button onClick={() => setShowingTokenInput(true)} variant=\"tertiary\" size=\"S\">\n {t('chat.figma-upload.edit-token', 'Edit API token')}\n </Button>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.description',\n 'Ask to turn your designs into schemas by attaching a link to one or multiple frames in your Figma files. (Max 15 frames)'\n )}\n </Typography>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-url\"\n placeholder={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n aria-label={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n value={figmaUrl}\n onChange={(e) => setFigmaUrl(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"url\"\n />\n </Box>\n\n {/* {error && (\n <Box padding={3} background=\"danger100\" color=\"danger600\" borderRadius=\"4px\" width=\"100%\">\n <Typography variant=\"pi\">{error}</Typography>\n </Box>\n )} */}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 2 - Display Figma Images\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaImageDisplayStepProps {\n images: FigmaImage[];\n selectedImages: string[];\n setSelectedImages: (images: string[]) => void;\n}\n\nconst FigmaImageDisplayStep = ({\n images,\n selectedImages,\n setSelectedImages,\n}: FigmaImageDisplayStepProps) => {\n const { t } = useTranslations();\n\n // Handle select/deselect all\n const toggleSelectAll = () => {\n if (selectedImages.length === images.length) {\n // Deselect all if all or max allowed are selected\n setSelectedImages([]);\n } else {\n // Select all images up to the max limit\n const allImageIds = images.map((img) => img.id);\n setSelectedImages(allImageIds);\n }\n };\n\n if (images.length === 0) {\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"center\" padding={4}>\n <Typography variant=\"omega\">\n {t('chat.figma-upload.no-images', 'No frames found in the Figma file.')}\n </Typography>\n </Flex>\n );\n }\n\n // Handle individual frame selection\n const handleFrameSelection = (frameId: string) => {\n const newSelection = selectedImages.includes(frameId)\n ? selectedImages.filter((id) => id !== frameId)\n : [...selectedImages, frameId];\n\n setSelectedImages(newSelection);\n };\n\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"start\" width=\"100%\" height=\"min(45vh, 400px)\">\n <Flex justifyContent=\"space-between\" width=\"100%\" alignItems=\"center\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.select-images', 'Select Frames to Import')}\n </Typography>\n <Flex gap={3} alignItems=\"center\">\n <Typography>\n {selectedImages.length} of {images.length} selected\n </Typography>\n <Button onClick={toggleSelectAll} type=\"button\" variant=\"secondary\">\n {/* Determine if select all button should show \"Select All\" or \"Deselect All\" */}\n {selectedImages.length === images.length\n ? t('chat.figma-upload.deselect-all', 'Deselect All')\n : t('chat.figma-upload.select-all', 'Select All')}\n </Button>\n </Flex>\n </Flex>\n\n <Box paddingRight={4} width=\"100%\" style={{ overflowY: 'auto' }}>\n <Grid.Root gap={4}>\n {images.map((frame, index) => {\n const isSelected = selectedImages.includes(frame.id);\n return (\n <Grid.Item key={frame.id} col={6} xs={12} padding={'1px'}>\n <ImagePreview\n imageUrl={frame.url}\n imageName={frame.filename || `Frame ${index + 1}`}\n selected={isSelected}\n onSelect={() => handleFrameSelection(frame.id)}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\nexport const UploadFigmaModal = () => {\n const [figmaUrl, setFigmaUrl] = useState<string>('');\n const [figmaImages, setFigmaImages] = useState<FigmaImage[]>([]);\n const [selectedImages, setSelectedImages] = useState<string[]>([]);\n const { t } = useTranslations();\n\n const { addAttachments } = useAttachments();\n const { isFigmaUploadOpen, closeFigmaUpload, submitOnFinish } = useUploadFigmaToChat();\n const { input, setInput, sendMessage, openChat } = useStrapiChat();\n const { processFigmaUrl, isLoading, error } = useFigmaUpload({\n onSuccess: (images) => {\n setFigmaImages(images);\n // Initialize with first 15 images selected\n const initialSelection = images.slice(0, 15).map((img) => img.id);\n setSelectedImages(initialSelection);\n },\n });\n\n const handleImportStep = async () => {\n await processFigmaUrl(figmaUrl);\n return true;\n };\n\n // Validate if the URL is a valid Figma URL\n const isValidFigmaUrl = (url: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url);\n return urlObj.hostname === 'www.figma.com' || urlObj.hostname === 'figma.com';\n } catch {\n return false;\n }\n };\n\n const handleCancel = () => {\n // Reset all state on cancel\n setFigmaUrl('');\n setFigmaImages([]);\n setSelectedImages([]);\n closeFigmaUpload();\n };\n\n const handleComplete = () => {\n // Only attach the selected images\n const selectedFigmaImages = figmaImages.filter((img) => selectedImages.includes(img.id));\n if (selectedFigmaImages.length === 0) {\n closeFigmaUpload();\n return;\n }\n\n // Ensure chat is opened\n openChat();\n\n if (submitOnFinish) {\n // Auto-submit a message to chat with attachments\n sendMessage({\n role: 'user',\n parts: [\n { type: 'text', text: 'Create schemas from the attached images' },\n ...selectedFigmaImages,\n ],\n });\n\n closeFigmaUpload();\n } else {\n // If input is empty, set a predefined message\n if (!input) {\n setInput('Create schemas from the attached images');\n }\n addAttachments(selectedFigmaImages);\n closeFigmaUpload();\n }\n };\n\n return (\n <StepModal\n open={isFigmaUploadOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleCancel();\n }}\n title={t('chat.figma-upload.header', 'Import from Figma')}\n onCancel={handleCancel}\n onComplete={handleComplete}\n >\n <StepModal.Step\n title={t('chat.figma-upload.step1-title', 'Enter Figma URL')}\n nextLabel={t('chat.figma-upload.import-button', 'Import')}\n cancelLabel={t('form.button.cancel', 'Cancel')}\n disableNext={!figmaUrl || isLoading || !isValidFigmaUrl(figmaUrl)}\n onNext={handleImportStep}\n >\n <FigmaUrlInputStep figmaUrl={figmaUrl} setFigmaUrl={setFigmaUrl} error={error} />\n </StepModal.Step>\n\n <StepModal.Step\n title={t('chat.figma-upload.step2-title', 'Preview Images')}\n nextLabel={t('form.button.finish', 'Finish')}\n backLabel={t('form.button.back', 'Back')}\n disableNext={selectedImages.length === 0}\n >\n <FigmaImageDisplayStep\n images={figmaImages}\n selectedImages={selectedImages}\n setSelectedImages={setSelectedImages}\n />\n </StepModal.Step>\n </StepModal>\n );\n};\n"],"names":["UploadFigmaContext","createContext","isFigmaUploadOpen","submitOnFinish","openFigmaUpload","closeFigmaUpload","useUploadFigmaToChat","context","useContext","Error","UploadFigmaToChatProvider","children","setIsFigmaUploadOpen","useState","setSubmitOnFinish","submitOnFinishParam","_jsxs","Provider","value","_jsx","UploadFigmaModal","FigmaUrlInputStep","figmaUrl","setFigmaUrl","t","useTranslations","isLoading","useStepModal","showingTokenInput","setShowingTokenInput","hasFigmaToken","figmaToken","setFigmaToken","getFigmaToken","handleSaveToken","trim","saveFigmaToken","Flex","direction","gap","alignItems","Typography","variant","textColor","Link","href","isExternal","Box","width","TextInput","name","placeholder","aria-label","onChange","e","target","disabled","type","Button","onClick","justifyContent","size","FigmaImageDisplayStep","images","selectedImages","setSelectedImages","toggleSelectAll","length","allImageIds","map","img","id","padding","handleFrameSelection","frameId","newSelection","includes","filter","height","paddingRight","style","overflowY","Grid","Root","frame","index","isSelected","Item","col","xs","ImagePreview","imageUrl","url","imageName","filename","selected","onSelect","figmaImages","setFigmaImages","addAttachments","useAttachments","input","setInput","sendMessage","openChat","useStrapiChat","processFigmaUrl","error","useFigmaUpload","onSuccess","initialSelection","slice","handleImportStep","isValidFigmaUrl","urlObj","URL","hostname","handleCancel","handleComplete","selectedFigmaImages","role","parts","text","StepModal","open","onOpenChange","isOpen","title","onCancel","onComplete","Step","nextLabel","cancelLabel","disableNext","onNext","backLabel"],"mappings":"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"}
1
+ {"version":3,"file":"UploadFigmaModal.js","sources":["../../../../admin/src/components/AIChat/UploadFigmaModal.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport { Flex, Typography, Box, TextInput, Grid, Button, Link } from '@strapi/design-system'; // Added Link\n\nimport { ImagePreview } from './components/ImagePreview';\nimport { StepModal, useStepModal } from './components/StepModal';\nimport { useAttachments } from './hooks/useAttachments';\nimport {\n FigmaImage,\n useFigmaUpload,\n getFigmaToken,\n saveFigmaToken,\n hasFigmaToken,\n} from './hooks/useFigmaUpload';\nimport { useTranslations } from './hooks/useTranslations';\nimport { useStrapiChat } from './providers/ChatProvider';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface UploadFigmaContextType {\n isFigmaUploadOpen: boolean;\n submitOnFinish: boolean;\n openFigmaUpload: (submitOnFinish?: boolean) => void;\n closeFigmaUpload: () => void;\n}\n\nconst UploadFigmaContext = createContext<UploadFigmaContextType>({\n isFigmaUploadOpen: false,\n submitOnFinish: false,\n openFigmaUpload: () => {},\n closeFigmaUpload: () => {},\n});\n\nexport const useUploadFigmaToChat = () => {\n const context = useContext(UploadFigmaContext);\n if (!context) {\n throw new Error('useUploadFigmaToChat must be used within an UploadFigmaToChatProvider');\n }\n return context;\n};\n\nexport const UploadFigmaToChatProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFigmaUploadOpen, setIsFigmaUploadOpen] = useState(false); // Default to false\n const [submitOnFinish, setSubmitOnFinish] = useState(false);\n\n const openFigmaUpload = useCallback((submitOnFinishParam?: boolean) => {\n setIsFigmaUploadOpen(true);\n setSubmitOnFinish(submitOnFinishParam ?? false);\n }, []);\n\n const closeFigmaUpload = useCallback(() => setIsFigmaUploadOpen(false), []);\n const contextValue = useMemo(\n () => ({ isFigmaUploadOpen, submitOnFinish, openFigmaUpload, closeFigmaUpload }),\n [isFigmaUploadOpen, submitOnFinish, openFigmaUpload, closeFigmaUpload]\n );\n\n return (\n <UploadFigmaContext.Provider value={contextValue}>\n {isFigmaUploadOpen && <UploadFigmaModal />}\n {children}\n </UploadFigmaContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 1 - Input Figma URL\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaUrlInputStepProps {\n figmaUrl: string;\n setFigmaUrl: (url: string) => void;\n error: string | null; // Error state from useFigmaUpload\n}\n\nconst FigmaUrlInputStep = ({ figmaUrl, setFigmaUrl }: FigmaUrlInputStepProps) => {\n const { t } = useTranslations();\n const { isLoading } = useStepModal();\n const [showingTokenInput, setShowingTokenInput] = useState(!hasFigmaToken());\n const [figmaToken, setFigmaToken] = useState<string>(getFigmaToken);\n\n // Handle saving token and returning to URL input\n const handleSaveToken = () => {\n if (figmaToken.trim()) {\n saveFigmaToken(figmaToken);\n setShowingTokenInput(false);\n }\n };\n\n // If we need to show token step, render the token input\n if (showingTokenInput) {\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.token-title', 'Enter Figma API Token')}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.token-description',\n 'To access your Figma designs, you need to provide a personal access token. This will be stored securely in your browser.'\n )}\n </Typography>\n <Link\n href=\"https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens\"\n isExternal\n >\n {t('chat.figma-upload.token-help', 'How to get a Figma API token')}\n </Link>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-token\"\n placeholder={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n aria-label={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n value={figmaToken}\n onChange={(e) => setFigmaToken(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"password\"\n />\n </Box>\n\n <Flex gap={2}>\n <Button onClick={handleSaveToken} disabled={!figmaToken.trim()} variant=\"secondary\">\n {t('chat.figma-upload.save-token', 'Save token')}\n </Button>\n <Button\n onClick={() => setShowingTokenInput(false)}\n variant=\"tertiary\"\n disabled={!hasFigmaToken()}\n >\n {t('chat.figma-upload.cancel', 'Cancel')}\n </Button>\n </Flex>\n </Flex>\n );\n }\n\n // Otherwise render the URL input\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\" width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.title', 'Import Figma Design')}\n </Typography>\n <Button onClick={() => setShowingTokenInput(true)} variant=\"tertiary\" size=\"S\">\n {t('chat.figma-upload.edit-token', 'Edit API token')}\n </Button>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.description',\n 'Ask to turn your designs into schemas by attaching a link to one or multiple frames in your Figma files. (Max 15 frames)'\n )}\n </Typography>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-url\"\n placeholder={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n aria-label={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n value={figmaUrl}\n onChange={(e) => setFigmaUrl(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"url\"\n />\n </Box>\n\n {/* {error && (\n <Box padding={3} background=\"danger100\" color=\"danger600\" borderRadius=\"4px\" width=\"100%\">\n <Typography variant=\"pi\">{error}</Typography>\n </Box>\n )} */}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 2 - Display Figma Images\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaImageDisplayStepProps {\n images: FigmaImage[];\n selectedImages: string[];\n setSelectedImages: (images: string[]) => void;\n}\n\nconst FigmaImageDisplayStep = ({\n images,\n selectedImages,\n setSelectedImages,\n}: FigmaImageDisplayStepProps) => {\n const { t } = useTranslations();\n\n // Handle select/deselect all\n const toggleSelectAll = () => {\n if (selectedImages.length === images.length) {\n // Deselect all if all or max allowed are selected\n setSelectedImages([]);\n } else {\n // Select all images up to the max limit\n const allImageIds = images.map((img) => img.id);\n setSelectedImages(allImageIds);\n }\n };\n\n if (images.length === 0) {\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"center\" padding={4}>\n <Typography variant=\"omega\">\n {t('chat.figma-upload.no-images', 'No frames found in the Figma file.')}\n </Typography>\n </Flex>\n );\n }\n\n // Handle individual frame selection\n const handleFrameSelection = (frameId: string) => {\n const newSelection = selectedImages.includes(frameId)\n ? selectedImages.filter((id) => id !== frameId)\n : [...selectedImages, frameId];\n\n setSelectedImages(newSelection);\n };\n\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"start\" width=\"100%\" height=\"min(45vh, 400px)\">\n <Flex justifyContent=\"space-between\" width=\"100%\" alignItems=\"center\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.select-images', 'Select Frames to Import')}\n </Typography>\n <Flex gap={3} alignItems=\"center\">\n <Typography>\n {selectedImages.length} of {images.length} selected\n </Typography>\n <Button onClick={toggleSelectAll} type=\"button\" variant=\"secondary\">\n {/* Determine if select all button should show \"Select All\" or \"Deselect All\" */}\n {selectedImages.length === images.length\n ? t('chat.figma-upload.deselect-all', 'Deselect All')\n : t('chat.figma-upload.select-all', 'Select All')}\n </Button>\n </Flex>\n </Flex>\n\n <Box paddingRight={4} width=\"100%\" style={{ overflowY: 'auto' }}>\n <Grid.Root gap={4}>\n {images.map((frame, index) => {\n const isSelected = selectedImages.includes(frame.id);\n return (\n <Grid.Item key={frame.id} col={6} xs={12} padding={'1px'}>\n <ImagePreview\n imageUrl={frame.url}\n imageName={frame.filename || `Frame ${index + 1}`}\n selected={isSelected}\n onSelect={() => handleFrameSelection(frame.id)}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\nexport const UploadFigmaModal = () => {\n const [figmaUrl, setFigmaUrl] = useState<string>('');\n const [figmaImages, setFigmaImages] = useState<FigmaImage[]>([]);\n const [selectedImages, setSelectedImages] = useState<string[]>([]);\n const { t } = useTranslations();\n\n const { addAttachments } = useAttachments();\n const { isFigmaUploadOpen, closeFigmaUpload, submitOnFinish } = useUploadFigmaToChat();\n const { input, setInput, sendMessage, openChat } = useStrapiChat();\n const { processFigmaUrl, isLoading, error } = useFigmaUpload({\n onSuccess: (images) => {\n setFigmaImages(images);\n // Initialize with first 15 images selected\n const initialSelection = images.slice(0, 15).map((img) => img.id);\n setSelectedImages(initialSelection);\n },\n });\n\n const handleImportStep = async () => {\n await processFigmaUrl(figmaUrl);\n return true;\n };\n\n // Validate if the URL is a valid Figma URL\n const isValidFigmaUrl = (url: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url);\n return urlObj.hostname === 'www.figma.com' || urlObj.hostname === 'figma.com';\n } catch {\n return false;\n }\n };\n\n const handleCancel = () => {\n // Reset all state on cancel\n setFigmaUrl('');\n setFigmaImages([]);\n setSelectedImages([]);\n closeFigmaUpload();\n };\n\n const handleComplete = () => {\n // Only attach the selected images\n const selectedFigmaImages = figmaImages.filter((img) => selectedImages.includes(img.id));\n if (selectedFigmaImages.length === 0) {\n closeFigmaUpload();\n return;\n }\n\n // Ensure chat is opened\n openChat();\n\n if (submitOnFinish) {\n // Auto-submit a message to chat with attachments\n sendMessage({\n role: 'user',\n parts: [\n { type: 'text', text: 'Create schemas from the attached images' },\n ...selectedFigmaImages,\n ],\n });\n\n closeFigmaUpload();\n } else {\n // If input is empty, set a predefined message\n if (!input) {\n setInput('Create schemas from the attached images');\n }\n addAttachments(selectedFigmaImages);\n closeFigmaUpload();\n }\n };\n\n return (\n <StepModal\n open={isFigmaUploadOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleCancel();\n }}\n title={t('chat.figma-upload.header', 'Import from Figma')}\n onCancel={handleCancel}\n onComplete={handleComplete}\n >\n <StepModal.Step\n title={t('chat.figma-upload.step1-title', 'Enter Figma URL')}\n nextLabel={t('chat.figma-upload.import-button', 'Import')}\n cancelLabel={t('form.button.cancel', 'Cancel')}\n disableNext={!figmaUrl || isLoading || !isValidFigmaUrl(figmaUrl)}\n onNext={handleImportStep}\n >\n <FigmaUrlInputStep figmaUrl={figmaUrl} setFigmaUrl={setFigmaUrl} error={error} />\n </StepModal.Step>\n\n <StepModal.Step\n title={t('chat.figma-upload.step2-title', 'Preview Images')}\n nextLabel={t('form.button.finish', 'Finish')}\n backLabel={t('form.button.back', 'Back')}\n disableNext={selectedImages.length === 0}\n >\n <FigmaImageDisplayStep\n images={figmaImages}\n selectedImages={selectedImages}\n setSelectedImages={setSelectedImages}\n />\n </StepModal.Step>\n </StepModal>\n );\n};\n"],"names":["UploadFigmaContext","createContext","isFigmaUploadOpen","submitOnFinish","openFigmaUpload","closeFigmaUpload","useUploadFigmaToChat","context","useContext","Error","UploadFigmaToChatProvider","children","setIsFigmaUploadOpen","useState","setSubmitOnFinish","useCallback","submitOnFinishParam","contextValue","useMemo","_jsxs","Provider","value","_jsx","UploadFigmaModal","FigmaUrlInputStep","figmaUrl","setFigmaUrl","t","useTranslations","isLoading","useStepModal","showingTokenInput","setShowingTokenInput","hasFigmaToken","figmaToken","setFigmaToken","getFigmaToken","handleSaveToken","trim","saveFigmaToken","Flex","direction","gap","alignItems","Typography","variant","textColor","Link","href","isExternal","Box","width","TextInput","name","placeholder","aria-label","onChange","e","target","disabled","type","Button","onClick","justifyContent","size","FigmaImageDisplayStep","images","selectedImages","setSelectedImages","toggleSelectAll","length","allImageIds","map","img","id","padding","handleFrameSelection","frameId","newSelection","includes","filter","height","paddingRight","style","overflowY","Grid","Root","frame","index","isSelected","Item","col","xs","ImagePreview","imageUrl","url","imageName","filename","selected","onSelect","figmaImages","setFigmaImages","addAttachments","useAttachments","input","setInput","sendMessage","openChat","useStrapiChat","processFigmaUrl","error","useFigmaUpload","onSuccess","initialSelection","slice","handleImportStep","isValidFigmaUrl","urlObj","URL","hostname","handleCancel","handleComplete","selectedFigmaImages","role","parts","text","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 } from 'react';
2
+ import { useState, useCallback, useMemo, useContext, createContext } from 'react';
3
3
  import { Flex, Typography, Link, Box, TextInput, Button, Grid } from '@strapi/design-system';
4
4
  import { ImagePreview } from './components/ImagePreview.mjs';
5
5
  import { StepModal, useStepModal } from './components/StepModal.mjs';
@@ -24,18 +24,24 @@ const useUploadFigmaToChat = ()=>{
24
24
  const UploadFigmaToChatProvider = ({ children })=>{
25
25
  const [isFigmaUploadOpen, setIsFigmaUploadOpen] = useState(false); // Default to false
26
26
  const [submitOnFinish, setSubmitOnFinish] = useState(false);
27
- const openFigmaUpload = (submitOnFinishParam)=>{
27
+ const openFigmaUpload = useCallback((submitOnFinishParam)=>{
28
28
  setIsFigmaUploadOpen(true);
29
29
  setSubmitOnFinish(submitOnFinishParam ?? false);
30
- };
31
- const closeFigmaUpload = ()=>setIsFigmaUploadOpen(false);
32
- return /*#__PURE__*/ jsxs(UploadFigmaContext.Provider, {
33
- value: {
30
+ }, []);
31
+ const closeFigmaUpload = useCallback(()=>setIsFigmaUploadOpen(false), []);
32
+ const contextValue = useMemo(()=>({
34
33
  isFigmaUploadOpen,
35
34
  submitOnFinish,
36
35
  openFigmaUpload,
37
36
  closeFigmaUpload
38
- },
37
+ }), [
38
+ isFigmaUploadOpen,
39
+ submitOnFinish,
40
+ openFigmaUpload,
41
+ closeFigmaUpload
42
+ ]);
43
+ return /*#__PURE__*/ jsxs(UploadFigmaContext.Provider, {
44
+ value: contextValue,
39
45
  children: [
40
46
  isFigmaUploadOpen && /*#__PURE__*/ jsx(UploadFigmaModal, {}),
41
47
  children
@@ -1 +1 @@
1
- {"version":3,"file":"UploadFigmaModal.mjs","sources":["../../../../admin/src/components/AIChat/UploadFigmaModal.tsx"],"sourcesContent":["import { createContext, useContext, useState } from 'react';\n\nimport { Flex, Typography, Box, TextInput, Grid, Button, Link } from '@strapi/design-system'; // Added Link\n\nimport { ImagePreview } from './components/ImagePreview';\nimport { StepModal, useStepModal } from './components/StepModal';\nimport { useAttachments } from './hooks/useAttachments';\nimport {\n FigmaImage,\n useFigmaUpload,\n getFigmaToken,\n saveFigmaToken,\n hasFigmaToken,\n} from './hooks/useFigmaUpload';\nimport { useTranslations } from './hooks/useTranslations';\nimport { useStrapiChat } from './providers/ChatProvider';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface UploadFigmaContextType {\n isFigmaUploadOpen: boolean;\n submitOnFinish: boolean;\n openFigmaUpload: (submitOnFinish?: boolean) => void;\n closeFigmaUpload: () => void;\n}\n\nconst UploadFigmaContext = createContext<UploadFigmaContextType>({\n isFigmaUploadOpen: false,\n submitOnFinish: false,\n openFigmaUpload: () => {},\n closeFigmaUpload: () => {},\n});\n\nexport const useUploadFigmaToChat = () => {\n const context = useContext(UploadFigmaContext);\n if (!context) {\n throw new Error('useUploadFigmaToChat must be used within an UploadFigmaToChatProvider');\n }\n return context;\n};\n\nexport const UploadFigmaToChatProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFigmaUploadOpen, setIsFigmaUploadOpen] = useState(false); // Default to false\n const [submitOnFinish, setSubmitOnFinish] = useState(false);\n\n const openFigmaUpload = (submitOnFinishParam?: boolean) => {\n setIsFigmaUploadOpen(true);\n setSubmitOnFinish(submitOnFinishParam ?? false);\n };\n\n const closeFigmaUpload = () => setIsFigmaUploadOpen(false);\n\n return (\n <UploadFigmaContext.Provider\n value={{ isFigmaUploadOpen, submitOnFinish, openFigmaUpload, closeFigmaUpload }}\n >\n {isFigmaUploadOpen && <UploadFigmaModal />}\n {children}\n </UploadFigmaContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 1 - Input Figma URL\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaUrlInputStepProps {\n figmaUrl: string;\n setFigmaUrl: (url: string) => void;\n error: string | null; // Error state from useFigmaUpload\n}\n\nconst FigmaUrlInputStep = ({ figmaUrl, setFigmaUrl }: FigmaUrlInputStepProps) => {\n const { t } = useTranslations();\n const { isLoading } = useStepModal();\n const [showingTokenInput, setShowingTokenInput] = useState(!hasFigmaToken());\n const [figmaToken, setFigmaToken] = useState<string>(getFigmaToken);\n\n // Handle saving token and returning to URL input\n const handleSaveToken = () => {\n if (figmaToken.trim()) {\n saveFigmaToken(figmaToken);\n setShowingTokenInput(false);\n }\n };\n\n // If we need to show token step, render the token input\n if (showingTokenInput) {\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.token-title', 'Enter Figma API Token')}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.token-description',\n 'To access your Figma designs, you need to provide a personal access token. This will be stored securely in your browser.'\n )}\n </Typography>\n <Link\n href=\"https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens\"\n isExternal\n >\n {t('chat.figma-upload.token-help', 'How to get a Figma API token')}\n </Link>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-token\"\n placeholder={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n aria-label={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n value={figmaToken}\n onChange={(e) => setFigmaToken(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"password\"\n />\n </Box>\n\n <Flex gap={2}>\n <Button onClick={handleSaveToken} disabled={!figmaToken.trim()} variant=\"secondary\">\n {t('chat.figma-upload.save-token', 'Save token')}\n </Button>\n <Button\n onClick={() => setShowingTokenInput(false)}\n variant=\"tertiary\"\n disabled={!hasFigmaToken()}\n >\n {t('chat.figma-upload.cancel', 'Cancel')}\n </Button>\n </Flex>\n </Flex>\n );\n }\n\n // Otherwise render the URL input\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\" width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.title', 'Import Figma Design')}\n </Typography>\n <Button onClick={() => setShowingTokenInput(true)} variant=\"tertiary\" size=\"S\">\n {t('chat.figma-upload.edit-token', 'Edit API token')}\n </Button>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.description',\n 'Ask to turn your designs into schemas by attaching a link to one or multiple frames in your Figma files. (Max 15 frames)'\n )}\n </Typography>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-url\"\n placeholder={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n aria-label={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n value={figmaUrl}\n onChange={(e) => setFigmaUrl(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"url\"\n />\n </Box>\n\n {/* {error && (\n <Box padding={3} background=\"danger100\" color=\"danger600\" borderRadius=\"4px\" width=\"100%\">\n <Typography variant=\"pi\">{error}</Typography>\n </Box>\n )} */}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 2 - Display Figma Images\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaImageDisplayStepProps {\n images: FigmaImage[];\n selectedImages: string[];\n setSelectedImages: (images: string[]) => void;\n}\n\nconst FigmaImageDisplayStep = ({\n images,\n selectedImages,\n setSelectedImages,\n}: FigmaImageDisplayStepProps) => {\n const { t } = useTranslations();\n\n // Handle select/deselect all\n const toggleSelectAll = () => {\n if (selectedImages.length === images.length) {\n // Deselect all if all or max allowed are selected\n setSelectedImages([]);\n } else {\n // Select all images up to the max limit\n const allImageIds = images.map((img) => img.id);\n setSelectedImages(allImageIds);\n }\n };\n\n if (images.length === 0) {\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"center\" padding={4}>\n <Typography variant=\"omega\">\n {t('chat.figma-upload.no-images', 'No frames found in the Figma file.')}\n </Typography>\n </Flex>\n );\n }\n\n // Handle individual frame selection\n const handleFrameSelection = (frameId: string) => {\n const newSelection = selectedImages.includes(frameId)\n ? selectedImages.filter((id) => id !== frameId)\n : [...selectedImages, frameId];\n\n setSelectedImages(newSelection);\n };\n\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"start\" width=\"100%\" height=\"min(45vh, 400px)\">\n <Flex justifyContent=\"space-between\" width=\"100%\" alignItems=\"center\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.select-images', 'Select Frames to Import')}\n </Typography>\n <Flex gap={3} alignItems=\"center\">\n <Typography>\n {selectedImages.length} of {images.length} selected\n </Typography>\n <Button onClick={toggleSelectAll} type=\"button\" variant=\"secondary\">\n {/* Determine if select all button should show \"Select All\" or \"Deselect All\" */}\n {selectedImages.length === images.length\n ? t('chat.figma-upload.deselect-all', 'Deselect All')\n : t('chat.figma-upload.select-all', 'Select All')}\n </Button>\n </Flex>\n </Flex>\n\n <Box paddingRight={4} width=\"100%\" style={{ overflowY: 'auto' }}>\n <Grid.Root gap={4}>\n {images.map((frame, index) => {\n const isSelected = selectedImages.includes(frame.id);\n return (\n <Grid.Item key={frame.id} col={6} xs={12} padding={'1px'}>\n <ImagePreview\n imageUrl={frame.url}\n imageName={frame.filename || `Frame ${index + 1}`}\n selected={isSelected}\n onSelect={() => handleFrameSelection(frame.id)}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\nexport const UploadFigmaModal = () => {\n const [figmaUrl, setFigmaUrl] = useState<string>('');\n const [figmaImages, setFigmaImages] = useState<FigmaImage[]>([]);\n const [selectedImages, setSelectedImages] = useState<string[]>([]);\n const { t } = useTranslations();\n\n const { addAttachments } = useAttachments();\n const { isFigmaUploadOpen, closeFigmaUpload, submitOnFinish } = useUploadFigmaToChat();\n const { input, setInput, sendMessage, openChat } = useStrapiChat();\n const { processFigmaUrl, isLoading, error } = useFigmaUpload({\n onSuccess: (images) => {\n setFigmaImages(images);\n // Initialize with first 15 images selected\n const initialSelection = images.slice(0, 15).map((img) => img.id);\n setSelectedImages(initialSelection);\n },\n });\n\n const handleImportStep = async () => {\n await processFigmaUrl(figmaUrl);\n return true;\n };\n\n // Validate if the URL is a valid Figma URL\n const isValidFigmaUrl = (url: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url);\n return urlObj.hostname === 'www.figma.com' || urlObj.hostname === 'figma.com';\n } catch {\n return false;\n }\n };\n\n const handleCancel = () => {\n // Reset all state on cancel\n setFigmaUrl('');\n setFigmaImages([]);\n setSelectedImages([]);\n closeFigmaUpload();\n };\n\n const handleComplete = () => {\n // Only attach the selected images\n const selectedFigmaImages = figmaImages.filter((img) => selectedImages.includes(img.id));\n if (selectedFigmaImages.length === 0) {\n closeFigmaUpload();\n return;\n }\n\n // Ensure chat is opened\n openChat();\n\n if (submitOnFinish) {\n // Auto-submit a message to chat with attachments\n sendMessage({\n role: 'user',\n parts: [\n { type: 'text', text: 'Create schemas from the attached images' },\n ...selectedFigmaImages,\n ],\n });\n\n closeFigmaUpload();\n } else {\n // If input is empty, set a predefined message\n if (!input) {\n setInput('Create schemas from the attached images');\n }\n addAttachments(selectedFigmaImages);\n closeFigmaUpload();\n }\n };\n\n return (\n <StepModal\n open={isFigmaUploadOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleCancel();\n }}\n title={t('chat.figma-upload.header', 'Import from Figma')}\n onCancel={handleCancel}\n onComplete={handleComplete}\n >\n <StepModal.Step\n title={t('chat.figma-upload.step1-title', 'Enter Figma URL')}\n nextLabel={t('chat.figma-upload.import-button', 'Import')}\n cancelLabel={t('form.button.cancel', 'Cancel')}\n disableNext={!figmaUrl || isLoading || !isValidFigmaUrl(figmaUrl)}\n onNext={handleImportStep}\n >\n <FigmaUrlInputStep figmaUrl={figmaUrl} setFigmaUrl={setFigmaUrl} error={error} />\n </StepModal.Step>\n\n <StepModal.Step\n title={t('chat.figma-upload.step2-title', 'Preview Images')}\n nextLabel={t('form.button.finish', 'Finish')}\n backLabel={t('form.button.back', 'Back')}\n disableNext={selectedImages.length === 0}\n >\n <FigmaImageDisplayStep\n images={figmaImages}\n selectedImages={selectedImages}\n setSelectedImages={setSelectedImages}\n />\n </StepModal.Step>\n </StepModal>\n );\n};\n"],"names":["UploadFigmaContext","createContext","isFigmaUploadOpen","submitOnFinish","openFigmaUpload","closeFigmaUpload","useUploadFigmaToChat","context","useContext","Error","UploadFigmaToChatProvider","children","setIsFigmaUploadOpen","useState","setSubmitOnFinish","submitOnFinishParam","_jsxs","Provider","value","_jsx","UploadFigmaModal","FigmaUrlInputStep","figmaUrl","setFigmaUrl","t","useTranslations","isLoading","useStepModal","showingTokenInput","setShowingTokenInput","hasFigmaToken","figmaToken","setFigmaToken","getFigmaToken","handleSaveToken","trim","saveFigmaToken","Flex","direction","gap","alignItems","Typography","variant","textColor","Link","href","isExternal","Box","width","TextInput","name","placeholder","aria-label","onChange","e","target","disabled","type","Button","onClick","justifyContent","size","FigmaImageDisplayStep","images","selectedImages","setSelectedImages","toggleSelectAll","length","allImageIds","map","img","id","padding","handleFrameSelection","frameId","newSelection","includes","filter","height","paddingRight","style","overflowY","Grid","Root","frame","index","isSelected","Item","col","xs","ImagePreview","imageUrl","url","imageName","filename","selected","onSelect","figmaImages","setFigmaImages","addAttachments","useAttachments","input","setInput","sendMessage","openChat","useStrapiChat","processFigmaUrl","error","useFigmaUpload","onSuccess","initialSelection","slice","handleImportStep","isValidFigmaUrl","urlObj","URL","hostname","handleCancel","handleComplete","selectedFigmaImages","role","parts","text","StepModal","open","onOpenChange","isOpen","title","onCancel","onComplete","Step","nextLabel","cancelLabel","disableNext","onNext","backLabel"],"mappings":"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"}
1
+ {"version":3,"file":"UploadFigmaModal.mjs","sources":["../../../../admin/src/components/AIChat/UploadFigmaModal.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport { Flex, Typography, Box, TextInput, Grid, Button, Link } from '@strapi/design-system'; // Added Link\n\nimport { ImagePreview } from './components/ImagePreview';\nimport { StepModal, useStepModal } from './components/StepModal';\nimport { useAttachments } from './hooks/useAttachments';\nimport {\n FigmaImage,\n useFigmaUpload,\n getFigmaToken,\n saveFigmaToken,\n hasFigmaToken,\n} from './hooks/useFigmaUpload';\nimport { useTranslations } from './hooks/useTranslations';\nimport { useStrapiChat } from './providers/ChatProvider';\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\ninterface UploadFigmaContextType {\n isFigmaUploadOpen: boolean;\n submitOnFinish: boolean;\n openFigmaUpload: (submitOnFinish?: boolean) => void;\n closeFigmaUpload: () => void;\n}\n\nconst UploadFigmaContext = createContext<UploadFigmaContextType>({\n isFigmaUploadOpen: false,\n submitOnFinish: false,\n openFigmaUpload: () => {},\n closeFigmaUpload: () => {},\n});\n\nexport const useUploadFigmaToChat = () => {\n const context = useContext(UploadFigmaContext);\n if (!context) {\n throw new Error('useUploadFigmaToChat must be used within an UploadFigmaToChatProvider');\n }\n return context;\n};\n\nexport const UploadFigmaToChatProvider = ({ children }: { children: React.ReactNode }) => {\n const [isFigmaUploadOpen, setIsFigmaUploadOpen] = useState(false); // Default to false\n const [submitOnFinish, setSubmitOnFinish] = useState(false);\n\n const openFigmaUpload = useCallback((submitOnFinishParam?: boolean) => {\n setIsFigmaUploadOpen(true);\n setSubmitOnFinish(submitOnFinishParam ?? false);\n }, []);\n\n const closeFigmaUpload = useCallback(() => setIsFigmaUploadOpen(false), []);\n const contextValue = useMemo(\n () => ({ isFigmaUploadOpen, submitOnFinish, openFigmaUpload, closeFigmaUpload }),\n [isFigmaUploadOpen, submitOnFinish, openFigmaUpload, closeFigmaUpload]\n );\n\n return (\n <UploadFigmaContext.Provider value={contextValue}>\n {isFigmaUploadOpen && <UploadFigmaModal />}\n {children}\n </UploadFigmaContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 1 - Input Figma URL\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaUrlInputStepProps {\n figmaUrl: string;\n setFigmaUrl: (url: string) => void;\n error: string | null; // Error state from useFigmaUpload\n}\n\nconst FigmaUrlInputStep = ({ figmaUrl, setFigmaUrl }: FigmaUrlInputStepProps) => {\n const { t } = useTranslations();\n const { isLoading } = useStepModal();\n const [showingTokenInput, setShowingTokenInput] = useState(!hasFigmaToken());\n const [figmaToken, setFigmaToken] = useState<string>(getFigmaToken);\n\n // Handle saving token and returning to URL input\n const handleSaveToken = () => {\n if (figmaToken.trim()) {\n saveFigmaToken(figmaToken);\n setShowingTokenInput(false);\n }\n };\n\n // If we need to show token step, render the token input\n if (showingTokenInput) {\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.token-title', 'Enter Figma API Token')}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.token-description',\n 'To access your Figma designs, you need to provide a personal access token. This will be stored securely in your browser.'\n )}\n </Typography>\n <Link\n href=\"https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens\"\n isExternal\n >\n {t('chat.figma-upload.token-help', 'How to get a Figma API token')}\n </Link>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-token\"\n placeholder={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n aria-label={t('chat.figma-upload.token-placeholder', 'Enter Figma API token')}\n value={figmaToken}\n onChange={(e) => setFigmaToken(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"password\"\n />\n </Box>\n\n <Flex gap={2}>\n <Button onClick={handleSaveToken} disabled={!figmaToken.trim()} variant=\"secondary\">\n {t('chat.figma-upload.save-token', 'Save token')}\n </Button>\n <Button\n onClick={() => setShowingTokenInput(false)}\n variant=\"tertiary\"\n disabled={!hasFigmaToken()}\n >\n {t('chat.figma-upload.cancel', 'Cancel')}\n </Button>\n </Flex>\n </Flex>\n );\n }\n\n // Otherwise render the URL input\n return (\n <Flex direction=\"column\" gap={6} alignItems=\"start\">\n <Flex direction=\"column\" gap={2} alignItems=\"start\" width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.title', 'Import Figma Design')}\n </Typography>\n <Button onClick={() => setShowingTokenInput(true)} variant=\"tertiary\" size=\"S\">\n {t('chat.figma-upload.edit-token', 'Edit API token')}\n </Button>\n </Flex>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {t(\n 'chat.figma-upload.description',\n 'Ask to turn your designs into schemas by attaching a link to one or multiple frames in your Figma files. (Max 15 frames)'\n )}\n </Typography>\n </Flex>\n\n <Box width=\"100%\">\n <TextInput\n name=\"figma-url\"\n placeholder={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n aria-label={t('chat.figma-upload.url-placeholder', 'Enter Figma URL')}\n value={figmaUrl}\n onChange={(e) => setFigmaUrl(e.target.value)}\n width=\"100%\"\n disabled={isLoading}\n type=\"url\"\n />\n </Box>\n\n {/* {error && (\n <Box padding={3} background=\"danger100\" color=\"danger600\" borderRadius=\"4px\" width=\"100%\">\n <Typography variant=\"pi\">{error}</Typography>\n </Box>\n )} */}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step 2 - Display Figma Images\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FigmaImageDisplayStepProps {\n images: FigmaImage[];\n selectedImages: string[];\n setSelectedImages: (images: string[]) => void;\n}\n\nconst FigmaImageDisplayStep = ({\n images,\n selectedImages,\n setSelectedImages,\n}: FigmaImageDisplayStepProps) => {\n const { t } = useTranslations();\n\n // Handle select/deselect all\n const toggleSelectAll = () => {\n if (selectedImages.length === images.length) {\n // Deselect all if all or max allowed are selected\n setSelectedImages([]);\n } else {\n // Select all images up to the max limit\n const allImageIds = images.map((img) => img.id);\n setSelectedImages(allImageIds);\n }\n };\n\n if (images.length === 0) {\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"center\" padding={4}>\n <Typography variant=\"omega\">\n {t('chat.figma-upload.no-images', 'No frames found in the Figma file.')}\n </Typography>\n </Flex>\n );\n }\n\n // Handle individual frame selection\n const handleFrameSelection = (frameId: string) => {\n const newSelection = selectedImages.includes(frameId)\n ? selectedImages.filter((id) => id !== frameId)\n : [...selectedImages, frameId];\n\n setSelectedImages(newSelection);\n };\n\n return (\n <Flex direction=\"column\" gap={4} alignItems=\"start\" width=\"100%\" height=\"min(45vh, 400px)\">\n <Flex justifyContent=\"space-between\" width=\"100%\" alignItems=\"center\">\n <Typography variant=\"beta\">\n {t('chat.figma-upload.select-images', 'Select Frames to Import')}\n </Typography>\n <Flex gap={3} alignItems=\"center\">\n <Typography>\n {selectedImages.length} of {images.length} selected\n </Typography>\n <Button onClick={toggleSelectAll} type=\"button\" variant=\"secondary\">\n {/* Determine if select all button should show \"Select All\" or \"Deselect All\" */}\n {selectedImages.length === images.length\n ? t('chat.figma-upload.deselect-all', 'Deselect All')\n : t('chat.figma-upload.select-all', 'Select All')}\n </Button>\n </Flex>\n </Flex>\n\n <Box paddingRight={4} width=\"100%\" style={{ overflowY: 'auto' }}>\n <Grid.Root gap={4}>\n {images.map((frame, index) => {\n const isSelected = selectedImages.includes(frame.id);\n return (\n <Grid.Item key={frame.id} col={6} xs={12} padding={'1px'}>\n <ImagePreview\n imageUrl={frame.url}\n imageName={frame.filename || `Frame ${index + 1}`}\n selected={isSelected}\n onSelect={() => handleFrameSelection(frame.id)}\n />\n </Grid.Item>\n );\n })}\n </Grid.Root>\n </Box>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Modal\n * -----------------------------------------------------------------------------------------------*/\nexport const UploadFigmaModal = () => {\n const [figmaUrl, setFigmaUrl] = useState<string>('');\n const [figmaImages, setFigmaImages] = useState<FigmaImage[]>([]);\n const [selectedImages, setSelectedImages] = useState<string[]>([]);\n const { t } = useTranslations();\n\n const { addAttachments } = useAttachments();\n const { isFigmaUploadOpen, closeFigmaUpload, submitOnFinish } = useUploadFigmaToChat();\n const { input, setInput, sendMessage, openChat } = useStrapiChat();\n const { processFigmaUrl, isLoading, error } = useFigmaUpload({\n onSuccess: (images) => {\n setFigmaImages(images);\n // Initialize with first 15 images selected\n const initialSelection = images.slice(0, 15).map((img) => img.id);\n setSelectedImages(initialSelection);\n },\n });\n\n const handleImportStep = async () => {\n await processFigmaUrl(figmaUrl);\n return true;\n };\n\n // Validate if the URL is a valid Figma URL\n const isValidFigmaUrl = (url: string) => {\n if (!url) return false;\n try {\n const urlObj = new URL(url);\n return urlObj.hostname === 'www.figma.com' || urlObj.hostname === 'figma.com';\n } catch {\n return false;\n }\n };\n\n const handleCancel = () => {\n // Reset all state on cancel\n setFigmaUrl('');\n setFigmaImages([]);\n setSelectedImages([]);\n closeFigmaUpload();\n };\n\n const handleComplete = () => {\n // Only attach the selected images\n const selectedFigmaImages = figmaImages.filter((img) => selectedImages.includes(img.id));\n if (selectedFigmaImages.length === 0) {\n closeFigmaUpload();\n return;\n }\n\n // Ensure chat is opened\n openChat();\n\n if (submitOnFinish) {\n // Auto-submit a message to chat with attachments\n sendMessage({\n role: 'user',\n parts: [\n { type: 'text', text: 'Create schemas from the attached images' },\n ...selectedFigmaImages,\n ],\n });\n\n closeFigmaUpload();\n } else {\n // If input is empty, set a predefined message\n if (!input) {\n setInput('Create schemas from the attached images');\n }\n addAttachments(selectedFigmaImages);\n closeFigmaUpload();\n }\n };\n\n return (\n <StepModal\n open={isFigmaUploadOpen}\n onOpenChange={(isOpen) => {\n if (!isOpen) handleCancel();\n }}\n title={t('chat.figma-upload.header', 'Import from Figma')}\n onCancel={handleCancel}\n onComplete={handleComplete}\n >\n <StepModal.Step\n title={t('chat.figma-upload.step1-title', 'Enter Figma URL')}\n nextLabel={t('chat.figma-upload.import-button', 'Import')}\n cancelLabel={t('form.button.cancel', 'Cancel')}\n disableNext={!figmaUrl || isLoading || !isValidFigmaUrl(figmaUrl)}\n onNext={handleImportStep}\n >\n <FigmaUrlInputStep figmaUrl={figmaUrl} setFigmaUrl={setFigmaUrl} error={error} />\n </StepModal.Step>\n\n <StepModal.Step\n title={t('chat.figma-upload.step2-title', 'Preview Images')}\n nextLabel={t('form.button.finish', 'Finish')}\n backLabel={t('form.button.back', 'Back')}\n disableNext={selectedImages.length === 0}\n >\n <FigmaImageDisplayStep\n images={figmaImages}\n selectedImages={selectedImages}\n setSelectedImages={setSelectedImages}\n />\n </StepModal.Step>\n </StepModal>\n );\n};\n"],"names":["UploadFigmaContext","createContext","isFigmaUploadOpen","submitOnFinish","openFigmaUpload","closeFigmaUpload","useUploadFigmaToChat","context","useContext","Error","UploadFigmaToChatProvider","children","setIsFigmaUploadOpen","useState","setSubmitOnFinish","useCallback","submitOnFinishParam","contextValue","useMemo","_jsxs","Provider","value","_jsx","UploadFigmaModal","FigmaUrlInputStep","figmaUrl","setFigmaUrl","t","useTranslations","isLoading","useStepModal","showingTokenInput","setShowingTokenInput","hasFigmaToken","figmaToken","setFigmaToken","getFigmaToken","handleSaveToken","trim","saveFigmaToken","Flex","direction","gap","alignItems","Typography","variant","textColor","Link","href","isExternal","Box","width","TextInput","name","placeholder","aria-label","onChange","e","target","disabled","type","Button","onClick","justifyContent","size","FigmaImageDisplayStep","images","selectedImages","setSelectedImages","toggleSelectAll","length","allImageIds","map","img","id","padding","handleFrameSelection","frameId","newSelection","includes","filter","height","paddingRight","style","overflowY","Grid","Root","frame","index","isSelected","Item","col","xs","ImagePreview","imageUrl","url","imageName","filename","selected","onSelect","figmaImages","setFigmaImages","addAttachments","useAttachments","input","setInput","sendMessage","openChat","useStrapiChat","processFigmaUrl","error","useFigmaUpload","onSuccess","initialSelection","slice","handleImportStep","isValidFigmaUrl","urlObj","URL","hostname","handleCancel","handleComplete","selectedFigmaImages","role","parts","text","StepModal","open","onOpenChange","isOpen","title","onCancel","onComplete","Step","nextLabel","cancelLabel","disableNext","onNext","backLabel"],"mappings":"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"}
@@ -18,10 +18,13 @@ const StyledRoot = styledComponents.styled(designSystem.Box)`
18
18
  `;
19
19
  // TODO: How to make this a button instead?
20
20
  const Root = ({ children, error = null, minWidth, maxWidth })=>{
21
- return /*#__PURE__*/ jsxRuntime.jsx(AttachmentContext.Provider, {
22
- value: {
21
+ const contextValue = React.useMemo(()=>({
23
22
  error
24
- },
23
+ }), [
24
+ error
25
+ ]);
26
+ return /*#__PURE__*/ jsxRuntime.jsx(AttachmentContext.Provider, {
27
+ value: contextValue,
25
28
  children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
26
29
  direction: "column",
27
30
  alignItems: "flex-start",
@@ -1 +1 @@
1
- {"version":3,"file":"Attachment.js","sources":["../../../../../../../admin/src/components/AIChat/components/Attachments/components/Attachment.tsx"],"sourcesContent":["import { ReactNode, createContext, useContext } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Trash, WarningCircle } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentContextValue {\n error?: string | null;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue>({ error: null });\n\nconst useAttachmentContext = () => useContext(AttachmentContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AttachmentRootProps {\n children: ReactNode;\n error?: string | null;\n minWidth?: string;\n maxWidth?: string;\n}\n\nconst StyledRoot = styled(Box)`\n &:hover {\n cursor: pointer;\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\n// TODO: How to make this a button instead?\nconst Root = ({ children, error = null, minWidth, maxWidth }: AttachmentRootProps) => {\n return (\n <AttachmentContext.Provider value={{ error }}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={2}\n minWidth={minWidth}\n maxWidth={maxWidth}\n >\n <StyledRoot\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n padding={2}\n width=\"100%\"\n >\n <Flex gap={2}>{children}</Flex>\n </StyledRoot>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger500\">\n {error}\n </Typography>\n )}\n </Flex>\n </AttachmentContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Preview\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentPreviewProps {\n children: ReactNode;\n}\n\nconst Preview = ({ children }: AttachmentPreviewProps) => {\n const { error } = useAttachmentContext();\n\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\">\n {error ? <WarningCircle fill=\"danger500\" /> : children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Title\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentTitleProps {\n children: ReactNode;\n}\n\nconst Title = ({ children }: AttachmentTitleProps) => {\n return (\n <Box grow={1}>\n <Typography variant=\"omega\" ellipsis style={{ userSelect: 'none', maxWidth: '100px' }}>\n {children}\n </Typography>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Remove\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentRemoveProps {\n onClick: () => void;\n}\n\nconst Remove = ({ onClick }: AttachmentRemoveProps) => {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" shrink={0} onClick={onClick}>\n <Trash fill=\"neutral500\" />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Attachment = {\n Root,\n Preview,\n Title,\n Remove,\n};\n\nexport { useAttachmentContext };\n"],"names":["AttachmentContext","createContext","error","useAttachmentContext","useContext","StyledRoot","styled","Box","theme","colors","neutral100","Root","children","minWidth","maxWidth","_jsx","Provider","value","_jsxs","Flex","direction","alignItems","gap","background","hasRadius","borderColor","borderStyle","borderWidth","padding","width","Typography","variant","textColor","Preview","justifyContent","WarningCircle","fill","Title","grow","ellipsis","style","userSelect","Remove","onClick","shrink","Trash","Attachment"],"mappings":"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"}
1
+ {"version":3,"file":"Attachment.js","sources":["../../../../../../../admin/src/components/AIChat/components/Attachments/components/Attachment.tsx"],"sourcesContent":["import { ReactNode, createContext, useContext, useMemo } from 'react';\n\nimport { Box, Flex, Typography } from '@strapi/design-system';\nimport { Trash, WarningCircle } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentContextValue {\n error?: string | null;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue>({ error: null });\n\nconst useAttachmentContext = () => useContext(AttachmentContext);\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Root\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface AttachmentRootProps {\n children: ReactNode;\n error?: string | null;\n minWidth?: string;\n maxWidth?: string;\n}\n\nconst StyledRoot = styled(Box)`\n &:hover {\n cursor: pointer;\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\n// TODO: How to make this a button instead?\nconst Root = ({ children, error = null, minWidth, maxWidth }: AttachmentRootProps) => {\n const contextValue = useMemo(() => ({ error }), [error]);\n\n return (\n <AttachmentContext.Provider value={contextValue}>\n <Flex\n direction=\"column\"\n alignItems=\"flex-start\"\n gap={2}\n minWidth={minWidth}\n maxWidth={maxWidth}\n >\n <StyledRoot\n background=\"neutral0\"\n hasRadius\n borderColor=\"neutral200\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n padding={2}\n width=\"100%\"\n >\n <Flex gap={2}>{children}</Flex>\n </StyledRoot>\n {error && (\n <Typography variant=\"pi\" textColor=\"danger500\">\n {error}\n </Typography>\n )}\n </Flex>\n </AttachmentContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Preview\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentPreviewProps {\n children: ReactNode;\n}\n\nconst Preview = ({ children }: AttachmentPreviewProps) => {\n const { error } = useAttachmentContext();\n\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\">\n {error ? <WarningCircle fill=\"danger500\" /> : children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Title\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentTitleProps {\n children: ReactNode;\n}\n\nconst Title = ({ children }: AttachmentTitleProps) => {\n return (\n <Box grow={1}>\n <Typography variant=\"omega\" ellipsis style={{ userSelect: 'none', maxWidth: '100px' }}>\n {children}\n </Typography>\n </Box>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Remove\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AttachmentRemoveProps {\n onClick: () => void;\n}\n\nconst Remove = ({ onClick }: AttachmentRemoveProps) => {\n return (\n <Flex alignItems=\"center\" justifyContent=\"center\" shrink={0} onClick={onClick}>\n <Trash fill=\"neutral500\" />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachment Compound\n * -----------------------------------------------------------------------------------------------*/\n\nexport const Attachment = {\n Root,\n Preview,\n Title,\n Remove,\n};\n\nexport { useAttachmentContext };\n"],"names":["AttachmentContext","createContext","error","useAttachmentContext","useContext","StyledRoot","styled","Box","theme","colors","neutral100","Root","children","minWidth","maxWidth","contextValue","useMemo","_jsx","Provider","value","_jsxs","Flex","direction","alignItems","gap","background","hasRadius","borderColor","borderStyle","borderWidth","padding","width","Typography","variant","textColor","Preview","justifyContent","WarningCircle","fill","Title","grow","ellipsis","style","userSelect","Remove","onClick","shrink","Trash","Attachment"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { createContext, useContext } from 'react';
2
+ import { useMemo, createContext, useContext } from 'react';
3
3
  import { Flex, Typography, Box } from '@strapi/design-system';
4
4
  import { WarningCircle, Trash } from '@strapi/icons';
5
5
  import { styled } from 'styled-components';
@@ -16,10 +16,13 @@ const StyledRoot = styled(Box)`
16
16
  `;
17
17
  // TODO: How to make this a button instead?
18
18
  const Root = ({ children, error = null, minWidth, maxWidth })=>{
19
- return /*#__PURE__*/ jsx(AttachmentContext.Provider, {
20
- value: {
19
+ const contextValue = useMemo(()=>({
21
20
  error
22
- },
21
+ }), [
22
+ error
23
+ ]);
24
+ return /*#__PURE__*/ jsx(AttachmentContext.Provider, {
25
+ value: contextValue,
23
26
  children: /*#__PURE__*/ jsxs(Flex, {
24
27
  direction: "column",
25
28
  alignItems: "flex-start",