@envive-ai/react-toolkit-v3 0.3.22 → 0.3.24
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/AnimatedText/AnimatedText.d.cts +3 -3
- package/dist/AnimatedText/AnimatedText.d.ts +3 -3
- package/dist/CSSVariablesEditor/CssVariablesEditorComponent.d.cts +2 -2
- package/dist/CSSVariablesEditor/CssVariablesEditorComponent.d.ts +2 -2
- package/dist/CSSVariablesEditor/hooks/useGetCssVariablesOptions.cjs +1 -1
- package/dist/CSSVariablesEditor/hooks/useGetCssVariablesOptions.js +1 -1
- package/dist/CSSVariablesEditor/hooks/useGetCurrentMerchantColors.cjs +1 -1
- package/dist/CSSVariablesEditor/hooks/useGetCurrentMerchantColors.js +1 -1
- package/dist/CSSVariablesEditor/hooks/useGetDefaultCssVariables.cjs +4 -4
- package/dist/CSSVariablesEditor/hooks/useGetDefaultCssVariables.js +4 -4
- package/dist/CSSVariablesEditor/hooks/useHandleUpdateCssVars.cjs +3 -3
- package/dist/CSSVariablesEditor/hooks/useHandleUpdateCssVars.js +3 -3
- package/dist/Carousel/Carousel.d.cts +2 -2
- package/dist/Carousel/components/Badge.cjs +1 -1
- package/dist/Carousel/components/Badge.js +1 -1
- package/dist/Carousel/components/Container.cjs +1 -1
- package/dist/Carousel/components/Container.js +1 -1
- package/dist/ChatFooter/ChatFooter.cjs +7 -3
- package/dist/ChatFooter/ChatFooter.d.cts +7 -3
- package/dist/ChatFooter/ChatFooter.d.ts +7 -3
- package/dist/ChatFooter/ChatFooter.js +7 -3
- package/dist/ChatFooter/components/Layout.cjs +1 -1
- package/dist/ChatFooter/components/Layout.js +1 -1
- package/dist/ChatFooter/components/index.d.cts +10 -6
- package/dist/ChatFooter/components/index.d.ts +10 -6
- package/dist/ChatFooter/types/types.d.cts +16 -0
- package/dist/ChatFooter/types/types.d.ts +16 -0
- package/dist/ChatHeader/ChatHeader.cjs +2 -1
- package/dist/ChatHeader/ChatHeader.d.cts +2 -2
- package/dist/ChatHeader/ChatHeader.d.ts +2 -2
- package/dist/ChatHeader/ChatHeader.js +2 -1
- package/dist/ChatHeader/components/Handle.cjs +2 -2
- package/dist/ChatHeader/components/Handle.js +2 -2
- package/dist/ChatHeader/hooks/useGetHandleProperties.cjs +4 -2
- package/dist/ChatHeader/hooks/useGetHandleProperties.js +4 -2
- package/dist/ChatHeader/hooks/useGetLayoutProperties.cjs +1 -1
- package/dist/ChatHeader/hooks/useGetLayoutProperties.js +1 -1
- package/dist/ChatHeader/hooks/useGetToggleOptionProperties.cjs +1 -1
- package/dist/ChatHeader/hooks/useGetToggleOptionProperties.js +1 -1
- package/dist/ChatPreview/ChatPreview.cjs +6 -3
- package/dist/ChatPreview/ChatPreview.d.cts +2 -2
- package/dist/ChatPreview/ChatPreview.d.ts +2 -2
- package/dist/ChatPreview/ChatPreview.js +6 -3
- package/dist/ChatPreview/index.d.cts +2 -2
- package/dist/ChatPreview/index.d.ts +2 -2
- package/dist/ChatPreview/types/types.d.cts +13 -1
- package/dist/ChatPreview/types/types.d.ts +13 -1
- package/dist/ChatPreviewComparison/ChatPreviewComparison.cjs +6 -3
- package/dist/ChatPreviewComparison/ChatPreviewComparison.d.cts +2 -2
- package/dist/ChatPreviewComparison/ChatPreviewComparison.d.ts +2 -2
- package/dist/ChatPreviewComparison/ChatPreviewComparison.js +6 -3
- package/dist/ChatPreviewComparison/components/Layout.cjs +2 -2
- package/dist/ChatPreviewComparison/components/Layout.js +2 -2
- package/dist/ChatPreviewComparison/index.d.cts +2 -2
- package/dist/ChatPreviewComparison/index.d.ts +2 -2
- package/dist/ChatPreviewComparison/types/types.d.cts +13 -1
- package/dist/ChatPreviewComparison/types/types.d.ts +13 -1
- package/dist/ChatPreviewLoading/ChatPreviewLoading.cjs +7 -2
- package/dist/ChatPreviewLoading/ChatPreviewLoading.d.cts +4 -3
- package/dist/ChatPreviewLoading/ChatPreviewLoading.d.ts +2 -1
- package/dist/ChatPreviewLoading/ChatPreviewLoading.js +7 -2
- package/dist/ChatPreviewLoading/types/types.d.cts +4 -0
- package/dist/ChatPreviewLoading/types/types.d.ts +4 -0
- package/dist/Container/Container.d.cts +172 -172
- package/dist/Container/Container.d.ts +172 -172
- package/dist/DesignTokens/DesignTokensComponent.d.cts +2 -2
- package/dist/DesignTokens/DesignTokensComponent.d.ts +2 -2
- package/dist/DesignTokens/components/FontFamily.cjs +1 -1
- package/dist/DesignTokens/components/FontFamily.js +1 -1
- package/dist/DesignTokens/components/FontSize.cjs +1 -1
- package/dist/DesignTokens/components/FontSize.js +1 -1
- package/dist/DesignTokens/components/FontWeight.cjs +1 -1
- package/dist/DesignTokens/components/FontWeight.js +1 -1
- package/dist/DesignTokens/components/LetterSpacing.cjs +1 -1
- package/dist/DesignTokens/components/LetterSpacing.js +1 -1
- package/dist/DesignTokens/components/LineHeight.cjs +1 -1
- package/dist/DesignTokens/components/LineHeight.js +1 -1
- package/dist/DesignTokens/components/Typography.cjs +1 -1
- package/dist/DesignTokens/components/Typography.js +1 -1
- package/dist/Disclaimer/components/Container.cjs +2 -2
- package/dist/Disclaimer/components/Container.js +2 -2
- package/dist/DocumentRetrievalCard/DocumentRetrievalCard.d.ts +2 -2
- package/dist/DocumentRetrievalCard/components/Image.cjs +1 -1
- package/dist/DocumentRetrievalCard/components/Image.js +1 -1
- package/dist/DocumentRetrievalCard/components/Layout.cjs +1 -1
- package/dist/DocumentRetrievalCard/components/Layout.js +1 -1
- package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Icon.cjs +1 -1
- package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Icon.js +1 -1
- package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Label.cjs +1 -1
- package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Label.js +1 -1
- package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Layout.cjs +1 -1
- package/dist/DocumentRetrievalCard/components/ViewArticleButton/components/Layout.js +1 -1
- package/dist/FloatingButton/FloatingButton.d.cts +2 -2
- package/dist/FloatingButton/components/Button.cjs +1 -1
- package/dist/FloatingButton/components/Button.js +1 -1
- package/dist/FloatingButton/components/Container.cjs +1 -1
- package/dist/FloatingButton/components/Container.js +1 -1
- package/dist/FloatingButton/components/Wrapper.cjs +1 -1
- package/dist/FloatingButton/components/Wrapper.js +1 -1
- package/dist/FloatingChat/FloatingChat.cjs +32 -4
- package/dist/FloatingChat/FloatingChat.d.cts +2 -2
- package/dist/FloatingChat/FloatingChat.d.ts +2 -2
- package/dist/FloatingChat/FloatingChat.js +33 -5
- package/dist/FloatingChat/components/AgentMessage.cjs +2 -2
- package/dist/FloatingChat/components/AgentMessage.js +2 -2
- package/dist/FloatingChat/components/ChatMessages.cjs +1 -1
- package/dist/FloatingChat/components/ChatMessages.js +1 -1
- package/dist/FloatingChat/components/Layout.cjs +1 -1
- package/dist/FloatingChat/components/Layout.js +1 -1
- package/dist/FloatingChat/components/ProductResultsModal.cjs +1 -1
- package/dist/FloatingChat/components/ProductResultsModal.js +1 -1
- package/dist/FloatingChat/components/ResultsGridView.cjs +1 -1
- package/dist/FloatingChat/components/ResultsGridView.js +1 -1
- package/dist/FloatingChat/components/SalesAgentBadgeContent.cjs +1 -1
- package/dist/FloatingChat/components/SalesAgentBadgeContent.js +1 -1
- package/dist/FloatingChat/components/SlideChatContent.cjs +1 -1
- package/dist/FloatingChat/components/SlideChatContent.js +1 -1
- package/dist/FloatingChat/hooks/useChatSuggestions.cjs +3 -5
- package/dist/FloatingChat/hooks/useChatSuggestions.js +4 -6
- package/dist/Form/Form.cjs +1 -1
- package/dist/Form/Form.js +1 -1
- package/dist/Form/components/Layout.cjs +1 -1
- package/dist/Form/components/Layout.js +1 -1
- package/dist/Form/components/SubmitButtonItem.cjs +1 -1
- package/dist/Form/components/SubmitButtonItem.js +1 -1
- package/dist/Form/components/TextFieldItem.cjs +1 -1
- package/dist/Form/components/TextFieldItem.js +1 -1
- package/dist/FullPageSalesAgent/FullPageSalesAgent.cjs +29 -2
- package/dist/FullPageSalesAgent/FullPageSalesAgent.d.cts +5 -3
- package/dist/FullPageSalesAgent/FullPageSalesAgent.d.ts +5 -3
- package/dist/FullPageSalesAgent/FullPageSalesAgent.js +30 -3
- package/dist/FullPageSalesAgent/components/Layout.cjs +1 -1
- package/dist/FullPageSalesAgent/components/Layout.js +1 -1
- package/dist/Image/Image.cjs +1 -1
- package/dist/Image/Image.d.cts +2 -2
- package/dist/Image/Image.d.ts +2 -2
- package/dist/Image/Image.js +1 -1
- package/dist/ImageGallery/ImageGallery.d.cts +2 -2
- package/dist/ImageGallery/ImageGallery.d.ts +2 -2
- package/dist/ImageGallery/components/Layout.cjs +1 -1
- package/dist/ImageGallery/components/Layout.js +1 -1
- package/dist/ImageGallery/utils/functions.cjs +1 -1
- package/dist/ImageGallery/utils/functions.js +1 -1
- package/dist/MarkdownProcessor/MarkdownProcessor.d.cts +2 -2
- package/dist/Message/components/Layout.cjs +1 -1
- package/dist/Message/components/Layout.js +1 -1
- package/dist/OrderLookupCard/OrderLookupCard.cjs +1 -1
- package/dist/OrderLookupCard/OrderLookupCard.js +1 -1
- package/dist/OrderLookupCard/components/Layout.cjs +1 -1
- package/dist/OrderLookupCard/components/Layout.js +1 -1
- package/dist/OrderLookupCard/components/MoreProductsOverlay.cjs +1 -1
- package/dist/OrderLookupCard/components/MoreProductsOverlay.js +1 -1
- package/dist/OrderLookupCard/components/ProductImageGridItem.cjs +1 -1
- package/dist/OrderLookupCard/components/ProductImageGridItem.js +1 -1
- package/dist/OrderLookupCard/components/ProductImageItem.cjs +1 -1
- package/dist/OrderLookupCard/components/ProductImageItem.js +1 -1
- package/dist/OrderLookupCard/components/ProductImagesGrid.cjs +1 -1
- package/dist/OrderLookupCard/components/ProductImagesGrid.js +1 -1
- package/dist/OrderLookupCard/components/StatusLabel.cjs +1 -1
- package/dist/OrderLookupCard/components/StatusLabel.js +1 -1
- package/dist/OrderLookupCard/components/TrackOrderLink.cjs +1 -1
- package/dist/OrderLookupCard/components/TrackOrderLink.js +1 -1
- package/dist/ProductCard/ProductCard.cjs +6 -2
- package/dist/ProductCard/ProductCard.d.cts +6 -3
- package/dist/ProductCard/ProductCard.d.ts +6 -3
- package/dist/ProductCard/ProductCard.js +6 -2
- package/dist/ProductCard/index.d.cts +2 -2
- package/dist/ProductCard/index.d.ts +2 -2
- package/dist/ProductCard/types/index.d.cts +7 -1
- package/dist/ProductCard/types/index.d.ts +7 -1
- package/dist/PromptButton/PromptButton.cjs +1 -1
- package/dist/PromptButton/PromptButton.d.cts +2 -2
- package/dist/PromptButton/PromptButton.js +1 -1
- package/dist/PromptButton/components/Layout.cjs +1 -1
- package/dist/PromptButton/components/Layout.js +1 -1
- package/dist/PromptButton/components/Loading.cjs +1 -1
- package/dist/PromptButton/components/Loading.js +1 -1
- package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.cjs +5 -2
- package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.cts +6 -3
- package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.d.ts +6 -3
- package/dist/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.js +5 -2
- package/dist/PromptButtonCarouselWithImage/components/Layout.cjs +1 -1
- package/dist/PromptButtonCarouselWithImage/components/Layout.js +1 -1
- package/dist/PromptButtonCarouselWithImage/components/Skeleton.cjs +1 -1
- package/dist/PromptButtonCarouselWithImage/components/Skeleton.js +1 -1
- package/dist/PromptButtonCarouselWithImage/types/types.d.cts +12 -0
- package/dist/PromptButtonCarouselWithImage/types/types.d.ts +12 -0
- package/dist/PromptCarousel/PromptCarousel.cjs +1 -1
- package/dist/PromptCarousel/PromptCarousel.d.cts +2 -2
- package/dist/PromptCarousel/PromptCarousel.d.ts +2 -2
- package/dist/PromptCarousel/PromptCarousel.js +1 -1
- package/dist/PromptCarousel/hooks/useCarouselButtons.cjs +3 -2
- package/dist/PromptCarousel/hooks/useCarouselButtons.js +3 -2
- package/dist/ReviewCard/ReviewCard.d.cts +2 -2
- package/dist/ReviewCard/ReviewCard.d.ts +2 -2
- package/dist/ReviewCard/components/Container.cjs +1 -1
- package/dist/ReviewCard/components/Container.js +1 -1
- package/dist/ReviewCard/components/Rating.cjs +1 -2
- package/dist/ReviewCard/components/Rating.js +1 -2
- package/dist/ReviewCard/components/ReadMoreButton.cjs +1 -1
- package/dist/ReviewCard/components/ReadMoreButton.js +1 -1
- package/dist/ReviewCard/components/index.d.cts +6 -6
- package/dist/ReviewCard/components/index.d.ts +6 -6
- package/dist/SalesAgentProductCard/SalesAgentProductCard.d.cts +2 -2
- package/dist/SalesAgentProductCard/components/Container.cjs +1 -1
- package/dist/SalesAgentProductCard/components/Container.js +1 -1
- package/dist/SalesAgentProductCard/components/ProductImage.cjs +1 -1
- package/dist/SalesAgentProductCard/components/ProductImage.js +1 -1
- package/dist/SalesAgentProductCard/components/ProductName.cjs +1 -1
- package/dist/SalesAgentProductCard/components/ProductName.js +1 -1
- package/dist/SalesAgentProductCard/components/index.d.cts +8 -8
- package/dist/SocialProof/SocialProof.cjs +6 -3
- package/dist/SocialProof/SocialProof.d.cts +2 -2
- package/dist/SocialProof/SocialProof.d.ts +2 -2
- package/dist/SocialProof/SocialProof.js +6 -3
- package/dist/SocialProof/components/Headline.cjs +1 -1
- package/dist/SocialProof/components/Headline.js +1 -1
- package/dist/SocialProof/components/LayoutFourHorizontal.cjs +1 -1
- package/dist/SocialProof/components/LayoutFourHorizontal.js +1 -1
- package/dist/SocialProof/components/Textfield.cjs +5 -2
- package/dist/SocialProof/components/Textfield.js +5 -2
- package/dist/SocialProof/index.d.cts +2 -2
- package/dist/SocialProof/index.d.ts +2 -2
- package/dist/SocialProof/types/types.d.cts +13 -1
- package/dist/SocialProof/types/types.d.ts +13 -1
- package/dist/SparkleAnimation/SparkleAnimation.d.cts +2 -2
- package/dist/Stack/Stack.d.cts +2 -2
- package/dist/Stack/Stack.d.ts +2 -2
- package/dist/TextField/TextField.cjs +35 -3
- package/dist/TextField/TextField.d.cts +5 -1
- package/dist/TextField/TextField.d.ts +5 -1
- package/dist/TextField/TextField.js +35 -3
- package/dist/TextField/components/Input.cjs +1 -1
- package/dist/TextField/components/Input.js +1 -1
- package/dist/TextField/components/Layout.cjs +11 -8
- package/dist/TextField/components/Layout.js +11 -8
- package/dist/TextField/components/SendIcon.cjs +1 -1
- package/dist/TextField/components/SendIcon.js +1 -1
- package/dist/TextField/components/VoiceInputButton.cjs +45 -0
- package/dist/TextField/components/VoiceInputButton.js +39 -0
- package/dist/TextField/components/index.cjs +3 -1
- package/dist/TextField/components/index.js +3 -1
- package/dist/TextField/hooks/useGetMicButtonContainerProperties.cjs +20 -0
- package/dist/TextField/hooks/useGetMicButtonContainerProperties.js +19 -0
- package/dist/TextField/hooks/useGetSkeletonProperties.cjs +1 -1
- package/dist/TextField/hooks/useGetSkeletonProperties.js +1 -1
- package/dist/TextField/hooks/useVoiceInput.cjs +52 -0
- package/dist/TextField/hooks/useVoiceInput.js +50 -0
- package/dist/TextField/types/index.d.cts +11 -0
- package/dist/TextField/types/index.d.ts +11 -0
- package/dist/TextField/utils/getLayoutStateProperties.cjs +9 -1
- package/dist/TextField/utils/getLayoutStateProperties.js +8 -1
- package/dist/Title/Title.cjs +1 -1
- package/dist/Title/Title.js +1 -1
- package/dist/Title/components/Layout.cjs +1 -1
- package/dist/Title/components/Layout.js +1 -1
- package/dist/TitledPromptCarousel/TitledPromptCarousel.cjs +1 -1
- package/dist/TitledPromptCarousel/TitledPromptCarousel.d.cts +2 -2
- package/dist/TitledPromptCarousel/TitledPromptCarousel.js +1 -1
- package/dist/Tokens/index.cjs +6 -6
- package/dist/Tokens/index.js +6 -6
- package/dist/TypingAnimation/TypingAnimation.cjs +7 -3
- package/dist/TypingAnimation/TypingAnimation.d.cts +2 -2
- package/dist/TypingAnimation/TypingAnimation.d.ts +2 -2
- package/dist/TypingAnimation/TypingAnimation.js +7 -3
- package/dist/TypingAnimation/index.d.cts +2 -2
- package/dist/TypingAnimation/index.d.ts +2 -2
- package/dist/TypingAnimation/types/index.d.cts +13 -1
- package/dist/TypingAnimation/types/index.d.ts +13 -1
- package/dist/Typography/Typography.d.cts +4 -4
- package/dist/Typography/Typography.d.ts +4 -4
- package/dist/WelcomeMessage/components/Container.cjs +1 -1
- package/dist/WelcomeMessage/components/Container.js +1 -1
- package/dist/WidgetTextField/WidgetTextField.cjs +39 -7
- package/dist/WidgetTextField/WidgetTextField.d.cts +7 -3
- package/dist/WidgetTextField/WidgetTextField.d.ts +7 -3
- package/dist/WidgetTextField/WidgetTextField.js +33 -2
- package/dist/WidgetTextField/components/Container.cjs +32 -26
- package/dist/WidgetTextField/components/Container.js +32 -26
- package/dist/WidgetTextField/components/Skeleton.cjs +1 -1
- package/dist/WidgetTextField/components/Skeleton.js +1 -1
- package/dist/WidgetTextField/hooks/useGetContainerProperties.cjs +5 -3
- package/dist/WidgetTextField/hooks/useGetContainerProperties.js +5 -3
- package/dist/WidgetTextField/hooks/useGetMicWidgetButtonProperties.cjs +20 -0
- package/dist/WidgetTextField/hooks/useGetMicWidgetButtonProperties.js +19 -0
- package/dist/WidgetTextField/types/types.d.cts +21 -0
- package/dist/WidgetTextField/types/types.d.ts +21 -0
- package/dist/WidgetWrapper/WidgetWrapper.cjs +1 -1
- package/dist/WidgetWrapper/WidgetWrapper.d.cts +2 -2
- package/dist/WidgetWrapper/WidgetWrapper.js +1 -1
- package/dist/WidgetWrapper/hooks/useGetWrapperProperties.cjs +1 -1
- package/dist/WidgetWrapper/hooks/useGetWrapperProperties.js +1 -1
- package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.cts +2 -2
- package/dist/WidgetWrapperWithTitle/WidgetWrapperWithTitle.d.ts +2 -2
- package/dist/node_modules/jotai/esm/react.cjs +87 -0
- package/dist/node_modules/jotai/esm/react.js +88 -2
- package/dist/node_modules/jotai/esm/vanilla/internals.cjs +2 -1
- package/dist/node_modules/jotai/esm/vanilla/internals.js +1 -1
- package/dist/packages/components-v3/tokens/typography/typography.cjs +1 -1
- package/dist/packages/components-v3/tokens/typography/typography.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/resolveTheme.cjs +1 -1
- package/dist/utils/resolveTheme.js +1 -1
- package/package.json +2 -1
- package/src/components/ChatFooter/ChatFooter.tsx +8 -0
- package/src/components/ChatFooter/__tests__/ChatFooter.test.tsx +43 -0
- package/src/components/ChatFooter/components/TextField.tsx +12 -0
- package/src/components/ChatFooter/types/types.ts +17 -0
- package/src/components/ChatHeader/ChatHeader.tsx +1 -0
- package/src/components/ChatHeader/components/Handle.tsx +7 -2
- package/src/components/ChatHeader/hooks/useGetHandleProperties.ts +5 -1
- package/src/components/ChatHeader/hooks/useGetToggleOptionProperties.ts +1 -1
- package/src/components/ChatHeader/types/index.ts +1 -0
- package/src/components/ChatPreview/ChatPreview.tsx +13 -2
- package/src/components/ChatPreview/__tests__/ChatPreview.test.tsx +44 -0
- package/src/components/ChatPreview/index.ts +1 -1
- package/src/components/ChatPreview/types/types.ts +13 -0
- package/src/components/ChatPreviewComparison/ChatPreviewComparison.tsx +6 -0
- package/src/components/ChatPreviewComparison/__tests__/ChatPreviewComparison.test.tsx +44 -0
- package/src/components/ChatPreviewComparison/index.ts +1 -1
- package/src/components/ChatPreviewComparison/types/types.ts +13 -0
- package/src/components/ChatPreviewLoading/ChatPreviewLoading.tsx +5 -3
- package/src/components/ChatPreviewLoading/__tests__/ChatPreviewLoading.test.tsx +40 -0
- package/src/components/ChatPreviewLoading/types/types.ts +5 -0
- package/src/components/Disclaimer/components/Container.tsx +1 -1
- package/src/components/FloatingChat/FloatingChat.tsx +43 -7
- package/src/components/FloatingChat/components/SlideChatContent.tsx +1 -1
- package/src/components/FloatingChat/hooks/useChatSuggestions.ts +8 -12
- package/src/components/FullPageSalesAgent/FullPageSalesAgent.tsx +43 -7
- package/src/components/ProductCard/ProductCard.tsx +7 -0
- package/src/components/ProductCard/__tests__/ProductCard.test.tsx +33 -0
- package/src/components/ProductCard/index.ts +1 -1
- package/src/components/ProductCard/types/index.ts +6 -0
- package/src/components/PromptButtonCarouselWithImage/PromptButtonCarouselWithImage.tsx +6 -0
- package/src/components/PromptButtonCarouselWithImage/__tests__/PromptButtonCarouselWithImage.test.tsx +34 -0
- package/src/components/PromptButtonCarouselWithImage/types/types.ts +12 -0
- package/src/components/PromptCarousel/__tests__/PromptCarousel.test.tsx +19 -0
- package/src/components/PromptCarousel/hooks/useCarouselButtons.ts +4 -2
- package/src/components/ReviewCard/components/Rating.tsx +0 -1
- package/src/components/SocialProof/SocialProof.tsx +6 -0
- package/src/components/SocialProof/__tests__/SocialProof.test.tsx +58 -0
- package/src/components/SocialProof/components/Textfield.tsx +9 -0
- package/src/components/SocialProof/index.ts +1 -1
- package/src/components/SocialProof/types/types.ts +13 -0
- package/src/components/TextField/TextField.tsx +49 -0
- package/src/components/TextField/__tests__/TextField.test.tsx +3 -3
- package/src/components/TextField/__tests__/VoiceInputButton.test.tsx +175 -0
- package/src/components/TextField/components/Layout.tsx +24 -17
- package/src/components/TextField/components/VoiceInputButton.tsx +69 -0
- package/src/components/TextField/components/index.ts +2 -0
- package/src/components/TextField/hooks/useGetMicButtonContainerProperties.ts +38 -0
- package/src/components/TextField/hooks/useGetSkeletonProperties.ts +1 -1
- package/src/components/TextField/hooks/useVoiceInput.ts +75 -0
- package/src/components/TextField/types/index.ts +11 -0
- package/src/components/TextField/utils/getLayoutStateProperties.ts +8 -0
- package/src/components/TypingAnimation/TypingAnimation.tsx +7 -0
- package/src/components/TypingAnimation/__tests__/TypingAnimation.test.tsx +47 -0
- package/src/components/TypingAnimation/index.ts +1 -1
- package/src/components/TypingAnimation/types/index.ts +14 -1
- package/src/components/WidgetTextField/WidgetTextField.tsx +47 -0
- package/src/components/WidgetTextField/__tests__/WidgetTextField.test.tsx +119 -4
- package/src/components/WidgetTextField/components/Container.tsx +40 -27
- package/src/components/WidgetTextField/hooks/useGetContainerProperties.ts +16 -4
- package/src/components/WidgetTextField/hooks/useGetMicWidgetButtonProperties.ts +38 -0
- package/src/components/WidgetTextField/types/types.ts +21 -0
- package/src/components/WidgetWrapper/hooks/useGetWrapperProperties.ts +1 -1
|
@@ -34,6 +34,7 @@ export const ChatPreviewComparison = ({
|
|
|
34
34
|
images,
|
|
35
35
|
logoSrc,
|
|
36
36
|
titleLabel,
|
|
37
|
+
voiceInputEnabled,
|
|
37
38
|
} = widgetContentProps ?? {};
|
|
38
39
|
|
|
39
40
|
const {
|
|
@@ -46,6 +47,8 @@ export const ChatPreviewComparison = ({
|
|
|
46
47
|
handlePromptButtonTouchEnd,
|
|
47
48
|
handleLinkClick,
|
|
48
49
|
handleTextFieldClick,
|
|
50
|
+
onTranscriptionStarted,
|
|
51
|
+
onTranscriptionCompleted,
|
|
49
52
|
} = widgetEventProps ?? {};
|
|
50
53
|
|
|
51
54
|
const finalTheme = resolveTheme(theme);
|
|
@@ -101,6 +104,9 @@ export const ChatPreviewComparison = ({
|
|
|
101
104
|
theme={finalTheme}
|
|
102
105
|
placeholder={textFieldPlaceholderText ?? ''}
|
|
103
106
|
onClick={() => handleTextFieldClick?.()}
|
|
107
|
+
enableVoiceInput={voiceInputEnabled}
|
|
108
|
+
onTranscriptionStarted={onTranscriptionStarted}
|
|
109
|
+
onTranscriptionCompleted={onTranscriptionCompleted}
|
|
104
110
|
/>
|
|
105
111
|
);
|
|
106
112
|
|
|
@@ -418,4 +418,48 @@ describe('ChatPreviewComparison', () => {
|
|
|
418
418
|
expect(screen.getByText('Button 1')).toBeInTheDocument();
|
|
419
419
|
});
|
|
420
420
|
});
|
|
421
|
+
|
|
422
|
+
describe('Voice input', () => {
|
|
423
|
+
it('should render with voiceInputEnabled set to true', () => {
|
|
424
|
+
render(
|
|
425
|
+
<ChatPreviewComparison
|
|
426
|
+
{...defaultProps}
|
|
427
|
+
widgetContentProps={{
|
|
428
|
+
...defaultProps.widgetContentProps,
|
|
429
|
+
voiceInputEnabled: true,
|
|
430
|
+
}}
|
|
431
|
+
widgetStyleProps={{ hideTextField: false }}
|
|
432
|
+
/>,
|
|
433
|
+
);
|
|
434
|
+
expect(screen.getByText('Compare these products')).toBeInTheDocument();
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
it('should render with voiceInputEnabled set to false', () => {
|
|
438
|
+
render(
|
|
439
|
+
<ChatPreviewComparison
|
|
440
|
+
{...defaultProps}
|
|
441
|
+
widgetContentProps={{
|
|
442
|
+
...defaultProps.widgetContentProps,
|
|
443
|
+
voiceInputEnabled: false,
|
|
444
|
+
}}
|
|
445
|
+
widgetStyleProps={{ hideTextField: false }}
|
|
446
|
+
/>,
|
|
447
|
+
);
|
|
448
|
+
expect(screen.getByText('Compare these products')).toBeInTheDocument();
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
it('should render with voiceInputEnabled undefined (default)', () => {
|
|
452
|
+
render(
|
|
453
|
+
<ChatPreviewComparison
|
|
454
|
+
{...defaultProps}
|
|
455
|
+
widgetContentProps={{
|
|
456
|
+
...defaultProps.widgetContentProps,
|
|
457
|
+
voiceInputEnabled: undefined,
|
|
458
|
+
}}
|
|
459
|
+
widgetStyleProps={{ hideTextField: false }}
|
|
460
|
+
/>,
|
|
461
|
+
);
|
|
462
|
+
expect(screen.getByText('Compare these products')).toBeInTheDocument();
|
|
463
|
+
});
|
|
464
|
+
});
|
|
421
465
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { ChatPreviewComparison } from './ChatPreviewComparison';
|
|
2
|
-
export type { ChatPreviewComparisonProps } from './types/types';
|
|
2
|
+
export type { ChatPreviewComparisonProps, WidgetEventProps } from './types/types';
|
|
@@ -72,6 +72,11 @@ export type WidgetContentProps = {
|
|
|
72
72
|
* Array of image objects for the images.
|
|
73
73
|
*/
|
|
74
74
|
images?: ImageGalleryImage[];
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Whether to enable voice input.
|
|
78
|
+
*/
|
|
79
|
+
voiceInputEnabled?: boolean;
|
|
75
80
|
};
|
|
76
81
|
|
|
77
82
|
/**
|
|
@@ -176,6 +181,14 @@ export type WidgetEventProps = {
|
|
|
176
181
|
* Callback function invoked when the text field is clicked.
|
|
177
182
|
*/
|
|
178
183
|
handleTextFieldClick?: () => void;
|
|
184
|
+
/**
|
|
185
|
+
* Callback function invoked when voice transcription starts.
|
|
186
|
+
*/
|
|
187
|
+
onTranscriptionStarted?: () => void;
|
|
188
|
+
/**
|
|
189
|
+
* Callback function invoked when voice transcription completes.
|
|
190
|
+
*/
|
|
191
|
+
onTranscriptionCompleted?: (transcript: string) => void;
|
|
179
192
|
};
|
|
180
193
|
|
|
181
194
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
|
-
import { WidgetWrapperVariant } from '../WidgetWrapper';
|
|
3
2
|
import { Stack } from '../Stack';
|
|
4
|
-
import { ChatPreviewLoadingComponents } from './components';
|
|
5
3
|
import { WidgetTextField } from '../WidgetTextField';
|
|
4
|
+
import { WidgetWrapperVariant } from '../WidgetWrapper';
|
|
5
|
+
import { ChatPreviewLoadingComponents } from './components';
|
|
6
6
|
import { ChatPreviewLoadingProps } from './types/types';
|
|
7
7
|
|
|
8
8
|
export const ChatPreviewLoading = ({
|
|
@@ -18,6 +18,7 @@ export const ChatPreviewLoading = ({
|
|
|
18
18
|
hideLogo,
|
|
19
19
|
logoSrc,
|
|
20
20
|
titleLabel,
|
|
21
|
+
voiceInputEnabled,
|
|
21
22
|
}: ChatPreviewLoadingProps) => {
|
|
22
23
|
const textfield = useMemo(() => {
|
|
23
24
|
if (fullIsLoading) {
|
|
@@ -29,10 +30,11 @@ export const ChatPreviewLoading = ({
|
|
|
29
30
|
return (
|
|
30
31
|
<WidgetTextField
|
|
31
32
|
placeholder={textFieldPlaceholder ?? ''}
|
|
33
|
+
enableVoiceInput={voiceInputEnabled}
|
|
32
34
|
disabled
|
|
33
35
|
/>
|
|
34
36
|
);
|
|
35
|
-
}, [fullIsLoading, textFieldPlaceholder]);
|
|
37
|
+
}, [fullIsLoading, textFieldPlaceholder, voiceInputEnabled]);
|
|
36
38
|
|
|
37
39
|
const headline = useMemo(
|
|
38
40
|
() => (
|
|
@@ -330,4 +330,44 @@ describe('ChatPreviewLoading', () => {
|
|
|
330
330
|
expect(skeletons.length).toBeGreaterThanOrEqual(6);
|
|
331
331
|
});
|
|
332
332
|
});
|
|
333
|
+
|
|
334
|
+
describe('Voice input', () => {
|
|
335
|
+
it('should render with voiceInputEnabled set to true', async () => {
|
|
336
|
+
render(
|
|
337
|
+
<ChatPreviewLoading
|
|
338
|
+
{...defaultProps}
|
|
339
|
+
voiceInputEnabled
|
|
340
|
+
fullIsLoading={false}
|
|
341
|
+
hideTextField={false}
|
|
342
|
+
/>,
|
|
343
|
+
);
|
|
344
|
+
await waitFor(() => {
|
|
345
|
+
expect(screen.getByText('What can I help you find?')).toBeInTheDocument();
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('should render with voiceInputEnabled set to false', () => {
|
|
350
|
+
render(
|
|
351
|
+
<ChatPreviewLoading
|
|
352
|
+
{...defaultProps}
|
|
353
|
+
voiceInputEnabled={false}
|
|
354
|
+
fullIsLoading={false}
|
|
355
|
+
hideTextField={false}
|
|
356
|
+
/>,
|
|
357
|
+
);
|
|
358
|
+
expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('should render with voiceInputEnabled undefined (default)', () => {
|
|
362
|
+
render(
|
|
363
|
+
<ChatPreviewLoading
|
|
364
|
+
{...defaultProps}
|
|
365
|
+
voiceInputEnabled={undefined}
|
|
366
|
+
fullIsLoading={false}
|
|
367
|
+
hideTextField={false}
|
|
368
|
+
/>,
|
|
369
|
+
);
|
|
370
|
+
expect(screen.getByText('Shopping Assistant')).toBeInTheDocument();
|
|
371
|
+
});
|
|
372
|
+
});
|
|
333
373
|
});
|
|
@@ -50,6 +50,11 @@ export type ChatPreviewLoadingProps = {
|
|
|
50
50
|
*/
|
|
51
51
|
hideTextField?: boolean;
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Whether to enable voice input.
|
|
55
|
+
*/
|
|
56
|
+
voiceInputEnabled?: boolean;
|
|
57
|
+
|
|
53
58
|
/**
|
|
54
59
|
* Placeholder text displayed in the text field.
|
|
55
60
|
* Only used when `fullIsLoading` is `false` and `hideTextField` is `false`.
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
|
|
3
3
|
import { ChatElementDisplayLocationV3 } from '@envive-ai/react-hooks/application/models';
|
|
4
|
-
import {
|
|
4
|
+
import { EnviveMetricsEventName } from '@envive-ai/react-hooks/contexts/amplitudeContext';
|
|
5
|
+
import { listeningToSpeechAtom } from '@envive-ai/react-hooks/atoms/chat';
|
|
6
|
+
import { useWidgetInteraction } from '@envive-ai/react-hooks/hooks/WidgetInteraction';
|
|
5
7
|
import {
|
|
6
8
|
WidgetInteractionComponent,
|
|
7
9
|
WidgetInteractionType,
|
|
8
10
|
} from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
+
import { motion } from 'framer-motion';
|
|
12
|
+
import { useSetAtom } from 'jotai';
|
|
11
13
|
import { Theme } from '../../../tokens/theme/theme';
|
|
12
14
|
import { ColorNames } from '../../models/colorsConfig';
|
|
13
15
|
|
|
@@ -24,12 +26,12 @@ import { useScrollToBottom } from './hooks/useScrollToBottom';
|
|
|
24
26
|
import { useSnapSetup } from './hooks/useSnapSetup';
|
|
25
27
|
|
|
26
28
|
import { Disclaimer } from '../Disclaimer';
|
|
29
|
+
import { SalesAgentProductCardProps } from '../SalesAgentProductCard/types/types';
|
|
27
30
|
import { resolveTheme } from '../utils/resolveTheme';
|
|
31
|
+
import { FloatingChatComponents, ModalSheet } from './components';
|
|
28
32
|
import { useFilteredChatMessages } from './hooks/useFilteredChatMessages';
|
|
29
33
|
import { Unit } from './hooks/useSnapCalculator';
|
|
30
34
|
import { FloatingChatProps } from './types/types';
|
|
31
|
-
import { FloatingChatComponents, ModalSheet } from './components';
|
|
32
|
-
import { SalesAgentProductCardProps } from '../SalesAgentProductCard/types/types';
|
|
33
35
|
import { trackProductCardClicked } from './utils/trackProductCardInteraction';
|
|
34
36
|
|
|
35
37
|
export const FloatingChat = ({
|
|
@@ -54,6 +56,7 @@ export const FloatingChat = ({
|
|
|
54
56
|
const { trackWidgetInteraction } = useWidgetInteraction();
|
|
55
57
|
const { onDrag, onHover, onMouseDown, onMouseUp, onTouchStart, onTouchEnd } =
|
|
56
58
|
usePromptCarouselAnalytics(WidgetInteractionComponent.FLOATING_CHAT, text => text);
|
|
59
|
+
const setListeningToSpeech = useSetAtom(listeningToSpeechAtom);
|
|
57
60
|
|
|
58
61
|
const [query, setQuery] = useState('');
|
|
59
62
|
|
|
@@ -93,7 +96,8 @@ export const FloatingChat = ({
|
|
|
93
96
|
return undefined;
|
|
94
97
|
}, [disclaimerText]);
|
|
95
98
|
|
|
96
|
-
const { agentName, chatHeaderLogoDarkSrc, chatHeaderLogoLightSrc } =
|
|
99
|
+
const { agentName, chatHeaderLogoDarkSrc, chatHeaderLogoLightSrc, voiceInputEnabled } =
|
|
100
|
+
lookAndFeelConfig;
|
|
97
101
|
|
|
98
102
|
const {
|
|
99
103
|
messages,
|
|
@@ -217,6 +221,32 @@ export const FloatingChat = ({
|
|
|
217
221
|
);
|
|
218
222
|
};
|
|
219
223
|
|
|
224
|
+
const handleTranscriptionStarted = useCallback(() => {
|
|
225
|
+
trackWidgetInteraction({
|
|
226
|
+
eventName: EnviveMetricsEventName.WidgetInteraction,
|
|
227
|
+
trigger: {
|
|
228
|
+
widget: WidgetInteractionComponent.FLOATING_CHAT,
|
|
229
|
+
widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_STARTED,
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
}, [trackWidgetInteraction]);
|
|
233
|
+
|
|
234
|
+
const handleTranscriptionCompleted = useCallback(
|
|
235
|
+
(transcript: string) => {
|
|
236
|
+
trackWidgetInteraction({
|
|
237
|
+
eventName: EnviveMetricsEventName.WidgetInteraction,
|
|
238
|
+
trigger: {
|
|
239
|
+
widget: WidgetInteractionComponent.FLOATING_CHAT,
|
|
240
|
+
widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_COMPLETED,
|
|
241
|
+
widget_interaction_data: {
|
|
242
|
+
transcription: transcript,
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
[trackWidgetInteraction],
|
|
248
|
+
);
|
|
249
|
+
|
|
220
250
|
const header = (
|
|
221
251
|
<ChatHeader
|
|
222
252
|
logoDark={chatHeaderLogoDarkSrc}
|
|
@@ -281,6 +311,7 @@ export const FloatingChat = ({
|
|
|
281
311
|
theme={finalTheme}
|
|
282
312
|
isScrolled={isMobile ? isFloatingLayout : false}
|
|
283
313
|
onChange={setQuery}
|
|
314
|
+
inputClassName="placeholder:envive-tw-text-text-secondary"
|
|
284
315
|
onSubmit={() => {
|
|
285
316
|
onTypedMessageSubmitted({
|
|
286
317
|
query,
|
|
@@ -303,6 +334,7 @@ export const FloatingChat = ({
|
|
|
303
334
|
onSuggestionClicked(suggestion, ChatElementDisplayLocationV3.FLOATING_CHAT_PROMPT_BUTTON);
|
|
304
335
|
}
|
|
305
336
|
|
|
337
|
+
setListeningToSpeech('abort');
|
|
306
338
|
setAnswerSuggestions([]);
|
|
307
339
|
setGeneralSuggestions([]);
|
|
308
340
|
handleBackToChat();
|
|
@@ -315,6 +347,9 @@ export const FloatingChat = ({
|
|
|
315
347
|
hideEnviveWatermark={!showEnviveLogo}
|
|
316
348
|
onFocus={handleInputQueryFocus}
|
|
317
349
|
parentWidget={WidgetInteractionComponent.FLOATING_CHAT}
|
|
350
|
+
voiceInputEnabled={voiceInputEnabled}
|
|
351
|
+
onTranscriptionStarted={handleTranscriptionStarted}
|
|
352
|
+
onTranscriptionCompleted={handleTranscriptionCompleted}
|
|
318
353
|
/>
|
|
319
354
|
);
|
|
320
355
|
|
|
@@ -373,6 +408,7 @@ export const FloatingChat = ({
|
|
|
373
408
|
if (suggestion) {
|
|
374
409
|
onSuggestionClicked(suggestion, ChatElementDisplayLocationV3.FLOATING_CHAT_PROMPT_BUTTON);
|
|
375
410
|
}
|
|
411
|
+
setListeningToSpeech('abort');
|
|
376
412
|
setAnswerSuggestions([]);
|
|
377
413
|
setGeneralSuggestions([]);
|
|
378
414
|
}}
|
|
@@ -52,7 +52,7 @@ export const SlideChatContent = ({
|
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
return (
|
|
55
|
-
<div className="envive-tw-relative envive-tw-
|
|
55
|
+
<div className="envive-tw-relative envive-tw-w-full envive-tw-overflow-hidden">
|
|
56
56
|
<AnimatePresence
|
|
57
57
|
initial={false}
|
|
58
58
|
mode="wait"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useLayoutEffect, useState } from 'react';
|
|
2
2
|
import { Suggestion } from '@envive-ai/react-hooks/application/models';
|
|
3
3
|
|
|
4
4
|
export interface UseChatSuggestionsProps {
|
|
@@ -26,17 +26,13 @@ export const useChatSuggestions = ({
|
|
|
26
26
|
const showAnswerSuggestions =
|
|
27
27
|
answerSuggestions.length > 0 && !isPendingResponse && !isResponseStreaming;
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.filter(suggestion => !suggestion.isAnswer)
|
|
37
|
-
.map(suggestion => suggestion.content),
|
|
38
|
-
);
|
|
39
|
-
}
|
|
29
|
+
useLayoutEffect(() => {
|
|
30
|
+
setAnswerSuggestions(
|
|
31
|
+
suggestions.filter(suggestion => suggestion.isAnswer).map(suggestion => suggestion.content),
|
|
32
|
+
);
|
|
33
|
+
setGeneralSuggestions(
|
|
34
|
+
suggestions.filter(suggestion => !suggestion.isAnswer).map(suggestion => suggestion.content),
|
|
35
|
+
);
|
|
40
36
|
}, [suggestions]);
|
|
41
37
|
|
|
42
38
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChatElementDisplayLocationV3 } from '@envive-ai/react-hooks/application/models';
|
|
2
|
+
import { listeningToSpeechAtom } from '@envive-ai/react-hooks/atoms/chat';
|
|
2
3
|
import { EnviveMetricsEventName } from '@envive-ai/react-hooks/contexts/amplitudeContext';
|
|
3
4
|
import { HardcopyResponse } from '@envive-ai/react-hooks/contexts/hardcopyContext';
|
|
4
5
|
import { useSalesAgent } from '@envive-ai/react-hooks/contexts/salesAgentContext';
|
|
@@ -8,17 +9,23 @@ import {
|
|
|
8
9
|
WidgetInteractionComponent,
|
|
9
10
|
WidgetInteractionType,
|
|
10
11
|
} from '@envive-ai/react-hooks/hooks/WidgetInteraction/types';
|
|
11
|
-
import {
|
|
12
|
+
import { useSetAtom } from 'jotai';
|
|
13
|
+
import { useCallback, useRef, useState } from 'react';
|
|
12
14
|
import { ChatFooter } from '../ChatFooter';
|
|
13
15
|
import { Disclaimer } from '../Disclaimer';
|
|
14
16
|
import { FloatingChatComponents } from '../FloatingChat/components';
|
|
17
|
+
import {
|
|
18
|
+
NUM_COLUMNS_FPSA,
|
|
19
|
+
NUM_COLUMNS_MOBILE,
|
|
20
|
+
ResultsGridColumnCount,
|
|
21
|
+
} from '../FloatingChat/components/ResultsGridView';
|
|
15
22
|
import { useChatSuggestions } from '../FloatingChat/hooks/useChatSuggestions';
|
|
16
23
|
import { useProductResultsView } from '../FloatingChat/hooks/useProductResultsView';
|
|
17
24
|
import { useScrollToBottom } from '../FloatingChat/hooks/useScrollToBottom';
|
|
18
25
|
import { trackProductCardClicked } from '../FloatingChat/utils/trackProductCardInteraction';
|
|
19
|
-
import { SalesAgentProductCardProps } from '../SalesAgentProductCard/types/types';
|
|
20
26
|
import { PromptButtonVariant } from '../PromptButton';
|
|
21
27
|
import { PromptCarousel, PromptCarouselRows, usePromptCarouselAnalytics } from '../PromptCarousel';
|
|
28
|
+
import { SalesAgentProductCardProps } from '../SalesAgentProductCard/types/types';
|
|
22
29
|
import { Theme } from '../Tokens';
|
|
23
30
|
import { resolveTheme } from '../utils/resolveTheme';
|
|
24
31
|
import { SparkleIconColor, WelcomeMessage } from '../WelcomeMessage';
|
|
@@ -27,11 +34,6 @@ import { useGetFooterStyles } from './hooks/useGetFooterStyles';
|
|
|
27
34
|
import { useGetMessagesStyles } from './hooks/useGetMessagesStyles';
|
|
28
35
|
import { useGetScrollContentStyles } from './hooks/useGetScrollContentStyles';
|
|
29
36
|
import { useIsMobile } from './hooks/useIsMobile';
|
|
30
|
-
import {
|
|
31
|
-
NUM_COLUMNS_FPSA,
|
|
32
|
-
NUM_COLUMNS_MOBILE,
|
|
33
|
-
ResultsGridColumnCount,
|
|
34
|
-
} from '../FloatingChat/components/ResultsGridView';
|
|
35
37
|
|
|
36
38
|
interface FullPageSalesAgentProps {
|
|
37
39
|
theme?: Theme;
|
|
@@ -40,6 +42,7 @@ interface FullPageSalesAgentProps {
|
|
|
40
42
|
hardcopyContent: HardcopyResponse;
|
|
41
43
|
headerContainer?: string;
|
|
42
44
|
autoHeight?: boolean;
|
|
45
|
+
voiceInputEnabled?: boolean;
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
export const FullPageSalesAgent = ({
|
|
@@ -49,6 +52,7 @@ export const FullPageSalesAgent = ({
|
|
|
49
52
|
hardcopyContent,
|
|
50
53
|
headerContainer,
|
|
51
54
|
autoHeight,
|
|
55
|
+
voiceInputEnabled,
|
|
52
56
|
}: FullPageSalesAgentProps) => {
|
|
53
57
|
const resolvedTheme = resolveTheme(theme);
|
|
54
58
|
const salesAgentData = useSalesAgent(WidgetInteractionComponent.FULL_PAGE_SALES_AGENT);
|
|
@@ -61,6 +65,7 @@ export const FullPageSalesAgent = ({
|
|
|
61
65
|
const { trackWidgetInteraction } = useWidgetInteraction();
|
|
62
66
|
const { onDrag, onHover, onMouseDown, onMouseUp, onTouchStart, onTouchEnd } =
|
|
63
67
|
usePromptCarouselAnalytics(WidgetInteractionComponent.FULL_PAGE_SALES_AGENT, text => text);
|
|
68
|
+
const setListeningToSpeech = useSetAtom(listeningToSpeechAtom);
|
|
64
69
|
|
|
65
70
|
const {
|
|
66
71
|
welcomeMessageIconColor,
|
|
@@ -153,6 +158,32 @@ export const FullPageSalesAgent = ({
|
|
|
153
158
|
);
|
|
154
159
|
};
|
|
155
160
|
|
|
161
|
+
const handleTranscriptionStarted = useCallback(() => {
|
|
162
|
+
trackWidgetInteraction({
|
|
163
|
+
eventName: EnviveMetricsEventName.WidgetInteraction,
|
|
164
|
+
trigger: {
|
|
165
|
+
widget: WidgetInteractionComponent.FULL_PAGE_SALES_AGENT,
|
|
166
|
+
widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_STARTED,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
}, [trackWidgetInteraction]);
|
|
170
|
+
|
|
171
|
+
const handleTranscriptionCompleted = useCallback(
|
|
172
|
+
(transcript: string) => {
|
|
173
|
+
trackWidgetInteraction({
|
|
174
|
+
eventName: EnviveMetricsEventName.WidgetInteraction,
|
|
175
|
+
trigger: {
|
|
176
|
+
widget: WidgetInteractionComponent.FULL_PAGE_SALES_AGENT,
|
|
177
|
+
widget_interaction: WidgetInteractionType.VOICE_TRANSCRIPTION_COMPLETED,
|
|
178
|
+
widget_interaction_data: {
|
|
179
|
+
transcription: transcript,
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
},
|
|
184
|
+
[trackWidgetInteraction],
|
|
185
|
+
);
|
|
186
|
+
|
|
156
187
|
const welcomeMessage = (
|
|
157
188
|
<div className={messageContainerClasses}>
|
|
158
189
|
<WelcomeMessage
|
|
@@ -188,6 +219,7 @@ export const FullPageSalesAgent = ({
|
|
|
188
219
|
onSuggestionClicked(suggestion, ChatElementDisplayLocationV3.FLOATING_CHAT_PROMPT_BUTTON);
|
|
189
220
|
}
|
|
190
221
|
|
|
222
|
+
setListeningToSpeech('abort');
|
|
191
223
|
setAnswerSuggestions([]);
|
|
192
224
|
setGeneralSuggestions([]);
|
|
193
225
|
handleBackToChat();
|
|
@@ -205,6 +237,9 @@ export const FullPageSalesAgent = ({
|
|
|
205
237
|
}}
|
|
206
238
|
onFocus={handleInputQueryFocus}
|
|
207
239
|
parentWidget={WidgetInteractionComponent.FULL_PAGE_SALES_AGENT}
|
|
240
|
+
voiceInputEnabled={voiceInputEnabled}
|
|
241
|
+
onTranscriptionStarted={handleTranscriptionStarted}
|
|
242
|
+
onTranscriptionCompleted={handleTranscriptionCompleted}
|
|
208
243
|
/>
|
|
209
244
|
);
|
|
210
245
|
|
|
@@ -258,6 +293,7 @@ export const FullPageSalesAgent = ({
|
|
|
258
293
|
if (suggestion) {
|
|
259
294
|
onSuggestionClicked(suggestion, ChatElementDisplayLocationV3.FLOATING_CHAT_PROMPT_BUTTON);
|
|
260
295
|
}
|
|
296
|
+
setListeningToSpeech('abort');
|
|
261
297
|
setAnswerSuggestions([]);
|
|
262
298
|
setGeneralSuggestions([]);
|
|
263
299
|
}}
|
|
@@ -20,6 +20,7 @@ export const ProductCard = ({
|
|
|
20
20
|
textTypingDuration,
|
|
21
21
|
textTransition,
|
|
22
22
|
loop,
|
|
23
|
+
voiceInputEnabled,
|
|
23
24
|
onSelect,
|
|
24
25
|
onDrag,
|
|
25
26
|
onHover,
|
|
@@ -28,6 +29,8 @@ export const ProductCard = ({
|
|
|
28
29
|
onTouchStart,
|
|
29
30
|
onTouchEnd,
|
|
30
31
|
onInputClick,
|
|
32
|
+
onTranscriptionStarted,
|
|
33
|
+
onTranscriptionCompleted,
|
|
31
34
|
}: ProductCardProps) => {
|
|
32
35
|
const resolvedTheme = resolveTheme(theme);
|
|
33
36
|
|
|
@@ -59,8 +62,12 @@ export const ProductCard = ({
|
|
|
59
62
|
/>
|
|
60
63
|
<WidgetTextField
|
|
61
64
|
theme={resolvedTheme}
|
|
65
|
+
minimalFrame={resolvedTheme === Theme.MINIMAL ? 'bottom-only' : 'full'}
|
|
62
66
|
placeholder={placeholder}
|
|
63
67
|
onClick={onInputClick}
|
|
68
|
+
enableVoiceInput={voiceInputEnabled}
|
|
69
|
+
onTranscriptionStarted={onTranscriptionStarted}
|
|
70
|
+
onTranscriptionCompleted={onTranscriptionCompleted}
|
|
64
71
|
textColor={
|
|
65
72
|
resolvedTheme === Theme.MINIMAL
|
|
66
73
|
? TypographyColor.TEXT_LIGHT
|
|
@@ -259,5 +259,38 @@ describe('ProductCard', () => {
|
|
|
259
259
|
expect(screen.getByText('Test Product')).toBeInTheDocument();
|
|
260
260
|
expect(screen.getByText('Prompt 1')).toBeInTheDocument();
|
|
261
261
|
});
|
|
262
|
+
|
|
263
|
+
it('should render with voiceInputEnabled set to true', () => {
|
|
264
|
+
render(
|
|
265
|
+
<ProductCard
|
|
266
|
+
{...defaultProps}
|
|
267
|
+
voiceInputEnabled
|
|
268
|
+
/>,
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
expect(screen.getByText('Test Product')).toBeInTheDocument();
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it('should render with voiceInputEnabled set to false', () => {
|
|
275
|
+
render(
|
|
276
|
+
<ProductCard
|
|
277
|
+
{...defaultProps}
|
|
278
|
+
voiceInputEnabled={false}
|
|
279
|
+
/>,
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
expect(screen.getByText('Test Product')).toBeInTheDocument();
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
it('should render with voiceInputEnabled undefined (default)', () => {
|
|
286
|
+
render(
|
|
287
|
+
<ProductCard
|
|
288
|
+
{...defaultProps}
|
|
289
|
+
voiceInputEnabled={undefined}
|
|
290
|
+
/>,
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
expect(screen.getByText('Test Product')).toBeInTheDocument();
|
|
294
|
+
});
|
|
262
295
|
});
|
|
263
296
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { ProductCard } from './ProductCard';
|
|
2
|
-
export type { ProductCardProps } from './types';
|
|
2
|
+
export type { ProductCardProps, InputProps } from './types';
|
|
@@ -94,6 +94,12 @@ export interface InputProps {
|
|
|
94
94
|
onInputClick: () => void;
|
|
95
95
|
/** Placeholder text displayed in the input field. */
|
|
96
96
|
placeholder?: string;
|
|
97
|
+
/** Whether to enable voice input. */
|
|
98
|
+
voiceInputEnabled?: boolean;
|
|
99
|
+
/** Callback function invoked when voice transcription starts. */
|
|
100
|
+
onTranscriptionStarted?: () => void;
|
|
101
|
+
/** Callback function invoked when voice transcription completes. */
|
|
102
|
+
onTranscriptionCompleted?: (transcript: string) => void;
|
|
97
103
|
}
|
|
98
104
|
|
|
99
105
|
/**
|
|
@@ -13,6 +13,7 @@ export const PromptButtonCarouselWithImage = ({
|
|
|
13
13
|
alt,
|
|
14
14
|
isLoading,
|
|
15
15
|
hideTextField,
|
|
16
|
+
voiceInputEnabled,
|
|
16
17
|
title,
|
|
17
18
|
promptButtonsTexts,
|
|
18
19
|
promptButtonType,
|
|
@@ -25,6 +26,8 @@ export const PromptButtonCarouselWithImage = ({
|
|
|
25
26
|
handlePromptButtonTouchEnd,
|
|
26
27
|
textFieldPlaceholder,
|
|
27
28
|
handleTextFieldClick,
|
|
29
|
+
onTranscriptionStarted,
|
|
30
|
+
onTranscriptionCompleted,
|
|
28
31
|
}: PromptButtonCarouselWithImageProps) => {
|
|
29
32
|
const finalTheme = resolveTheme(theme);
|
|
30
33
|
|
|
@@ -49,6 +52,9 @@ export const PromptButtonCarouselWithImage = ({
|
|
|
49
52
|
className={finalTheme === Theme.MINIMAL ? '!envive-tw-border-border-medium' : undefined}
|
|
50
53
|
onClick={() => handleTextFieldClick(textFieldPlaceholder)}
|
|
51
54
|
theme={finalTheme}
|
|
55
|
+
enableVoiceInput={voiceInputEnabled}
|
|
56
|
+
onTranscriptionStarted={onTranscriptionStarted}
|
|
57
|
+
onTranscriptionCompleted={onTranscriptionCompleted}
|
|
52
58
|
/>
|
|
53
59
|
}
|
|
54
60
|
image={
|
|
@@ -513,4 +513,38 @@ describe('PromptButtonCarouselWithImage', () => {
|
|
|
513
513
|
}).not.toThrow();
|
|
514
514
|
});
|
|
515
515
|
});
|
|
516
|
+
|
|
517
|
+
describe('Voice input', () => {
|
|
518
|
+
it('should render with voiceInputEnabled set to true', () => {
|
|
519
|
+
setMobile(true);
|
|
520
|
+
render(
|
|
521
|
+
<PromptButtonCarouselWithImage
|
|
522
|
+
{...defaultProps}
|
|
523
|
+
voiceInputEnabled
|
|
524
|
+
/>,
|
|
525
|
+
);
|
|
526
|
+
expect(screen.getByText('Type something...')).toBeInTheDocument();
|
|
527
|
+
setMobile(false);
|
|
528
|
+
});
|
|
529
|
+
|
|
530
|
+
it('should render with voiceInputEnabled set to false', () => {
|
|
531
|
+
render(
|
|
532
|
+
<PromptButtonCarouselWithImage
|
|
533
|
+
{...defaultProps}
|
|
534
|
+
voiceInputEnabled={false}
|
|
535
|
+
/>,
|
|
536
|
+
);
|
|
537
|
+
expect(screen.getByText('Type something...')).toBeInTheDocument();
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
it('should render with voiceInputEnabled undefined (default)', () => {
|
|
541
|
+
render(
|
|
542
|
+
<PromptButtonCarouselWithImage
|
|
543
|
+
{...defaultProps}
|
|
544
|
+
voiceInputEnabled={undefined}
|
|
545
|
+
/>,
|
|
546
|
+
);
|
|
547
|
+
expect(screen.getByText('Type something...')).toBeInTheDocument();
|
|
548
|
+
});
|
|
549
|
+
});
|
|
516
550
|
});
|
|
@@ -59,6 +59,10 @@ export type PromptButtonCarouselWithImageProps = {
|
|
|
59
59
|
* Whether to hide the text field.
|
|
60
60
|
*/
|
|
61
61
|
hideTextField?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Whether to enable voice input.
|
|
64
|
+
*/
|
|
65
|
+
voiceInputEnabled?: boolean;
|
|
62
66
|
/**
|
|
63
67
|
* Callback function invoked when a prompt button is clicked.
|
|
64
68
|
* Receives the button's text as a parameter.
|
|
@@ -97,4 +101,12 @@ export type PromptButtonCarouselWithImageProps = {
|
|
|
97
101
|
* Receives the placeholder text as a parameter.
|
|
98
102
|
*/
|
|
99
103
|
handleTextFieldClick: (text: string) => void;
|
|
104
|
+
/**
|
|
105
|
+
* Callback function invoked when voice transcription starts.
|
|
106
|
+
*/
|
|
107
|
+
onTranscriptionStarted?: () => void;
|
|
108
|
+
/**
|
|
109
|
+
* Callback function invoked when voice transcription completes.
|
|
110
|
+
*/
|
|
111
|
+
onTranscriptionCompleted?: (transcript: string) => void;
|
|
100
112
|
};
|