@patternfly/chatbot 2.2.1 → 6.3.0-prerelease.10
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/cjs/AttachmentEdit/AttachmentEdit.d.ts +2 -0
- package/dist/cjs/AttachmentEdit/AttachmentEdit.js +2 -2
- package/dist/cjs/Chatbot/Chatbot.d.ts +2 -0
- package/dist/cjs/Chatbot/Chatbot.js +2 -2
- package/dist/cjs/Chatbot/Chatbot.test.js +4 -0
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +6 -0
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -3
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +27 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +1 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -1
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeader.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +4 -2
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +20 -6
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +5 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +3 -2
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +20 -6
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +5 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -3
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +5 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +2 -2
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +5 -0
- package/dist/cjs/ChatbotModal/ChatbotModal.d.ts +3 -0
- package/dist/cjs/ChatbotModal/ChatbotModal.js +2 -2
- package/dist/cjs/ChatbotModal/ChatbotModal.test.d.ts +1 -0
- package/dist/cjs/ChatbotModal/ChatbotModal.test.js +28 -0
- package/dist/cjs/ChatbotPopover/ChatbotPopover.js +1 -1
- package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.d.ts +1 -0
- package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.js +3 -3
- package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +4 -0
- package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
- package/dist/cjs/CodeModal/CodeModal.js +3 -3
- package/dist/cjs/CodeModal/CodeModal.test.d.ts +1 -0
- package/dist/cjs/CodeModal/CodeModal.test.js +15 -0
- package/dist/cjs/FileDetails/FileDetails.js +1 -1
- package/dist/cjs/Message/Message.d.ts +19 -1
- package/dist/cjs/Message/Message.js +58 -39
- package/dist/cjs/Message/Message.test.js +64 -0
- package/dist/cjs/Message/MessageInput.d.ts +18 -0
- package/dist/cjs/Message/MessageInput.js +34 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +2 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.js +2 -2
- package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +2 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTile.js +2 -2
- package/dist/cjs/Message/UserFeedback/UserFeedback.js +4 -4
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +4 -0
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +4 -4
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +4 -0
- package/dist/cjs/MessageBar/AttachButton.d.ts +1 -0
- package/dist/cjs/MessageBar/AttachButton.js +3 -3
- package/dist/cjs/MessageBar/AttachButton.test.js +4 -0
- package/dist/cjs/MessageBar/MessageBar.d.ts +5 -0
- package/dist/cjs/MessageBar/MessageBar.js +14 -13
- package/dist/cjs/MessageBar/MessageBar.test.js +13 -0
- package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -0
- package/dist/cjs/MessageBar/MicrophoneButton.js +4 -4
- package/dist/cjs/MessageBar/SendButton.d.ts +1 -0
- package/dist/cjs/MessageBar/SendButton.js +3 -3
- package/dist/cjs/MessageBar/SendButton.test.js +4 -0
- package/dist/cjs/MessageBar/StopButton.d.ts +1 -0
- package/dist/cjs/MessageBar/StopButton.js +3 -3
- package/dist/cjs/MessageBar/StopButton.test.js +4 -0
- package/dist/cjs/MessageBox/MessageBox.d.ts +4 -0
- package/dist/cjs/MessageBox/MessageBox.js +21 -7
- package/dist/cjs/MessageBox/MessageBox.test.js +43 -0
- package/dist/cjs/PreviewAttachment/PreviewAttachment.d.ts +2 -0
- package/dist/cjs/PreviewAttachment/PreviewAttachment.js +2 -2
- package/dist/cjs/Settings/SettingsForm.d.ts +2 -0
- package/dist/cjs/Settings/SettingsForm.js +2 -2
- package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -1
- package/dist/cjs/Settings/SettingsForm.test.js +12 -0
- package/dist/cjs/SourcesCard/SourcesCard.d.ts +7 -1
- package/dist/cjs/SourcesCard/SourcesCard.js +17 -11
- package/dist/cjs/SourcesCard/SourcesCard.test.js +25 -15
- package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +2 -0
- package/dist/cjs/TermsOfUse/TermsOfUse.js +5 -5
- package/dist/cjs/tracking/console_tracking_provider.d.ts +4 -5
- package/dist/cjs/tracking/console_tracking_provider.js +22 -15
- package/dist/cjs/tracking/posthog_tracking_provider.d.ts +2 -2
- package/dist/cjs/tracking/posthog_tracking_provider.js +21 -12
- package/dist/cjs/tracking/segment_tracking_provider.d.ts +2 -2
- package/dist/cjs/tracking/segment_tracking_provider.js +21 -12
- package/dist/cjs/tracking/trackingProviderProxy.d.ts +1 -1
- package/dist/cjs/tracking/trackingProviderProxy.js +2 -2
- package/dist/cjs/tracking/tracking_api.d.ts +1 -1
- package/dist/cjs/tracking/tracking_registry.js +46 -12
- package/dist/cjs/tracking/tracking_spi.d.ts +15 -5
- package/dist/cjs/tracking/tracking_spi.js +9 -0
- package/dist/cjs/tracking/umami_tracking_provider.d.ts +6 -2
- package/dist/cjs/tracking/umami_tracking_provider.js +66 -22
- package/dist/css/main.css +225 -22
- package/dist/css/main.css.map +1 -1
- package/dist/esm/AttachmentEdit/AttachmentEdit.d.ts +2 -0
- package/dist/esm/AttachmentEdit/AttachmentEdit.js +2 -2
- package/dist/esm/Chatbot/Chatbot.d.ts +2 -0
- package/dist/esm/Chatbot/Chatbot.js +2 -2
- package/dist/esm/Chatbot/Chatbot.test.js +4 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +6 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -3
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +27 -0
- package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +1 -0
- package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -1
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -0
- package/dist/esm/ChatbotHeader/ChatbotHeader.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +4 -2
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +20 -6
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +5 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMain.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +3 -2
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +20 -6
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +5 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -3
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +5 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +2 -2
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +5 -0
- package/dist/esm/ChatbotModal/ChatbotModal.d.ts +3 -0
- package/dist/esm/ChatbotModal/ChatbotModal.js +2 -2
- package/dist/esm/ChatbotModal/ChatbotModal.test.d.ts +1 -0
- package/dist/esm/ChatbotModal/ChatbotModal.test.js +23 -0
- package/dist/esm/ChatbotPopover/ChatbotPopover.js +1 -1
- package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.d.ts +1 -0
- package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.js +3 -3
- package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +4 -0
- package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
- package/dist/esm/CodeModal/CodeModal.js +3 -3
- package/dist/esm/CodeModal/CodeModal.test.d.ts +1 -0
- package/dist/esm/CodeModal/CodeModal.test.js +10 -0
- package/dist/esm/FileDetails/FileDetails.js +1 -1
- package/dist/esm/Message/Message.d.ts +19 -1
- package/dist/esm/Message/Message.js +58 -39
- package/dist/esm/Message/Message.test.js +64 -0
- package/dist/esm/Message/MessageInput.d.ts +18 -0
- package/dist/esm/Message/MessageInput.js +29 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +2 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.js +2 -2
- package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +2 -0
- package/dist/esm/Message/QuickStarts/QuickStartTile.js +2 -2
- package/dist/esm/Message/UserFeedback/UserFeedback.js +4 -4
- package/dist/esm/Message/UserFeedback/UserFeedback.test.js +4 -0
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +4 -4
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +4 -0
- package/dist/esm/MessageBar/AttachButton.d.ts +1 -0
- package/dist/esm/MessageBar/AttachButton.js +3 -3
- package/dist/esm/MessageBar/AttachButton.test.js +4 -0
- package/dist/esm/MessageBar/MessageBar.d.ts +5 -0
- package/dist/esm/MessageBar/MessageBar.js +14 -13
- package/dist/esm/MessageBar/MessageBar.test.js +13 -0
- package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -0
- package/dist/esm/MessageBar/MicrophoneButton.js +4 -4
- package/dist/esm/MessageBar/SendButton.d.ts +1 -0
- package/dist/esm/MessageBar/SendButton.js +3 -3
- package/dist/esm/MessageBar/SendButton.test.js +4 -0
- package/dist/esm/MessageBar/StopButton.d.ts +1 -0
- package/dist/esm/MessageBar/StopButton.js +3 -3
- package/dist/esm/MessageBar/StopButton.test.js +4 -0
- package/dist/esm/MessageBox/MessageBox.d.ts +4 -0
- package/dist/esm/MessageBox/MessageBox.js +21 -7
- package/dist/esm/MessageBox/MessageBox.test.js +44 -1
- package/dist/esm/PreviewAttachment/PreviewAttachment.d.ts +2 -0
- package/dist/esm/PreviewAttachment/PreviewAttachment.js +2 -2
- package/dist/esm/Settings/SettingsForm.d.ts +2 -0
- package/dist/esm/Settings/SettingsForm.js +2 -2
- package/dist/esm/Settings/SettingsForm.test.d.ts +1 -1
- package/dist/esm/Settings/SettingsForm.test.js +12 -0
- package/dist/esm/SourcesCard/SourcesCard.d.ts +7 -1
- package/dist/esm/SourcesCard/SourcesCard.js +18 -12
- package/dist/esm/SourcesCard/SourcesCard.test.js +25 -15
- package/dist/esm/TermsOfUse/TermsOfUse.d.ts +2 -0
- package/dist/esm/TermsOfUse/TermsOfUse.js +5 -5
- package/dist/esm/tracking/console_tracking_provider.d.ts +4 -5
- package/dist/esm/tracking/console_tracking_provider.js +22 -15
- package/dist/esm/tracking/posthog_tracking_provider.d.ts +2 -2
- package/dist/esm/tracking/posthog_tracking_provider.js +21 -12
- package/dist/esm/tracking/segment_tracking_provider.d.ts +2 -2
- package/dist/esm/tracking/segment_tracking_provider.js +21 -12
- package/dist/esm/tracking/trackingProviderProxy.d.ts +1 -1
- package/dist/esm/tracking/trackingProviderProxy.js +2 -2
- package/dist/esm/tracking/tracking_api.d.ts +1 -1
- package/dist/esm/tracking/tracking_registry.js +46 -12
- package/dist/esm/tracking/tracking_spi.d.ts +15 -5
- package/dist/esm/tracking/tracking_spi.js +8 -1
- package/dist/esm/tracking/umami_tracking_provider.d.ts +6 -2
- package/dist/esm/tracking/umami_tracking_provider.js +66 -22
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +18 -14
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentEdit.tsx +10 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +74 -104
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDetailsLabel.tsx +48 -37
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +33 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +34 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +11 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +71 -13
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +3 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/PreviewAttachment.tsx +10 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +80 -104
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +44 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +13 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithActions.tsx +9 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSelection.tsx +11 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactSettings.tsx +289 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUseCompact.tsx +136 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +15 -1
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +8 -1
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +6 -3
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +2 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotCompact.tsx +481 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +2 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +2 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +62 -57
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +2 -0
- package/src/AttachmentEdit/AttachmentEdit.tsx +5 -1
- package/src/Chatbot/Chatbot.scss +7 -0
- package/src/Chatbot/Chatbot.test.tsx +9 -0
- package/src/Chatbot/Chatbot.tsx +4 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +38 -3
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +71 -0
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +23 -2
- package/src/ChatbotFooter/ChatbotFooter.scss +5 -0
- package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -0
- package/src/ChatbotFooter/ChatbotFooter.tsx +3 -1
- package/src/ChatbotHeader/ChatbotHeader.scss +25 -0
- package/src/ChatbotHeader/ChatbotHeader.tsx +1 -1
- package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +6 -0
- package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +12 -6
- package/src/ChatbotHeader/ChatbotHeaderMain.tsx +3 -1
- package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +8 -0
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +10 -5
- package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +6 -0
- package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +5 -2
- package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +10 -0
- package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +4 -0
- package/src/ChatbotModal/ChatbotModal.scss +15 -4
- package/src/ChatbotModal/ChatbotModal.test.tsx +59 -0
- package/src/ChatbotModal/ChatbotModal.tsx +5 -1
- package/src/ChatbotPopover/ChatbotPopover.scss +9 -5
- package/src/ChatbotPopover/ChatbotPopover.tsx +1 -1
- package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +9 -1
- package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +13 -0
- package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx +13 -2
- package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +1 -1
- package/src/CodeModal/CodeModal.scss +11 -3
- package/src/CodeModal/CodeModal.test.tsx +24 -0
- package/src/CodeModal/CodeModal.tsx +6 -2
- package/src/FileDetails/FileDetails.tsx +1 -1
- package/src/FileDetails/__snapshots__/FileDetails.test.tsx.snap +1 -1
- package/src/FileDetailsLabel/__snapshots__/FileDetailsLabel.test.tsx.snap +1 -1
- package/src/Message/Message.scss +31 -0
- package/src/Message/Message.test.tsx +83 -0
- package/src/Message/Message.tsx +121 -56
- package/src/Message/MessageInput.tsx +59 -0
- package/src/Message/QuickResponse/QuickResponse.tsx +5 -1
- package/src/Message/QuickStarts/QuickStartTile.tsx +5 -1
- package/src/Message/TextMessage/TextMessage.scss +25 -0
- package/src/Message/UserFeedback/UserFeedback.scss +24 -3
- package/src/Message/UserFeedback/UserFeedback.test.tsx +13 -0
- package/src/Message/UserFeedback/UserFeedback.tsx +4 -2
- package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +4 -0
- package/src/Message/UserFeedback/UserFeedbackComplete.tsx +10 -2
- package/src/MessageBar/AttachButton.scss +10 -0
- package/src/MessageBar/AttachButton.test.tsx +4 -0
- package/src/MessageBar/AttachButton.tsx +5 -2
- package/src/MessageBar/MessageBar.scss +17 -0
- package/src/MessageBar/MessageBar.test.tsx +13 -0
- package/src/MessageBar/MessageBar.tsx +23 -8
- package/src/MessageBar/MicrophoneButton.scss +10 -0
- package/src/MessageBar/MicrophoneButton.tsx +6 -3
- package/src/MessageBar/SendButton.scss +10 -0
- package/src/MessageBar/SendButton.test.tsx +5 -1
- package/src/MessageBar/SendButton.tsx +5 -2
- package/src/MessageBar/StopButton.scss +10 -0
- package/src/MessageBar/StopButton.test.tsx +5 -1
- package/src/MessageBar/StopButton.tsx +5 -2
- package/src/MessageBox/MessageBox.scss +6 -0
- package/src/MessageBox/MessageBox.test.tsx +45 -1
- package/src/MessageBox/MessageBox.tsx +16 -6
- package/src/PreviewAttachment/PreviewAttachment.tsx +5 -1
- package/src/Settings/Settings.scss +11 -0
- package/src/Settings/SettingsForm.test.tsx +17 -0
- package/src/Settings/SettingsForm.tsx +12 -2
- package/src/SourcesCard/SourcesCard.scss +11 -7
- package/src/SourcesCard/SourcesCard.test.tsx +30 -22
- package/src/SourcesCard/SourcesCard.tsx +56 -13
- package/src/TermsOfUse/TermsOfUse.scss +20 -0
- package/src/TermsOfUse/TermsOfUse.tsx +9 -4
- package/src/tracking/console_tracking_provider.ts +21 -17
- package/src/tracking/posthog_tracking_provider.ts +20 -13
- package/src/tracking/segment_tracking_provider.ts +20 -13
- package/src/tracking/trackingProviderProxy.ts +2 -2
- package/src/tracking/tracking_api.ts +1 -1
- package/src/tracking/tracking_registry.ts +46 -13
- package/src/tracking/tracking_spi.ts +18 -7
- package/src/tracking/umami_tracking_provider.ts +76 -20
- package/src/SourcesCard/__snapshots__/SourcesCard.test.tsx.snap +0 -34
@@ -5,18 +5,13 @@ import '@testing-library/jest-dom';
|
|
5
5
|
import SourcesCard from './SourcesCard';
|
6
6
|
|
7
7
|
describe('SourcesCard', () => {
|
8
|
-
it('should render card', () => {
|
9
|
-
const { container } = render(<SourcesCard sources={[{ link: '' }]} />);
|
10
|
-
expect(container).toMatchSnapshot();
|
11
|
-
});
|
12
|
-
|
13
8
|
it('should render card correctly if one source with only a link is passed in', () => {
|
14
9
|
render(<SourcesCard sources={[{ link: '' }]} />);
|
15
10
|
expect(screen.getByText('1 source')).toBeTruthy();
|
16
11
|
expect(screen.getByText('Source 1')).toBeTruthy();
|
17
12
|
// no buttons or navigation when there is only 1 source
|
18
13
|
expect(screen.queryByRole('button')).toBeFalsy();
|
19
|
-
expect(screen.queryByText('1
|
14
|
+
expect(screen.queryByText('1/1')).toBeFalsy();
|
20
15
|
});
|
21
16
|
|
22
17
|
it('should render card correctly if one source with a title is passed in', () => {
|
@@ -53,7 +48,7 @@ describe('SourcesCard', () => {
|
|
53
48
|
);
|
54
49
|
expect(screen.getByText('2 sources')).toBeTruthy();
|
55
50
|
expect(screen.getByText('How to make an apple pie')).toBeTruthy();
|
56
|
-
expect(screen.getByText('1
|
51
|
+
expect(screen.getByText('1/2')).toBeTruthy();
|
57
52
|
screen.getByRole('button', { name: /Go to previous page/i });
|
58
53
|
screen.getByRole('button', { name: /Go to next page/i });
|
59
54
|
});
|
@@ -68,12 +63,12 @@ describe('SourcesCard', () => {
|
|
68
63
|
/>
|
69
64
|
);
|
70
65
|
expect(screen.getByText('How to make an apple pie')).toBeTruthy();
|
71
|
-
expect(screen.getByText('1
|
66
|
+
expect(screen.getByText('1/2')).toBeTruthy();
|
72
67
|
expect(screen.getByRole('button', { name: /Go to previous page/i })).toBeDisabled();
|
73
68
|
await userEvent.click(screen.getByRole('button', { name: /Go to next page/i }));
|
74
69
|
expect(screen.queryByText('How to make an apple pie')).toBeFalsy();
|
75
70
|
expect(screen.getByText('How to make cookies')).toBeTruthy();
|
76
|
-
expect(screen.getByText('2
|
71
|
+
expect(screen.getByText('2/2')).toBeTruthy();
|
77
72
|
expect(screen.getByRole('button', { name: /Go to previous page/i })).toBeEnabled();
|
78
73
|
expect(screen.getByRole('button', { name: /Go to next page/i })).toBeDisabled();
|
79
74
|
});
|
@@ -106,19 +101,6 @@ describe('SourcesCard', () => {
|
|
106
101
|
expect(screen.getByRole('button', { name: /Go to next page/i })).toBeDisabled();
|
107
102
|
});
|
108
103
|
|
109
|
-
it('should change ofWord appropriately', () => {
|
110
|
-
render(
|
111
|
-
<SourcesCard
|
112
|
-
sources={[
|
113
|
-
{ title: 'How to make an apple pie', link: '' },
|
114
|
-
{ title: 'How to make cookies', link: '' }
|
115
|
-
]}
|
116
|
-
ofWord={'de'}
|
117
|
-
/>
|
118
|
-
);
|
119
|
-
expect(screen.getByText('1 de 2')).toBeTruthy();
|
120
|
-
});
|
121
|
-
|
122
104
|
it('should render navigation aria label appropriately', () => {
|
123
105
|
render(
|
124
106
|
<SourcesCard
|
@@ -235,4 +217,30 @@ describe('SourcesCard', () => {
|
|
235
217
|
await userEvent.click(screen.getByRole('button', { name: /Go to previous page/i }));
|
236
218
|
expect(spy).toHaveBeenCalledTimes(2);
|
237
219
|
});
|
220
|
+
|
221
|
+
it('should handle showMore appropriately', async () => {
|
222
|
+
render(
|
223
|
+
<SourcesCard
|
224
|
+
sources={[
|
225
|
+
{
|
226
|
+
title: 'Getting started with Red Hat OpenShift',
|
227
|
+
link: '#',
|
228
|
+
body: 'Red Hat OpenShift on IBM Cloud is a managed offering to create your own cluster of compute hosts where you can deploy and manage containerized apps on IBM Cloud ...',
|
229
|
+
hasShowMore: true
|
230
|
+
},
|
231
|
+
{
|
232
|
+
title: 'Azure Red Hat OpenShift documentation',
|
233
|
+
link: '#',
|
234
|
+
body: 'Microsoft Azure Red Hat OpenShift allows you to deploy a production ready Red Hat OpenShift cluster in Azure ...'
|
235
|
+
},
|
236
|
+
{
|
237
|
+
title: 'OKD Documentation: Home',
|
238
|
+
link: '#',
|
239
|
+
body: 'OKD is a distribution of Kubernetes optimized for continuous application development and multi-tenant deployment. OKD also serves as the upstream code base upon ...'
|
240
|
+
}
|
241
|
+
]}
|
242
|
+
/>
|
243
|
+
);
|
244
|
+
expect(screen.getByRole('region')).toHaveAttribute('class', 'pf-v6-c-expandable-section__content');
|
245
|
+
});
|
238
246
|
});
|
@@ -12,22 +12,31 @@ import {
|
|
12
12
|
CardFooter,
|
13
13
|
CardProps,
|
14
14
|
CardTitle,
|
15
|
+
ExpandableSection,
|
16
|
+
ExpandableSectionVariant,
|
15
17
|
Icon,
|
16
18
|
pluralize,
|
17
19
|
Truncate
|
18
20
|
} from '@patternfly/react-core';
|
21
|
+
import { ExternalLinkSquareAltIcon } from '@patternfly/react-icons';
|
19
22
|
|
20
23
|
export interface SourcesCardProps extends CardProps {
|
21
24
|
/** Additional classes for the pagination navigation container. */
|
22
25
|
className?: string;
|
23
26
|
/** Flag indicating if the pagination is disabled. */
|
24
27
|
isDisabled?: boolean;
|
25
|
-
/** Label for the English word "of"
|
28
|
+
/** @deprecated ofWord has been deprecated. Label for the English word "of." */
|
26
29
|
ofWord?: string;
|
27
30
|
/** Accessible label for the pagination component. */
|
28
31
|
paginationAriaLabel?: string;
|
29
32
|
/** Content rendered inside the paginated card */
|
30
|
-
sources: {
|
33
|
+
sources: {
|
34
|
+
title?: string;
|
35
|
+
link: string;
|
36
|
+
body?: React.ReactNode | string;
|
37
|
+
isExternal?: boolean;
|
38
|
+
hasShowMore?: boolean;
|
39
|
+
}[];
|
31
40
|
/** Label for the English word "source" */
|
32
41
|
sourceWord?: string;
|
33
42
|
/** Plural for sourceWord */
|
@@ -42,12 +51,15 @@ export interface SourcesCardProps extends CardProps {
|
|
42
51
|
onPreviousClick?: (event: React.SyntheticEvent<HTMLButtonElement>, page: number) => void;
|
43
52
|
/** Function called when page is changed. */
|
44
53
|
onSetPage?: (event: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPage: number) => void;
|
54
|
+
/** Label for English words "show more" */
|
55
|
+
showMoreWords?: string;
|
56
|
+
/** Label for English words "show less" */
|
57
|
+
showLessWords?: string;
|
45
58
|
}
|
46
59
|
|
47
60
|
const SourcesCard: React.FunctionComponent<SourcesCardProps> = ({
|
48
61
|
className,
|
49
62
|
isDisabled,
|
50
|
-
ofWord = 'of',
|
51
63
|
paginationAriaLabel = 'Pagination',
|
52
64
|
sources,
|
53
65
|
sourceWord = 'source',
|
@@ -57,9 +69,17 @@ const SourcesCard: React.FunctionComponent<SourcesCardProps> = ({
|
|
57
69
|
onNextClick,
|
58
70
|
onPreviousClick,
|
59
71
|
onSetPage,
|
72
|
+
showMoreWords = 'show more',
|
73
|
+
showLessWords = 'show less',
|
74
|
+
isCompact,
|
60
75
|
...props
|
61
76
|
}: SourcesCardProps) => {
|
62
77
|
const [page, setPage] = React.useState(1);
|
78
|
+
const [isExpanded, setIsExpanded] = React.useState(false);
|
79
|
+
|
80
|
+
const onToggle = (_event: React.MouseEvent, isExpanded: boolean) => {
|
81
|
+
setIsExpanded(isExpanded);
|
82
|
+
};
|
63
83
|
|
64
84
|
const handleNewPage = (_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPage: number) => {
|
65
85
|
setPage(newPage);
|
@@ -76,15 +96,39 @@ const SourcesCard: React.FunctionComponent<SourcesCardProps> = ({
|
|
76
96
|
return (
|
77
97
|
<div className="pf-chatbot__source">
|
78
98
|
<span>{pluralize(sources.length, sourceWord, sourceWordPlural)}</span>
|
79
|
-
<Card className="pf-chatbot__sources-card" {...props}>
|
99
|
+
<Card isCompact={isCompact} className="pf-chatbot__sources-card" {...props}>
|
80
100
|
<CardTitle className="pf-chatbot__sources-card-title">
|
81
|
-
<
|
101
|
+
<Button
|
102
|
+
component="a"
|
103
|
+
variant={ButtonVariant.link}
|
104
|
+
href={sources[page - 1].link}
|
105
|
+
icon={sources[page - 1].isExternal ? <ExternalLinkSquareAltIcon /> : undefined}
|
106
|
+
iconPosition="end"
|
107
|
+
isInline
|
108
|
+
rel={sources[page - 1].isExternal ? 'noreferrer' : undefined}
|
109
|
+
target={sources[page - 1].isExternal ? '_blank' : undefined}
|
110
|
+
>
|
111
|
+
{renderTitle(sources[page - 1].title)}
|
112
|
+
</Button>
|
82
113
|
</CardTitle>
|
83
114
|
{sources[page - 1].body && (
|
84
|
-
<CardBody
|
85
|
-
|
86
|
-
|
87
|
-
|
115
|
+
<CardBody className={`pf-chatbot__sources-card-body`}>
|
116
|
+
{sources[page - 1].hasShowMore ? (
|
117
|
+
// prevents extra VO announcements of button text - parent Message has aria-live
|
118
|
+
<div aria-live="off">
|
119
|
+
<ExpandableSection
|
120
|
+
variant={ExpandableSectionVariant.truncate}
|
121
|
+
toggleText={isExpanded ? showLessWords : showMoreWords}
|
122
|
+
onToggle={onToggle}
|
123
|
+
isExpanded={isExpanded}
|
124
|
+
truncateMaxLines={2}
|
125
|
+
>
|
126
|
+
{sources[page - 1].body}
|
127
|
+
</ExpandableSection>
|
128
|
+
</div>
|
129
|
+
) : (
|
130
|
+
<div className="pf-chatbot__sources-card-body-text">{sources[page - 1].body}</div>
|
131
|
+
)}
|
88
132
|
</CardBody>
|
89
133
|
)}
|
90
134
|
{sources.length > 1 && (
|
@@ -117,6 +161,9 @@ const SourcesCard: React.FunctionComponent<SourcesCardProps> = ({
|
|
117
161
|
</svg>
|
118
162
|
</Icon>
|
119
163
|
</Button>
|
164
|
+
<span aria-hidden="true">
|
165
|
+
{page}/{sources.length}
|
166
|
+
</span>
|
120
167
|
<Button
|
121
168
|
variant={ButtonVariant.plain}
|
122
169
|
isDisabled={isDisabled || page === sources.length}
|
@@ -144,10 +191,6 @@ const SourcesCard: React.FunctionComponent<SourcesCardProps> = ({
|
|
144
191
|
</Icon>
|
145
192
|
</Button>
|
146
193
|
</nav>
|
147
|
-
|
148
|
-
<span aria-hidden="true">
|
149
|
-
{page} {ofWord} {sources.length}
|
150
|
-
</span>
|
151
194
|
</div>
|
152
195
|
</CardFooter>
|
153
196
|
)}
|
@@ -64,3 +64,23 @@
|
|
64
64
|
font-size: var(--pf-t--global--font--size--heading--2xl);
|
65
65
|
}
|
66
66
|
}
|
67
|
+
|
68
|
+
.pf-chatbot__terms-of-use-modal.pf-m-compact {
|
69
|
+
.pf-chatbot__terms-of-use--header {
|
70
|
+
gap: var(--pf-t--global--spacer--md);
|
71
|
+
align-items: flex-start;
|
72
|
+
margin-block-start: var(--pf-t--global--spacer--lg);
|
73
|
+
}
|
74
|
+
|
75
|
+
.pf-chatbot__terms-of-use--modal-header {
|
76
|
+
--pf-v6-c-modal-box__header--PaddingBlockStart: var(--pf-t--global--spacer--md);
|
77
|
+
--pf-v6-c-modal-box__header--PaddingBlockEnd: var(--pf-t--global--spacer--md);
|
78
|
+
--pf-v6-c-modal-box__header--PaddingInlineStart: var(--pf-t--global--spacer--md);
|
79
|
+
--pf-v6-c-modal-box__header--PaddingInlineEnd: var(--pf-t--global--spacer--md);
|
80
|
+
}
|
81
|
+
|
82
|
+
.pf-chatbot__terms-of-use--modal-body {
|
83
|
+
--pf-v6-c-modal-box__body--PaddingInlineStart: var(--pf-t--global--spacer--md);
|
84
|
+
--pf-v6-c-modal-box__body--PaddingInlineEnd: var(--pf-t--global--spacer--md);
|
85
|
+
}
|
86
|
+
}
|
@@ -33,6 +33,8 @@ export interface TermsOfUseProps extends ModalProps {
|
|
33
33
|
innerRef?: React.Ref<HTMLDivElement>;
|
34
34
|
/** OuiaID applied to modal */
|
35
35
|
ouiaId?: string;
|
36
|
+
/** Sets modal to compact styling. */
|
37
|
+
isCompact?: boolean;
|
36
38
|
}
|
37
39
|
|
38
40
|
export const TermsOfUseBase: React.FunctionComponent<TermsOfUseProps> = ({
|
@@ -50,6 +52,7 @@ export const TermsOfUseBase: React.FunctionComponent<TermsOfUseProps> = ({
|
|
50
52
|
children,
|
51
53
|
innerRef,
|
52
54
|
ouiaId = 'TermsOfUse',
|
55
|
+
isCompact,
|
53
56
|
...props
|
54
57
|
}: TermsOfUseProps) => {
|
55
58
|
const handlePrimaryAction = (_event: React.MouseEvent | MouseEvent | KeyboardEvent) => {
|
@@ -67,19 +70,21 @@ export const TermsOfUseBase: React.FunctionComponent<TermsOfUseProps> = ({
|
|
67
70
|
ouiaId={ouiaId}
|
68
71
|
aria-labelledby="terms-of-use-title"
|
69
72
|
aria-describedby="terms-of-use-modal"
|
70
|
-
className={`pf-chatbot__terms-of-use-modal pf-chatbot__terms-of-use-modal--${displayMode} ${className ? className : ''}`}
|
73
|
+
className={`pf-chatbot__terms-of-use-modal pf-chatbot__terms-of-use-modal--${displayMode} ${isCompact ? 'pf-m-compact' : ''} ${className ? className : ''}`}
|
71
74
|
displayMode={displayMode}
|
72
75
|
{...props}
|
73
76
|
>
|
74
77
|
{/* This is a workaround since the PatternFly modal doesn't have ref forwarding */}
|
75
78
|
<section className={`pf-chatbot__terms-of-use--section`} aria-label={title} tabIndex={-1} ref={innerRef}>
|
76
|
-
<ModalHeader>
|
79
|
+
<ModalHeader className="pf-chatbot__terms-of-use--modal-header">
|
77
80
|
<div className="pf-chatbot__terms-of-use--header">
|
78
|
-
{image && altText &&
|
81
|
+
{!isCompact && image && altText && (
|
82
|
+
<img src={image} className="pf-chatbot__terms-of-use--image" alt={altText} />
|
83
|
+
)}
|
79
84
|
<h1 className="pf-chatbot__terms-of-use--title">{title}</h1>
|
80
85
|
</div>
|
81
86
|
</ModalHeader>
|
82
|
-
<ModalBody>
|
87
|
+
<ModalBody className="pf-chatbot__terms-of-use--modal-body">
|
83
88
|
<Content>{children}</Content>
|
84
89
|
</ModalBody>
|
85
90
|
<ModalFooter className="pf-chatbot__terms-of-use--footer">
|
@@ -1,30 +1,34 @@
|
|
1
|
-
import { TrackingSpi } from './tracking_spi';
|
1
|
+
import { InitProps, TrackingSpi } from './tracking_spi';
|
2
2
|
import { TrackingApi, TrackingEventProperties } from './tracking_api';
|
3
3
|
|
4
4
|
export class ConsoleTrackingProvider implements TrackingSpi, TrackingApi {
|
5
|
+
private verbose = false;
|
5
6
|
trackPageView(url: string | undefined) {
|
6
|
-
|
7
|
-
|
7
|
+
if (this.verbose) {
|
8
|
+
// eslint-disable-next-line no-console
|
9
|
+
console.log('ConsoleProvider pageView ', url);
|
10
|
+
}
|
8
11
|
}
|
9
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
10
|
-
registerProvider(): void {}
|
11
12
|
|
12
|
-
initialize(): void {
|
13
|
-
|
14
|
-
|
13
|
+
initialize(props: InitProps): void {
|
14
|
+
this.verbose = props.verbose;
|
15
|
+
if (this.verbose) {
|
16
|
+
// eslint-disable-next-line no-console
|
17
|
+
console.log('ConsoleProvider initialize');
|
18
|
+
}
|
15
19
|
}
|
16
20
|
|
17
|
-
identify(userID: string): void {
|
18
|
-
|
19
|
-
|
21
|
+
identify(userID: string, userProperties: TrackingEventProperties = {}): void {
|
22
|
+
if (this.verbose) {
|
23
|
+
// eslint-disable-next-line no-console
|
24
|
+
console.log('ConsoleProvider identify ', userID, userProperties);
|
25
|
+
}
|
20
26
|
}
|
21
27
|
|
22
28
|
trackSingleItem(item: string, properties?: TrackingEventProperties): void {
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
getKey(): string {
|
28
|
-
return 'console';
|
29
|
+
if (this.verbose) {
|
30
|
+
// eslint-disable-next-line no-console
|
31
|
+
console.log('ConsoleProvider: ' + item, properties);
|
32
|
+
}
|
29
33
|
}
|
30
34
|
}
|
@@ -4,13 +4,14 @@ import { TrackingApi, TrackingEventProperties } from './tracking_api';
|
|
4
4
|
import { InitProps, TrackingSpi } from './tracking_spi';
|
5
5
|
|
6
6
|
export class PosthogTrackingProvider implements TrackingSpi, TrackingApi {
|
7
|
-
|
8
|
-
return 'posthogKey';
|
9
|
-
}
|
7
|
+
private verbose = false;
|
10
8
|
|
11
9
|
initialize(props: InitProps): void {
|
12
|
-
|
13
|
-
|
10
|
+
this.verbose = props.verbose;
|
11
|
+
if (this.verbose) {
|
12
|
+
// eslint-disable-next-line no-console
|
13
|
+
console.log('PosthogProvider initialize');
|
14
|
+
}
|
14
15
|
const posthogKey = props.posthogKey as string;
|
15
16
|
|
16
17
|
posthog.init(posthogKey, {
|
@@ -21,22 +22,28 @@ export class PosthogTrackingProvider implements TrackingSpi, TrackingApi {
|
|
21
22
|
});
|
22
23
|
}
|
23
24
|
|
24
|
-
identify(userID: string): void {
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
identify(userID: string, userProperties: TrackingEventProperties = {}): void {
|
26
|
+
if (this.verbose) {
|
27
|
+
// eslint-disable-next-line no-console
|
28
|
+
console.log('PosthogProvider userID: ' + userID);
|
29
|
+
}
|
30
|
+
posthog.identify(userID, userProperties);
|
28
31
|
}
|
29
32
|
|
30
33
|
trackPageView(url: string | undefined): void {
|
31
|
-
|
32
|
-
|
34
|
+
if (this.verbose) {
|
35
|
+
// eslint-disable-next-line no-console
|
36
|
+
console.log('PostHogProvider url ', url);
|
37
|
+
}
|
33
38
|
// TODO posthog seems to record that automatically.
|
34
39
|
// How to not clash with this here? Just leave as no-op?
|
35
40
|
}
|
36
41
|
|
37
42
|
trackSingleItem(item: string, properties?: TrackingEventProperties): void {
|
38
|
-
|
39
|
-
|
43
|
+
if (this.verbose) {
|
44
|
+
// eslint-disable-next-line no-console
|
45
|
+
console.log('PosthogProvider: trackSingleItem ' + item, properties);
|
46
|
+
}
|
40
47
|
posthog.capture(item, { properties });
|
41
48
|
}
|
42
49
|
}
|
@@ -5,13 +5,14 @@ import { InitProps, TrackingSpi } from './tracking_spi';
|
|
5
5
|
|
6
6
|
export class SegmentTrackingProvider implements TrackingSpi, TrackingApi {
|
7
7
|
private analytics: AnalyticsBrowser | undefined;
|
8
|
-
|
9
|
-
return 'segmentKey';
|
10
|
-
}
|
8
|
+
private verbose = false;
|
11
9
|
|
12
10
|
initialize(props: InitProps): void {
|
13
|
-
|
14
|
-
|
11
|
+
this.verbose = props.verbose;
|
12
|
+
if (this.verbose) {
|
13
|
+
// eslint-disable-next-line no-console
|
14
|
+
console.log('SegmentProvider initialize');
|
15
|
+
}
|
15
16
|
const segmentKey = props.segmentKey as string;
|
16
17
|
|
17
18
|
// We need to create an object here, as ts lint is unhappy otherwise
|
@@ -32,17 +33,21 @@ export class SegmentTrackingProvider implements TrackingSpi, TrackingApi {
|
|
32
33
|
);
|
33
34
|
}
|
34
35
|
|
35
|
-
identify(userID: string): void {
|
36
|
-
|
37
|
-
|
36
|
+
identify(userID: string, userProperties: TrackingEventProperties = {}): void {
|
37
|
+
if (this.verbose) {
|
38
|
+
// eslint-disable-next-line no-console
|
39
|
+
console.log('SegmentProvider userID: ' + userID);
|
40
|
+
}
|
38
41
|
if (this.analytics) {
|
39
|
-
this.analytics.identify(userID);
|
42
|
+
this.analytics.identify(userID, userProperties);
|
40
43
|
}
|
41
44
|
}
|
42
45
|
|
43
46
|
trackPageView(url: string | undefined): void {
|
44
|
-
|
45
|
-
|
47
|
+
if (this.verbose) {
|
48
|
+
// eslint-disable-next-line no-console
|
49
|
+
console.log('SegmentProvider url ', url);
|
50
|
+
}
|
46
51
|
if (this.analytics) {
|
47
52
|
if (url) {
|
48
53
|
this.analytics.page(url);
|
@@ -53,8 +58,10 @@ export class SegmentTrackingProvider implements TrackingSpi, TrackingApi {
|
|
53
58
|
}
|
54
59
|
|
55
60
|
trackSingleItem(item: string, properties?: TrackingEventProperties): void {
|
56
|
-
|
57
|
-
|
61
|
+
if (this.verbose) {
|
62
|
+
// eslint-disable-next-line no-console
|
63
|
+
console.log('SegmentProvider: trackSingleItem ' + item, properties);
|
64
|
+
}
|
58
65
|
if (this.analytics) {
|
59
66
|
this.analytics.track(item, { properties });
|
60
67
|
}
|
@@ -6,9 +6,9 @@ class TrackingProviderProxy implements TrackingApi {
|
|
6
6
|
this.providers = providers;
|
7
7
|
}
|
8
8
|
|
9
|
-
identify(userID: string): void {
|
9
|
+
identify(userID: string, userProperties: TrackingEventProperties = {}): void {
|
10
10
|
for (const provider of this.providers) {
|
11
|
-
provider.identify(userID);
|
11
|
+
provider.identify(userID, userProperties);
|
12
12
|
}
|
13
13
|
}
|
14
14
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { InitProps, TrackingSpi } from './tracking_spi';
|
1
|
+
import { InitProps, Providers, TrackingSpi } from './tracking_spi';
|
2
2
|
import { TrackingApi } from './tracking_api';
|
3
3
|
import TrackingProviderProxy from './trackingProviderProxy';
|
4
4
|
import { ConsoleTrackingProvider } from './console_tracking_provider';
|
@@ -8,26 +8,59 @@ import { UmamiTrackingProvider } from './umami_tracking_provider';
|
|
8
8
|
|
9
9
|
export const getTrackingProviders = (initProps: InitProps): TrackingApi => {
|
10
10
|
const providers: TrackingSpi[] = [];
|
11
|
-
providers.push(new SegmentTrackingProvider());
|
12
|
-
providers.push(new PosthogTrackingProvider());
|
13
|
-
providers.push(new UmamiTrackingProvider());
|
14
11
|
|
15
|
-
|
12
|
+
if (initProps.activeProviders) {
|
13
|
+
let tmpProps: string[] = initProps.activeProviders;
|
14
|
+
|
15
|
+
// Theoretically we get an array of provider names, but it could also be a CSV string...
|
16
|
+
if (!Array.isArray(initProps.activeProviders)) {
|
17
|
+
const tmpString = initProps.activeProviders as string;
|
18
|
+
if (tmpString && tmpString.indexOf(',') !== -1) {
|
19
|
+
tmpProps = tmpString.split(',');
|
20
|
+
} else {
|
21
|
+
tmpProps = [tmpString];
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
tmpProps.forEach((provider) => {
|
26
|
+
switch (Providers[provider]) {
|
27
|
+
case Providers.Segment:
|
28
|
+
providers.push(new SegmentTrackingProvider());
|
29
|
+
break;
|
30
|
+
case Providers.Umami:
|
31
|
+
providers.push(new UmamiTrackingProvider());
|
32
|
+
break;
|
33
|
+
case Providers.Posthog:
|
34
|
+
providers.push(new PosthogTrackingProvider());
|
35
|
+
break;
|
36
|
+
case Providers.Console:
|
37
|
+
providers.push(new ConsoleTrackingProvider());
|
38
|
+
break;
|
39
|
+
case Providers.None: // Do nothing, just a placeholder
|
40
|
+
break;
|
41
|
+
default:
|
42
|
+
if (providers.length > 1) {
|
43
|
+
if (initProps.verbose) {
|
44
|
+
// eslint-disable-next-line no-console
|
45
|
+
console.error("Unknown provider '" + provider);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
break;
|
49
|
+
}
|
50
|
+
});
|
51
|
+
}
|
16
52
|
|
17
53
|
// Initialize them
|
18
|
-
const enabledProviders: TrackingSpi[] = [];
|
19
54
|
for (const provider of providers) {
|
20
|
-
|
21
|
-
if (Object.keys(initProps).indexOf(key) > -1) {
|
55
|
+
try {
|
22
56
|
provider.initialize(initProps);
|
23
|
-
|
57
|
+
} catch (e) {
|
58
|
+
// eslint-disable-next-line no-console
|
59
|
+
console.error(e);
|
24
60
|
}
|
25
61
|
}
|
26
|
-
// Add the console provider
|
27
|
-
const consoleTrackingProvider = new ConsoleTrackingProvider();
|
28
|
-
enabledProviders.push(consoleTrackingProvider); // TODO noop- provider?
|
29
62
|
|
30
|
-
return new TrackingProviderProxy(
|
63
|
+
return new TrackingProviderProxy(providers);
|
31
64
|
};
|
32
65
|
|
33
66
|
export default getTrackingProviders;
|
@@ -1,14 +1,25 @@
|
|
1
|
-
import { TrackingApi
|
1
|
+
import { TrackingApi } from './tracking_api';
|
2
2
|
|
3
|
-
export
|
4
|
-
|
3
|
+
export enum Providers {
|
4
|
+
None,
|
5
|
+
Segment,
|
6
|
+
Umami,
|
7
|
+
Posthog,
|
8
|
+
Console
|
9
|
+
}
|
10
|
+
|
11
|
+
export type ProviderAsString = keyof typeof Providers;
|
12
|
+
|
13
|
+
export interface BaseProps {
|
14
|
+
verbose: boolean;
|
15
|
+
activeProviders: [ProviderAsString];
|
5
16
|
}
|
6
17
|
|
18
|
+
export type InitProps = {
|
19
|
+
[key: string]: string | number | boolean;
|
20
|
+
} & BaseProps;
|
21
|
+
|
7
22
|
export interface TrackingSpi extends TrackingApi {
|
8
|
-
// Return a key in InitProps to check if the provided should be enabled
|
9
|
-
getKey: () => string;
|
10
23
|
// Initialize the provider
|
11
24
|
initialize: (props: InitProps) => void;
|
12
|
-
// Track a single item
|
13
|
-
trackSingleItem: (item: string, properties?: TrackingEventProperties) => void;
|
14
25
|
}
|