@strapi/content-type-builder 5.50.0 → 5.50.1
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.
- package/dist/admin/components/AIChat/Chat.js +2 -4
- package/dist/admin/components/AIChat/Chat.js.map +1 -1
- package/dist/admin/components/AIChat/Chat.mjs +2 -4
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.js +8 -3
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +8 -3
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/aiClient.js +8 -2
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -1
- package/dist/admin/components/AIChat/lib/aiClient.mjs +8 -2
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +0 -3
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +0 -3
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +9 -7
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +9 -7
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
- package/dist/admin/components/AllowedTypesSelect.js.map +1 -1
- package/dist/admin/components/AllowedTypesSelect.mjs.map +1 -1
- package/dist/admin/components/AttributeIcon.js +1 -1
- package/dist/admin/components/AttributeIcon.js.map +1 -1
- package/dist/admin/components/AttributeIcon.mjs +1 -1
- package/dist/admin/components/AttributeIcon.mjs.map +1 -1
- package/dist/admin/components/BooleanDefaultValueSelect.js +3 -2
- package/dist/admin/components/BooleanDefaultValueSelect.js.map +1 -1
- package/dist/admin/components/BooleanDefaultValueSelect.mjs +3 -2
- package/dist/admin/components/BooleanDefaultValueSelect.mjs.map +1 -1
- package/dist/admin/components/BooleanRadioGroup.js.map +1 -1
- package/dist/admin/components/BooleanRadioGroup.mjs.map +1 -1
- package/dist/admin/components/CTBSession/useCTBTracking.js +3 -3
- package/dist/admin/components/CTBSession/useCTBTracking.js.map +1 -1
- package/dist/admin/components/CTBSession/useCTBTracking.mjs +3 -3
- package/dist/admin/components/CTBSession/useCTBTracking.mjs.map +1 -1
- package/dist/admin/components/CheckboxWithNumberField.js +3 -2
- package/dist/admin/components/CheckboxWithNumberField.js.map +1 -1
- package/dist/admin/components/CheckboxWithNumberField.mjs +3 -2
- package/dist/admin/components/CheckboxWithNumberField.mjs.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.js.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +160 -162
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +160 -162
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +1 -1
- package/dist/admin/components/ContentTypeRadioGroup.js.map +1 -1
- package/dist/admin/components/ContentTypeRadioGroup.mjs.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +6 -5
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +6 -5
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
- package/dist/admin/components/CustomRadioGroup/Styles.js.map +1 -1
- package/dist/admin/components/CustomRadioGroup/Styles.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +16 -4
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +16 -4
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +2 -2
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +2 -2
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DataManager/useServerRestartWatcher.js.map +1 -1
- package/dist/admin/components/DataManager/useServerRestartWatcher.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js.map +1 -1
- package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.mjs.map +1 -1
- package/dist/admin/components/DraftAndPublishToggle.js.map +1 -1
- package/dist/admin/components/DraftAndPublishToggle.mjs.map +1 -1
- package/dist/admin/components/DynamicZoneList.js.map +1 -1
- package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +91 -71
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +91 -70
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js +20 -17
- package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +20 -17
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.js +4 -6
- package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.mjs +4 -6
- package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/getUsedAttributeNames.js.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/getUsedAttributeNames.mjs.map +1 -1
- package/dist/admin/components/FormModal/reducer.js +9 -6
- package/dist/admin/components/FormModal/reducer.js.map +1 -1
- package/dist/admin/components/FormModal/reducer.mjs +9 -6
- package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.js +3 -3
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.js.map +1 -1
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.mjs +3 -3
- package/dist/admin/components/FormModal/utils/customFieldDefaultOptionsReducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.js +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.js.map +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.mjs +1 -1
- package/dist/admin/components/FormModal/utils/getFormInputNames.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/relations.js +2 -2
- package/dist/admin/components/FormModal/utils/relations.js.map +1 -1
- package/dist/admin/components/FormModal/utils/relations.mjs +2 -2
- package/dist/admin/components/FormModal/utils/relations.mjs.map +1 -1
- package/dist/admin/components/FormModalHeader.js.map +1 -1
- package/dist/admin/components/FormModalHeader.mjs.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.mjs.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js +13 -13
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs +13 -13
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs.map +1 -1
- package/dist/admin/components/GenericInputs.js +24 -12
- package/dist/admin/components/GenericInputs.js.map +1 -1
- package/dist/admin/components/GenericInputs.mjs +24 -12
- package/dist/admin/components/GenericInputs.mjs.map +1 -1
- package/dist/admin/components/IconPicker/IconPicker.js.map +1 -1
- package/dist/admin/components/IconPicker/IconPicker.mjs.map +1 -1
- package/dist/admin/components/PluralName.js.map +1 -1
- package/dist/admin/components/PluralName.mjs.map +1 -1
- package/dist/admin/components/Relation/Relation.js +3 -3
- package/dist/admin/components/Relation/Relation.js.map +1 -1
- package/dist/admin/components/Relation/Relation.mjs +3 -3
- package/dist/admin/components/Relation/Relation.mjs.map +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.js +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.js.map +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.mjs +1 -1
- package/dist/admin/components/Relation/RelationField/RelationField.mjs.map +1 -1
- package/dist/admin/components/SelectCategory.js +6 -0
- package/dist/admin/components/SelectCategory.js.map +1 -1
- package/dist/admin/components/SelectCategory.mjs +6 -0
- package/dist/admin/components/SelectCategory.mjs.map +1 -1
- package/dist/admin/components/SelectComponent.js +1 -1
- package/dist/admin/components/SelectComponent.js.map +1 -1
- package/dist/admin/components/SelectComponent.mjs +1 -1
- package/dist/admin/components/SelectComponent.mjs.map +1 -1
- package/dist/admin/components/SingularName.js.map +1 -1
- package/dist/admin/components/SingularName.mjs.map +1 -1
- package/dist/admin/components/TabForm.js +50 -51
- package/dist/admin/components/TabForm.js.map +1 -1
- package/dist/admin/components/TabForm.mjs +51 -52
- package/dist/admin/components/TabForm.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +1 -2
- package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +1 -1
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +6 -2
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +1 -1
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +5 -5
- package/dist/admin/src/components/AllowedTypesSelect.d.ts +3 -3
- package/dist/admin/src/components/BooleanDefaultValueSelect.d.ts +3 -3
- package/dist/admin/src/components/BooleanRadioGroup.d.ts +2 -2
- package/dist/admin/src/components/CTBSession/useCTBTracking.d.ts +1 -1
- package/dist/admin/src/components/CheckboxWithNumberField.d.ts +6 -4
- package/dist/admin/src/components/ContentTypeRadioGroup.d.ts +3 -2
- package/dist/admin/src/components/CustomRadioGroup/CustomRadioGroup.d.ts +3 -2
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +13 -11
- package/dist/admin/src/components/DataManager/reducer.d.ts +14 -10
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +8 -8
- package/dist/admin/src/components/DataManager/utils/formatSchemas.d.ts +9 -3
- package/dist/admin/src/components/DataManager/utils/retrieveSpecificInfoFromComponents.d.ts +2 -1
- package/dist/admin/src/components/DraftAndPublishToggle.d.ts +1 -6
- package/dist/admin/src/components/DynamicZoneList.d.ts +2 -2
- package/dist/admin/src/components/FormModal/attributes/ConditionForm.d.ts +3 -2
- package/dist/admin/src/components/FormModal/attributes/validation/common.d.ts +3 -1
- package/dist/admin/src/components/FormModal/forms/forms.d.ts +59 -26
- package/dist/admin/src/components/FormModal/forms/utils/getUsedAttributeNames.d.ts +12 -2
- package/dist/admin/src/components/FormModal/reducer.d.ts +104 -32
- package/dist/admin/src/components/FormModal/utils/customFieldDefaultOptionsReducer.d.ts +11 -1
- package/dist/admin/src/components/FormModal/utils/getFormInputNames.d.ts +8 -1
- package/dist/admin/src/components/FormModal/utils/relations.d.ts +2 -2
- package/dist/admin/src/components/FormModalHeader.d.ts +5 -8
- package/dist/admin/src/components/FormModalNavigation/FormModalNavigationContext.d.ts +2 -2
- package/dist/admin/src/components/FormModalNavigation/FormModalNavigationProvider.d.ts +17 -1
- package/dist/admin/src/components/GenericInputs.d.ts +12 -7
- package/dist/admin/src/components/IconPicker/IconPicker.d.ts +2 -7
- package/dist/admin/src/components/PluralName.d.ts +6 -14
- package/dist/admin/src/components/Relation/Relation.d.ts +12 -3
- package/dist/admin/src/components/Relation/RelationField/RelationField.d.ts +3 -2
- package/dist/admin/src/components/SelectCategory.d.ts +3 -12
- package/dist/admin/src/components/SelectComponent.d.ts +8 -7
- package/dist/admin/src/components/SingularName.d.ts +5 -8
- package/dist/admin/src/components/TabForm.d.ts +38 -7
- package/dist/admin/src/types.d.ts +20 -12
- package/dist/admin/src/utils/conditions.d.ts +13 -4
- package/dist/admin/src/utils/formAPI.d.ts +38 -33
- package/dist/admin/src/utils/getRelationType.d.ts +1 -1
- package/dist/admin/src/utils/parseNumberInputValue.d.ts +1 -0
- package/dist/admin/utils/conditions.js +38 -28
- package/dist/admin/utils/conditions.js.map +1 -1
- package/dist/admin/utils/conditions.mjs +37 -28
- package/dist/admin/utils/conditions.mjs.map +1 -1
- package/dist/admin/utils/formAPI.js +9 -6
- package/dist/admin/utils/formAPI.js.map +1 -1
- package/dist/admin/utils/formAPI.mjs +9 -6
- package/dist/admin/utils/formAPI.mjs.map +1 -1
- package/dist/admin/utils/getRelationType.js +3 -0
- package/dist/admin/utils/getRelationType.js.map +1 -1
- package/dist/admin/utils/getRelationType.mjs +3 -0
- package/dist/admin/utils/getRelationType.mjs.map +1 -1
- package/dist/admin/utils/getYupInnerErrors.js +6 -4
- package/dist/admin/utils/getYupInnerErrors.js.map +1 -1
- package/dist/admin/utils/getYupInnerErrors.mjs +6 -4
- package/dist/admin/utils/getYupInnerErrors.mjs.map +1 -1
- package/dist/admin/utils/parseNumberInputValue.js +15 -0
- package/dist/admin/utils/parseNumberInputValue.js.map +1 -0
- package/dist/admin/utils/parseNumberInputValue.mjs +13 -0
- package/dist/admin/utils/parseNumberInputValue.mjs.map +1 -0
- package/dist/server/controllers/validation/relations.js +1 -1
- package/dist/server/controllers/validation/relations.js.map +1 -1
- package/dist/server/controllers/validation/relations.mjs +1 -1
- package/dist/server/controllers/validation/relations.mjs.map +1 -1
- package/dist/server/controllers/validation/types.js +4 -3
- package/dist/server/controllers/validation/types.js.map +1 -1
- package/dist/server/controllers/validation/types.mjs +4 -3
- package/dist/server/controllers/validation/types.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -164,10 +164,8 @@ const ChatError = ()=>{
|
|
|
164
164
|
direction: "column",
|
|
165
165
|
gap: 5,
|
|
166
166
|
children: [
|
|
167
|
-
messages.map((message
|
|
168
|
-
message: message
|
|
169
|
-
// Chat loading and message is the last one
|
|
170
|
-
isLoading: (status === 'streaming' || status === 'submitted') && idx === messages.length - 1
|
|
167
|
+
messages.map((message)=>/*#__PURE__*/ jsxRuntime.jsx(Message.ChatMessage, {
|
|
168
|
+
message: message
|
|
171
169
|
}, message.id)),
|
|
172
170
|
status === 'error' && /*#__PURE__*/ jsxRuntime.jsx(ChatError, {})
|
|
173
171
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.js","sources":["../../../../admin/src/components/AIChat/Chat.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { tours, useGuidedTour, useAppInfo } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton, Button, Typography, Box } from '@strapi/design-system';\nimport { Sparkle, ArrowUp, Plus, Paperclip, Upload, Code } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { useCTBTracking } from '../CTBSession/ctbSession';\n\nimport { Alert } from './components/Alert';\nimport { AnimatedBox } from './components/AnimatedBox';\nimport { AttachmentPreview } from './components/Attachments/AttachmentPreview';\nimport { Dropzone } from './components/Dropzone';\nimport { Panel } from './components/FloatingPanel';\nimport { FigmaIcon } from './components/icons/FigmaIcon';\nimport { StopIcon } from './components/icons/StopIcon';\nimport { Input } from './components/Input';\nimport { ChatMessage } from './components/Messages/Message';\nimport { ResizableTextArea } from './components/ResizableTextArea';\nimport { MenuItem, SimpleMenu } from './components/SimpleMenu';\nimport {\n CHAT_TOO_LONG_ERROR,\n LICENSE_LIMIT_REACHED_ERROR,\n TOO_MANY_REQUESTS_ERROR,\n LICENSE_LIMIT_EXCEEDED_ERROR,\n} from './hooks/useAIFetch';\nimport { useAttachments } from './hooks/useAttachments';\nimport { useTranslations } from './hooks/useTranslations';\nimport { AIMessage } from './lib/types/messages';\nimport { useStrapiChat } from './providers/ChatProvider';\nimport { useUploadProjectToChat } from './UploadCodeModal';\nimport { useUploadFigmaToChat } from './UploadFigmaModal';\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Message Suggestions\n * -----------------------------------------------------------------------------------------------*/\nconst ResponsiveFlex = styled(Flex)`\n @media (max-height: 500px) {\n display: none;\n }\n`;\n\nconst ChatSuggestions = () => {\n const { sendMessage } = useStrapiChat();\n const { t } = useTranslations();\n const { trackUsage } = useCTBTracking();\n\n const SUGGESTIONS = [\n t('chat.input.defaults.generate', 'Generate a product schema'),\n t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder'),\n t('chat.input.defaults.strapi', 'Tell me about Strapi'),\n ] as const;\n\n const SUGGESTION_TO_PROMPT_TYPE = {\n [t('chat.input.defaults.generate', 'Generate a product schema')]: 'generate-product-schema',\n [t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder')]:\n 'tell-me-about-the-content-type-builder',\n [t('chat.input.defaults.strapi', 'Tell me about Strapi')]: 'tell-me-about-strapi',\n } as const;\n\n const suggestionsTitle = t('chat.input.defaults.title', 'How can I help you?');\n\n return (\n <AnimatedBox>\n <ResponsiveFlex direction=\"column\" alignItems={'flex-start'} gap={3}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {suggestionsTitle}\n </Typography>\n <Flex direction=\"column\" alignItems={'flex-start'} gap={2}>\n {SUGGESTIONS.map((suggestion) => (\n <Button\n key={suggestion}\n startIcon={<Sparkle fill=\"neutral500\" />}\n size=\"M\"\n variant=\"tertiary\"\n onClick={() => {\n trackUsage('didUsePresetPrompt', {\n promptType: SUGGESTION_TO_PROMPT_TYPE[suggestion],\n });\n\n sendMessage({ text: suggestion });\n }}\n >\n <Typography fontWeight=\"regular\">{suggestion}</Typography>\n </Button>\n ))}\n </Flex>\n </ResponsiveFlex>\n </AnimatedBox>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Errors\n * -----------------------------------------------------------------------------------------------*/\nconst getErrorMessage = (err: Error) => {\n try {\n const error = JSON.parse(err.message);\n return error.error;\n } catch (e) {\n return err;\n }\n};\n\nconst ChatError = () => {\n const { error } = useStrapiChat();\n const { t } = useTranslations();\n\n const defaultErrorMessage = t('chat.messages.error', 'Something went wrong.');\n const tooManyRequestsMessage = t(\n 'chat.messages.too-many-requests',\n 'Too many requests, please try again later.'\n );\n const licenseLimitReachedMessage = t(\n 'chat.messages.license-limit-reached',\n 'License limit reached, please try again tomorrow.'\n );\n const licenseLimitExceededMessage = t(\n 'chat.messages.license-limit-exceeded',\n 'AI credit limit exceeded.'\n );\n const chatTooLongError = t(\n 'chat.messages.too-long-error',\n 'This conversation reached its maximum length. Start a new conversation'\n );\n\n if (!error) return null;\n\n const errorMessage = getErrorMessage(error);\n if (!errorMessage || typeof errorMessage !== 'string') {\n return null;\n }\n\n if (errorMessage === TOO_MANY_REQUESTS_ERROR) {\n return <Alert title={tooManyRequestsMessage} variant=\"warning\" />;\n }\n\n if (errorMessage === LICENSE_LIMIT_REACHED_ERROR) {\n return <Alert title={licenseLimitReachedMessage} variant=\"warning\" />;\n }\n\n if (errorMessage.split('.')[0] === LICENSE_LIMIT_EXCEEDED_ERROR) {\n return <Alert title={licenseLimitExceededMessage} variant=\"danger\" />;\n }\n\n if (errorMessage === CHAT_TOO_LONG_ERROR) {\n return <Alert title={chatTooLongError} variant=\"danger\" />;\n }\n\n return <Alert title={defaultErrorMessage} variant=\"danger\" />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Messages\n * -----------------------------------------------------------------------------------------------*/\nconst ChatContent: React.FC<{\n messages: AIMessage[];\n}> = ({ messages }) => {\n const messageEndRef = useRef<HTMLDivElement>(null);\n const { status } = useStrapiChat();\n\n // Scroll to the bottom of the chat when new messages arrive\n useEffect(() => {\n // Add a small delay to ensure all message content is fully rendered\n // including conditionally rendered elements like feedback buttons\n const scrollTimeout = setTimeout(() => {\n messageEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, 20);\n\n return () => clearTimeout(scrollTimeout);\n }, [messages, status]);\n\n return (\n <>\n <Flex direction=\"column\" gap={5}>\n {messages.map((message, idx) => (\n <ChatMessage\n key={message.id}\n message={message}\n // Chat loading and message is the last one\n isLoading={\n (status === 'streaming' || status === 'submitted') && idx === messages.length - 1\n }\n />\n ))}\n {status === 'error' && <ChatError />}\n </Flex>\n <div ref={messageEndRef} />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachments\n * -----------------------------------------------------------------------------------------------*/\nconst ChatAttachmentList = () => {\n const { attachments, removeAttachmentByIndex } = useAttachments();\n\n if (!attachments.length) return null;\n\n return (\n <Input.Attachments>\n {attachments.map((attachment, index) => (\n <Box key={attachment.filename} maxWidth={'250px'}>\n <AttachmentPreview\n attachment={attachment}\n onRemove={() => removeAttachmentByIndex(index)}\n />\n </Box>\n ))}\n </Input.Attachments>\n );\n};\n\nconst ChatAttachmentMenu = () => {\n const { attachFiles } = useAttachments();\n const { openCodeUpload } = useUploadProjectToChat();\n const { openFigmaUpload } = useUploadFigmaToChat();\n const { t } = useTranslations();\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const uploadLabel = t('chat.tooltips.upload-attachments', 'Upload attachments');\n const importCodeText = t('chat.attachments.menu.import-code', 'Import code');\n const attachImageText = t('chat.attachments.menu.attach-image', 'Attach image');\n const importFigmaText = t('chat.attachments.menu.import-figma', 'Import from Figma');\n\n return (\n <SimpleMenu\n label={uploadLabel}\n icon={<Paperclip />}\n tag={IconButton}\n popoverPlacement=\"top-end\"\n >\n <MenuItem startIcon={<Code />} onSelect={() => openCodeUpload()}>\n {importCodeText}\n </MenuItem>\n\n <MenuItem startIcon={<FigmaIcon />} onSelect={() => openFigmaUpload()}>\n {importFigmaText}\n </MenuItem>\n\n <input type=\"file\" accept=\"image/*\" multiple hidden ref={fileInputRef} />\n <MenuItem\n startIcon={<Upload />}\n onSelect={() => {\n const fileInput = fileInputRef.current;\n if (!fileInput) return;\n fileInput.onchange = (e) => {\n const target = e.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n attachFiles(Array.from(target.files));\n }\n };\n\n fileInput.click();\n }}\n >\n {attachImageText}\n </MenuItem>\n </SimpleMenu>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Input\n * -----------------------------------------------------------------------------------------------*/\n\nconst LoadingDots = ({ children }: { children: string }) => {\n const [dots, setDots] = useState('');\n\n useEffect(() => {\n const dotStates = ['', '.', '..', '...'];\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n currentIndex = (currentIndex + 1) % dotStates.length;\n setDots(dotStates[currentIndex]);\n }, 400); // Change every 400ms\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {children}\n {dots}\n </Typography>\n );\n};\n\nconst ChatInput = (props: React.FormHTMLAttributes<HTMLFormElement>) => {\n const { input, handleSubmit, handleInputChange, messages, status, stop, attachments } =\n useStrapiChat();\n const { t } = useTranslations();\n\n const isLoading = status === 'streaming' || status === 'submitted';\n\n return (\n <>\n <form onSubmit={handleSubmit} {...props}>\n <Input.Root isLoading={isLoading} gap={4}>\n <Input.Header minHeight={0}>\n {messages.length === 0 && (\n <Input.HeaderItem>\n <ChatSuggestions />\n </Input.HeaderItem>\n )}\n {isLoading && (\n <Input.HeaderItem>\n <LoadingDots>{t('chat.input.thinking', 'Strapi AI is thinking')}</LoadingDots>\n </Input.HeaderItem>\n )}\n </Input.Header>\n <Input.Content>\n <Dropzone.Area />\n <ChatAttachmentList />\n <Box paddingBottom={3}>\n <ResizableTextArea\n value={input}\n onChange={handleInputChange}\n onSubmit={handleSubmit}\n placeholder={t('chat.input.placeholder', 'Ask Strapi AI...')}\n />\n </Box>\n <Input.Actions>\n <ChatAttachmentMenu />\n\n {isLoading ? (\n <IconButton\n label={t('chat.tooltips.stop-generation', 'Stop')}\n type=\"button\"\n variant=\"default\"\n onClick={(e) => {\n e.preventDefault();\n stop();\n }}\n >\n <StopIcon />\n </IconButton>\n ) : (\n <IconButton\n label={t('chat.tooltips.send-message', 'Send')}\n variant=\"default\"\n type=\"submit\"\n // allow sending an empty message if there are attachments\n disabled={input.trim().length === 0 && attachments.length === 0}\n >\n <ArrowUp />\n </IconButton>\n )}\n </Input.Actions>\n </Input.Content>\n </Input.Root>\n </form>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat\n * -----------------------------------------------------------------------------------------------*/\n\nconst Chat = () => {\n const { title, messages, isChatOpen, isChatEnabled, openChat, closeChat, reset } =\n useStrapiChat();\n const { attachFiles } = useAttachments();\n const { t } = useTranslations();\n const state = useGuidedTour('Chat', (s) => s.state);\n const currentEnvironment = useAppInfo('Chat', (state) => state.currentEnvironment);\n\n // Disable AI Chat in production mode\n const isProduction = currentEnvironment === 'production';\n\n // Auto-open chat when AIChat guided tour step is active\n useEffect(() => {\n const isAIChatStepActive =\n state.enabled &&\n state.tours.contentTypeBuilder?.currentStep === 1 && // AIChat is step 1 in contentTypeBuilderStepsAI\n !state.tours.contentTypeBuilder?.isCompleted;\n\n if (isAIChatStepActive && !isChatOpen && openChat) {\n openChat();\n }\n }, [\n state.tours.contentTypeBuilder?.currentStep,\n state.tours.contentTypeBuilder?.isCompleted,\n state.enabled,\n isChatOpen,\n openChat,\n ]);\n\n // Labels\n const openChatLabel = t('chat.tooltips.open-chat', 'Open chat');\n const closeChatLabel = t('chat.tooltips.close-chat', 'Close chat');\n const createChatLabel = t('chat.tooltips.create-chat', 'New conversation');\n const defaultTitle = t('chat.header.default-title', 'New conversation');\n const mistakesDisclaimer = t(\n 'chat.input.strapi-ai-can-make-errors',\n 'Strapi AI can make mistakes.'\n );\n\n // Don't render the chat at all in production mode or if chat is not enabled\n if (!isChatEnabled || isProduction) {\n return null;\n }\n\n return (\n <Dropzone.Root\n onAddFiles={(files) => {\n attachFiles(files);\n }}\n >\n <Panel.Root\n size=\"md\"\n position=\"bottom-right\"\n isOpen={isChatOpen}\n onToggle={isChatOpen ? closeChat : openChat}\n toggleIcon={\n <IconButton\n onClick={isChatOpen ? closeChat : openChat}\n label={isChatOpen ? closeChatLabel : openChatLabel}\n variant=\"default\"\n size=\"L\"\n >\n <Sparkle />\n </IconButton>\n }\n >\n <Panel.Header>\n <Typography tag=\"h3\" variant=\"omega\" fontWeight=\"bold\">\n {title || defaultTitle}\n </Typography>\n <Flex gap={0}>\n <IconButton label={createChatLabel} variant=\"ghost\" onClick={reset}>\n <Plus />\n </IconButton>\n <Panel.Close label={closeChatLabel} />\n </Flex>\n </Panel.Header>\n\n <Panel.Body>\n <tours.contentTypeBuilder.AIChat>\n {!messages.length ? (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {mistakesDisclaimer}\n </Typography>\n ) : null}\n <ChatContent messages={messages} />\n </tours.contentTypeBuilder.AIChat>\n </Panel.Body>\n\n <Panel.Footer>\n <ChatInput />\n </Panel.Footer>\n </Panel.Root>\n </Dropzone.Root>\n );\n};\n\nexport { Chat };\n"],"names":["ResponsiveFlex","styled","Flex","ChatSuggestions","sendMessage","useStrapiChat","t","useTranslations","trackUsage","useCTBTracking","SUGGESTIONS","SUGGESTION_TO_PROMPT_TYPE","suggestionsTitle","_jsx","AnimatedBox","_jsxs","direction","alignItems","gap","Typography","variant","fontWeight","map","suggestion","Button","startIcon","Sparkle","fill","size","onClick","promptType","text","getErrorMessage","err","error","JSON","parse","message","e","ChatError","defaultErrorMessage","tooManyRequestsMessage","licenseLimitReachedMessage","licenseLimitExceededMessage","chatTooLongError","errorMessage","TOO_MANY_REQUESTS_ERROR","Alert","title","LICENSE_LIMIT_REACHED_ERROR","split","LICENSE_LIMIT_EXCEEDED_ERROR","CHAT_TOO_LONG_ERROR","ChatContent","messages","messageEndRef","useRef","status","useEffect","scrollTimeout","setTimeout","current","scrollIntoView","behavior","clearTimeout","_Fragment","idx","ChatMessage","isLoading","length","id","div","ref","ChatAttachmentList","attachments","removeAttachmentByIndex","useAttachments","Input","Attachments","attachment","index","Box","maxWidth","AttachmentPreview","onRemove","filename","ChatAttachmentMenu","attachFiles","openCodeUpload","useUploadProjectToChat","openFigmaUpload","useUploadFigmaToChat","fileInputRef","uploadLabel","importCodeText","attachImageText","importFigmaText","SimpleMenu","label","icon","Paperclip","tag","IconButton","popoverPlacement","MenuItem","Code","onSelect","FigmaIcon","input","type","accept","multiple","hidden","Upload","fileInput","onchange","target","files","Array","from","click","LoadingDots","children","dots","setDots","useState","dotStates","currentIndex","interval","setInterval","clearInterval","textColor","ChatInput","props","handleSubmit","handleInputChange","stop","form","onSubmit","Root","Header","minHeight","HeaderItem","Content","Dropzone","Area","paddingBottom","ResizableTextArea","value","onChange","placeholder","Actions","preventDefault","StopIcon","disabled","trim","ArrowUp","Chat","isChatOpen","isChatEnabled","openChat","closeChat","reset","state","useGuidedTour","s","currentEnvironment","useAppInfo","isProduction","isAIChatStepActive","enabled","tours","contentTypeBuilder","currentStep","isCompleted","openChatLabel","closeChatLabel","createChatLabel","defaultTitle","mistakesDisclaimer","onAddFiles","Panel","position","isOpen","onToggle","toggleIcon","Plus","Close","Body","AIChat","Footer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chat.js","sources":["../../../../admin/src/components/AIChat/Chat.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { tours, useGuidedTour, useAppInfo } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton, Button, Typography, Box } from '@strapi/design-system';\nimport { Sparkle, ArrowUp, Plus, Paperclip, Upload, Code } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { useCTBTracking } from '../CTBSession/ctbSession';\n\nimport { Alert } from './components/Alert';\nimport { AnimatedBox } from './components/AnimatedBox';\nimport { AttachmentPreview } from './components/Attachments/AttachmentPreview';\nimport { Dropzone } from './components/Dropzone';\nimport { Panel } from './components/FloatingPanel';\nimport { FigmaIcon } from './components/icons/FigmaIcon';\nimport { StopIcon } from './components/icons/StopIcon';\nimport { Input } from './components/Input';\nimport { ChatMessage } from './components/Messages/Message';\nimport { ResizableTextArea } from './components/ResizableTextArea';\nimport { MenuItem, SimpleMenu } from './components/SimpleMenu';\nimport {\n CHAT_TOO_LONG_ERROR,\n LICENSE_LIMIT_REACHED_ERROR,\n TOO_MANY_REQUESTS_ERROR,\n LICENSE_LIMIT_EXCEEDED_ERROR,\n} from './hooks/useAIFetch';\nimport { useAttachments } from './hooks/useAttachments';\nimport { useTranslations } from './hooks/useTranslations';\nimport { AIMessage } from './lib/types/messages';\nimport { useStrapiChat } from './providers/ChatProvider';\nimport { useUploadProjectToChat } from './UploadCodeModal';\nimport { useUploadFigmaToChat } from './UploadFigmaModal';\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Message Suggestions\n * -----------------------------------------------------------------------------------------------*/\nconst ResponsiveFlex = styled(Flex)`\n @media (max-height: 500px) {\n display: none;\n }\n`;\n\nconst ChatSuggestions = () => {\n const { sendMessage } = useStrapiChat();\n const { t } = useTranslations();\n const { trackUsage } = useCTBTracking();\n\n const SUGGESTIONS = [\n t('chat.input.defaults.generate', 'Generate a product schema'),\n t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder'),\n t('chat.input.defaults.strapi', 'Tell me about Strapi'),\n ] as const;\n\n const SUGGESTION_TO_PROMPT_TYPE = {\n [t('chat.input.defaults.generate', 'Generate a product schema')]: 'generate-product-schema',\n [t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder')]:\n 'tell-me-about-the-content-type-builder',\n [t('chat.input.defaults.strapi', 'Tell me about Strapi')]: 'tell-me-about-strapi',\n } as const;\n\n const suggestionsTitle = t('chat.input.defaults.title', 'How can I help you?');\n\n return (\n <AnimatedBox>\n <ResponsiveFlex direction=\"column\" alignItems={'flex-start'} gap={3}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {suggestionsTitle}\n </Typography>\n <Flex direction=\"column\" alignItems={'flex-start'} gap={2}>\n {SUGGESTIONS.map((suggestion) => (\n <Button\n key={suggestion}\n startIcon={<Sparkle fill=\"neutral500\" />}\n size=\"M\"\n variant=\"tertiary\"\n onClick={() => {\n trackUsage('didUsePresetPrompt', {\n promptType: SUGGESTION_TO_PROMPT_TYPE[suggestion],\n });\n\n sendMessage({ text: suggestion });\n }}\n >\n <Typography fontWeight=\"regular\">{suggestion}</Typography>\n </Button>\n ))}\n </Flex>\n </ResponsiveFlex>\n </AnimatedBox>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Errors\n * -----------------------------------------------------------------------------------------------*/\nconst getErrorMessage = (err: Error) => {\n try {\n const error = JSON.parse(err.message);\n return error.error;\n } catch (e) {\n return err;\n }\n};\n\nconst ChatError = () => {\n const { error } = useStrapiChat();\n const { t } = useTranslations();\n\n const defaultErrorMessage = t('chat.messages.error', 'Something went wrong.');\n const tooManyRequestsMessage = t(\n 'chat.messages.too-many-requests',\n 'Too many requests, please try again later.'\n );\n const licenseLimitReachedMessage = t(\n 'chat.messages.license-limit-reached',\n 'License limit reached, please try again tomorrow.'\n );\n const licenseLimitExceededMessage = t(\n 'chat.messages.license-limit-exceeded',\n 'AI credit limit exceeded.'\n );\n const chatTooLongError = t(\n 'chat.messages.too-long-error',\n 'This conversation reached its maximum length. Start a new conversation'\n );\n\n if (!error) return null;\n\n const errorMessage = getErrorMessage(error);\n if (!errorMessage || typeof errorMessage !== 'string') {\n return null;\n }\n\n if (errorMessage === TOO_MANY_REQUESTS_ERROR) {\n return <Alert title={tooManyRequestsMessage} variant=\"warning\" />;\n }\n\n if (errorMessage === LICENSE_LIMIT_REACHED_ERROR) {\n return <Alert title={licenseLimitReachedMessage} variant=\"warning\" />;\n }\n\n if (errorMessage.split('.')[0] === LICENSE_LIMIT_EXCEEDED_ERROR) {\n return <Alert title={licenseLimitExceededMessage} variant=\"danger\" />;\n }\n\n if (errorMessage === CHAT_TOO_LONG_ERROR) {\n return <Alert title={chatTooLongError} variant=\"danger\" />;\n }\n\n return <Alert title={defaultErrorMessage} variant=\"danger\" />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Messages\n * -----------------------------------------------------------------------------------------------*/\nconst ChatContent: React.FC<{\n messages: AIMessage[];\n}> = ({ messages }) => {\n const messageEndRef = useRef<HTMLDivElement>(null);\n const { status } = useStrapiChat();\n\n // Scroll to the bottom of the chat when new messages arrive\n useEffect(() => {\n // Add a small delay to ensure all message content is fully rendered\n // including conditionally rendered elements like feedback buttons\n const scrollTimeout = setTimeout(() => {\n messageEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, 20);\n\n return () => clearTimeout(scrollTimeout);\n }, [messages, status]);\n\n return (\n <>\n <Flex direction=\"column\" gap={5}>\n {messages.map((message) => (\n <ChatMessage key={message.id} message={message} />\n ))}\n {status === 'error' && <ChatError />}\n </Flex>\n <div ref={messageEndRef} />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachments\n * -----------------------------------------------------------------------------------------------*/\nconst ChatAttachmentList = () => {\n const { attachments, removeAttachmentByIndex } = useAttachments();\n\n if (!attachments.length) return null;\n\n return (\n <Input.Attachments>\n {attachments.map((attachment, index) => (\n <Box key={attachment.filename} maxWidth={'250px'}>\n <AttachmentPreview\n attachment={attachment}\n onRemove={() => removeAttachmentByIndex(index)}\n />\n </Box>\n ))}\n </Input.Attachments>\n );\n};\n\nconst ChatAttachmentMenu = () => {\n const { attachFiles } = useAttachments();\n const { openCodeUpload } = useUploadProjectToChat();\n const { openFigmaUpload } = useUploadFigmaToChat();\n const { t } = useTranslations();\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const uploadLabel = t('chat.tooltips.upload-attachments', 'Upload attachments');\n const importCodeText = t('chat.attachments.menu.import-code', 'Import code');\n const attachImageText = t('chat.attachments.menu.attach-image', 'Attach image');\n const importFigmaText = t('chat.attachments.menu.import-figma', 'Import from Figma');\n\n return (\n <SimpleMenu\n label={uploadLabel}\n icon={<Paperclip />}\n tag={IconButton}\n popoverPlacement=\"top-end\"\n >\n <MenuItem startIcon={<Code />} onSelect={() => openCodeUpload()}>\n {importCodeText}\n </MenuItem>\n\n <MenuItem startIcon={<FigmaIcon />} onSelect={() => openFigmaUpload()}>\n {importFigmaText}\n </MenuItem>\n\n <input type=\"file\" accept=\"image/*\" multiple hidden ref={fileInputRef} />\n <MenuItem\n startIcon={<Upload />}\n onSelect={() => {\n const fileInput = fileInputRef.current;\n if (!fileInput) return;\n fileInput.onchange = (e) => {\n const target = e.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n attachFiles(Array.from(target.files));\n }\n };\n\n fileInput.click();\n }}\n >\n {attachImageText}\n </MenuItem>\n </SimpleMenu>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Input\n * -----------------------------------------------------------------------------------------------*/\n\nconst LoadingDots = ({ children }: { children: string }) => {\n const [dots, setDots] = useState('');\n\n useEffect(() => {\n const dotStates = ['', '.', '..', '...'];\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n currentIndex = (currentIndex + 1) % dotStates.length;\n setDots(dotStates[currentIndex]);\n }, 400); // Change every 400ms\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {children}\n {dots}\n </Typography>\n );\n};\n\nconst ChatInput = (props: React.FormHTMLAttributes<HTMLFormElement>) => {\n const { input, handleSubmit, handleInputChange, messages, status, stop, attachments } =\n useStrapiChat();\n const { t } = useTranslations();\n\n const isLoading = status === 'streaming' || status === 'submitted';\n\n return (\n <>\n <form onSubmit={handleSubmit} {...props}>\n <Input.Root isLoading={isLoading} gap={4}>\n <Input.Header minHeight={0}>\n {messages.length === 0 && (\n <Input.HeaderItem>\n <ChatSuggestions />\n </Input.HeaderItem>\n )}\n {isLoading && (\n <Input.HeaderItem>\n <LoadingDots>{t('chat.input.thinking', 'Strapi AI is thinking')}</LoadingDots>\n </Input.HeaderItem>\n )}\n </Input.Header>\n <Input.Content>\n <Dropzone.Area />\n <ChatAttachmentList />\n <Box paddingBottom={3}>\n <ResizableTextArea\n value={input}\n onChange={handleInputChange}\n onSubmit={handleSubmit}\n placeholder={t('chat.input.placeholder', 'Ask Strapi AI...')}\n />\n </Box>\n <Input.Actions>\n <ChatAttachmentMenu />\n\n {isLoading ? (\n <IconButton\n label={t('chat.tooltips.stop-generation', 'Stop')}\n type=\"button\"\n variant=\"default\"\n onClick={(e) => {\n e.preventDefault();\n stop();\n }}\n >\n <StopIcon />\n </IconButton>\n ) : (\n <IconButton\n label={t('chat.tooltips.send-message', 'Send')}\n variant=\"default\"\n type=\"submit\"\n // allow sending an empty message if there are attachments\n disabled={input.trim().length === 0 && attachments.length === 0}\n >\n <ArrowUp />\n </IconButton>\n )}\n </Input.Actions>\n </Input.Content>\n </Input.Root>\n </form>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat\n * -----------------------------------------------------------------------------------------------*/\n\nconst Chat = () => {\n const { title, messages, isChatOpen, isChatEnabled, openChat, closeChat, reset } =\n useStrapiChat();\n const { attachFiles } = useAttachments();\n const { t } = useTranslations();\n const state = useGuidedTour('Chat', (s) => s.state);\n const currentEnvironment = useAppInfo('Chat', (state) => state.currentEnvironment);\n\n // Disable AI Chat in production mode\n const isProduction = currentEnvironment === 'production';\n\n // Auto-open chat when AIChat guided tour step is active\n useEffect(() => {\n const isAIChatStepActive =\n state.enabled &&\n state.tours.contentTypeBuilder?.currentStep === 1 && // AIChat is step 1 in contentTypeBuilderStepsAI\n !state.tours.contentTypeBuilder?.isCompleted;\n\n if (isAIChatStepActive && !isChatOpen && openChat) {\n openChat();\n }\n }, [\n state.tours.contentTypeBuilder?.currentStep,\n state.tours.contentTypeBuilder?.isCompleted,\n state.enabled,\n isChatOpen,\n openChat,\n ]);\n\n // Labels\n const openChatLabel = t('chat.tooltips.open-chat', 'Open chat');\n const closeChatLabel = t('chat.tooltips.close-chat', 'Close chat');\n const createChatLabel = t('chat.tooltips.create-chat', 'New conversation');\n const defaultTitle = t('chat.header.default-title', 'New conversation');\n const mistakesDisclaimer = t(\n 'chat.input.strapi-ai-can-make-errors',\n 'Strapi AI can make mistakes.'\n );\n\n // Don't render the chat at all in production mode or if chat is not enabled\n if (!isChatEnabled || isProduction) {\n return null;\n }\n\n return (\n <Dropzone.Root\n onAddFiles={(files) => {\n attachFiles(files);\n }}\n >\n <Panel.Root\n size=\"md\"\n position=\"bottom-right\"\n isOpen={isChatOpen}\n onToggle={isChatOpen ? closeChat : openChat}\n toggleIcon={\n <IconButton\n onClick={isChatOpen ? closeChat : openChat}\n label={isChatOpen ? closeChatLabel : openChatLabel}\n variant=\"default\"\n size=\"L\"\n >\n <Sparkle />\n </IconButton>\n }\n >\n <Panel.Header>\n <Typography tag=\"h3\" variant=\"omega\" fontWeight=\"bold\">\n {title || defaultTitle}\n </Typography>\n <Flex gap={0}>\n <IconButton label={createChatLabel} variant=\"ghost\" onClick={reset}>\n <Plus />\n </IconButton>\n <Panel.Close label={closeChatLabel} />\n </Flex>\n </Panel.Header>\n\n <Panel.Body>\n <tours.contentTypeBuilder.AIChat>\n {!messages.length ? (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {mistakesDisclaimer}\n </Typography>\n ) : null}\n <ChatContent messages={messages} />\n </tours.contentTypeBuilder.AIChat>\n </Panel.Body>\n\n <Panel.Footer>\n <ChatInput />\n </Panel.Footer>\n </Panel.Root>\n </Dropzone.Root>\n );\n};\n\nexport { Chat };\n"],"names":["ResponsiveFlex","styled","Flex","ChatSuggestions","sendMessage","useStrapiChat","t","useTranslations","trackUsage","useCTBTracking","SUGGESTIONS","SUGGESTION_TO_PROMPT_TYPE","suggestionsTitle","_jsx","AnimatedBox","_jsxs","direction","alignItems","gap","Typography","variant","fontWeight","map","suggestion","Button","startIcon","Sparkle","fill","size","onClick","promptType","text","getErrorMessage","err","error","JSON","parse","message","e","ChatError","defaultErrorMessage","tooManyRequestsMessage","licenseLimitReachedMessage","licenseLimitExceededMessage","chatTooLongError","errorMessage","TOO_MANY_REQUESTS_ERROR","Alert","title","LICENSE_LIMIT_REACHED_ERROR","split","LICENSE_LIMIT_EXCEEDED_ERROR","CHAT_TOO_LONG_ERROR","ChatContent","messages","messageEndRef","useRef","status","useEffect","scrollTimeout","setTimeout","current","scrollIntoView","behavior","clearTimeout","_Fragment","ChatMessage","id","div","ref","ChatAttachmentList","attachments","removeAttachmentByIndex","useAttachments","length","Input","Attachments","attachment","index","Box","maxWidth","AttachmentPreview","onRemove","filename","ChatAttachmentMenu","attachFiles","openCodeUpload","useUploadProjectToChat","openFigmaUpload","useUploadFigmaToChat","fileInputRef","uploadLabel","importCodeText","attachImageText","importFigmaText","SimpleMenu","label","icon","Paperclip","tag","IconButton","popoverPlacement","MenuItem","Code","onSelect","FigmaIcon","input","type","accept","multiple","hidden","Upload","fileInput","onchange","target","files","Array","from","click","LoadingDots","children","dots","setDots","useState","dotStates","currentIndex","interval","setInterval","clearInterval","textColor","ChatInput","props","handleSubmit","handleInputChange","stop","isLoading","form","onSubmit","Root","Header","minHeight","HeaderItem","Content","Dropzone","Area","paddingBottom","ResizableTextArea","value","onChange","placeholder","Actions","preventDefault","StopIcon","disabled","trim","ArrowUp","Chat","isChatOpen","isChatEnabled","openChat","closeChat","reset","state","useGuidedTour","s","currentEnvironment","useAppInfo","isProduction","isAIChatStepActive","enabled","tours","contentTypeBuilder","currentStep","isCompleted","openChatLabel","closeChatLabel","createChatLabel","defaultTitle","mistakesDisclaimer","onAddFiles","Panel","position","isOpen","onToggle","toggleIcon","Plus","Close","Body","AIChat","Footer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA;;AAEkG,qGAClG,MAAMA,cAAAA,GAAiBC,uBAAAA,CAAOC,iBAAAA,CAAK;;;;AAInC,CAAC;AAED,MAAMC,eAAAA,GAAkB,IAAA;IACtB,MAAM,EAAEC,WAAW,EAAE,GAAGC,0BAAAA,EAAAA;IACxB,MAAM,EAAEC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IACd,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;AAEvB,IAAA,MAAMC,WAAAA,GAAc;AAClBJ,QAAAA,CAAAA,CAAE,8BAAA,EAAgC,2BAAA,CAAA;AAClCA,QAAAA,CAAAA,CAAE,yBAAA,EAA2B,wCAAA,CAAA;AAC7BA,QAAAA,CAAAA,CAAE,4BAAA,EAA8B,sBAAA;AACjC,KAAA;AAED,IAAA,MAAMK,yBAAAA,GAA4B;QAChC,CAACL,CAAAA,CAAE,8BAAA,EAAgC,2BAAA,CAAA,GAA+B,yBAAA;QAClE,CAACA,CAAAA,CAAE,yBAAA,EAA2B,wCAAA,CAAA,GAC5B,wCAAA;QACF,CAACA,CAAAA,CAAE,4BAAA,EAA8B,sBAAA,CAAA,GAA0B;AAC7D,KAAA;IAEA,MAAMM,gBAAAA,GAAmBN,EAAE,2BAAA,EAA6B,qBAAA,CAAA;AAExD,IAAA,qBACEO,cAAA,CAACC,uBAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAC,eAAA,CAACf,cAAAA,EAAAA;YAAegB,SAAAA,EAAU,QAAA;YAASC,UAAAA,EAAY,YAAA;YAAcC,GAAAA,EAAK,CAAA;;8BAChEL,cAAA,CAACM,uBAAAA,EAAAA;oBAAWC,OAAAA,EAAQ,OAAA;oBAAQC,UAAAA,EAAW,MAAA;AACpCT,oBAAAA,QAAAA,EAAAA;;8BAEHC,cAAA,CAACX,iBAAAA,EAAAA;oBAAKc,SAAAA,EAAU,QAAA;oBAASC,UAAAA,EAAY,YAAA;oBAAcC,GAAAA,EAAK,CAAA;AACrDR,oBAAAA,QAAAA,EAAAA,WAAAA,CAAYY,GAAG,CAAC,CAACC,UAAAA,iBAChBV,cAAA,CAACW,mBAAAA,EAAAA;AAECC,4BAAAA,SAAAA,gBAAWZ,cAAA,CAACa,aAAAA,EAAAA;gCAAQC,IAAAA,EAAK;;4BACzBC,IAAAA,EAAK,GAAA;4BACLR,OAAAA,EAAQ,UAAA;4BACRS,OAAAA,EAAS,IAAA;AACPrB,gCAAAA,UAAAA,CAAW,oBAAA,EAAsB;oCAC/BsB,UAAAA,EAAYnB,yBAAyB,CAACY,UAAAA;AACxC,iCAAA,CAAA;gCAEAnB,WAAAA,CAAY;oCAAE2B,IAAAA,EAAMR;AAAW,iCAAA,CAAA;AACjC,4BAAA,CAAA;AAEA,4BAAA,QAAA,gBAAAV,cAAA,CAACM,uBAAAA,EAAAA;gCAAWE,UAAAA,EAAW,SAAA;AAAWE,gCAAAA,QAAAA,EAAAA;;AAZ7BA,yBAAAA,EAAAA,UAAAA,CAAAA;;;;;AAmBnB,CAAA;AAEA;;qGAGA,MAAMS,kBAAkB,CAACC,GAAAA,GAAAA;IACvB,IAAI;AACF,QAAA,MAAMC,KAAAA,GAAQC,IAAAA,CAAKC,KAAK,CAACH,IAAII,OAAO,CAAA;AACpC,QAAA,OAAOH,MAAMA,KAAK;AACpB,IAAA,CAAA,CAAE,OAAOI,CAAAA,EAAG;QACV,OAAOL,GAAAA;AACT,IAAA;AACF,CAAA;AAEA,MAAMM,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEL,KAAK,EAAE,GAAG7B,0BAAAA,EAAAA;IAClB,MAAM,EAAEC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IAEd,MAAMiC,mBAAAA,GAAsBlC,EAAE,qBAAA,EAAuB,uBAAA,CAAA;IACrD,MAAMmC,sBAAAA,GAAyBnC,EAC7B,iCAAA,EACA,4CAAA,CAAA;IAEF,MAAMoC,0BAAAA,GAA6BpC,EACjC,qCAAA,EACA,mDAAA,CAAA;IAEF,MAAMqC,2BAAAA,GAA8BrC,EAClC,sCAAA,EACA,2BAAA,CAAA;IAEF,MAAMsC,gBAAAA,GAAmBtC,EACvB,8BAAA,EACA,wEAAA,CAAA;IAGF,IAAI,CAAC4B,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAMW,eAAeb,eAAAA,CAAgBE,KAAAA,CAAAA;AACrC,IAAA,IAAI,CAACW,YAAAA,IAAgB,OAAOA,YAAAA,KAAiB,QAAA,EAAU;QACrD,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAIA,iBAAiBC,kCAAAA,EAAyB;AAC5C,QAAA,qBAAOjC,cAAA,CAACkC,WAAAA,EAAAA;YAAMC,KAAAA,EAAOP,sBAAAA;YAAwBrB,OAAAA,EAAQ;;AACvD,IAAA;AAEA,IAAA,IAAIyB,iBAAiBI,sCAAAA,EAA6B;AAChD,QAAA,qBAAOpC,cAAA,CAACkC,WAAAA,EAAAA;YAAMC,KAAAA,EAAON,0BAAAA;YAA4BtB,OAAAA,EAAQ;;AAC3D,IAAA;AAEA,IAAA,IAAIyB,aAAaK,KAAK,CAAC,IAAI,CAAC,CAAA,CAAE,KAAKC,uCAAAA,EAA8B;AAC/D,QAAA,qBAAOtC,cAAA,CAACkC,WAAAA,EAAAA;YAAMC,KAAAA,EAAOL,2BAAAA;YAA6BvB,OAAAA,EAAQ;;AAC5D,IAAA;AAEA,IAAA,IAAIyB,iBAAiBO,8BAAAA,EAAqB;AACxC,QAAA,qBAAOvC,cAAA,CAACkC,WAAAA,EAAAA;YAAMC,KAAAA,EAAOJ,gBAAAA;YAAkBxB,OAAAA,EAAQ;;AACjD,IAAA;AAEA,IAAA,qBAAOP,cAAA,CAACkC,WAAAA,EAAAA;QAAMC,KAAAA,EAAOR,mBAAAA;QAAqBpB,OAAAA,EAAQ;;AACpD,CAAA;AAEA;;AAEkG,qGAClG,MAAMiC,WAAAA,GAED,CAAC,EAAEC,QAAQ,EAAE,GAAA;AAChB,IAAA,MAAMC,gBAAgBC,YAAAA,CAAuB,IAAA,CAAA;IAC7C,MAAM,EAAEC,MAAM,EAAE,GAAGpD,0BAAAA,EAAAA;;IAGnBqD,eAAAA,CAAU,IAAA;;;AAGR,QAAA,MAAMC,gBAAgBC,UAAAA,CAAW,IAAA;YAC/BL,aAAAA,CAAcM,OAAO,EAAEC,cAAAA,CAAe;gBAAEC,QAAAA,EAAU;AAAS,aAAA,CAAA;QAC7D,CAAA,EAAG,EAAA,CAAA;AAEH,QAAA,OAAO,IAAMC,YAAAA,CAAaL,aAAAA,CAAAA;IAC5B,CAAA,EAAG;AAACL,QAAAA,QAAAA;AAAUG,QAAAA;AAAO,KAAA,CAAA;IAErB,qBACE1C,eAAA,CAAAkD,mBAAA,EAAA;;0BACElD,eAAA,CAACb,iBAAAA,EAAAA;gBAAKc,SAAAA,EAAU,QAAA;gBAASE,GAAAA,EAAK,CAAA;;AAC3BoC,oBAAAA,QAAAA,CAAShC,GAAG,CAAC,CAACe,OAAAA,iBACbxB,cAAA,CAACqD,mBAAAA,EAAAA;4BAA6B7B,OAAAA,EAASA;AAArBA,yBAAAA,EAAAA,OAAAA,CAAQ8B,EAAE,CAAA,CAAA;AAE7BV,oBAAAA,MAAAA,KAAW,yBAAW5C,cAAA,CAAC0B,SAAAA,EAAAA,EAAAA;;;0BAE1B1B,cAAA,CAACuD,KAAAA,EAAAA;gBAAIC,GAAAA,EAAKd;;;;AAGhB,CAAA;AAEA;;AAEkG,qGAClG,MAAMe,kBAAAA,GAAqB,IAAA;AACzB,IAAA,MAAM,EAAEC,WAAW,EAAEC,uBAAuB,EAAE,GAAGC,6BAAAA,EAAAA;AAEjD,IAAA,IAAI,CAACF,WAAAA,CAAYG,MAAM,EAAE,OAAO,IAAA;IAEhC,qBACE7D,cAAA,CAAC8D,YAAMC,WAAW,EAAA;AACfL,QAAAA,QAAAA,EAAAA,WAAAA,CAAYjD,GAAG,CAAC,CAACuD,UAAAA,EAAYC,sBAC5BjE,cAAA,CAACkE,gBAAAA,EAAAA;gBAA8BC,QAAAA,EAAU,OAAA;AACvC,gBAAA,QAAA,gBAAAnE,cAAA,CAACoE,mCAAAA,EAAAA;oBACCJ,UAAAA,EAAYA,UAAAA;AACZK,oBAAAA,QAAAA,EAAU,IAAMV,uBAAAA,CAAwBM,KAAAA;;AAHlCD,aAAAA,EAAAA,UAAAA,CAAWM,QAAQ,CAAA;;AASrC,CAAA;AAEA,MAAMC,kBAAAA,GAAqB,IAAA;IACzB,MAAM,EAAEC,WAAW,EAAE,GAAGZ,6BAAAA,EAAAA;IACxB,MAAM,EAAEa,cAAc,EAAE,GAAGC,sCAAAA,EAAAA;IAC3B,MAAM,EAAEC,eAAe,EAAE,GAAGC,qCAAAA,EAAAA;IAC5B,MAAM,EAAEnF,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;AAEd,IAAA,MAAMmF,eAAelC,YAAAA,CAAyB,IAAA,CAAA;IAE9C,MAAMmC,WAAAA,GAAcrF,EAAE,kCAAA,EAAoC,oBAAA,CAAA;IAC1D,MAAMsF,cAAAA,GAAiBtF,EAAE,mCAAA,EAAqC,aAAA,CAAA;IAC9D,MAAMuF,eAAAA,GAAkBvF,EAAE,oCAAA,EAAsC,cAAA,CAAA;IAChE,MAAMwF,eAAAA,GAAkBxF,EAAE,oCAAA,EAAsC,mBAAA,CAAA;AAEhE,IAAA,qBACES,eAAA,CAACgF,qBAAAA,EAAAA;QACCC,KAAAA,EAAOL,WAAAA;AACPM,QAAAA,IAAAA,gBAAMpF,cAAA,CAACqF,eAAAA,EAAAA,EAAAA,CAAAA;QACPC,GAAAA,EAAKC,uBAAAA;QACLC,gBAAAA,EAAiB,SAAA;;0BAEjBxF,cAAA,CAACyF,mBAAAA,EAAAA;AAAS7E,gBAAAA,SAAAA,gBAAWZ,cAAA,CAAC0F,UAAAA,EAAAA,EAAAA,CAAAA;AAASC,gBAAAA,QAAAA,EAAU,IAAMlB,cAAAA,EAAAA;AAC5CM,gBAAAA,QAAAA,EAAAA;;0BAGH/E,cAAA,CAACyF,mBAAAA,EAAAA;AAAS7E,gBAAAA,SAAAA,gBAAWZ,cAAA,CAAC4F,mBAAAA,EAAAA,EAAAA,CAAAA;AAAcD,gBAAAA,QAAAA,EAAU,IAAMhB,eAAAA,EAAAA;AACjDM,gBAAAA,QAAAA,EAAAA;;0BAGHjF,cAAA,CAAC6F,OAAAA,EAAAA;gBAAMC,IAAAA,EAAK,MAAA;gBAAOC,MAAAA,EAAO,SAAA;gBAAUC,QAAQ,EAAA,IAAA;gBAACC,MAAM,EAAA,IAAA;gBAACzC,GAAAA,EAAKqB;;0BACzD7E,cAAA,CAACyF,mBAAAA,EAAAA;AACC7E,gBAAAA,SAAAA,gBAAWZ,cAAA,CAACkG,YAAAA,EAAAA,EAAAA,CAAAA;gBACZP,QAAAA,EAAU,IAAA;oBACR,MAAMQ,SAAAA,GAAYtB,aAAa7B,OAAO;AACtC,oBAAA,IAAI,CAACmD,SAAAA,EAAW;oBAChBA,SAAAA,CAAUC,QAAQ,GAAG,CAAC3E,CAAAA,GAAAA;wBACpB,MAAM4E,MAAAA,GAAS5E,EAAE4E,MAAM;wBACvB,IAAIA,MAAAA,CAAOC,KAAK,IAAID,MAAAA,CAAOC,KAAK,CAACzC,MAAM,GAAG,CAAA,EAAG;AAC3CW,4BAAAA,WAAAA,CAAY+B,KAAAA,CAAMC,IAAI,CAACH,MAAAA,CAAOC,KAAK,CAAA,CAAA;AACrC,wBAAA;AACF,oBAAA,CAAA;AAEAH,oBAAAA,SAAAA,CAAUM,KAAK,EAAA;AACjB,gBAAA,CAAA;AAECzB,gBAAAA,QAAAA,EAAAA;;;;AAIT,CAAA;AAEA;;AAEkG,qGAElG,MAAM0B,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAwB,GAAA;AACrD,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,cAAAA,CAAS,EAAA,CAAA;IAEjCjE,eAAAA,CAAU,IAAA;AACR,QAAA,MAAMkE,SAAAA,GAAY;AAAC,YAAA,EAAA;AAAI,YAAA,GAAA;AAAK,YAAA,IAAA;AAAM,YAAA;AAAM,SAAA;AACxC,QAAA,IAAIC,YAAAA,GAAe,CAAA;AAEnB,QAAA,MAAMC,WAAWC,WAAAA,CAAY,IAAA;AAC3BF,YAAAA,YAAAA,GAAe,CAACA,YAAAA,GAAe,CAAA,IAAKD,UAAUlD,MAAM;YACpDgD,OAAAA,CAAQE,SAAS,CAACC,YAAAA,CAAa,CAAA;AACjC,QAAA,CAAA,EAAG;AAEH,QAAA,OAAO,IAAMG,aAAAA,CAAcF,QAAAA,CAAAA;AAC7B,IAAA,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,qBACE/G,eAAA,CAACI,uBAAAA,EAAAA;QAAWC,OAAAA,EAAQ,IAAA;QAAK6G,SAAAA,EAAU,YAAA;;AAChCT,YAAAA,QAAAA;AACAC,YAAAA;;;AAGP,CAAA;AAEA,MAAMS,YAAY,CAACC,KAAAA,GAAAA;AACjB,IAAA,MAAM,EAAEzB,KAAK,EAAE0B,YAAY,EAAEC,iBAAiB,EAAE/E,QAAQ,EAAEG,MAAM,EAAE6E,IAAI,EAAE/D,WAAW,EAAE,GACnFlE,0BAAAA,EAAAA;IACF,MAAM,EAAEC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IAEd,MAAMgI,SAAAA,GAAY9E,MAAAA,KAAW,WAAA,IAAeA,MAAAA,KAAW,WAAA;IAEvD,qBACE5C,cAAA,CAAAoD,mBAAA,EAAA;AACE,QAAA,QAAA,gBAAApD,cAAA,CAAC2H,MAAAA,EAAAA;YAAKC,QAAAA,EAAUL,YAAAA;AAAe,YAAA,GAAGD,KAAK;oCACrCpH,eAAA,CAAC4D,YAAM+D,IAAI,EAAA;gBAACH,SAAAA,EAAWA,SAAAA;gBAAWrH,GAAAA,EAAK,CAAA;;AACrC,kCAAAH,eAAA,CAAC4D,YAAMgE,MAAM,EAAA;wBAACC,SAAAA,EAAW,CAAA;;AACtBtF,4BAAAA,QAAAA,CAASoB,MAAM,KAAK,CAAA,kBACnB7D,cAAA,CAAC8D,YAAMkE,UAAU,EAAA;AACf,gCAAA,QAAA,gBAAAhI,cAAA,CAACV,eAAAA,EAAAA,EAAAA;;4BAGJoI,SAAAA,kBACC1H,cAAA,CAAC8D,YAAMkE,UAAU,EAAA;AACf,gCAAA,QAAA,gBAAAhI,cAAA,CAAC0G,WAAAA,EAAAA;AAAajH,oCAAAA,QAAAA,EAAAA,CAAAA,CAAE,qBAAA,EAAuB,uBAAA;;;;;AAI7C,kCAAAS,eAAA,CAAC4D,YAAMmE,OAAO,EAAA;;AACZ,0CAAAjI,cAAA,CAACkI,kBAASC,IAAI,EAAA,EAAA,CAAA;0CACdnI,cAAA,CAACyD,kBAAAA,EAAAA,EAAAA,CAAAA;0CACDzD,cAAA,CAACkE,gBAAAA,EAAAA;gCAAIkE,aAAAA,EAAe,CAAA;AAClB,gCAAA,QAAA,gBAAApI,cAAA,CAACqI,mCAAAA,EAAAA;oCACCC,KAAAA,EAAOzC,KAAAA;oCACP0C,QAAAA,EAAUf,iBAAAA;oCACVI,QAAAA,EAAUL,YAAAA;AACViB,oCAAAA,WAAAA,EAAa/I,EAAE,wBAAA,EAA0B,kBAAA;;;AAG7C,0CAAAS,eAAA,CAAC4D,YAAM2E,OAAO,EAAA;;kDACZzI,cAAA,CAACuE,kBAAAA,EAAAA,EAAAA,CAAAA;AAEAmD,oCAAAA,SAAAA,iBACC1H,cAAA,CAACuF,uBAAAA,EAAAA;AACCJ,wCAAAA,KAAAA,EAAO1F,EAAE,+BAAA,EAAiC,MAAA,CAAA;wCAC1CqG,IAAAA,EAAK,QAAA;wCACLvF,OAAAA,EAAQ,SAAA;AACRS,wCAAAA,OAAAA,EAAS,CAACS,CAAAA,GAAAA;AACRA,4CAAAA,CAAAA,CAAEiH,cAAc,EAAA;AAChBjB,4CAAAA,IAAAA,EAAAA;AACF,wCAAA,CAAA;AAEA,wCAAA,QAAA,gBAAAzH,cAAA,CAAC2I,iBAAAA,EAAAA,EAAAA;uDAGH3I,cAAA,CAACuF,uBAAAA,EAAAA;AACCJ,wCAAAA,KAAAA,EAAO1F,EAAE,4BAAA,EAA8B,MAAA,CAAA;wCACvCc,OAAAA,EAAQ,SAAA;wCACRuF,IAAAA,EAAK,QAAA;;wCAEL8C,QAAAA,EAAU/C,KAAAA,CAAMgD,IAAI,EAAA,CAAGhF,MAAM,KAAK,CAAA,IAAKH,WAAAA,CAAYG,MAAM,KAAK,CAAA;AAE9D,wCAAA,QAAA,gBAAA7D,cAAA,CAAC8I,aAAAA,EAAAA,EAAAA;;;;;;;;;;AASnB,CAAA;AAEA;;AAEkG,2GAE5FC,IAAAA,GAAO,IAAA;AACX,IAAA,MAAM,EAAE5G,KAAK,EAAEM,QAAQ,EAAEuG,UAAU,EAAEC,aAAa,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAC9E5J,0BAAAA,EAAAA;IACF,MAAM,EAAEgF,WAAW,EAAE,GAAGZ,6BAAAA,EAAAA;IACxB,MAAM,EAAEnE,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;AACd,IAAA,MAAM2J,QAAQC,yBAAAA,CAAc,MAAA,EAAQ,CAACC,CAAAA,GAAMA,EAAEF,KAAK,CAAA;AAClD,IAAA,MAAMG,qBAAqBC,sBAAAA,CAAW,MAAA,EAAQ,CAACJ,KAAAA,GAAUA,MAAMG,kBAAkB,CAAA;;AAGjF,IAAA,MAAME,eAAeF,kBAAAA,KAAuB,YAAA;;IAG5C3G,eAAAA,CAAU,IAAA;QACR,MAAM8G,kBAAAA,GACJN,KAAAA,CAAMO,OAAO,IACbP,KAAAA,CAAMQ,KAAK,CAACC,kBAAkB,EAAEC,WAAAA,KAAgB,CAAA;AAChD,QAAA,CAACV,KAAAA,CAAMQ,KAAK,CAACC,kBAAkB,EAAEE,WAAAA;QAEnC,IAAIL,kBAAAA,IAAsB,CAACX,UAAAA,IAAcE,QAAAA,EAAU;AACjDA,YAAAA,QAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;QACDG,KAAAA,CAAMQ,KAAK,CAACC,kBAAkB,EAAEC,WAAAA;QAChCV,KAAAA,CAAMQ,KAAK,CAACC,kBAAkB,EAAEE,WAAAA;AAChCX,QAAAA,KAAAA,CAAMO,OAAO;AACbZ,QAAAA,UAAAA;AACAE,QAAAA;AACD,KAAA,CAAA;;IAGD,MAAMe,aAAAA,GAAgBxK,EAAE,yBAAA,EAA2B,WAAA,CAAA;IACnD,MAAMyK,cAAAA,GAAiBzK,EAAE,0BAAA,EAA4B,YAAA,CAAA;IACrD,MAAM0K,eAAAA,GAAkB1K,EAAE,2BAAA,EAA6B,kBAAA,CAAA;IACvD,MAAM2K,YAAAA,GAAe3K,EAAE,2BAAA,EAA6B,kBAAA,CAAA;IACpD,MAAM4K,kBAAAA,GAAqB5K,EACzB,sCAAA,EACA,8BAAA,CAAA;;IAIF,IAAI,CAACwJ,iBAAiBS,YAAAA,EAAc;QAClC,OAAO,IAAA;AACT,IAAA;IAEA,qBACE1J,cAAA,CAACkI,kBAASL,IAAI,EAAA;AACZyC,QAAAA,UAAAA,EAAY,CAAChE,KAAAA,GAAAA;YACX9B,WAAAA,CAAY8B,KAAAA,CAAAA;AACd,QAAA,CAAA;gCAEApG,eAAA,CAACqK,oBAAM1C,IAAI,EAAA;YACT9G,IAAAA,EAAK,IAAA;YACLyJ,QAAAA,EAAS,cAAA;YACTC,MAAAA,EAAQzB,UAAAA;AACR0B,YAAAA,QAAAA,EAAU1B,aAAaG,SAAAA,GAAYD,QAAAA;AACnCyB,YAAAA,UAAAA,gBACE3K,cAAA,CAACuF,uBAAAA,EAAAA;AACCvE,gBAAAA,OAAAA,EAASgI,aAAaG,SAAAA,GAAYD,QAAAA;AAClC/D,gBAAAA,KAAAA,EAAO6D,aAAakB,cAAAA,GAAiBD,aAAAA;gBACrC1J,OAAAA,EAAQ,SAAA;gBACRQ,IAAAA,EAAK,GAAA;AAEL,gBAAA,QAAA,gBAAAf,cAAA,CAACa,aAAAA,EAAAA,EAAAA;;;AAIL,8BAAAX,eAAA,CAACqK,oBAAMzC,MAAM,EAAA;;sCACX9H,cAAA,CAACM,uBAAAA,EAAAA;4BAAWgF,GAAAA,EAAI,IAAA;4BAAK/E,OAAAA,EAAQ,OAAA;4BAAQC,UAAAA,EAAW,MAAA;sCAC7C2B,KAAAA,IAASiI;;sCAEZlK,eAAA,CAACb,iBAAAA,EAAAA;4BAAKgB,GAAAA,EAAK,CAAA;;8CACTL,cAAA,CAACuF,uBAAAA,EAAAA;oCAAWJ,KAAAA,EAAOgF,eAAAA;oCAAiB5J,OAAAA,EAAQ,OAAA;oCAAQS,OAAAA,EAASoI,KAAAA;AAC3D,oCAAA,QAAA,gBAAApJ,cAAA,CAAC4K,UAAAA,EAAAA,EAAAA;;AAEH,8CAAA5K,cAAA,CAACuK,oBAAMM,KAAK,EAAA;oCAAC1F,KAAAA,EAAO+E;;;;;;AAIxB,8BAAAlK,cAAA,CAACuK,oBAAMO,IAAI,EAAA;AACT,oBAAA,QAAA,gBAAA5K,eAAA,CAAC2J,iBAAAA,CAAMC,kBAAkB,CAACiB,MAAM,EAAA;;4BAC7B,CAACtI,QAAAA,CAASoB,MAAM,iBACf7D,cAAA,CAACM,uBAAAA,EAAAA;gCAAWC,OAAAA,EAAQ,IAAA;gCAAK6G,SAAAA,EAAU,YAAA;AAChCiD,gCAAAA,QAAAA,EAAAA;AAED,6BAAA,CAAA,GAAA,IAAA;0CACJrK,cAAA,CAACwC,WAAAA,EAAAA;gCAAYC,QAAAA,EAAUA;;;;;AAI3B,8BAAAzC,cAAA,CAACuK,oBAAMS,MAAM,EAAA;AACX,oBAAA,QAAA,gBAAAhL,cAAA,CAACqH,SAAAA,EAAAA,EAAAA;;;;;AAKX;;;;"}
|
|
@@ -162,10 +162,8 @@ const ChatError = ()=>{
|
|
|
162
162
|
direction: "column",
|
|
163
163
|
gap: 5,
|
|
164
164
|
children: [
|
|
165
|
-
messages.map((message
|
|
166
|
-
message: message
|
|
167
|
-
// Chat loading and message is the last one
|
|
168
|
-
isLoading: (status === 'streaming' || status === 'submitted') && idx === messages.length - 1
|
|
165
|
+
messages.map((message)=>/*#__PURE__*/ jsx(ChatMessage, {
|
|
166
|
+
message: message
|
|
169
167
|
}, message.id)),
|
|
170
168
|
status === 'error' && /*#__PURE__*/ jsx(ChatError, {})
|
|
171
169
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.mjs","sources":["../../../../admin/src/components/AIChat/Chat.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { tours, useGuidedTour, useAppInfo } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton, Button, Typography, Box } from '@strapi/design-system';\nimport { Sparkle, ArrowUp, Plus, Paperclip, Upload, Code } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { useCTBTracking } from '../CTBSession/ctbSession';\n\nimport { Alert } from './components/Alert';\nimport { AnimatedBox } from './components/AnimatedBox';\nimport { AttachmentPreview } from './components/Attachments/AttachmentPreview';\nimport { Dropzone } from './components/Dropzone';\nimport { Panel } from './components/FloatingPanel';\nimport { FigmaIcon } from './components/icons/FigmaIcon';\nimport { StopIcon } from './components/icons/StopIcon';\nimport { Input } from './components/Input';\nimport { ChatMessage } from './components/Messages/Message';\nimport { ResizableTextArea } from './components/ResizableTextArea';\nimport { MenuItem, SimpleMenu } from './components/SimpleMenu';\nimport {\n CHAT_TOO_LONG_ERROR,\n LICENSE_LIMIT_REACHED_ERROR,\n TOO_MANY_REQUESTS_ERROR,\n LICENSE_LIMIT_EXCEEDED_ERROR,\n} from './hooks/useAIFetch';\nimport { useAttachments } from './hooks/useAttachments';\nimport { useTranslations } from './hooks/useTranslations';\nimport { AIMessage } from './lib/types/messages';\nimport { useStrapiChat } from './providers/ChatProvider';\nimport { useUploadProjectToChat } from './UploadCodeModal';\nimport { useUploadFigmaToChat } from './UploadFigmaModal';\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Message Suggestions\n * -----------------------------------------------------------------------------------------------*/\nconst ResponsiveFlex = styled(Flex)`\n @media (max-height: 500px) {\n display: none;\n }\n`;\n\nconst ChatSuggestions = () => {\n const { sendMessage } = useStrapiChat();\n const { t } = useTranslations();\n const { trackUsage } = useCTBTracking();\n\n const SUGGESTIONS = [\n t('chat.input.defaults.generate', 'Generate a product schema'),\n t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder'),\n t('chat.input.defaults.strapi', 'Tell me about Strapi'),\n ] as const;\n\n const SUGGESTION_TO_PROMPT_TYPE = {\n [t('chat.input.defaults.generate', 'Generate a product schema')]: 'generate-product-schema',\n [t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder')]:\n 'tell-me-about-the-content-type-builder',\n [t('chat.input.defaults.strapi', 'Tell me about Strapi')]: 'tell-me-about-strapi',\n } as const;\n\n const suggestionsTitle = t('chat.input.defaults.title', 'How can I help you?');\n\n return (\n <AnimatedBox>\n <ResponsiveFlex direction=\"column\" alignItems={'flex-start'} gap={3}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {suggestionsTitle}\n </Typography>\n <Flex direction=\"column\" alignItems={'flex-start'} gap={2}>\n {SUGGESTIONS.map((suggestion) => (\n <Button\n key={suggestion}\n startIcon={<Sparkle fill=\"neutral500\" />}\n size=\"M\"\n variant=\"tertiary\"\n onClick={() => {\n trackUsage('didUsePresetPrompt', {\n promptType: SUGGESTION_TO_PROMPT_TYPE[suggestion],\n });\n\n sendMessage({ text: suggestion });\n }}\n >\n <Typography fontWeight=\"regular\">{suggestion}</Typography>\n </Button>\n ))}\n </Flex>\n </ResponsiveFlex>\n </AnimatedBox>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Errors\n * -----------------------------------------------------------------------------------------------*/\nconst getErrorMessage = (err: Error) => {\n try {\n const error = JSON.parse(err.message);\n return error.error;\n } catch (e) {\n return err;\n }\n};\n\nconst ChatError = () => {\n const { error } = useStrapiChat();\n const { t } = useTranslations();\n\n const defaultErrorMessage = t('chat.messages.error', 'Something went wrong.');\n const tooManyRequestsMessage = t(\n 'chat.messages.too-many-requests',\n 'Too many requests, please try again later.'\n );\n const licenseLimitReachedMessage = t(\n 'chat.messages.license-limit-reached',\n 'License limit reached, please try again tomorrow.'\n );\n const licenseLimitExceededMessage = t(\n 'chat.messages.license-limit-exceeded',\n 'AI credit limit exceeded.'\n );\n const chatTooLongError = t(\n 'chat.messages.too-long-error',\n 'This conversation reached its maximum length. Start a new conversation'\n );\n\n if (!error) return null;\n\n const errorMessage = getErrorMessage(error);\n if (!errorMessage || typeof errorMessage !== 'string') {\n return null;\n }\n\n if (errorMessage === TOO_MANY_REQUESTS_ERROR) {\n return <Alert title={tooManyRequestsMessage} variant=\"warning\" />;\n }\n\n if (errorMessage === LICENSE_LIMIT_REACHED_ERROR) {\n return <Alert title={licenseLimitReachedMessage} variant=\"warning\" />;\n }\n\n if (errorMessage.split('.')[0] === LICENSE_LIMIT_EXCEEDED_ERROR) {\n return <Alert title={licenseLimitExceededMessage} variant=\"danger\" />;\n }\n\n if (errorMessage === CHAT_TOO_LONG_ERROR) {\n return <Alert title={chatTooLongError} variant=\"danger\" />;\n }\n\n return <Alert title={defaultErrorMessage} variant=\"danger\" />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Messages\n * -----------------------------------------------------------------------------------------------*/\nconst ChatContent: React.FC<{\n messages: AIMessage[];\n}> = ({ messages }) => {\n const messageEndRef = useRef<HTMLDivElement>(null);\n const { status } = useStrapiChat();\n\n // Scroll to the bottom of the chat when new messages arrive\n useEffect(() => {\n // Add a small delay to ensure all message content is fully rendered\n // including conditionally rendered elements like feedback buttons\n const scrollTimeout = setTimeout(() => {\n messageEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, 20);\n\n return () => clearTimeout(scrollTimeout);\n }, [messages, status]);\n\n return (\n <>\n <Flex direction=\"column\" gap={5}>\n {messages.map((message, idx) => (\n <ChatMessage\n key={message.id}\n message={message}\n // Chat loading and message is the last one\n isLoading={\n (status === 'streaming' || status === 'submitted') && idx === messages.length - 1\n }\n />\n ))}\n {status === 'error' && <ChatError />}\n </Flex>\n <div ref={messageEndRef} />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachments\n * -----------------------------------------------------------------------------------------------*/\nconst ChatAttachmentList = () => {\n const { attachments, removeAttachmentByIndex } = useAttachments();\n\n if (!attachments.length) return null;\n\n return (\n <Input.Attachments>\n {attachments.map((attachment, index) => (\n <Box key={attachment.filename} maxWidth={'250px'}>\n <AttachmentPreview\n attachment={attachment}\n onRemove={() => removeAttachmentByIndex(index)}\n />\n </Box>\n ))}\n </Input.Attachments>\n );\n};\n\nconst ChatAttachmentMenu = () => {\n const { attachFiles } = useAttachments();\n const { openCodeUpload } = useUploadProjectToChat();\n const { openFigmaUpload } = useUploadFigmaToChat();\n const { t } = useTranslations();\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const uploadLabel = t('chat.tooltips.upload-attachments', 'Upload attachments');\n const importCodeText = t('chat.attachments.menu.import-code', 'Import code');\n const attachImageText = t('chat.attachments.menu.attach-image', 'Attach image');\n const importFigmaText = t('chat.attachments.menu.import-figma', 'Import from Figma');\n\n return (\n <SimpleMenu\n label={uploadLabel}\n icon={<Paperclip />}\n tag={IconButton}\n popoverPlacement=\"top-end\"\n >\n <MenuItem startIcon={<Code />} onSelect={() => openCodeUpload()}>\n {importCodeText}\n </MenuItem>\n\n <MenuItem startIcon={<FigmaIcon />} onSelect={() => openFigmaUpload()}>\n {importFigmaText}\n </MenuItem>\n\n <input type=\"file\" accept=\"image/*\" multiple hidden ref={fileInputRef} />\n <MenuItem\n startIcon={<Upload />}\n onSelect={() => {\n const fileInput = fileInputRef.current;\n if (!fileInput) return;\n fileInput.onchange = (e) => {\n const target = e.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n attachFiles(Array.from(target.files));\n }\n };\n\n fileInput.click();\n }}\n >\n {attachImageText}\n </MenuItem>\n </SimpleMenu>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Input\n * -----------------------------------------------------------------------------------------------*/\n\nconst LoadingDots = ({ children }: { children: string }) => {\n const [dots, setDots] = useState('');\n\n useEffect(() => {\n const dotStates = ['', '.', '..', '...'];\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n currentIndex = (currentIndex + 1) % dotStates.length;\n setDots(dotStates[currentIndex]);\n }, 400); // Change every 400ms\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {children}\n {dots}\n </Typography>\n );\n};\n\nconst ChatInput = (props: React.FormHTMLAttributes<HTMLFormElement>) => {\n const { input, handleSubmit, handleInputChange, messages, status, stop, attachments } =\n useStrapiChat();\n const { t } = useTranslations();\n\n const isLoading = status === 'streaming' || status === 'submitted';\n\n return (\n <>\n <form onSubmit={handleSubmit} {...props}>\n <Input.Root isLoading={isLoading} gap={4}>\n <Input.Header minHeight={0}>\n {messages.length === 0 && (\n <Input.HeaderItem>\n <ChatSuggestions />\n </Input.HeaderItem>\n )}\n {isLoading && (\n <Input.HeaderItem>\n <LoadingDots>{t('chat.input.thinking', 'Strapi AI is thinking')}</LoadingDots>\n </Input.HeaderItem>\n )}\n </Input.Header>\n <Input.Content>\n <Dropzone.Area />\n <ChatAttachmentList />\n <Box paddingBottom={3}>\n <ResizableTextArea\n value={input}\n onChange={handleInputChange}\n onSubmit={handleSubmit}\n placeholder={t('chat.input.placeholder', 'Ask Strapi AI...')}\n />\n </Box>\n <Input.Actions>\n <ChatAttachmentMenu />\n\n {isLoading ? (\n <IconButton\n label={t('chat.tooltips.stop-generation', 'Stop')}\n type=\"button\"\n variant=\"default\"\n onClick={(e) => {\n e.preventDefault();\n stop();\n }}\n >\n <StopIcon />\n </IconButton>\n ) : (\n <IconButton\n label={t('chat.tooltips.send-message', 'Send')}\n variant=\"default\"\n type=\"submit\"\n // allow sending an empty message if there are attachments\n disabled={input.trim().length === 0 && attachments.length === 0}\n >\n <ArrowUp />\n </IconButton>\n )}\n </Input.Actions>\n </Input.Content>\n </Input.Root>\n </form>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat\n * -----------------------------------------------------------------------------------------------*/\n\nconst Chat = () => {\n const { title, messages, isChatOpen, isChatEnabled, openChat, closeChat, reset } =\n useStrapiChat();\n const { attachFiles } = useAttachments();\n const { t } = useTranslations();\n const state = useGuidedTour('Chat', (s) => s.state);\n const currentEnvironment = useAppInfo('Chat', (state) => state.currentEnvironment);\n\n // Disable AI Chat in production mode\n const isProduction = currentEnvironment === 'production';\n\n // Auto-open chat when AIChat guided tour step is active\n useEffect(() => {\n const isAIChatStepActive =\n state.enabled &&\n state.tours.contentTypeBuilder?.currentStep === 1 && // AIChat is step 1 in contentTypeBuilderStepsAI\n !state.tours.contentTypeBuilder?.isCompleted;\n\n if (isAIChatStepActive && !isChatOpen && openChat) {\n openChat();\n }\n }, [\n state.tours.contentTypeBuilder?.currentStep,\n state.tours.contentTypeBuilder?.isCompleted,\n state.enabled,\n isChatOpen,\n openChat,\n ]);\n\n // Labels\n const openChatLabel = t('chat.tooltips.open-chat', 'Open chat');\n const closeChatLabel = t('chat.tooltips.close-chat', 'Close chat');\n const createChatLabel = t('chat.tooltips.create-chat', 'New conversation');\n const defaultTitle = t('chat.header.default-title', 'New conversation');\n const mistakesDisclaimer = t(\n 'chat.input.strapi-ai-can-make-errors',\n 'Strapi AI can make mistakes.'\n );\n\n // Don't render the chat at all in production mode or if chat is not enabled\n if (!isChatEnabled || isProduction) {\n return null;\n }\n\n return (\n <Dropzone.Root\n onAddFiles={(files) => {\n attachFiles(files);\n }}\n >\n <Panel.Root\n size=\"md\"\n position=\"bottom-right\"\n isOpen={isChatOpen}\n onToggle={isChatOpen ? closeChat : openChat}\n toggleIcon={\n <IconButton\n onClick={isChatOpen ? closeChat : openChat}\n label={isChatOpen ? closeChatLabel : openChatLabel}\n variant=\"default\"\n size=\"L\"\n >\n <Sparkle />\n </IconButton>\n }\n >\n <Panel.Header>\n <Typography tag=\"h3\" variant=\"omega\" fontWeight=\"bold\">\n {title || defaultTitle}\n </Typography>\n <Flex gap={0}>\n <IconButton label={createChatLabel} variant=\"ghost\" onClick={reset}>\n <Plus />\n </IconButton>\n <Panel.Close label={closeChatLabel} />\n </Flex>\n </Panel.Header>\n\n <Panel.Body>\n <tours.contentTypeBuilder.AIChat>\n {!messages.length ? (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {mistakesDisclaimer}\n </Typography>\n ) : null}\n <ChatContent messages={messages} />\n </tours.contentTypeBuilder.AIChat>\n </Panel.Body>\n\n <Panel.Footer>\n <ChatInput />\n </Panel.Footer>\n </Panel.Root>\n </Dropzone.Root>\n );\n};\n\nexport { Chat };\n"],"names":["ResponsiveFlex","styled","Flex","ChatSuggestions","sendMessage","useStrapiChat","t","useTranslations","trackUsage","useCTBTracking","SUGGESTIONS","SUGGESTION_TO_PROMPT_TYPE","suggestionsTitle","_jsx","AnimatedBox","_jsxs","direction","alignItems","gap","Typography","variant","fontWeight","map","suggestion","Button","startIcon","Sparkle","fill","size","onClick","promptType","text","getErrorMessage","err","error","JSON","parse","message","e","ChatError","defaultErrorMessage","tooManyRequestsMessage","licenseLimitReachedMessage","licenseLimitExceededMessage","chatTooLongError","errorMessage","TOO_MANY_REQUESTS_ERROR","Alert","title","LICENSE_LIMIT_REACHED_ERROR","split","LICENSE_LIMIT_EXCEEDED_ERROR","CHAT_TOO_LONG_ERROR","ChatContent","messages","messageEndRef","useRef","status","useEffect","scrollTimeout","setTimeout","current","scrollIntoView","behavior","clearTimeout","_Fragment","idx","ChatMessage","isLoading","length","id","div","ref","ChatAttachmentList","attachments","removeAttachmentByIndex","useAttachments","Input","Attachments","attachment","index","Box","maxWidth","AttachmentPreview","onRemove","filename","ChatAttachmentMenu","attachFiles","openCodeUpload","useUploadProjectToChat","openFigmaUpload","useUploadFigmaToChat","fileInputRef","uploadLabel","importCodeText","attachImageText","importFigmaText","SimpleMenu","label","icon","Paperclip","tag","IconButton","popoverPlacement","MenuItem","Code","onSelect","FigmaIcon","input","type","accept","multiple","hidden","Upload","fileInput","onchange","target","files","Array","from","click","LoadingDots","children","dots","setDots","useState","dotStates","currentIndex","interval","setInterval","clearInterval","textColor","ChatInput","props","handleSubmit","handleInputChange","stop","form","onSubmit","Root","Header","minHeight","HeaderItem","Content","Dropzone","Area","paddingBottom","ResizableTextArea","value","onChange","placeholder","Actions","preventDefault","StopIcon","disabled","trim","ArrowUp","Chat","isChatOpen","isChatEnabled","openChat","closeChat","reset","state","useGuidedTour","s","currentEnvironment","useAppInfo","isProduction","isAIChatStepActive","enabled","tours","contentTypeBuilder","currentStep","isCompleted","openChatLabel","closeChatLabel","createChatLabel","defaultTitle","mistakesDisclaimer","onAddFiles","Panel","position","isOpen","onToggle","toggleIcon","Plus","Close","Body","AIChat","Footer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Chat.mjs","sources":["../../../../admin/src/components/AIChat/Chat.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { tours, useGuidedTour, useAppInfo } from '@strapi/admin/strapi-admin';\nimport { Flex, IconButton, Button, Typography, Box } from '@strapi/design-system';\nimport { Sparkle, ArrowUp, Plus, Paperclip, Upload, Code } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nimport { useCTBTracking } from '../CTBSession/ctbSession';\n\nimport { Alert } from './components/Alert';\nimport { AnimatedBox } from './components/AnimatedBox';\nimport { AttachmentPreview } from './components/Attachments/AttachmentPreview';\nimport { Dropzone } from './components/Dropzone';\nimport { Panel } from './components/FloatingPanel';\nimport { FigmaIcon } from './components/icons/FigmaIcon';\nimport { StopIcon } from './components/icons/StopIcon';\nimport { Input } from './components/Input';\nimport { ChatMessage } from './components/Messages/Message';\nimport { ResizableTextArea } from './components/ResizableTextArea';\nimport { MenuItem, SimpleMenu } from './components/SimpleMenu';\nimport {\n CHAT_TOO_LONG_ERROR,\n LICENSE_LIMIT_REACHED_ERROR,\n TOO_MANY_REQUESTS_ERROR,\n LICENSE_LIMIT_EXCEEDED_ERROR,\n} from './hooks/useAIFetch';\nimport { useAttachments } from './hooks/useAttachments';\nimport { useTranslations } from './hooks/useTranslations';\nimport { AIMessage } from './lib/types/messages';\nimport { useStrapiChat } from './providers/ChatProvider';\nimport { useUploadProjectToChat } from './UploadCodeModal';\nimport { useUploadFigmaToChat } from './UploadFigmaModal';\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Message Suggestions\n * -----------------------------------------------------------------------------------------------*/\nconst ResponsiveFlex = styled(Flex)`\n @media (max-height: 500px) {\n display: none;\n }\n`;\n\nconst ChatSuggestions = () => {\n const { sendMessage } = useStrapiChat();\n const { t } = useTranslations();\n const { trackUsage } = useCTBTracking();\n\n const SUGGESTIONS = [\n t('chat.input.defaults.generate', 'Generate a product schema'),\n t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder'),\n t('chat.input.defaults.strapi', 'Tell me about Strapi'),\n ] as const;\n\n const SUGGESTION_TO_PROMPT_TYPE = {\n [t('chat.input.defaults.generate', 'Generate a product schema')]: 'generate-product-schema',\n [t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder')]:\n 'tell-me-about-the-content-type-builder',\n [t('chat.input.defaults.strapi', 'Tell me about Strapi')]: 'tell-me-about-strapi',\n } as const;\n\n const suggestionsTitle = t('chat.input.defaults.title', 'How can I help you?');\n\n return (\n <AnimatedBox>\n <ResponsiveFlex direction=\"column\" alignItems={'flex-start'} gap={3}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {suggestionsTitle}\n </Typography>\n <Flex direction=\"column\" alignItems={'flex-start'} gap={2}>\n {SUGGESTIONS.map((suggestion) => (\n <Button\n key={suggestion}\n startIcon={<Sparkle fill=\"neutral500\" />}\n size=\"M\"\n variant=\"tertiary\"\n onClick={() => {\n trackUsage('didUsePresetPrompt', {\n promptType: SUGGESTION_TO_PROMPT_TYPE[suggestion],\n });\n\n sendMessage({ text: suggestion });\n }}\n >\n <Typography fontWeight=\"regular\">{suggestion}</Typography>\n </Button>\n ))}\n </Flex>\n </ResponsiveFlex>\n </AnimatedBox>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Errors\n * -----------------------------------------------------------------------------------------------*/\nconst getErrorMessage = (err: Error) => {\n try {\n const error = JSON.parse(err.message);\n return error.error;\n } catch (e) {\n return err;\n }\n};\n\nconst ChatError = () => {\n const { error } = useStrapiChat();\n const { t } = useTranslations();\n\n const defaultErrorMessage = t('chat.messages.error', 'Something went wrong.');\n const tooManyRequestsMessage = t(\n 'chat.messages.too-many-requests',\n 'Too many requests, please try again later.'\n );\n const licenseLimitReachedMessage = t(\n 'chat.messages.license-limit-reached',\n 'License limit reached, please try again tomorrow.'\n );\n const licenseLimitExceededMessage = t(\n 'chat.messages.license-limit-exceeded',\n 'AI credit limit exceeded.'\n );\n const chatTooLongError = t(\n 'chat.messages.too-long-error',\n 'This conversation reached its maximum length. Start a new conversation'\n );\n\n if (!error) return null;\n\n const errorMessage = getErrorMessage(error);\n if (!errorMessage || typeof errorMessage !== 'string') {\n return null;\n }\n\n if (errorMessage === TOO_MANY_REQUESTS_ERROR) {\n return <Alert title={tooManyRequestsMessage} variant=\"warning\" />;\n }\n\n if (errorMessage === LICENSE_LIMIT_REACHED_ERROR) {\n return <Alert title={licenseLimitReachedMessage} variant=\"warning\" />;\n }\n\n if (errorMessage.split('.')[0] === LICENSE_LIMIT_EXCEEDED_ERROR) {\n return <Alert title={licenseLimitExceededMessage} variant=\"danger\" />;\n }\n\n if (errorMessage === CHAT_TOO_LONG_ERROR) {\n return <Alert title={chatTooLongError} variant=\"danger\" />;\n }\n\n return <Alert title={defaultErrorMessage} variant=\"danger\" />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat Messages\n * -----------------------------------------------------------------------------------------------*/\nconst ChatContent: React.FC<{\n messages: AIMessage[];\n}> = ({ messages }) => {\n const messageEndRef = useRef<HTMLDivElement>(null);\n const { status } = useStrapiChat();\n\n // Scroll to the bottom of the chat when new messages arrive\n useEffect(() => {\n // Add a small delay to ensure all message content is fully rendered\n // including conditionally rendered elements like feedback buttons\n const scrollTimeout = setTimeout(() => {\n messageEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, 20);\n\n return () => clearTimeout(scrollTimeout);\n }, [messages, status]);\n\n return (\n <>\n <Flex direction=\"column\" gap={5}>\n {messages.map((message) => (\n <ChatMessage key={message.id} message={message} />\n ))}\n {status === 'error' && <ChatError />}\n </Flex>\n <div ref={messageEndRef} />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Attachments\n * -----------------------------------------------------------------------------------------------*/\nconst ChatAttachmentList = () => {\n const { attachments, removeAttachmentByIndex } = useAttachments();\n\n if (!attachments.length) return null;\n\n return (\n <Input.Attachments>\n {attachments.map((attachment, index) => (\n <Box key={attachment.filename} maxWidth={'250px'}>\n <AttachmentPreview\n attachment={attachment}\n onRemove={() => removeAttachmentByIndex(index)}\n />\n </Box>\n ))}\n </Input.Attachments>\n );\n};\n\nconst ChatAttachmentMenu = () => {\n const { attachFiles } = useAttachments();\n const { openCodeUpload } = useUploadProjectToChat();\n const { openFigmaUpload } = useUploadFigmaToChat();\n const { t } = useTranslations();\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const uploadLabel = t('chat.tooltips.upload-attachments', 'Upload attachments');\n const importCodeText = t('chat.attachments.menu.import-code', 'Import code');\n const attachImageText = t('chat.attachments.menu.attach-image', 'Attach image');\n const importFigmaText = t('chat.attachments.menu.import-figma', 'Import from Figma');\n\n return (\n <SimpleMenu\n label={uploadLabel}\n icon={<Paperclip />}\n tag={IconButton}\n popoverPlacement=\"top-end\"\n >\n <MenuItem startIcon={<Code />} onSelect={() => openCodeUpload()}>\n {importCodeText}\n </MenuItem>\n\n <MenuItem startIcon={<FigmaIcon />} onSelect={() => openFigmaUpload()}>\n {importFigmaText}\n </MenuItem>\n\n <input type=\"file\" accept=\"image/*\" multiple hidden ref={fileInputRef} />\n <MenuItem\n startIcon={<Upload />}\n onSelect={() => {\n const fileInput = fileInputRef.current;\n if (!fileInput) return;\n fileInput.onchange = (e) => {\n const target = e.target as HTMLInputElement;\n if (target.files && target.files.length > 0) {\n attachFiles(Array.from(target.files));\n }\n };\n\n fileInput.click();\n }}\n >\n {attachImageText}\n </MenuItem>\n </SimpleMenu>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Input\n * -----------------------------------------------------------------------------------------------*/\n\nconst LoadingDots = ({ children }: { children: string }) => {\n const [dots, setDots] = useState('');\n\n useEffect(() => {\n const dotStates = ['', '.', '..', '...'];\n let currentIndex = 0;\n\n const interval = setInterval(() => {\n currentIndex = (currentIndex + 1) % dotStates.length;\n setDots(dotStates[currentIndex]);\n }, 400); // Change every 400ms\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {children}\n {dots}\n </Typography>\n );\n};\n\nconst ChatInput = (props: React.FormHTMLAttributes<HTMLFormElement>) => {\n const { input, handleSubmit, handleInputChange, messages, status, stop, attachments } =\n useStrapiChat();\n const { t } = useTranslations();\n\n const isLoading = status === 'streaming' || status === 'submitted';\n\n return (\n <>\n <form onSubmit={handleSubmit} {...props}>\n <Input.Root isLoading={isLoading} gap={4}>\n <Input.Header minHeight={0}>\n {messages.length === 0 && (\n <Input.HeaderItem>\n <ChatSuggestions />\n </Input.HeaderItem>\n )}\n {isLoading && (\n <Input.HeaderItem>\n <LoadingDots>{t('chat.input.thinking', 'Strapi AI is thinking')}</LoadingDots>\n </Input.HeaderItem>\n )}\n </Input.Header>\n <Input.Content>\n <Dropzone.Area />\n <ChatAttachmentList />\n <Box paddingBottom={3}>\n <ResizableTextArea\n value={input}\n onChange={handleInputChange}\n onSubmit={handleSubmit}\n placeholder={t('chat.input.placeholder', 'Ask Strapi AI...')}\n />\n </Box>\n <Input.Actions>\n <ChatAttachmentMenu />\n\n {isLoading ? (\n <IconButton\n label={t('chat.tooltips.stop-generation', 'Stop')}\n type=\"button\"\n variant=\"default\"\n onClick={(e) => {\n e.preventDefault();\n stop();\n }}\n >\n <StopIcon />\n </IconButton>\n ) : (\n <IconButton\n label={t('chat.tooltips.send-message', 'Send')}\n variant=\"default\"\n type=\"submit\"\n // allow sending an empty message if there are attachments\n disabled={input.trim().length === 0 && attachments.length === 0}\n >\n <ArrowUp />\n </IconButton>\n )}\n </Input.Actions>\n </Input.Content>\n </Input.Root>\n </form>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Chat\n * -----------------------------------------------------------------------------------------------*/\n\nconst Chat = () => {\n const { title, messages, isChatOpen, isChatEnabled, openChat, closeChat, reset } =\n useStrapiChat();\n const { attachFiles } = useAttachments();\n const { t } = useTranslations();\n const state = useGuidedTour('Chat', (s) => s.state);\n const currentEnvironment = useAppInfo('Chat', (state) => state.currentEnvironment);\n\n // Disable AI Chat in production mode\n const isProduction = currentEnvironment === 'production';\n\n // Auto-open chat when AIChat guided tour step is active\n useEffect(() => {\n const isAIChatStepActive =\n state.enabled &&\n state.tours.contentTypeBuilder?.currentStep === 1 && // AIChat is step 1 in contentTypeBuilderStepsAI\n !state.tours.contentTypeBuilder?.isCompleted;\n\n if (isAIChatStepActive && !isChatOpen && openChat) {\n openChat();\n }\n }, [\n state.tours.contentTypeBuilder?.currentStep,\n state.tours.contentTypeBuilder?.isCompleted,\n state.enabled,\n isChatOpen,\n openChat,\n ]);\n\n // Labels\n const openChatLabel = t('chat.tooltips.open-chat', 'Open chat');\n const closeChatLabel = t('chat.tooltips.close-chat', 'Close chat');\n const createChatLabel = t('chat.tooltips.create-chat', 'New conversation');\n const defaultTitle = t('chat.header.default-title', 'New conversation');\n const mistakesDisclaimer = t(\n 'chat.input.strapi-ai-can-make-errors',\n 'Strapi AI can make mistakes.'\n );\n\n // Don't render the chat at all in production mode or if chat is not enabled\n if (!isChatEnabled || isProduction) {\n return null;\n }\n\n return (\n <Dropzone.Root\n onAddFiles={(files) => {\n attachFiles(files);\n }}\n >\n <Panel.Root\n size=\"md\"\n position=\"bottom-right\"\n isOpen={isChatOpen}\n onToggle={isChatOpen ? closeChat : openChat}\n toggleIcon={\n <IconButton\n onClick={isChatOpen ? closeChat : openChat}\n label={isChatOpen ? closeChatLabel : openChatLabel}\n variant=\"default\"\n size=\"L\"\n >\n <Sparkle />\n </IconButton>\n }\n >\n <Panel.Header>\n <Typography tag=\"h3\" variant=\"omega\" fontWeight=\"bold\">\n {title || defaultTitle}\n </Typography>\n <Flex gap={0}>\n <IconButton label={createChatLabel} variant=\"ghost\" onClick={reset}>\n <Plus />\n </IconButton>\n <Panel.Close label={closeChatLabel} />\n </Flex>\n </Panel.Header>\n\n <Panel.Body>\n <tours.contentTypeBuilder.AIChat>\n {!messages.length ? (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {mistakesDisclaimer}\n </Typography>\n ) : null}\n <ChatContent messages={messages} />\n </tours.contentTypeBuilder.AIChat>\n </Panel.Body>\n\n <Panel.Footer>\n <ChatInput />\n </Panel.Footer>\n </Panel.Root>\n </Dropzone.Root>\n );\n};\n\nexport { Chat };\n"],"names":["ResponsiveFlex","styled","Flex","ChatSuggestions","sendMessage","useStrapiChat","t","useTranslations","trackUsage","useCTBTracking","SUGGESTIONS","SUGGESTION_TO_PROMPT_TYPE","suggestionsTitle","_jsx","AnimatedBox","_jsxs","direction","alignItems","gap","Typography","variant","fontWeight","map","suggestion","Button","startIcon","Sparkle","fill","size","onClick","promptType","text","getErrorMessage","err","error","JSON","parse","message","e","ChatError","defaultErrorMessage","tooManyRequestsMessage","licenseLimitReachedMessage","licenseLimitExceededMessage","chatTooLongError","errorMessage","TOO_MANY_REQUESTS_ERROR","Alert","title","LICENSE_LIMIT_REACHED_ERROR","split","LICENSE_LIMIT_EXCEEDED_ERROR","CHAT_TOO_LONG_ERROR","ChatContent","messages","messageEndRef","useRef","status","useEffect","scrollTimeout","setTimeout","current","scrollIntoView","behavior","clearTimeout","_Fragment","ChatMessage","id","div","ref","ChatAttachmentList","attachments","removeAttachmentByIndex","useAttachments","length","Input","Attachments","attachment","index","Box","maxWidth","AttachmentPreview","onRemove","filename","ChatAttachmentMenu","attachFiles","openCodeUpload","useUploadProjectToChat","openFigmaUpload","useUploadFigmaToChat","fileInputRef","uploadLabel","importCodeText","attachImageText","importFigmaText","SimpleMenu","label","icon","Paperclip","tag","IconButton","popoverPlacement","MenuItem","Code","onSelect","FigmaIcon","input","type","accept","multiple","hidden","Upload","fileInput","onchange","target","files","Array","from","click","LoadingDots","children","dots","setDots","useState","dotStates","currentIndex","interval","setInterval","clearInterval","textColor","ChatInput","props","handleSubmit","handleInputChange","stop","isLoading","form","onSubmit","Root","Header","minHeight","HeaderItem","Content","Dropzone","Area","paddingBottom","ResizableTextArea","value","onChange","placeholder","Actions","preventDefault","StopIcon","disabled","trim","ArrowUp","Chat","isChatOpen","isChatEnabled","openChat","closeChat","reset","state","useGuidedTour","s","currentEnvironment","useAppInfo","isProduction","isAIChatStepActive","enabled","tours","contentTypeBuilder","currentStep","isCompleted","openChatLabel","closeChatLabel","createChatLabel","defaultTitle","mistakesDisclaimer","onAddFiles","Panel","position","isOpen","onToggle","toggleIcon","Plus","Close","Body","AIChat","Footer"],"mappings":"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"}
|
|
@@ -276,7 +276,7 @@ const FigmaImageDisplayStep = ({ images, selectedImages, setSelectedImages })=>{
|
|
|
276
276
|
const { t } = useTranslations.useTranslations();
|
|
277
277
|
const { addAttachments } = useAttachments.useAttachments();
|
|
278
278
|
const { isFigmaUploadOpen, closeFigmaUpload, submitOnFinish } = useUploadFigmaToChat();
|
|
279
|
-
const { input, setInput,
|
|
279
|
+
const { input, setInput, sendMessage, openChat } = ChatProvider.useStrapiChat();
|
|
280
280
|
const { processFigmaUrl, isLoading, error } = useFigmaUpload.useFigmaUpload({
|
|
281
281
|
onSuccess: (images)=>{
|
|
282
282
|
setFigmaImages(images);
|
|
@@ -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, setMessages, 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 (e) {\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","setMessages","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":";;;;;;;;;;;;AA2BA,MAAMA,mCAAqBC,mBAAAA,CAAsC;IAC/DC,iBAAAA,EAAmB,KAAA;IACnBC,cAAAA,EAAgB,KAAA;AAChBC,IAAAA,eAAAA,EAAiB,IAAA,CAAO,CAAA;AACxBC,IAAAA,gBAAAA,EAAkB,IAAA,CAAO;AAC3B,CAAA,CAAA;MAEaC,oBAAAA,GAAuB,IAAA;AAClC,IAAA,MAAMC,UAAUC,gBAAAA,CAAWR,kBAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACO,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,uEAAA,CAAA;AAClB,IAAA;IACA,OAAOF,OAAAA;AACT;AAEO,MAAMG,yBAAAA,GAA4B,CAAC,EAAEC,QAAQ,EAAiC,GAAA;AACnF,IAAA,MAAM,CAACT,iBAAAA,EAAmBU,oBAAAA,CAAqB,GAAGC,cAAAA,CAAS;AAC3D,IAAA,MAAM,CAACV,cAAAA,EAAgBW,iBAAAA,CAAkB,GAAGD,cAAAA,CAAS,KAAA,CAAA;AAErD,IAAA,MAAMT,kBAAkB,CAACW,mBAAAA,GAAAA;QACvBH,oBAAAA,CAAqB,IAAA,CAAA;AACrBE,QAAAA,iBAAAA,CAAkBC,mBAAAA,IAAuB,KAAA,CAAA;AAC3C,IAAA,CAAA;IAEA,MAAMV,gBAAAA,GAAmB,IAAMO,oBAAAA,CAAqB,KAAA,CAAA;IAEpD,qBACEI,eAAA,CAAChB,mBAAmBiB,QAAQ,EAAA;QAC1BC,KAAAA,EAAO;AAAEhB,YAAAA,iBAAAA;AAAmBC,YAAAA,cAAAA;AAAgBC,YAAAA,eAAAA;AAAiBC,YAAAA;AAAiB,SAAA;;AAE7EH,YAAAA,iBAAAA,kBAAqBiB,cAAA,CAACC,gBAAAA,EAAAA,EAAAA,CAAAA;AACtBT,YAAAA;;;AAGP;AAYA,MAAMU,oBAAoB,CAAC,EAAEC,QAAQ,EAAEC,WAAW,EAA0B,GAAA;IAC1E,MAAM,EAAEC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGC,sBAAAA,EAAAA;AACtB,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGhB,eAAS,CAACiB,4BAAAA,EAAAA,CAAAA;AAC5D,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGnB,cAAAA,CAAiBoB,4BAAAA,CAAAA;;AAGrD,IAAA,MAAMC,eAAAA,GAAkB,IAAA;QACtB,IAAIH,UAAAA,CAAWI,IAAI,EAAA,EAAI;YACrBC,6BAAAA,CAAeL,UAAAA,CAAAA;YACfF,oBAAAA,CAAqB,KAAA,CAAA;AACvB,QAAA;AACF,IAAA,CAAA;;AAGA,IAAA,IAAID,iBAAAA,EAAmB;AACrB,QAAA,qBACEZ,eAAA,CAACqB,iBAAAA,EAAAA;YAAKC,SAAAA,EAAU,QAAA;YAASC,GAAAA,EAAK,CAAA;YAAGC,UAAAA,EAAW,OAAA;;8BAC1CxB,eAAA,CAACqB,iBAAAA,EAAAA;oBAAKC,SAAAA,EAAU,QAAA;oBAASC,GAAAA,EAAK,CAAA;oBAAGC,UAAAA,EAAW,OAAA;;sCAC1CrB,cAAA,CAACsB,uBAAAA,EAAAA;4BAAWC,OAAAA,EAAQ,MAAA;AACjBlB,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,+BAAA,EAAiC,uBAAA;;sCAEtCL,cAAA,CAACsB,uBAAAA,EAAAA;4BAAWC,OAAAA,EAAQ,OAAA;4BAAQC,SAAAA,EAAU,YAAA;AACnCnB,4BAAAA,QAAAA,EAAAA,CAAAA,CACC,qCAAA,EACA,0HAAA;;sCAGJL,cAAA,CAACyB,iBAAAA,EAAAA;4BACCC,IAAAA,EAAK,sFAAA;4BACLC,UAAU,EAAA,IAAA;AAETtB,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,8BAAA,EAAgC,8BAAA;;;;8BAIvCL,cAAA,CAAC4B,gBAAAA,EAAAA;oBAAIC,KAAAA,EAAM,MAAA;AACT,oBAAA,QAAA,gBAAA7B,cAAA,CAAC8B,sBAAAA,EAAAA;wBACCC,IAAAA,EAAK,aAAA;AACLC,wBAAAA,WAAAA,EAAa3B,EAAE,qCAAA,EAAuC,uBAAA,CAAA;AACtD4B,wBAAAA,YAAAA,EAAY5B,EAAE,qCAAA,EAAuC,uBAAA,CAAA;wBACrDN,KAAAA,EAAOa,UAAAA;AACPsB,wBAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAMtB,aAAAA,CAAcsB,CAAAA,CAAEC,MAAM,CAACrC,KAAK,CAAA;wBAC7C8B,KAAAA,EAAM,MAAA;wBACNQ,QAAAA,EAAU9B,SAAAA;wBACV+B,IAAAA,EAAK;;;8BAITzC,eAAA,CAACqB,iBAAAA,EAAAA;oBAAKE,GAAAA,EAAK,CAAA;;sCACTpB,cAAA,CAACuC,mBAAAA,EAAAA;4BAAOC,OAAAA,EAASzB,eAAAA;4BAAiBsB,QAAAA,EAAU,CAACzB,WAAWI,IAAI,EAAA;4BAAIO,OAAAA,EAAQ,WAAA;AACrElB,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,8BAAA,EAAgC,YAAA;;sCAErCL,cAAA,CAACuC,mBAAAA,EAAAA;AACCC,4BAAAA,OAAAA,EAAS,IAAM9B,oBAAAA,CAAqB,KAAA,CAAA;4BACpCa,OAAAA,EAAQ,UAAA;AACRc,4BAAAA,QAAAA,EAAU,CAAC1B,4BAAAA,EAAAA;AAEVN,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,0BAAA,EAA4B,QAAA;;;;;;AAKzC,IAAA;;AAGA,IAAA,qBACER,eAAA,CAACqB,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,UAAAA,EAAW,OAAA;;0BAC1CxB,eAAA,CAACqB,iBAAAA,EAAAA;gBAAKC,SAAAA,EAAU,QAAA;gBAASC,GAAAA,EAAK,CAAA;gBAAGC,UAAAA,EAAW,OAAA;gBAAQQ,KAAAA,EAAM,MAAA;;kCACxDhC,eAAA,CAACqB,iBAAAA,EAAAA;wBAAKuB,cAAAA,EAAe,eAAA;wBAAgBpB,UAAAA,EAAW,QAAA;wBAASQ,KAAAA,EAAM,MAAA;;0CAC7D7B,cAAA,CAACsB,uBAAAA,EAAAA;gCAAWC,OAAAA,EAAQ,MAAA;AACjBlB,gCAAAA,QAAAA,EAAAA,CAAAA,CAAE,yBAAA,EAA2B,qBAAA;;0CAEhCL,cAAA,CAACuC,mBAAAA,EAAAA;AAAOC,gCAAAA,OAAAA,EAAS,IAAM9B,oBAAAA,CAAqB,IAAA,CAAA;gCAAOa,OAAAA,EAAQ,UAAA;gCAAWmB,IAAAA,EAAK,GAAA;AACxErC,gCAAAA,QAAAA,EAAAA,CAAAA,CAAE,8BAAA,EAAgC,gBAAA;;;;kCAGvCL,cAAA,CAACsB,uBAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,OAAA;wBAAQC,SAAAA,EAAU,YAAA;AACnCnB,wBAAAA,QAAAA,EAAAA,CAAAA,CACC,+BAAA,EACA,0HAAA;;;;0BAKNL,cAAA,CAAC4B,gBAAAA,EAAAA;gBAAIC,KAAAA,EAAM,MAAA;AACT,gBAAA,QAAA,gBAAA7B,cAAA,CAAC8B,sBAAAA,EAAAA;oBACCC,IAAAA,EAAK,WAAA;AACLC,oBAAAA,WAAAA,EAAa3B,EAAE,mCAAA,EAAqC,iBAAA,CAAA;AACpD4B,oBAAAA,YAAAA,EAAY5B,EAAE,mCAAA,EAAqC,iBAAA,CAAA;oBACnDN,KAAAA,EAAOI,QAAAA;AACP+B,oBAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAM/B,WAAAA,CAAY+B,CAAAA,CAAEC,MAAM,CAACrC,KAAK,CAAA;oBAC3C8B,KAAAA,EAAM,MAAA;oBACNQ,QAAAA,EAAU9B,SAAAA;oBACV+B,IAAAA,EAAK;;;;;AAWf,CAAA;AAYA,MAAMK,qBAAAA,GAAwB,CAAC,EAC7BC,MAAM,EACNC,cAAc,EACdC,iBAAiB,EACU,GAAA;IAC3B,MAAM,EAAEzC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;;AAGd,IAAA,MAAMyC,eAAAA,GAAkB,IAAA;AACtB,QAAA,IAAIF,cAAAA,CAAeG,MAAM,KAAKJ,MAAAA,CAAOI,MAAM,EAAE;;AAE3CF,YAAAA,iBAAAA,CAAkB,EAAE,CAAA;QACtB,CAAA,MAAO;;AAEL,YAAA,MAAMG,cAAcL,MAAAA,CAAOM,GAAG,CAAC,CAACC,GAAAA,GAAQA,IAAIC,EAAE,CAAA;YAC9CN,iBAAAA,CAAkBG,WAAAA,CAAAA;AACpB,QAAA;AACF,IAAA,CAAA;IAEA,IAAIL,MAAAA,CAAOI,MAAM,KAAK,CAAA,EAAG;AACvB,QAAA,qBACEhD,cAAA,CAACkB,iBAAAA,EAAAA;YAAKC,SAAAA,EAAU,QAAA;YAASC,GAAAA,EAAK,CAAA;YAAGC,UAAAA,EAAW,QAAA;YAASgC,OAAAA,EAAS,CAAA;AAC5D,YAAA,QAAA,gBAAArD,cAAA,CAACsB,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;AACjBlB,gBAAAA,QAAAA,EAAAA,CAAAA,CAAE,6BAAA,EAA+B,oCAAA;;;AAI1C,IAAA;;AAGA,IAAA,MAAMiD,uBAAuB,CAACC,OAAAA,GAAAA;QAC5B,MAAMC,YAAAA,GAAeX,cAAAA,CAAeY,QAAQ,CAACF,OAAAA,CAAAA,GACzCV,cAAAA,CAAea,MAAM,CAAC,CAACN,EAAAA,GAAOA,EAAAA,KAAOG,OAAAA,CAAAA,GACrC;AAAIV,YAAAA,GAAAA,cAAAA;AAAgBU,YAAAA;AAAQ,SAAA;QAEhCT,iBAAAA,CAAkBU,YAAAA,CAAAA;AACpB,IAAA,CAAA;AAEA,IAAA,qBACE3D,eAAA,CAACqB,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,UAAAA,EAAW,OAAA;QAAQQ,KAAAA,EAAM,MAAA;QAAO8B,MAAAA,EAAO,kBAAA;;0BACtE9D,eAAA,CAACqB,iBAAAA,EAAAA;gBAAKuB,cAAAA,EAAe,eAAA;gBAAgBZ,KAAAA,EAAM,MAAA;gBAAOR,UAAAA,EAAW,QAAA;;kCAC3DrB,cAAA,CAACsB,uBAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,MAAA;AACjBlB,wBAAAA,QAAAA,EAAAA,CAAAA,CAAE,iCAAA,EAAmC,yBAAA;;kCAExCR,eAAA,CAACqB,iBAAAA,EAAAA;wBAAKE,GAAAA,EAAK,CAAA;wBAAGC,UAAAA,EAAW,QAAA;;0CACvBxB,eAAA,CAACyB,uBAAAA,EAAAA;;AACEuB,oCAAAA,cAAAA,CAAeG,MAAM;AAAC,oCAAA,MAAA;AAAKJ,oCAAAA,MAAAA,CAAOI,MAAM;AAAC,oCAAA;;;0CAE5ChD,cAAA,CAACuC,mBAAAA,EAAAA;gCAAOC,OAAAA,EAASO,eAAAA;gCAAiBT,IAAAA,EAAK,QAAA;gCAASf,OAAAA,EAAQ,WAAA;0CAErDsB,cAAAA,CAAeG,MAAM,KAAKJ,MAAAA,CAAOI,MAAM,GACpC3C,CAAAA,CAAE,gCAAA,EAAkC,cAAA,CAAA,GACpCA,CAAAA,CAAE,8BAAA,EAAgC,YAAA;;;;;;0BAK5CL,cAAA,CAAC4B,gBAAAA,EAAAA;gBAAIgC,YAAAA,EAAc,CAAA;gBAAG/B,KAAAA,EAAM,MAAA;gBAAOgC,KAAAA,EAAO;oBAAEC,SAAAA,EAAW;AAAO,iBAAA;wCAC5D9D,cAAA,CAAC+D,kBAAKC,IAAI,EAAA;oBAAC5C,GAAAA,EAAK,CAAA;8BACbwB,MAAAA,CAAOM,GAAG,CAAC,CAACe,KAAAA,EAAOC,KAAAA,GAAAA;AAClB,wBAAA,MAAMC,UAAAA,GAAatB,cAAAA,CAAeY,QAAQ,CAACQ,MAAMb,EAAE,CAAA;wBACnD,qBACEpD,cAAA,CAAC+D,kBAAKK,IAAI,EAAA;4BAAgBC,GAAAA,EAAK,CAAA;4BAAGC,EAAAA,EAAI,EAAA;4BAAIjB,OAAAA,EAAS,KAAA;AACjD,4BAAA,QAAA,gBAAArD,cAAA,CAACuE,yBAAAA,EAAAA;AACCC,gCAAAA,QAAAA,EAAUP,MAAMQ,GAAG;AACnBC,gCAAAA,SAAAA,EAAWT,MAAMU,QAAQ,IAAI,CAAC,MAAM,EAAET,QAAQ,CAAA,CAAA,CAAG;gCACjDU,QAAAA,EAAUT,UAAAA;gCACVU,QAAAA,EAAU,IAAMvB,oBAAAA,CAAqBW,KAAAA,CAAMb,EAAE;;AALjCa,yBAAAA,EAAAA,KAAAA,CAAMb,EAAE,CAAA;AAS5B,oBAAA,CAAA;;;;;AAKV,CAAA;AAEA;;2GAGanD,gBAAAA,GAAmB,IAAA;AAC9B,IAAA,MAAM,CAACE,QAAAA,EAAUC,WAAAA,CAAY,GAAGV,cAAAA,CAAiB,EAAA,CAAA;AACjD,IAAA,MAAM,CAACoF,WAAAA,EAAaC,cAAAA,CAAe,GAAGrF,eAAuB,EAAE,CAAA;AAC/D,IAAA,MAAM,CAACmD,cAAAA,EAAgBC,iBAAAA,CAAkB,GAAGpD,eAAmB,EAAE,CAAA;IACjE,MAAM,EAAEW,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IAEd,MAAM,EAAE0E,cAAc,EAAE,GAAGC,6BAAAA,EAAAA;AAC3B,IAAA,MAAM,EAAElG,iBAAiB,EAAEG,gBAAgB,EAAEF,cAAc,EAAE,GAAGG,oBAAAA,EAAAA;IAChE,MAAM,EAAE+F,KAAK,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,WAAW,EAAEC,QAAQ,EAAE,GAAGC,0BAAAA,EAAAA;IAChE,MAAM,EAAEC,eAAe,EAAEjF,SAAS,EAAEkF,KAAK,EAAE,GAAGC,6BAAAA,CAAe;AAC3DC,QAAAA,SAAAA,EAAW,CAAC/C,MAAAA,GAAAA;YACVmC,cAAAA,CAAenC,MAAAA,CAAAA;;YAEf,MAAMgD,gBAAAA,GAAmBhD,MAAAA,CAAOiD,KAAK,CAAC,CAAA,EAAG,EAAA,CAAA,CAAI3C,GAAG,CAAC,CAACC,GAAAA,GAAQA,GAAAA,CAAIC,EAAE,CAAA;YAChEN,iBAAAA,CAAkB8C,gBAAAA,CAAAA;AACpB,QAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAME,gBAAAA,GAAmB,UAAA;AACvB,QAAA,MAAMN,eAAAA,CAAgBrF,QAAAA,CAAAA;QACtB,OAAO,IAAA;AACT,IAAA,CAAA;;AAGA,IAAA,MAAM4F,kBAAkB,CAACtB,GAAAA,GAAAA;QACvB,IAAI,CAACA,KAAK,OAAO,KAAA;QACjB,IAAI;YACF,MAAMuB,MAAAA,GAAS,IAAIC,GAAAA,CAAIxB,GAAAA,CAAAA;AACvB,YAAA,OAAOuB,OAAOE,QAAQ,KAAK,eAAA,IAAmBF,MAAAA,CAAOE,QAAQ,KAAK,WAAA;AACpE,QAAA,CAAA,CAAE,OAAO/D,CAAAA,EAAG;YACV,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMgE,YAAAA,GAAe,IAAA;;QAEnB/F,WAAAA,CAAY,EAAA,CAAA;AACZ2E,QAAAA,cAAAA,CAAe,EAAE,CAAA;AACjBjC,QAAAA,iBAAAA,CAAkB,EAAE,CAAA;AACpB5D,QAAAA,gBAAAA,EAAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMkH,cAAAA,GAAiB,IAAA;;QAErB,MAAMC,mBAAAA,GAAsBvB,WAAAA,CAAYpB,MAAM,CAAC,CAACP,MAAQN,cAAAA,CAAeY,QAAQ,CAACN,GAAAA,CAAIC,EAAE,CAAA,CAAA;QACtF,IAAIiD,mBAAAA,CAAoBrD,MAAM,KAAK,CAAA,EAAG;AACpC9D,YAAAA,gBAAAA,EAAAA;AACA,YAAA;AACF,QAAA;;AAGAoG,QAAAA,QAAAA,EAAAA;AAEA,QAAA,IAAItG,cAAAA,EAAgB;;YAElBqG,WAAAA,CAAY;gBACViB,IAAAA,EAAM,MAAA;gBACNC,KAAAA,EAAO;AACL,oBAAA;wBAAEjE,IAAAA,EAAM,MAAA;wBAAQkE,IAAAA,EAAM;AAA0C,qBAAA;AAC7DH,oBAAAA,GAAAA;AACJ;AACH,aAAA,CAAA;AAEAnH,YAAAA,gBAAAA,EAAAA;QACF,CAAA,MAAO;;AAEL,YAAA,IAAI,CAACgG,KAAAA,EAAO;gBACVC,QAAAA,CAAS,yCAAA,CAAA;AACX,YAAA;YACAH,cAAAA,CAAeqB,mBAAAA,CAAAA;AACfnH,YAAAA,gBAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEW,eAAA,CAAC4G,mBAAAA,EAAAA;QACCC,IAAAA,EAAM3H,iBAAAA;AACN4H,QAAAA,YAAAA,EAAc,CAACC,MAAAA,GAAAA;AACb,YAAA,IAAI,CAACA,MAAAA,EAAQT,YAAAA,EAAAA;AACf,QAAA,CAAA;AACAU,QAAAA,KAAAA,EAAOxG,EAAE,0BAAA,EAA4B,mBAAA,CAAA;QACrCyG,QAAAA,EAAUX,YAAAA;QACVY,UAAAA,EAAYX,cAAAA;;AAEZ,0BAAApG,cAAA,CAACyG,oBAAUO,IAAI,EAAA;AACbH,gBAAAA,KAAAA,EAAOxG,EAAE,+BAAA,EAAiC,iBAAA,CAAA;AAC1C4G,gBAAAA,SAAAA,EAAW5G,EAAE,iCAAA,EAAmC,QAAA,CAAA;AAChD6G,gBAAAA,WAAAA,EAAa7G,EAAE,oBAAA,EAAsB,QAAA,CAAA;AACrC8G,gBAAAA,WAAAA,EAAa,CAAChH,QAAAA,IAAYI,SAAAA,IAAa,CAACwF,eAAAA,CAAgB5F,QAAAA,CAAAA;gBACxDiH,MAAAA,EAAQtB,gBAAAA;AAER,gBAAA,QAAA,gBAAA9F,cAAA,CAACE,iBAAAA,EAAAA;oBAAkBC,QAAAA,EAAUA,QAAAA;oBAAUC,WAAAA,EAAaA,WAAAA;oBAAaqF,KAAAA,EAAOA;;;AAG1E,0BAAAzF,cAAA,CAACyG,oBAAUO,IAAI,EAAA;AACbH,gBAAAA,KAAAA,EAAOxG,EAAE,+BAAA,EAAiC,gBAAA,CAAA;AAC1C4G,gBAAAA,SAAAA,EAAW5G,EAAE,oBAAA,EAAsB,QAAA,CAAA;AACnCgH,gBAAAA,SAAAA,EAAWhH,EAAE,kBAAA,EAAoB,MAAA,CAAA;gBACjC8G,WAAAA,EAAatE,cAAAA,CAAeG,MAAM,KAAK,CAAA;AAEvC,gBAAA,QAAA,gBAAAhD,cAAA,CAAC2C,qBAAAA,EAAAA;oBACCC,MAAAA,EAAQkC,WAAAA;oBACRjC,cAAAA,EAAgBA,cAAAA;oBAChBC,iBAAAA,EAAmBA;;;;;AAK7B;;;;;;"}
|
|
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 (e) {\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":";;;;;;;;;;;;AA2BA,MAAMA,mCAAqBC,mBAAAA,CAAsC;IAC/DC,iBAAAA,EAAmB,KAAA;IACnBC,cAAAA,EAAgB,KAAA;AAChBC,IAAAA,eAAAA,EAAiB,IAAA,CAAO,CAAA;AACxBC,IAAAA,gBAAAA,EAAkB,IAAA,CAAO;AAC3B,CAAA,CAAA;MAEaC,oBAAAA,GAAuB,IAAA;AAClC,IAAA,MAAMC,UAAUC,gBAAAA,CAAWR,kBAAAA,CAAAA;AAC3B,IAAA,IAAI,CAACO,OAAAA,EAAS;AACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,uEAAA,CAAA;AAClB,IAAA;IACA,OAAOF,OAAAA;AACT;AAEO,MAAMG,yBAAAA,GAA4B,CAAC,EAAEC,QAAQ,EAAiC,GAAA;AACnF,IAAA,MAAM,CAACT,iBAAAA,EAAmBU,oBAAAA,CAAqB,GAAGC,cAAAA,CAAS;AAC3D,IAAA,MAAM,CAACV,cAAAA,EAAgBW,iBAAAA,CAAkB,GAAGD,cAAAA,CAAS,KAAA,CAAA;AAErD,IAAA,MAAMT,kBAAkB,CAACW,mBAAAA,GAAAA;QACvBH,oBAAAA,CAAqB,IAAA,CAAA;AACrBE,QAAAA,iBAAAA,CAAkBC,mBAAAA,IAAuB,KAAA,CAAA;AAC3C,IAAA,CAAA;IAEA,MAAMV,gBAAAA,GAAmB,IAAMO,oBAAAA,CAAqB,KAAA,CAAA;IAEpD,qBACEI,eAAA,CAAChB,mBAAmBiB,QAAQ,EAAA;QAC1BC,KAAAA,EAAO;AAAEhB,YAAAA,iBAAAA;AAAmBC,YAAAA,cAAAA;AAAgBC,YAAAA,eAAAA;AAAiBC,YAAAA;AAAiB,SAAA;;AAE7EH,YAAAA,iBAAAA,kBAAqBiB,cAAA,CAACC,gBAAAA,EAAAA,EAAAA,CAAAA;AACtBT,YAAAA;;;AAGP;AAYA,MAAMU,oBAAoB,CAAC,EAAEC,QAAQ,EAAEC,WAAW,EAA0B,GAAA;IAC1E,MAAM,EAAEC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IACd,MAAM,EAAEC,SAAS,EAAE,GAAGC,sBAAAA,EAAAA;AACtB,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGhB,eAAS,CAACiB,4BAAAA,EAAAA,CAAAA;AAC5D,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGnB,cAAAA,CAAiBoB,4BAAAA,CAAAA;;AAGrD,IAAA,MAAMC,eAAAA,GAAkB,IAAA;QACtB,IAAIH,UAAAA,CAAWI,IAAI,EAAA,EAAI;YACrBC,6BAAAA,CAAeL,UAAAA,CAAAA;YACfF,oBAAAA,CAAqB,KAAA,CAAA;AACvB,QAAA;AACF,IAAA,CAAA;;AAGA,IAAA,IAAID,iBAAAA,EAAmB;AACrB,QAAA,qBACEZ,eAAA,CAACqB,iBAAAA,EAAAA;YAAKC,SAAAA,EAAU,QAAA;YAASC,GAAAA,EAAK,CAAA;YAAGC,UAAAA,EAAW,OAAA;;8BAC1CxB,eAAA,CAACqB,iBAAAA,EAAAA;oBAAKC,SAAAA,EAAU,QAAA;oBAASC,GAAAA,EAAK,CAAA;oBAAGC,UAAAA,EAAW,OAAA;;sCAC1CrB,cAAA,CAACsB,uBAAAA,EAAAA;4BAAWC,OAAAA,EAAQ,MAAA;AACjBlB,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,+BAAA,EAAiC,uBAAA;;sCAEtCL,cAAA,CAACsB,uBAAAA,EAAAA;4BAAWC,OAAAA,EAAQ,OAAA;4BAAQC,SAAAA,EAAU,YAAA;AACnCnB,4BAAAA,QAAAA,EAAAA,CAAAA,CACC,qCAAA,EACA,0HAAA;;sCAGJL,cAAA,CAACyB,iBAAAA,EAAAA;4BACCC,IAAAA,EAAK,sFAAA;4BACLC,UAAU,EAAA,IAAA;AAETtB,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,8BAAA,EAAgC,8BAAA;;;;8BAIvCL,cAAA,CAAC4B,gBAAAA,EAAAA;oBAAIC,KAAAA,EAAM,MAAA;AACT,oBAAA,QAAA,gBAAA7B,cAAA,CAAC8B,sBAAAA,EAAAA;wBACCC,IAAAA,EAAK,aAAA;AACLC,wBAAAA,WAAAA,EAAa3B,EAAE,qCAAA,EAAuC,uBAAA,CAAA;AACtD4B,wBAAAA,YAAAA,EAAY5B,EAAE,qCAAA,EAAuC,uBAAA,CAAA;wBACrDN,KAAAA,EAAOa,UAAAA;AACPsB,wBAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAMtB,aAAAA,CAAcsB,CAAAA,CAAEC,MAAM,CAACrC,KAAK,CAAA;wBAC7C8B,KAAAA,EAAM,MAAA;wBACNQ,QAAAA,EAAU9B,SAAAA;wBACV+B,IAAAA,EAAK;;;8BAITzC,eAAA,CAACqB,iBAAAA,EAAAA;oBAAKE,GAAAA,EAAK,CAAA;;sCACTpB,cAAA,CAACuC,mBAAAA,EAAAA;4BAAOC,OAAAA,EAASzB,eAAAA;4BAAiBsB,QAAAA,EAAU,CAACzB,WAAWI,IAAI,EAAA;4BAAIO,OAAAA,EAAQ,WAAA;AACrElB,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,8BAAA,EAAgC,YAAA;;sCAErCL,cAAA,CAACuC,mBAAAA,EAAAA;AACCC,4BAAAA,OAAAA,EAAS,IAAM9B,oBAAAA,CAAqB,KAAA,CAAA;4BACpCa,OAAAA,EAAQ,UAAA;AACRc,4BAAAA,QAAAA,EAAU,CAAC1B,4BAAAA,EAAAA;AAEVN,4BAAAA,QAAAA,EAAAA,CAAAA,CAAE,0BAAA,EAA4B,QAAA;;;;;;AAKzC,IAAA;;AAGA,IAAA,qBACER,eAAA,CAACqB,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,UAAAA,EAAW,OAAA;;0BAC1CxB,eAAA,CAACqB,iBAAAA,EAAAA;gBAAKC,SAAAA,EAAU,QAAA;gBAASC,GAAAA,EAAK,CAAA;gBAAGC,UAAAA,EAAW,OAAA;gBAAQQ,KAAAA,EAAM,MAAA;;kCACxDhC,eAAA,CAACqB,iBAAAA,EAAAA;wBAAKuB,cAAAA,EAAe,eAAA;wBAAgBpB,UAAAA,EAAW,QAAA;wBAASQ,KAAAA,EAAM,MAAA;;0CAC7D7B,cAAA,CAACsB,uBAAAA,EAAAA;gCAAWC,OAAAA,EAAQ,MAAA;AACjBlB,gCAAAA,QAAAA,EAAAA,CAAAA,CAAE,yBAAA,EAA2B,qBAAA;;0CAEhCL,cAAA,CAACuC,mBAAAA,EAAAA;AAAOC,gCAAAA,OAAAA,EAAS,IAAM9B,oBAAAA,CAAqB,IAAA,CAAA;gCAAOa,OAAAA,EAAQ,UAAA;gCAAWmB,IAAAA,EAAK,GAAA;AACxErC,gCAAAA,QAAAA,EAAAA,CAAAA,CAAE,8BAAA,EAAgC,gBAAA;;;;kCAGvCL,cAAA,CAACsB,uBAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,OAAA;wBAAQC,SAAAA,EAAU,YAAA;AACnCnB,wBAAAA,QAAAA,EAAAA,CAAAA,CACC,+BAAA,EACA,0HAAA;;;;0BAKNL,cAAA,CAAC4B,gBAAAA,EAAAA;gBAAIC,KAAAA,EAAM,MAAA;AACT,gBAAA,QAAA,gBAAA7B,cAAA,CAAC8B,sBAAAA,EAAAA;oBACCC,IAAAA,EAAK,WAAA;AACLC,oBAAAA,WAAAA,EAAa3B,EAAE,mCAAA,EAAqC,iBAAA,CAAA;AACpD4B,oBAAAA,YAAAA,EAAY5B,EAAE,mCAAA,EAAqC,iBAAA,CAAA;oBACnDN,KAAAA,EAAOI,QAAAA;AACP+B,oBAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAM/B,WAAAA,CAAY+B,CAAAA,CAAEC,MAAM,CAACrC,KAAK,CAAA;oBAC3C8B,KAAAA,EAAM,MAAA;oBACNQ,QAAAA,EAAU9B,SAAAA;oBACV+B,IAAAA,EAAK;;;;;AAWf,CAAA;AAYA,MAAMK,qBAAAA,GAAwB,CAAC,EAC7BC,MAAM,EACNC,cAAc,EACdC,iBAAiB,EACU,GAAA;IAC3B,MAAM,EAAEzC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;;AAGd,IAAA,MAAMyC,eAAAA,GAAkB,IAAA;AACtB,QAAA,IAAIF,cAAAA,CAAeG,MAAM,KAAKJ,MAAAA,CAAOI,MAAM,EAAE;;AAE3CF,YAAAA,iBAAAA,CAAkB,EAAE,CAAA;QACtB,CAAA,MAAO;;AAEL,YAAA,MAAMG,cAAcL,MAAAA,CAAOM,GAAG,CAAC,CAACC,GAAAA,GAAQA,IAAIC,EAAE,CAAA;YAC9CN,iBAAAA,CAAkBG,WAAAA,CAAAA;AACpB,QAAA;AACF,IAAA,CAAA;IAEA,IAAIL,MAAAA,CAAOI,MAAM,KAAK,CAAA,EAAG;AACvB,QAAA,qBACEhD,cAAA,CAACkB,iBAAAA,EAAAA;YAAKC,SAAAA,EAAU,QAAA;YAASC,GAAAA,EAAK,CAAA;YAAGC,UAAAA,EAAW,QAAA;YAASgC,OAAAA,EAAS,CAAA;AAC5D,YAAA,QAAA,gBAAArD,cAAA,CAACsB,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;AACjBlB,gBAAAA,QAAAA,EAAAA,CAAAA,CAAE,6BAAA,EAA+B,oCAAA;;;AAI1C,IAAA;;AAGA,IAAA,MAAMiD,uBAAuB,CAACC,OAAAA,GAAAA;QAC5B,MAAMC,YAAAA,GAAeX,cAAAA,CAAeY,QAAQ,CAACF,OAAAA,CAAAA,GACzCV,cAAAA,CAAea,MAAM,CAAC,CAACN,EAAAA,GAAOA,EAAAA,KAAOG,OAAAA,CAAAA,GACrC;AAAIV,YAAAA,GAAAA,cAAAA;AAAgBU,YAAAA;AAAQ,SAAA;QAEhCT,iBAAAA,CAAkBU,YAAAA,CAAAA;AACpB,IAAA,CAAA;AAEA,IAAA,qBACE3D,eAAA,CAACqB,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,UAAAA,EAAW,OAAA;QAAQQ,KAAAA,EAAM,MAAA;QAAO8B,MAAAA,EAAO,kBAAA;;0BACtE9D,eAAA,CAACqB,iBAAAA,EAAAA;gBAAKuB,cAAAA,EAAe,eAAA;gBAAgBZ,KAAAA,EAAM,MAAA;gBAAOR,UAAAA,EAAW,QAAA;;kCAC3DrB,cAAA,CAACsB,uBAAAA,EAAAA;wBAAWC,OAAAA,EAAQ,MAAA;AACjBlB,wBAAAA,QAAAA,EAAAA,CAAAA,CAAE,iCAAA,EAAmC,yBAAA;;kCAExCR,eAAA,CAACqB,iBAAAA,EAAAA;wBAAKE,GAAAA,EAAK,CAAA;wBAAGC,UAAAA,EAAW,QAAA;;0CACvBxB,eAAA,CAACyB,uBAAAA,EAAAA;;AACEuB,oCAAAA,cAAAA,CAAeG,MAAM;AAAC,oCAAA,MAAA;AAAKJ,oCAAAA,MAAAA,CAAOI,MAAM;AAAC,oCAAA;;;0CAE5ChD,cAAA,CAACuC,mBAAAA,EAAAA;gCAAOC,OAAAA,EAASO,eAAAA;gCAAiBT,IAAAA,EAAK,QAAA;gCAASf,OAAAA,EAAQ,WAAA;0CAErDsB,cAAAA,CAAeG,MAAM,KAAKJ,MAAAA,CAAOI,MAAM,GACpC3C,CAAAA,CAAE,gCAAA,EAAkC,cAAA,CAAA,GACpCA,CAAAA,CAAE,8BAAA,EAAgC,YAAA;;;;;;0BAK5CL,cAAA,CAAC4B,gBAAAA,EAAAA;gBAAIgC,YAAAA,EAAc,CAAA;gBAAG/B,KAAAA,EAAM,MAAA;gBAAOgC,KAAAA,EAAO;oBAAEC,SAAAA,EAAW;AAAO,iBAAA;wCAC5D9D,cAAA,CAAC+D,kBAAKC,IAAI,EAAA;oBAAC5C,GAAAA,EAAK,CAAA;8BACbwB,MAAAA,CAAOM,GAAG,CAAC,CAACe,KAAAA,EAAOC,KAAAA,GAAAA;AAClB,wBAAA,MAAMC,UAAAA,GAAatB,cAAAA,CAAeY,QAAQ,CAACQ,MAAMb,EAAE,CAAA;wBACnD,qBACEpD,cAAA,CAAC+D,kBAAKK,IAAI,EAAA;4BAAgBC,GAAAA,EAAK,CAAA;4BAAGC,EAAAA,EAAI,EAAA;4BAAIjB,OAAAA,EAAS,KAAA;AACjD,4BAAA,QAAA,gBAAArD,cAAA,CAACuE,yBAAAA,EAAAA;AACCC,gCAAAA,QAAAA,EAAUP,MAAMQ,GAAG;AACnBC,gCAAAA,SAAAA,EAAWT,MAAMU,QAAQ,IAAI,CAAC,MAAM,EAAET,QAAQ,CAAA,CAAA,CAAG;gCACjDU,QAAAA,EAAUT,UAAAA;gCACVU,QAAAA,EAAU,IAAMvB,oBAAAA,CAAqBW,KAAAA,CAAMb,EAAE;;AALjCa,yBAAAA,EAAAA,KAAAA,CAAMb,EAAE,CAAA;AAS5B,oBAAA,CAAA;;;;;AAKV,CAAA;AAEA;;2GAGanD,gBAAAA,GAAmB,IAAA;AAC9B,IAAA,MAAM,CAACE,QAAAA,EAAUC,WAAAA,CAAY,GAAGV,cAAAA,CAAiB,EAAA,CAAA;AACjD,IAAA,MAAM,CAACoF,WAAAA,EAAaC,cAAAA,CAAe,GAAGrF,eAAuB,EAAE,CAAA;AAC/D,IAAA,MAAM,CAACmD,cAAAA,EAAgBC,iBAAAA,CAAkB,GAAGpD,eAAmB,EAAE,CAAA;IACjE,MAAM,EAAEW,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;IAEd,MAAM,EAAE0E,cAAc,EAAE,GAAGC,6BAAAA,EAAAA;AAC3B,IAAA,MAAM,EAAElG,iBAAiB,EAAEG,gBAAgB,EAAEF,cAAc,EAAE,GAAGG,oBAAAA,EAAAA;IAChE,MAAM,EAAE+F,KAAK,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,QAAQ,EAAE,GAAGC,0BAAAA,EAAAA;IACnD,MAAM,EAAEC,eAAe,EAAEhF,SAAS,EAAEiF,KAAK,EAAE,GAAGC,6BAAAA,CAAe;AAC3DC,QAAAA,SAAAA,EAAW,CAAC9C,MAAAA,GAAAA;YACVmC,cAAAA,CAAenC,MAAAA,CAAAA;;YAEf,MAAM+C,gBAAAA,GAAmB/C,MAAAA,CAAOgD,KAAK,CAAC,CAAA,EAAG,EAAA,CAAA,CAAI1C,GAAG,CAAC,CAACC,GAAAA,GAAQA,GAAAA,CAAIC,EAAE,CAAA;YAChEN,iBAAAA,CAAkB6C,gBAAAA,CAAAA;AACpB,QAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAME,gBAAAA,GAAmB,UAAA;AACvB,QAAA,MAAMN,eAAAA,CAAgBpF,QAAAA,CAAAA;QACtB,OAAO,IAAA;AACT,IAAA,CAAA;;AAGA,IAAA,MAAM2F,kBAAkB,CAACrB,GAAAA,GAAAA;QACvB,IAAI,CAACA,KAAK,OAAO,KAAA;QACjB,IAAI;YACF,MAAMsB,MAAAA,GAAS,IAAIC,GAAAA,CAAIvB,GAAAA,CAAAA;AACvB,YAAA,OAAOsB,OAAOE,QAAQ,KAAK,eAAA,IAAmBF,MAAAA,CAAOE,QAAQ,KAAK,WAAA;AACpE,QAAA,CAAA,CAAE,OAAO9D,CAAAA,EAAG;YACV,OAAO,KAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM+D,YAAAA,GAAe,IAAA;;QAEnB9F,WAAAA,CAAY,EAAA,CAAA;AACZ2E,QAAAA,cAAAA,CAAe,EAAE,CAAA;AACjBjC,QAAAA,iBAAAA,CAAkB,EAAE,CAAA;AACpB5D,QAAAA,gBAAAA,EAAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMiH,cAAAA,GAAiB,IAAA;;QAErB,MAAMC,mBAAAA,GAAsBtB,WAAAA,CAAYpB,MAAM,CAAC,CAACP,MAAQN,cAAAA,CAAeY,QAAQ,CAACN,GAAAA,CAAIC,EAAE,CAAA,CAAA;QACtF,IAAIgD,mBAAAA,CAAoBpD,MAAM,KAAK,CAAA,EAAG;AACpC9D,YAAAA,gBAAAA,EAAAA;AACA,YAAA;AACF,QAAA;;AAGAmG,QAAAA,QAAAA,EAAAA;AAEA,QAAA,IAAIrG,cAAAA,EAAgB;;YAElBoG,WAAAA,CAAY;gBACViB,IAAAA,EAAM,MAAA;gBACNC,KAAAA,EAAO;AACL,oBAAA;wBAAEhE,IAAAA,EAAM,MAAA;wBAAQiE,IAAAA,EAAM;AAA0C,qBAAA;AAC7DH,oBAAAA,GAAAA;AACJ;AACH,aAAA,CAAA;AAEAlH,YAAAA,gBAAAA,EAAAA;QACF,CAAA,MAAO;;AAEL,YAAA,IAAI,CAACgG,KAAAA,EAAO;gBACVC,QAAAA,CAAS,yCAAA,CAAA;AACX,YAAA;YACAH,cAAAA,CAAeoB,mBAAAA,CAAAA;AACflH,YAAAA,gBAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEW,eAAA,CAAC2G,mBAAAA,EAAAA;QACCC,IAAAA,EAAM1H,iBAAAA;AACN2H,QAAAA,YAAAA,EAAc,CAACC,MAAAA,GAAAA;AACb,YAAA,IAAI,CAACA,MAAAA,EAAQT,YAAAA,EAAAA;AACf,QAAA,CAAA;AACAU,QAAAA,KAAAA,EAAOvG,EAAE,0BAAA,EAA4B,mBAAA,CAAA;QACrCwG,QAAAA,EAAUX,YAAAA;QACVY,UAAAA,EAAYX,cAAAA;;AAEZ,0BAAAnG,cAAA,CAACwG,oBAAUO,IAAI,EAAA;AACbH,gBAAAA,KAAAA,EAAOvG,EAAE,+BAAA,EAAiC,iBAAA,CAAA;AAC1C2G,gBAAAA,SAAAA,EAAW3G,EAAE,iCAAA,EAAmC,QAAA,CAAA;AAChD4G,gBAAAA,WAAAA,EAAa5G,EAAE,oBAAA,EAAsB,QAAA,CAAA;AACrC6G,gBAAAA,WAAAA,EAAa,CAAC/G,QAAAA,IAAYI,SAAAA,IAAa,CAACuF,eAAAA,CAAgB3F,QAAAA,CAAAA;gBACxDgH,MAAAA,EAAQtB,gBAAAA;AAER,gBAAA,QAAA,gBAAA7F,cAAA,CAACE,iBAAAA,EAAAA;oBAAkBC,QAAAA,EAAUA,QAAAA;oBAAUC,WAAAA,EAAaA,WAAAA;oBAAaoF,KAAAA,EAAOA;;;AAG1E,0BAAAxF,cAAA,CAACwG,oBAAUO,IAAI,EAAA;AACbH,gBAAAA,KAAAA,EAAOvG,EAAE,+BAAA,EAAiC,gBAAA,CAAA;AAC1C2G,gBAAAA,SAAAA,EAAW3G,EAAE,oBAAA,EAAsB,QAAA,CAAA;AACnC+G,gBAAAA,SAAAA,EAAW/G,EAAE,kBAAA,EAAoB,MAAA,CAAA;gBACjC6G,WAAAA,EAAarE,cAAAA,CAAeG,MAAM,KAAK,CAAA;AAEvC,gBAAA,QAAA,gBAAAhD,cAAA,CAAC2C,qBAAAA,EAAAA;oBACCC,MAAAA,EAAQkC,WAAAA;oBACRjC,cAAAA,EAAgBA,cAAAA;oBAChBC,iBAAAA,EAAmBA;;;;;AAK7B;;;;;;"}
|
|
@@ -274,7 +274,7 @@ const FigmaImageDisplayStep = ({ images, selectedImages, setSelectedImages })=>{
|
|
|
274
274
|
const { t } = useTranslations();
|
|
275
275
|
const { addAttachments } = useAttachments();
|
|
276
276
|
const { isFigmaUploadOpen, closeFigmaUpload, submitOnFinish } = useUploadFigmaToChat();
|
|
277
|
-
const { input, setInput,
|
|
277
|
+
const { input, setInput, sendMessage, openChat } = useStrapiChat();
|
|
278
278
|
const { processFigmaUrl, isLoading, error } = useFigmaUpload({
|
|
279
279
|
onSuccess: (images)=>{
|
|
280
280
|
setFigmaImages(images);
|