@strapi/content-type-builder 5.31.3 → 5.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AIChat/Chat.js +3 -1
- package/dist/admin/components/AIChat/Chat.js.map +1 -1
- package/dist/admin/components/AIChat/Chat.mjs +4 -2
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/useFeedback.js +4 -1
- package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs +5 -2
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.js +3 -2
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +3 -2
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
- package/dist/admin/components/CTBSession/CTBSessionProvider.js +49 -0
- package/dist/admin/components/CTBSession/CTBSessionProvider.js.map +1 -0
- package/dist/admin/components/CTBSession/CTBSessionProvider.mjs +46 -0
- package/dist/admin/components/CTBSession/CTBSessionProvider.mjs.map +1 -0
- package/dist/admin/components/CTBSession/sessionContext.js +8 -0
- package/dist/admin/components/CTBSession/sessionContext.js.map +1 -0
- package/dist/admin/components/CTBSession/sessionContext.mjs +6 -0
- package/dist/admin/components/CTBSession/sessionContext.mjs.map +1 -0
- package/dist/admin/components/CTBSession/useCTBSession.js +25 -0
- package/dist/admin/components/CTBSession/useCTBSession.js.map +1 -0
- package/dist/admin/components/CTBSession/useCTBSession.mjs +23 -0
- package/dist/admin/components/CTBSession/useCTBSession.mjs.map +1 -0
- package/dist/admin/components/CTBSession/useCTBTracking.js +37 -0
- package/dist/admin/components/CTBSession/useCTBTracking.js.map +1 -0
- package/dist/admin/components/CTBSession/useCTBTracking.mjs +35 -0
- package/dist/admin/components/CTBSession/useCTBTracking.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +4 -2
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +4 -2
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +40 -3
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +41 -4
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +3 -1
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +4 -2
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js +14 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs +14 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationProvider.mjs.map +1 -1
- package/dist/admin/components/List.js +3 -1
- package/dist/admin/components/List.js.map +1 -1
- package/dist/admin/components/List.mjs +4 -2
- package/dist/admin/components/List.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +40 -37
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +40 -37
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListView.js +10 -1
- package/dist/admin/pages/ListView/ListView.js.map +1 -1
- package/dist/admin/pages/ListView/ListView.mjs +11 -2
- package/dist/admin/pages/ListView/ListView.mjs.map +1 -1
- package/dist/admin/src/components/CTBSession/CTBSessionProvider.d.ts +26 -0
- package/dist/admin/src/components/CTBSession/ctbSession.d.ts +5 -0
- package/dist/admin/src/components/CTBSession/sessionContext.d.ts +25 -0
- package/dist/admin/src/components/CTBSession/useCTBSession.d.ts +12 -0
- package/dist/admin/src/components/CTBSession/useCTBTracking.d.ts +13 -0
- package/dist/admin/translations/ru.json.js +74 -30
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +74 -30
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +6 -0
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +6 -0
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/validation/types.js +1 -1
- package/dist/server/controllers/validation/types.js.map +1 -1
- package/dist/server/controllers/validation/types.mjs +1 -1
- package/dist/server/controllers/validation/types.mjs.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -6,6 +6,8 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
|
6
6
|
var designSystem = require('@strapi/design-system');
|
|
7
7
|
var Icons = require('@strapi/icons');
|
|
8
8
|
var styledComponents = require('styled-components');
|
|
9
|
+
require('../CTBSession/sessionContext.js');
|
|
10
|
+
var useCTBTracking = require('../CTBSession/useCTBTracking.js');
|
|
9
11
|
var Alert = require('./components/Alert.js');
|
|
10
12
|
var AnimatedBox = require('./components/AnimatedBox.js');
|
|
11
13
|
var AttachmentPreview = require('./components/Attachments/AttachmentPreview.js');
|
|
@@ -34,7 +36,7 @@ var UploadFigmaModal = require('./UploadFigmaModal.js');
|
|
|
34
36
|
const ChatSuggestions = ()=>{
|
|
35
37
|
const { sendMessage } = ChatProvider.useStrapiChat();
|
|
36
38
|
const { t } = useTranslations.useTranslations();
|
|
37
|
-
const { trackUsage } =
|
|
39
|
+
const { trackUsage } = useCTBTracking.useCTBTracking();
|
|
38
40
|
const SUGGESTIONS = [
|
|
39
41
|
t('chat.input.defaults.generate', 'Generate a product schema'),
|
|
40
42
|
t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder'),
|
|
@@ -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, useTracking, 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 { 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 } = useTracking();\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","useTracking","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, 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,9 +1,11 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useEffect, useRef, useState } from 'react';
|
|
3
|
-
import { useGuidedTour, useAppInfo, tours
|
|
3
|
+
import { useGuidedTour, useAppInfo, tours } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { Flex, IconButton, Typography, Box, Button } from '@strapi/design-system';
|
|
5
5
|
import { Sparkle, Plus, ArrowUp, Paperclip, Code, Upload } from '@strapi/icons';
|
|
6
6
|
import { styled } from 'styled-components';
|
|
7
|
+
import '../CTBSession/sessionContext.mjs';
|
|
8
|
+
import { useCTBTracking } from '../CTBSession/useCTBTracking.mjs';
|
|
7
9
|
import { Alert } from './components/Alert.mjs';
|
|
8
10
|
import { AnimatedBox } from './components/AnimatedBox.mjs';
|
|
9
11
|
import { AttachmentPreview } from './components/Attachments/AttachmentPreview.mjs';
|
|
@@ -32,7 +34,7 @@ import { useUploadFigmaToChat } from './UploadFigmaModal.mjs';
|
|
|
32
34
|
const ChatSuggestions = ()=>{
|
|
33
35
|
const { sendMessage } = useStrapiChat();
|
|
34
36
|
const { t } = useTranslations();
|
|
35
|
-
const { trackUsage } =
|
|
37
|
+
const { trackUsage } = useCTBTracking();
|
|
36
38
|
const SUGGESTIONS = [
|
|
37
39
|
t('chat.input.defaults.generate', 'Generate a product schema'),
|
|
38
40
|
t('chat.input.defaults.ctb', 'Tell me about the Content-Type Builder'),
|
|
@@ -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, useTracking, 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 { 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 } = useTracking();\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","useTracking","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, 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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"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
5
|
+
require('react/jsx-runtime');
|
|
6
|
+
require('../../CTBSession/sessionContext.js');
|
|
7
|
+
var useCTBTracking = require('../../CTBSession/useCTBTracking.js');
|
|
5
8
|
var ChatProvider = require('../providers/ChatProvider.js');
|
|
6
9
|
var useAIFetch = require('./useAIFetch.js');
|
|
7
10
|
var useTranslations = require('./useTranslations.js');
|
|
@@ -10,7 +13,7 @@ const useFeedback = ()=>{
|
|
|
10
13
|
const { fetch: sendFeedback, isPending, error } = useAIFetch.useFetchSendFeedback();
|
|
11
14
|
const { id, messages, schemas } = ChatProvider.useStrapiChat();
|
|
12
15
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
13
|
-
const { trackUsage } =
|
|
16
|
+
const { trackUsage } = useCTBTracking.useCTBTracking();
|
|
14
17
|
const { t } = useTranslations.useTranslations();
|
|
15
18
|
// Keep track of messages that have received feedback
|
|
16
19
|
const [votedMessages, setVotedMessages] = React.useState({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeedback.js","sources":["../../../../../admin/src/components/AIChat/hooks/useFeedback.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useNotification
|
|
1
|
+
{"version":3,"file":"useFeedback.js","sources":["../../../../../admin/src/components/AIChat/hooks/useFeedback.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\n\nimport { useCTBTracking } from '../../CTBSession/ctbSession';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { FeedbackReasonIds, useFetchSendFeedback } from './useAIFetch';\nimport { useTranslations } from './useTranslations';\n\nexport const useFeedback = () => {\n const { fetch: sendFeedback, isPending, error } = useFetchSendFeedback();\n const { id, messages, schemas } = useStrapiChat();\n const { toggleNotification } = useNotification();\n const { trackUsage } = useCTBTracking();\n const { t } = useTranslations();\n\n // Keep track of messages that have received feedback\n const [votedMessages, setVotedMessages] = useState<Record<string, 'upvote' | 'downvote'>>({});\n\n const hasVoted = (messageId: string) => {\n return !!votedMessages[messageId];\n };\n\n const upvoteMessage = (messageId: string) => {\n // Prevent spamming upvote\n if (hasVoted(messageId)) {\n return Promise.resolve();\n }\n\n trackUsage('didVoteAnswer', {\n value: 'positive',\n });\n\n toggleNotification({\n type: 'success',\n message: t('chat.feedback.submitted', 'Thank you for your feedback! '),\n });\n\n // Record this message as upvoted\n setVotedMessages((prev) => ({ ...prev, [messageId]: 'upvote' }));\n\n return sendFeedback({\n body: {\n type: 'upvote',\n chatId: id,\n messageId,\n messages,\n schemas,\n },\n });\n };\n\n const downvoteMessage = (messageId: string, feedback: string, reasons: FeedbackReasonIds[]) => {\n trackUsage('didVoteAnswer', {\n value: 'negative',\n });\n\n toggleNotification({\n type: 'success',\n message: t('chat.feedback.submitted', 'Thank you for your feedback! '),\n });\n\n return sendFeedback({\n body: {\n type: 'downvote',\n chatId: id,\n messageId,\n messages,\n feedback,\n reasons,\n schemas,\n },\n });\n };\n\n return { upvoteMessage, downvoteMessage, isPending, error };\n};\n"],"names":["useFeedback","fetch","sendFeedback","isPending","error","useFetchSendFeedback","id","messages","schemas","useStrapiChat","toggleNotification","useNotification","trackUsage","useCTBTracking","t","useTranslations","votedMessages","setVotedMessages","useState","hasVoted","messageId","upvoteMessage","Promise","resolve","value","type","message","prev","body","chatId","downvoteMessage","feedback","reasons"],"mappings":";;;;;;;;;;;MAUaA,WAAc,GAAA,IAAA;IACzB,MAAM,EAAEC,OAAOC,YAAY,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGC,+BAAAA,EAAAA;AAClD,IAAA,MAAM,EAAEC,EAAE,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAGC,0BAAAA,EAAAA;IAClC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;IACvB,MAAM,EAAEC,CAAC,EAAE,GAAGC,+BAAAA,EAAAA;;AAGd,IAAA,MAAM,CAACC,aAAAA,EAAeC,gBAAiB,CAAA,GAAGC,eAAgD,EAAC,CAAA;AAE3F,IAAA,MAAMC,WAAW,CAACC,SAAAA,GAAAA;AAChB,QAAA,OAAO,CAAC,CAACJ,aAAa,CAACI,SAAU,CAAA;AACnC,KAAA;AAEA,IAAA,MAAMC,gBAAgB,CAACD,SAAAA,GAAAA;;AAErB,QAAA,IAAID,SAASC,SAAY,CAAA,EAAA;AACvB,YAAA,OAAOE,QAAQC,OAAO,EAAA;AACxB;AAEAX,QAAAA,UAAAA,CAAW,eAAiB,EAAA;YAC1BY,KAAO,EAAA;AACT,SAAA,CAAA;QAEAd,kBAAmB,CAAA;YACjBe,IAAM,EAAA,SAAA;AACNC,YAAAA,OAAAA,EAASZ,EAAE,yBAA2B,EAAA,+BAAA;AACxC,SAAA,CAAA;;QAGAG,gBAAiB,CAAA,CAACU,QAAU;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAACP,YAAY;aAAS,CAAA,CAAA;AAE7D,QAAA,OAAOlB,YAAa,CAAA;YAClB0B,IAAM,EAAA;gBACJH,IAAM,EAAA,QAAA;gBACNI,MAAQvB,EAAAA,EAAAA;AACRc,gBAAAA,SAAAA;AACAb,gBAAAA,QAAAA;AACAC,gBAAAA;AACF;AACF,SAAA,CAAA;AACF,KAAA;IAEA,MAAMsB,eAAAA,GAAkB,CAACV,SAAAA,EAAmBW,QAAkBC,EAAAA,OAAAA,GAAAA;AAC5DpB,QAAAA,UAAAA,CAAW,eAAiB,EAAA;YAC1BY,KAAO,EAAA;AACT,SAAA,CAAA;QAEAd,kBAAmB,CAAA;YACjBe,IAAM,EAAA,SAAA;AACNC,YAAAA,OAAAA,EAASZ,EAAE,yBAA2B,EAAA,+BAAA;AACxC,SAAA,CAAA;AAEA,QAAA,OAAOZ,YAAa,CAAA;YAClB0B,IAAM,EAAA;gBACJH,IAAM,EAAA,UAAA;gBACNI,MAAQvB,EAAAA,EAAAA;AACRc,gBAAAA,SAAAA;AACAb,gBAAAA,QAAAA;AACAwB,gBAAAA,QAAAA;AACAC,gBAAAA,OAAAA;AACAxB,gBAAAA;AACF;AACF,SAAA,CAAA;AACF,KAAA;IAEA,OAAO;AAAEa,QAAAA,aAAAA;AAAeS,QAAAA,eAAAA;AAAiB3B,QAAAA,SAAAA;AAAWC,QAAAA;AAAM,KAAA;AAC5D;;;;"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
|
-
import { useNotification
|
|
2
|
+
import { useNotification } from '@strapi/admin/strapi-admin';
|
|
3
|
+
import 'react/jsx-runtime';
|
|
4
|
+
import '../../CTBSession/sessionContext.mjs';
|
|
5
|
+
import { useCTBTracking } from '../../CTBSession/useCTBTracking.mjs';
|
|
3
6
|
import { useStrapiChat } from '../providers/ChatProvider.mjs';
|
|
4
7
|
import { useFetchSendFeedback } from './useAIFetch.mjs';
|
|
5
8
|
import { useTranslations } from './useTranslations.mjs';
|
|
@@ -8,7 +11,7 @@ const useFeedback = ()=>{
|
|
|
8
11
|
const { fetch: sendFeedback, isPending, error } = useFetchSendFeedback();
|
|
9
12
|
const { id, messages, schemas } = useStrapiChat();
|
|
10
13
|
const { toggleNotification } = useNotification();
|
|
11
|
-
const { trackUsage } =
|
|
14
|
+
const { trackUsage } = useCTBTracking();
|
|
12
15
|
const { t } = useTranslations();
|
|
13
16
|
// Keep track of messages that have received feedback
|
|
14
17
|
const [votedMessages, setVotedMessages] = useState({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeedback.mjs","sources":["../../../../../admin/src/components/AIChat/hooks/useFeedback.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useNotification
|
|
1
|
+
{"version":3,"file":"useFeedback.mjs","sources":["../../../../../admin/src/components/AIChat/hooks/useFeedback.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\n\nimport { useCTBTracking } from '../../CTBSession/ctbSession';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { FeedbackReasonIds, useFetchSendFeedback } from './useAIFetch';\nimport { useTranslations } from './useTranslations';\n\nexport const useFeedback = () => {\n const { fetch: sendFeedback, isPending, error } = useFetchSendFeedback();\n const { id, messages, schemas } = useStrapiChat();\n const { toggleNotification } = useNotification();\n const { trackUsage } = useCTBTracking();\n const { t } = useTranslations();\n\n // Keep track of messages that have received feedback\n const [votedMessages, setVotedMessages] = useState<Record<string, 'upvote' | 'downvote'>>({});\n\n const hasVoted = (messageId: string) => {\n return !!votedMessages[messageId];\n };\n\n const upvoteMessage = (messageId: string) => {\n // Prevent spamming upvote\n if (hasVoted(messageId)) {\n return Promise.resolve();\n }\n\n trackUsage('didVoteAnswer', {\n value: 'positive',\n });\n\n toggleNotification({\n type: 'success',\n message: t('chat.feedback.submitted', 'Thank you for your feedback! '),\n });\n\n // Record this message as upvoted\n setVotedMessages((prev) => ({ ...prev, [messageId]: 'upvote' }));\n\n return sendFeedback({\n body: {\n type: 'upvote',\n chatId: id,\n messageId,\n messages,\n schemas,\n },\n });\n };\n\n const downvoteMessage = (messageId: string, feedback: string, reasons: FeedbackReasonIds[]) => {\n trackUsage('didVoteAnswer', {\n value: 'negative',\n });\n\n toggleNotification({\n type: 'success',\n message: t('chat.feedback.submitted', 'Thank you for your feedback! '),\n });\n\n return sendFeedback({\n body: {\n type: 'downvote',\n chatId: id,\n messageId,\n messages,\n feedback,\n reasons,\n schemas,\n },\n });\n };\n\n return { upvoteMessage, downvoteMessage, isPending, error };\n};\n"],"names":["useFeedback","fetch","sendFeedback","isPending","error","useFetchSendFeedback","id","messages","schemas","useStrapiChat","toggleNotification","useNotification","trackUsage","useCTBTracking","t","useTranslations","votedMessages","setVotedMessages","useState","hasVoted","messageId","upvoteMessage","Promise","resolve","value","type","message","prev","body","chatId","downvoteMessage","feedback","reasons"],"mappings":";;;;;;;;;MAUaA,WAAc,GAAA,IAAA;IACzB,MAAM,EAAEC,OAAOC,YAAY,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGC,oBAAAA,EAAAA;AAClD,IAAA,MAAM,EAAEC,EAAE,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAGC,aAAAA,EAAAA;IAClC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,UAAU,EAAE,GAAGC,cAAAA,EAAAA;IACvB,MAAM,EAAEC,CAAC,EAAE,GAAGC,eAAAA,EAAAA;;AAGd,IAAA,MAAM,CAACC,aAAAA,EAAeC,gBAAiB,CAAA,GAAGC,SAAgD,EAAC,CAAA;AAE3F,IAAA,MAAMC,WAAW,CAACC,SAAAA,GAAAA;AAChB,QAAA,OAAO,CAAC,CAACJ,aAAa,CAACI,SAAU,CAAA;AACnC,KAAA;AAEA,IAAA,MAAMC,gBAAgB,CAACD,SAAAA,GAAAA;;AAErB,QAAA,IAAID,SAASC,SAAY,CAAA,EAAA;AACvB,YAAA,OAAOE,QAAQC,OAAO,EAAA;AACxB;AAEAX,QAAAA,UAAAA,CAAW,eAAiB,EAAA;YAC1BY,KAAO,EAAA;AACT,SAAA,CAAA;QAEAd,kBAAmB,CAAA;YACjBe,IAAM,EAAA,SAAA;AACNC,YAAAA,OAAAA,EAASZ,EAAE,yBAA2B,EAAA,+BAAA;AACxC,SAAA,CAAA;;QAGAG,gBAAiB,CAAA,CAACU,QAAU;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAACP,YAAY;aAAS,CAAA,CAAA;AAE7D,QAAA,OAAOlB,YAAa,CAAA;YAClB0B,IAAM,EAAA;gBACJH,IAAM,EAAA,QAAA;gBACNI,MAAQvB,EAAAA,EAAAA;AACRc,gBAAAA,SAAAA;AACAb,gBAAAA,QAAAA;AACAC,gBAAAA;AACF;AACF,SAAA,CAAA;AACF,KAAA;IAEA,MAAMsB,eAAAA,GAAkB,CAACV,SAAAA,EAAmBW,QAAkBC,EAAAA,OAAAA,GAAAA;AAC5DpB,QAAAA,UAAAA,CAAW,eAAiB,EAAA;YAC1BY,KAAO,EAAA;AACT,SAAA,CAAA;QAEAd,kBAAmB,CAAA;YACjBe,IAAM,EAAA,SAAA;AACNC,YAAAA,OAAAA,EAASZ,EAAE,yBAA2B,EAAA,+BAAA;AACxC,SAAA,CAAA;AAEA,QAAA,OAAOZ,YAAa,CAAA;YAClB0B,IAAM,EAAA;gBACJH,IAAM,EAAA,UAAA;gBACNI,MAAQvB,EAAAA,EAAAA;AACRc,gBAAAA,SAAAA;AACAb,gBAAAA,QAAAA;AACAwB,gBAAAA,QAAAA;AACAC,gBAAAA,OAAAA;AACAxB,gBAAAA;AACF;AACF,SAAA,CAAA;AACF,KAAA;IAEA,OAAO;AAAEa,QAAAA,aAAAA;AAAeS,QAAAA,eAAAA;AAAiB3B,QAAAA,SAAAA;AAAWC,QAAAA;AAAM,KAAA;AAC5D;;;;"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
5
|
var ee = require('@strapi/admin/strapi-admin/ee');
|
|
6
|
+
require('../../CTBSession/sessionContext.js');
|
|
7
|
+
var useCTBTracking = require('../../CTBSession/useCTBTracking.js');
|
|
7
8
|
var useDataManager = require('../../DataManager/useDataManager.js');
|
|
8
9
|
var FeedbackModal = require('../FeedbackModal.js');
|
|
9
10
|
var useAIFetch = require('../hooks/useAIFetch.js');
|
|
@@ -25,7 +26,7 @@ const BaseChatProvider = ({ children, defaultOpen = false })=>{
|
|
|
25
26
|
const [input, setInput] = React.useState('');
|
|
26
27
|
// Files
|
|
27
28
|
const [attachments, setAttachments] = React.useState([]);
|
|
28
|
-
const { trackUsage } =
|
|
29
|
+
const { trackUsage } = useCTBTracking.useCTBTracking();
|
|
29
30
|
// DataManager
|
|
30
31
|
const { components, contentTypes } = useDataManager.useDataManager();
|
|
31
32
|
// Last user seen schemas
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatProvider.js","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":";;;;;;;;;;;;;;;;AA+CA,MAAMA,4BAAcC,mBAA2CC,CAAAA,SAAAA,CAAAA;AAE/D,MAAMC,gBAAmB,GAAA,IAAA;IACvB,OAAOC,IAAAA,CAAKC,MAAM,EAAGC,CAAAA,QAAQ,CAAC,EAAIC,CAAAA,CAAAA,SAAS,CAAC,CAAG,EAAA,EAAA,CAAA;AACjD,CAAA;AAEO,MAAMC,mBAAmB,CAAC,EAC/BC,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAU,CAAA,GAAGC,cAA6BV,CAAAA,gBAAAA,EAAAA,CAAAA;AACzD,IAAA,MAAM,CAACW,UAAAA,EAAYC,aAAc,CAAA,GAAGF,cAASH,CAAAA,WAAAA,CAAAA;AAC7C,IAAA,MAAM,CAACM,SAAAA,EAAWC,YAAa,CAAA,GAAGJ,cAAS,CAAA,CAAA,CAAA;AAC3C,IAAA,MAAM,CAACK,KAAAA,EAAOC,QAAS,CAAA,GAAGN,cAAS,CAAA,EAAA,CAAA;;AAGnC,IAAA,MAAM,CAACO,WAAAA,EAAaC,cAAe,CAAA,GAAGR,eAAuB,EAAE,CAAA;IAE/D,MAAM,EAAES,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;;AAGvB,IAAA,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGC,6BAAAA,EAAAA;;IAGrC,MAAM,EAAEC,eAAe,EAAE,GAAGC,qCAAAA,EAAAA;;AAG5B,IAAA,MAAMC,UAAUC,aAAQ,CAAA,IAAA;QACtB,OAAO;eACFC,MAAOC,CAAAA,MAAM,CAACP,YAAAA,CAAAA,CACdQ,MAAM,CAAC,CAACC,MAAAA,GAAWA,MAAOC,CAAAA,MAAM,KAAK,SAAA,CACtC;AACCF,aAAAA,MAAM,CAAC,CAACC,MAAWA,GAAAA,MAAAA,CAAOE,GAAG,KAAK,gCAAA,CAAA,CAClCH,MAAM,CAAC,CAACC,MAAWA,GAAAA,MAAAA,CAAOG,OAAO,CAAA,CACjCC,GAAG,CAACC,0BAAAA,CAAAA;AACJR,YAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACR,UACdS,CAAAA,CAAAA,MAAM,CAAC,CAACC,MAAWA,GAAAA,MAAAA,CAAOC,MAAM,KAAK,SACrCG,CAAAA,CAAAA,GAAG,CAACC,0BAAAA;AACR,SAAA;KACA,EAAA;AAACd,QAAAA,YAAAA;AAAcD,QAAAA;AAAW,KAAA,CAAA;AAE7B,IAAA,MAAM,EACJgB,EAAE,EACFC,QAAQ,EACRC,WAAaC,EAAAA,YAAY,EACzBR,MAAM,EACNS,IAAI,EACJ,GAAGC,IAAAA,EACJ,GAAGC,oBAAU,CAAA;AACZN,QAAAA,EAAAA,EAAI7B,MAAQL,EAAAA,QAAAA,EAAAA;QACZyC,qBAAuB,EAAA;AACzB,KAAA,CAAA;AAEA;;AAEkG;IAGlG,MAAML,WAAAA,GAAmC,OAAOM,OAASC,EAAAA,OAAAA,GAAAA;QACvD,IAAId,MAAAA,KAAW,WAAeA,IAAAA,MAAAA,KAAW,WAAa,EAAA;AACpD,YAAA;AACF;AAEA,QAAA,OAAOQ,aAAaK,OAAS,EAAA;AAC3B,YAAA,GAAGC,OAAO;YACVC,IAAM,EAAA;AACJ,gBAAA,GAAGD,SAASC,IAAI;AAChBrB,gBAAAA,OAAAA;gBACAsB,QAAU,EAAA;AACRxB,oBAAAA,eAAAA,EAAiBA,gBAAgBW,GAAG,CAAC,CAACJ,MAAAA,GAAWA,OAAOE,GAAG;AAC7D;AACF;AACF,SAAA,CAAA;AACF,KAAA;AAEA,IAAA,MAAMgB,eAAe,CAACC,CAAAA,GAAAA;AACpBA,QAAAA,CAAAA,CAAEC,cAAc,EAAA;QAEhB,IAAInB,MAAAA,KAAW,WAAeA,IAAAA,MAAAA,KAAW,WAAa,EAAA;AACpD,YAAA;AACF;QAEA,MAAMoB,gBAAAA,GAAmBnC,YAAYa,MAAM,CAAC,CAACuB,CAAMA,GAAAA,CAAAA,CAAErB,MAAM,KAAK,SAAA,CAAA;QAChE,IAAIjB,KAAAA,CAAMuC,IAAI,EAAGC,CAAAA,MAAM,KAAK,CAAKtC,IAAAA,WAAAA,CAAYsC,MAAM,KAAK,CAAG,EAAA;AACzD,YAAA;AACF;AAEA,QAAA,MAAMC,QAAQJ,gBAAiBjB,CAAAA,GAAG,CAChC,CAACsB,cACE;gBACCC,IAAM,EAAA,MAAA;AACNC,gBAAAA,QAAAA,EAAUF,WAAWE,QAAQ;AAC7BC,gBAAAA,SAAAA,EAAWH,WAAWG,SAAS;AAC/BC,gBAAAA,GAAAA,EAAKJ,WAAWI;aAClB,CAAA,CAAA;QAEJtB,WAAY,CAAA;YAAEuB,IAAM/C,EAAAA,KAAAA;AAAOyC,YAAAA;AAAM,SAAA,CAAA;QACjCxC,QAAS,CAAA,EAAA,CAAA;AACTE,QAAAA,cAAAA,CAAe,EAAE,CAAA;AACnB,KAAA;AAEA;;uGAGA,MAAM,EAAE6C,KAAK,EAAEC,aAAa,EAAEC,UAAU,EAAE,GAAGC,yBAAa,CAAA;QAAE1D,MAAQ6B,EAAAA,EAAAA;AAAIC,QAAAA;AAAS,KAAA,CAAA;;IAGjF6B,eAAU,CAAA,IAAA;AACR,QAAA,IAAI7B,QAASiB,CAAAA,MAAM,IAAI,CAAA,IAAK,CAACQ,KAAO,EAAA;AAClCC,YAAAA,aAAAA,EAAAA;AACF;KACC,EAAA;AAAC1B,QAAAA,QAAAA,CAASiB,MAAM;AAAEQ,QAAAA,KAAAA;AAAOC,QAAAA;AAAc,KAAA,CAAA;IAE1CG,eAAU,CAAA,IAAA;AACR,QAAA,IAAInC,WAAW,OAAS,EAAA;AACtBb,YAAAA,UAAAA,CAAW,kBAAoB,EAAA;gBAC7BiD,UAAY,EAAA;AACd,aAAA,CAAA;AACF,SAAA,MAAO,IACLpC,MAAAA,KAAW,OACXM,IAAAA,QAAAA,CAASiB,MAAM,GAAG,CAAA,IAClBjB,QAAQ,CAACA,SAASiB,MAAM,GAAG,CAAE,CAAA,EAAEc,SAAS,WACxC,EAAA;AACAlD,YAAAA,UAAAA,CAAW,kBAAoB,EAAA;gBAC7BiD,UAAY,EAAA;AACd,aAAA,CAAA;AACF;KACC,EAAA;AAACpC,QAAAA,MAAAA;AAAQM,QAAAA,QAAAA;AAAUnB,QAAAA;AAAW,KAAA,CAAA;AAEjC,IAAA,MAAMmD,eAAkBC,GAAAA,oBAAAA,EAAAA;IAExB,qBACEC,cAAA,CAAC3E,YAAY4E,QAAQ,EAAA;QACnBC,KAAO,EAAA;YACLC,aAAeL,EAAAA,eAAAA;AACfjC,YAAAA,EAAAA;AACAL,YAAAA,MAAAA;AACAS,YAAAA,IAAAA;AACAF,YAAAA,WAAAA;AACA,YAAA,GAAGG,IAAI;AACPJ,YAAAA,QAAAA;AACAW,YAAAA,YAAAA;AACAlC,YAAAA,KAAAA;AACAC,YAAAA,QAAAA;AACA4D,YAAAA,iBAAAA,EAAmB,CAAC1B,CAAMlC,GAAAA,QAAAA,CAASkC,CAAE2B,CAAAA,MAAM,CAACH,KAAK,CAAA;YACjDI,KAAO,EAAA,IAAA;AACLrC,gBAAAA,IAAAA,EAAAA;gBACAhC,SAAUT,CAAAA,gBAAAA,EAAAA,CAAAA;gBACVmB,UAAW,CAAA,iBAAA,CAAA;AACX8C,gBAAAA,UAAAA,EAAAA;AACF,aAAA;AACAvC,YAAAA,OAAAA;;AAEAqC,YAAAA,KAAAA;AACApD,YAAAA,UAAAA;YACAoE,QAAU,EAAA,IAAA;gBACRnE,aAAc,CAAA,IAAA,CAAA;;AAEd,gBAAA,IAAIC,cAAc,CAAG,EAAA;oBACnBM,UAAW,CAAA,iBAAA,CAAA;AACb;gBACAL,YAAa,CAAA,CAACkE,OAASA,IAAO,GAAA,CAAA,CAAA;AAChC,aAAA;AACAC,YAAAA,SAAAA,EAAW,IAAMrE,aAAc,CAAA,KAAA,CAAA;;AAE/BK,YAAAA,WAAAA;AACAC,YAAAA;AACF,SAAA;AAECZ,QAAAA,QAAAA,EAAAA;;AAGP;AAEO,MAAM4E,eAAe,CAAC,EAC3B5E,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,qBACEiE,cAACnE,CAAAA,gBAAAA,EAAAA;QAAiBE,WAAaA,EAAAA,WAAAA;AAC7B,QAAA,QAAA,gBAAAiE,cAACW,CAAAA,iCAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAX,cAACY,CAAAA,2CAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAZ,cAACa,CAAAA,0CAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAb,cAACc,CAAAA,8BAAAA,EAAAA;AAAkBhF,wBAAAA,QAAAA,EAAAA;;;;;;AAM/B;AAEO,SAASiF,aAAAA,GAAAA;AACd,IAAA,MAAMC,UAAUC,gBAAW5F,CAAAA,WAAAA,CAAAA;AAE3B,IAAA,IAAI6F,OAAQC,CAAAA,GAAG,CAACC,QAAQ,KAAK,aAAe,EAAA;;;AAG1C,QAAA,IAAIJ,YAAYzF,SAAW,EAAA;AACzB8F,YAAAA,OAAAA,CAAQC,IAAI,CACV,6FAAA,CAAA;AAEF,YAAA,OAAO,EAAC;AACV;KACK,MAAA,IAAIN,YAAYzF,SAAW,EAAA;AAChC,QAAA,MAAM,IAAIgG,KAAM,CAAA,kDAAA,CAAA;AAClB;IACA,OAAOP,OAAAA;AACT;;;;;;"}
|
|
1
|
+
{"version":3,"file":"ChatProvider.js","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useCTBTracking } from '../../CTBSession/ctbSession';\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useCTBTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useCTBTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useMemo, useEffect, useContext, createContext } from 'react';
|
|
3
|
-
import { useTracking } from '@strapi/admin/strapi-admin';
|
|
4
3
|
import { useAIAvailability } from '@strapi/admin/strapi-admin/ee';
|
|
4
|
+
import '../../CTBSession/sessionContext.mjs';
|
|
5
|
+
import { useCTBTracking } from '../../CTBSession/useCTBTracking.mjs';
|
|
5
6
|
import { useDataManager } from '../../DataManager/useDataManager.mjs';
|
|
6
7
|
import { FeedbackProvider } from '../FeedbackModal.mjs';
|
|
7
8
|
import { useAIChat } from '../hooks/useAIFetch.mjs';
|
|
@@ -23,7 +24,7 @@ const BaseChatProvider = ({ children, defaultOpen = false })=>{
|
|
|
23
24
|
const [input, setInput] = useState('');
|
|
24
25
|
// Files
|
|
25
26
|
const [attachments, setAttachments] = useState([]);
|
|
26
|
-
const { trackUsage } =
|
|
27
|
+
const { trackUsage } = useCTBTracking();
|
|
27
28
|
// DataManager
|
|
28
29
|
const { components, contentTypes } = useDataManager();
|
|
29
30
|
// Last user seen schemas
|