botframework-webchat-component 4.13.0 → 4.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.yml +4 -100
- package/.prettierrc.yml +1 -1
- package/lib/Activity/Avatar.d.ts +10 -0
- package/lib/Activity/Avatar.d.ts.map +1 -0
- package/lib/Activity/Avatar.js +2 -1
- package/lib/Activity/Bubble.d.ts +11 -0
- package/lib/Activity/Bubble.d.ts.map +1 -0
- package/lib/Activity/Bubble.js +2 -2
- package/lib/Activity/CarouselFilmStrip.js +21 -31
- package/lib/Activity/CarouselFilmStripAttachment.js +120 -0
- package/lib/Activity/CarouselLayout.js +5 -5
- package/lib/Activity/Speak.d.ts +10 -0
- package/lib/Activity/Speak.d.ts.map +1 -0
- package/lib/Activity/Speak.js +11 -13
- package/lib/Activity/StackedLayout.d.ts +18 -0
- package/lib/Activity/StackedLayout.d.ts.map +1 -0
- package/lib/Activity/StackedLayout.js +19 -15
- package/lib/Assets/TypingAnimation.js +2 -2
- package/lib/Attachment/Assets/DownloadIcon.js +3 -1
- package/lib/Attachment/AudioAttachment.js +2 -2
- package/lib/Attachment/AudioContent.d.ts +11 -0
- package/lib/Attachment/AudioContent.d.ts.map +1 -0
- package/lib/Attachment/AudioContent.js +4 -4
- package/lib/Attachment/FileAttachment.js +2 -2
- package/lib/Attachment/FileContent.d.ts +10 -0
- package/lib/Attachment/FileContent.d.ts.map +1 -0
- package/lib/Attachment/FileContent.js +14 -9
- package/lib/Attachment/HTMLVideoContent.d.ts +11 -0
- package/lib/Attachment/HTMLVideoContent.d.ts.map +1 -0
- package/lib/Attachment/HTMLVideoContent.js +2 -2
- package/lib/Attachment/ImageContent.d.ts +8 -0
- package/lib/Attachment/ImageContent.d.ts.map +1 -0
- package/lib/Attachment/ImageContent.js +2 -2
- package/lib/Attachment/TextContent.d.ts +8 -0
- package/lib/Attachment/TextContent.d.ts.map +1 -0
- package/lib/Attachment/TextContent.js +4 -4
- package/lib/Attachment/VideoAttachment.js +2 -2
- package/lib/Attachment/VideoContent.d.ts +11 -0
- package/lib/Attachment/VideoContent.d.ts.map +1 -0
- package/lib/Attachment/VideoContent.js +1 -1
- package/lib/Attachment/VimeoContent.d.ts +10 -0
- package/lib/Attachment/VimeoContent.d.ts.map +1 -0
- package/lib/Attachment/VimeoContent.js +8 -8
- package/lib/Attachment/YouTubeContent.d.ts +10 -0
- package/lib/Attachment/YouTubeContent.d.ts.map +1 -0
- package/lib/Attachment/YouTubeContent.js +5 -5
- package/lib/Avatar/ImageAvatar.js +2 -2
- package/lib/Avatar/InitialsAvatar.js +2 -2
- package/lib/BasicConnectivityStatus.js +2 -2
- package/lib/BasicSendBox.d.ts +9 -0
- package/lib/BasicSendBox.d.ts.map +1 -0
- package/lib/BasicSendBox.js +7 -6
- package/lib/BasicToast.js +4 -4
- package/lib/BasicToaster.js +8 -5
- package/lib/BasicTranscript.d.ts +7 -0
- package/lib/BasicTranscript.d.ts.map +1 -0
- package/lib/BasicTranscript.js +406 -743
- package/lib/BasicTypingIndicator.d.ts +6 -0
- package/lib/BasicTypingIndicator.d.ts.map +1 -0
- package/lib/BasicTypingIndicator.js +13 -5
- package/lib/BasicWebChat.d.ts +9 -0
- package/lib/BasicWebChat.d.ts.map +1 -0
- package/lib/BasicWebChat.js +6 -4
- package/lib/Composer.d.ts +23 -0
- package/lib/Composer.d.ts.map +1 -0
- package/lib/Composer.js +65 -82
- package/lib/ConnectivityStatus/Assets/ErrorNotificationIcon.js +2 -2
- package/lib/ConnectivityStatus/Assets/SpinnerAnimation.js +2 -2
- package/lib/ConnectivityStatus/Assets/WarningNotificationIcon.js +2 -2
- package/lib/ConnectivityStatus/Connected.js +1 -1
- package/lib/ConnectivityStatus/Connecting.js +4 -4
- package/lib/ConnectivityStatus/FailedToConnect.js +2 -2
- package/lib/ConnectivityStatus/JavaScriptError.js +2 -2
- package/lib/Dictation.js +13 -4
- package/lib/ErrorBox.d.ts +8 -0
- package/lib/ErrorBox.d.ts.map +1 -0
- package/lib/ErrorBox.js +2 -2
- package/lib/Middleware/Activity/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/Activity/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Activity/createCoreMiddleware.js +1 -1
- package/lib/Middleware/ActivityStatus/AbsoluteTime.js +1 -1
- package/lib/Middleware/ActivityStatus/RelativeTime.js +1 -1
- package/lib/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js +3 -3
- package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts +11 -0
- package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts.map +1 -0
- package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.js +5 -5
- package/lib/Middleware/ActivityStatus/Timestamp.d.ts +9 -0
- package/lib/Middleware/ActivityStatus/Timestamp.d.ts.map +1 -0
- package/lib/Middleware/ActivityStatus/Timestamp.js +2 -2
- package/lib/Middleware/ActivityStatus/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/ActivityStatus/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/ActivityStatus/createCoreMiddleware.js +1 -1
- package/lib/Middleware/ActivityStatus/createSendStatusMiddleware.js +21 -16
- package/lib/Middleware/ActivityStatus/createTimestampMiddleware.js +1 -1
- package/lib/Middleware/Attachment/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/Attachment/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Attachment/createCoreMiddleware.js +10 -13
- package/lib/Middleware/AttachmentForScreenReader/AudioAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/FileAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/ImageAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/TextAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/VideoAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.js +9 -5
- package/lib/Middleware/Avatar/createCoreMiddleware.d.ts +11 -0
- package/lib/Middleware/Avatar/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Avatar/createCoreMiddleware.js +3 -4
- package/lib/Middleware/CardAction/createCoreMiddleware.js +11 -4
- package/lib/Middleware/GroupActivities/createCoreMiddleware.js +1 -1
- package/lib/Middleware/ScrollToEndButton/ScrollToEndButton.js +71 -0
- package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts +3 -0
- package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts.map +1 -0
- package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.js +27 -0
- package/lib/Middleware/Toast/createCoreMiddleware.d.ts +4 -0
- package/lib/Middleware/Toast/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Toast/createCoreMiddleware.js +1 -1
- package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/TypingIndicator/createCoreMiddleware.js +9 -6
- package/lib/ReactWebChat.d.ts +10 -0
- package/lib/ReactWebChat.d.ts.map +1 -0
- package/lib/ReactWebChat.js +19 -7
- package/lib/ScreenReaderActivity.js +76 -48
- package/lib/ScreenReaderText.d.ts +9 -0
- package/lib/ScreenReaderText.d.ts.map +1 -0
- package/lib/ScreenReaderText.js +22 -8
- package/lib/SendBox/Assets/AttachmentIcon.js +3 -1
- package/lib/SendBox/Assets/MicrophoneIcon.js +3 -1
- package/lib/SendBox/Assets/SendIcon.js +2 -2
- package/lib/SendBox/AutoResizeTextArea.d.ts +23 -0
- package/lib/SendBox/AutoResizeTextArea.d.ts.map +1 -0
- package/lib/SendBox/AutoResizeTextArea.js +6 -6
- package/lib/SendBox/DictationInterims.d.ts +9 -0
- package/lib/SendBox/DictationInterims.d.ts.map +1 -0
- package/lib/SendBox/DictationInterims.js +3 -3
- package/lib/SendBox/IconButton.d.ts +11 -0
- package/lib/SendBox/IconButton.d.ts.map +1 -0
- package/lib/SendBox/IconButton.js +27 -7
- package/lib/SendBox/MicrophoneButton.d.ts +11 -0
- package/lib/SendBox/MicrophoneButton.d.ts.map +1 -0
- package/lib/SendBox/MicrophoneButton.js +25 -24
- package/lib/SendBox/SendButton.d.ts +9 -0
- package/lib/SendBox/SendButton.d.ts.map +1 -0
- package/lib/SendBox/SendButton.js +8 -6
- package/lib/SendBox/SuggestedAction.d.ts +17 -0
- package/lib/SendBox/SuggestedAction.d.ts.map +1 -0
- package/lib/SendBox/SuggestedAction.js +29 -24
- package/lib/SendBox/SuggestedActions.d.ts +5 -0
- package/lib/SendBox/SuggestedActions.d.ts.map +1 -0
- package/lib/SendBox/SuggestedActions.js +33 -13
- package/lib/SendBox/TextBox.d.ts +28 -0
- package/lib/SendBox/TextBox.d.ts.map +1 -0
- package/lib/SendBox/TextBox.js +13 -8
- package/lib/SendBox/UploadButton.d.ts +9 -0
- package/lib/SendBox/UploadButton.d.ts.map +1 -0
- package/lib/SendBox/UploadButton.js +6 -6
- package/lib/Styles/StyleSet/Activities.d.ts +5 -0
- package/lib/Styles/StyleSet/Activities.d.ts.map +1 -0
- package/lib/Styles/StyleSet/AudioAttachment.d.ts +6 -0
- package/lib/Styles/StyleSet/AudioAttachment.d.ts.map +1 -0
- package/lib/Styles/StyleSet/AudioContent.d.ts +4 -0
- package/lib/Styles/StyleSet/AudioContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/AutoResizeTextArea.d.ts +37 -0
- package/lib/Styles/StyleSet/AutoResizeTextArea.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Avatar.d.ts +9 -0
- package/lib/Styles/StyleSet/Avatar.d.ts.map +1 -0
- package/lib/Styles/StyleSet/BasicTranscript.d.ts +85 -0
- package/lib/Styles/StyleSet/BasicTranscript.d.ts.map +1 -0
- package/lib/Styles/StyleSet/BasicTranscript.js +21 -9
- package/lib/Styles/StyleSet/Bubble.d.ts +5 -0
- package/lib/Styles/StyleSet/Bubble.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Bubble.js +2 -2
- package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts +5 -0
- package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts.map +1 -0
- package/lib/Styles/StyleSet/CarouselFilmStrip.js +2 -18
- package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts +3 -0
- package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts.map +1 -0
- package/lib/Styles/StyleSet/CarouselFilmStripAttachment.js +63 -0
- package/lib/Styles/StyleSet/CarouselFlipper.d.ts +27 -0
- package/lib/Styles/StyleSet/CarouselFlipper.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ConnectivityNotification.d.ts +13 -0
- package/lib/Styles/StyleSet/ConnectivityNotification.d.ts.map +1 -0
- package/lib/Styles/StyleSet/DictationInterims.d.ts +13 -0
- package/lib/Styles/StyleSet/DictationInterims.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ErrorBox.d.ts +33 -0
- package/lib/Styles/StyleSet/ErrorBox.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ErrorNotification.d.ts +23 -0
- package/lib/Styles/StyleSet/ErrorNotification.d.ts.map +1 -0
- package/lib/Styles/StyleSet/FileContent.d.ts +32 -0
- package/lib/Styles/StyleSet/FileContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ImageAvatar.d.ts +7 -0
- package/lib/Styles/StyleSet/ImageAvatar.d.ts.map +1 -0
- package/lib/Styles/StyleSet/InitialsAvatar.d.ts +19 -0
- package/lib/Styles/StyleSet/InitialsAvatar.d.ts.map +1 -0
- package/lib/Styles/StyleSet/KeyboardHelp.d.ts +123 -0
- package/lib/Styles/StyleSet/KeyboardHelp.d.ts.map +1 -0
- package/lib/Styles/StyleSet/KeyboardHelp.js +145 -0
- package/lib/Styles/StyleSet/MicrophoneButton.d.ts +13 -0
- package/lib/Styles/StyleSet/MicrophoneButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Root.d.ts +8 -0
- package/lib/Styles/StyleSet/Root.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ScrollToEndButton.d.ts +36 -0
- package/lib/Styles/StyleSet/ScrollToEndButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ScrollToEndButton.js +36 -34
- package/lib/Styles/StyleSet/SendBox.d.ts +24 -0
- package/lib/Styles/StyleSet/SendBox.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SendBoxButton.d.ts +79 -0
- package/lib/Styles/StyleSet/SendBoxButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SendBoxButton.js +76 -12
- package/lib/Styles/StyleSet/SendBoxTextBox.d.ts +41 -0
- package/lib/Styles/StyleSet/SendBoxTextBox.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SendBoxTextBox.js +3 -3
- package/lib/Styles/StyleSet/SendStatus.d.ts +8 -0
- package/lib/Styles/StyleSet/SendStatus.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SingleAttachmentActivity.d.ts +11 -0
- package/lib/Styles/StyleSet/SingleAttachmentActivity.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SpinnerAnimation.d.ts +15 -0
- package/lib/Styles/StyleSet/SpinnerAnimation.d.ts.map +1 -0
- package/lib/Styles/StyleSet/StackedLayout.d.ts +63 -0
- package/lib/Styles/StyleSet/StackedLayout.d.ts.map +1 -0
- package/lib/Styles/StyleSet/StackedLayout.js +1 -1
- package/lib/Styles/StyleSet/SuggestedAction.d.ts +94 -0
- package/lib/Styles/StyleSet/SuggestedAction.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SuggestedAction.js +116 -41
- package/lib/Styles/StyleSet/SuggestedActions.d.ts +125 -0
- package/lib/Styles/StyleSet/SuggestedActions.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SuggestedActions.js +13 -6
- package/lib/Styles/StyleSet/TextContent.d.ts +28 -0
- package/lib/Styles/StyleSet/TextContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Toast.d.ts +65 -0
- package/lib/Styles/StyleSet/Toast.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Toaster.d.ts +111 -0
- package/lib/Styles/StyleSet/Toaster.d.ts.map +1 -0
- package/lib/Styles/StyleSet/TypingAnimation.d.ts +8 -0
- package/lib/Styles/StyleSet/TypingAnimation.d.ts.map +1 -0
- package/lib/Styles/StyleSet/TypingIndicator.d.ts +11 -0
- package/lib/Styles/StyleSet/TypingIndicator.d.ts.map +1 -0
- package/lib/Styles/StyleSet/UploadButton.d.ts +14 -0
- package/lib/Styles/StyleSet/UploadButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/VideoAttachment.d.ts +2 -0
- package/lib/Styles/StyleSet/VideoAttachment.d.ts.map +1 -0
- package/lib/Styles/StyleSet/VideoContent.d.ts +6 -0
- package/lib/Styles/StyleSet/VideoContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/VimeoContent.d.ts +7 -0
- package/lib/Styles/StyleSet/VimeoContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/WarningNotification.d.ts +22 -0
- package/lib/Styles/StyleSet/WarningNotification.d.ts.map +1 -0
- package/lib/Styles/StyleSet/YouTubeContent.d.ts +7 -0
- package/lib/Styles/StyleSet/YouTubeContent.d.ts.map +1 -0
- package/lib/Styles/createStyleSet.d.ts +1372 -0
- package/lib/Styles/createStyleSet.d.ts.map +1 -0
- package/lib/Styles/createStyleSet.js +47 -41
- package/lib/Styles/mirrorStyle.js +13 -4
- package/lib/Toast/CollapseIcon.js +3 -1
- package/lib/Toast/DismissIcon.js +3 -1
- package/lib/Toast/ExpandIcon.js +3 -1
- package/lib/Toast/NotificationIcon.js +7 -3
- package/lib/Toast/createToastMiddleware.d.ts +4 -0
- package/lib/Toast/createToastMiddleware.d.ts.map +1 -0
- package/lib/Toast/createToastMiddleware.js +2 -2
- package/lib/Transcript/ActivityRow.d.ts +9 -0
- package/lib/Transcript/ActivityRow.d.ts.map +1 -0
- package/lib/Transcript/ActivityRow.js +157 -0
- package/lib/Transcript/ActivityTextAlt.js +57 -0
- package/lib/Transcript/FocusTrap.d.ts +8 -0
- package/lib/Transcript/FocusTrap.d.ts.map +1 -0
- package/lib/Transcript/FocusTrap.js +74 -0
- package/lib/Transcript/KeyboardHelp.d.ts +4 -0
- package/lib/Transcript/KeyboardHelp.d.ts.map +1 -0
- package/lib/Transcript/KeyboardHelp.js +550 -0
- package/lib/Transcript/LiveRegionTranscript.d.ts +8 -0
- package/lib/Transcript/LiveRegionTranscript.d.ts.map +1 -0
- package/lib/Transcript/LiveRegionTranscript.js +214 -0
- package/lib/Transcript/types.d.ts +2 -0
- package/lib/Transcript/types.d.ts.map +1 -0
- package/lib/Transcript/types.js +2 -0
- package/lib/Transcript/useActivityAccessibleName.d.ts +4 -0
- package/lib/Transcript/useActivityAccessibleName.d.ts.map +1 -0
- package/lib/Transcript/useActivityAccessibleName.js +97 -0
- package/lib/Utils/AccessKeySink/Surface.js +7 -5
- package/lib/Utils/AccessibleButton.d.ts +11 -0
- package/lib/Utils/AccessibleButton.d.ts.map +1 -0
- package/lib/Utils/AccessibleButton.js +15 -8
- package/lib/Utils/AccessibleInputText.d.ts +21 -0
- package/lib/Utils/AccessibleInputText.d.ts.map +1 -0
- package/lib/Utils/AccessibleInputText.js +29 -25
- package/lib/Utils/AccessibleTextArea.d.ts +20 -0
- package/lib/Utils/AccessibleTextArea.d.ts.map +1 -0
- package/lib/Utils/AccessibleTextArea.js +35 -24
- package/lib/Utils/CroppedImage.js +2 -2
- package/lib/Utils/Fade.js +2 -2
- package/lib/Utils/FocusRedirector.d.ts +9 -0
- package/lib/Utils/FocusRedirector.d.ts.map +1 -0
- package/lib/Utils/FocusRedirector.js +18 -15
- package/lib/Utils/InlineMarkdown.js +17 -10
- package/lib/Utils/TypeFocusSink/FocusBox.js +6 -4
- package/lib/Utils/TypeFocusSink/getTabIndex.d.ts +2 -0
- package/lib/Utils/TypeFocusSink/getTabIndex.d.ts.map +1 -0
- package/lib/Utils/TypeFocusSink/getTabIndex.js +1 -1
- package/lib/Utils/TypeFocusSink/inputtableKey.d.ts +2 -0
- package/lib/Utils/TypeFocusSink/inputtableKey.d.ts.map +1 -0
- package/lib/Utils/TypeFocusSink/inputtableKey.js +5 -2
- package/lib/Utils/TypeFocusSink/navigableEvent.js +1 -1
- package/lib/Utils/activityAltText.d.ts +8 -0
- package/lib/Utils/activityAltText.d.ts.map +1 -0
- package/lib/Utils/activityAltText.js +100 -0
- package/lib/Utils/addTargetBlankToHyperlinksMarkdown.js +1 -1
- package/lib/Utils/createCustomEvent.js +9 -3
- package/lib/Utils/debounce.js +1 -1
- package/lib/Utils/detectBrowser.js +4 -2
- package/lib/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js +3 -3
- package/lib/Utils/downscaleImageToDataURL/index.js +2 -2
- package/lib/Utils/filterMap.js +1 -1
- package/lib/Utils/findAncestor.js +17 -0
- package/lib/Utils/getActivityUniqueId.js +4 -2
- package/lib/Utils/intersectionOf.d.ts +5 -0
- package/lib/Utils/intersectionOf.d.ts.map +1 -0
- package/lib/Utils/intersectionOf.js +17 -2
- package/lib/Utils/isZeroOrPositive.d.ts +5 -0
- package/lib/Utils/isZeroOrPositive.d.ts.map +1 -0
- package/lib/Utils/isZeroOrPositive.js +4 -1
- package/lib/Utils/mapMap.js +10 -3
- package/lib/Utils/readDataURIToBlob.js +3 -3
- package/lib/Utils/scrollIntoViewWithBlockNearest.d.ts +7 -0
- package/lib/Utils/scrollIntoViewWithBlockNearest.d.ts.map +1 -0
- package/lib/Utils/scrollIntoViewWithBlockNearest.js +48 -0
- package/lib/Utils/shallowEquals.js +7 -3
- package/lib/Utils/singleToArray.js +1 -1
- package/lib/Utils/supportPseudoClass.d.ts +2 -0
- package/lib/Utils/supportPseudoClass.d.ts.map +1 -0
- package/lib/Utils/supportPseudoClass.js +23 -0
- package/lib/Utils/tabbableElements.d.ts +2 -0
- package/lib/Utils/tabbableElements.d.ts.map +1 -0
- package/lib/Utils/tabbableElements.js +2 -2
- package/lib/connectToWebChat.js +17 -7
- package/lib/hooks/index.d.ts +21 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js +25 -25
- package/lib/hooks/internal/BypassSpeechSynthesisPonyfill.js +100 -41
- package/lib/hooks/internal/UITracker.js +2 -2
- package/lib/hooks/internal/useChanged.js +8 -1
- package/lib/hooks/internal/useDispatchScrollPosition.js +3 -7
- package/lib/hooks/internal/useDispatchTranscriptFocusByActivityKey.d.ts +2 -0
- package/lib/hooks/internal/useDispatchTranscriptFocusByActivityKey.d.ts.map +1 -0
- package/lib/hooks/internal/useDispatchTranscriptFocusByActivityKey.js +15 -0
- package/lib/hooks/internal/useEnterKeyHint.js +1 -1
- package/lib/hooks/internal/useFocusVisible.d.ts +3 -0
- package/lib/hooks/internal/useFocusVisible.d.ts.map +1 -0
- package/lib/hooks/internal/useFocusVisible.js +48 -0
- package/lib/hooks/internal/useForceRender.js +2 -2
- package/lib/hooks/internal/useForceRenderAtInterval.js +2 -2
- package/lib/hooks/internal/useInternalRenderMarkdownInline.js +1 -1
- package/lib/hooks/internal/useLocalizeAccessKey.js +2 -2
- package/lib/hooks/internal/useMemoWithPrevious.d.ts +3 -0
- package/lib/hooks/internal/useMemoWithPrevious.d.ts.map +1 -0
- package/lib/hooks/internal/useMemoWithPrevious.js +22 -0
- package/lib/hooks/internal/useMemoize.d.ts +14 -0
- package/lib/hooks/internal/useMemoize.d.ts.map +1 -0
- package/lib/hooks/internal/useMemoize.js +12 -3
- package/lib/hooks/internal/useNavigatorPlatform.js +1 -1
- package/lib/hooks/internal/useNonce.js +1 -1
- package/lib/hooks/internal/useObserveFocusVisible.d.ts +3 -0
- package/lib/hooks/internal/useObserveFocusVisible.d.ts.map +1 -0
- package/lib/hooks/internal/useObserveFocusVisible.js +208 -0
- package/lib/hooks/internal/usePrevious.d.ts +2 -0
- package/lib/hooks/internal/usePrevious.d.ts.map +1 -0
- package/lib/hooks/internal/usePrevious.js +18 -0
- package/lib/hooks/internal/useRegisterFocusSendBox.js +1 -1
- package/lib/hooks/internal/useRegisterFocusTranscript.js +1 -1
- package/lib/hooks/internal/useRegisterScrollRelative.js +1 -1
- package/lib/hooks/internal/useRegisterScrollTo.js +1 -1
- package/lib/hooks/internal/useRegisterScrollToEnd.js +1 -1
- package/lib/hooks/internal/useReplaceEmoticon.js +2 -2
- package/lib/hooks/internal/useResumeAudioContext.js +33 -0
- package/lib/hooks/internal/useScrollRelative.js +1 -1
- package/lib/hooks/internal/useSettableDictateAbortable.js +1 -1
- package/lib/hooks/internal/useStateRef.d.ts +3 -0
- package/lib/hooks/internal/useStateRef.d.ts.map +1 -0
- package/lib/hooks/internal/useStateRef.js +40 -0
- package/lib/hooks/internal/useSuggestedActionsAccessKey.js +1 -1
- package/lib/hooks/internal/useUniqueId.d.ts +2 -0
- package/lib/hooks/internal/useUniqueId.d.ts.map +1 -0
- package/lib/hooks/internal/useUniqueId.js +1 -1
- package/lib/hooks/internal/useValueRef.d.ts +3 -0
- package/lib/hooks/internal/useValueRef.d.ts.map +1 -0
- package/lib/hooks/internal/useValueRef.js +25 -0
- package/lib/hooks/useDictateAbortable.d.ts +2 -0
- package/lib/hooks/useDictateAbortable.d.ts.map +1 -0
- package/lib/hooks/useDictateAbortable.js +2 -2
- package/lib/hooks/useFocus.d.ts +2 -0
- package/lib/hooks/useFocus.d.ts.map +1 -0
- package/lib/hooks/useFocus.js +1 -1
- package/lib/hooks/useFocusSendBox.d.ts +3 -0
- package/lib/hooks/useFocusSendBox.d.ts.map +1 -0
- package/lib/hooks/useFocusSendBox.js +2 -1
- package/lib/hooks/useObserveScrollPosition.d.ts +3 -0
- package/lib/hooks/useObserveScrollPosition.d.ts.map +1 -0
- package/lib/hooks/useObserveScrollPosition.js +2 -2
- package/lib/hooks/useObserveTranscriptFocus.d.ts +5 -0
- package/lib/hooks/useObserveTranscriptFocus.d.ts.map +1 -0
- package/lib/hooks/useObserveTranscriptFocus.js +2 -2
- package/lib/hooks/useRenderMarkdownAsHTML.d.ts +5 -0
- package/lib/hooks/useRenderMarkdownAsHTML.d.ts.map +1 -0
- package/lib/hooks/useRenderMarkdownAsHTML.js +2 -2
- package/lib/hooks/useScrollDown.d.ts +4 -0
- package/lib/hooks/useScrollDown.d.ts.map +1 -0
- package/lib/hooks/useScrollDown.js +1 -1
- package/lib/hooks/useScrollTo.d.ts +5 -0
- package/lib/hooks/useScrollTo.d.ts.map +1 -0
- package/lib/hooks/useScrollTo.js +1 -1
- package/lib/hooks/useScrollToEnd.d.ts +2 -0
- package/lib/hooks/useScrollToEnd.d.ts.map +1 -0
- package/lib/hooks/useScrollToEnd.js +1 -1
- package/lib/hooks/useScrollUp.d.ts +4 -0
- package/lib/hooks/useScrollUp.d.ts.map +1 -0
- package/lib/hooks/useScrollUp.js +1 -1
- package/lib/hooks/useSendFiles.d.ts +2 -0
- package/lib/hooks/useSendFiles.d.ts.map +1 -0
- package/lib/hooks/useSendFiles.js +3 -3
- package/lib/hooks/useStyleSet.d.ts +2 -0
- package/lib/hooks/useStyleSet.d.ts.map +1 -0
- package/lib/hooks/useStyleSet.js +1 -1
- package/lib/hooks/useWebSpeechPonyfill.d.ts +3 -0
- package/lib/hooks/useWebSpeechPonyfill.d.ts.map +1 -0
- package/lib/hooks/useWebSpeechPonyfill.js +1 -1
- package/lib/index.d.ts +219 -22
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +22 -20
- package/lib/providers/ActivityTree/ActivityTreeComposer.d.ts +5 -0
- package/lib/providers/ActivityTree/ActivityTreeComposer.d.ts.map +1 -0
- package/lib/providers/ActivityTree/ActivityTreeComposer.js +86 -0
- package/lib/providers/ActivityTree/private/Context.d.ts +9 -0
- package/lib/providers/ActivityTree/private/Context.d.ts.map +1 -0
- package/lib/providers/ActivityTree/private/Context.js +13 -0
- package/lib/providers/ActivityTree/private/types.d.ts +10 -0
- package/lib/providers/ActivityTree/private/types.d.ts.map +1 -0
- package/lib/providers/ActivityTree/private/types.js +2 -0
- package/lib/providers/ActivityTree/private/useActivitiesWithRenderer.d.ts +4 -0
- package/lib/providers/ActivityTree/private/useActivitiesWithRenderer.d.ts.map +1 -0
- package/lib/providers/ActivityTree/private/useActivitiesWithRenderer.js +58 -0
- package/lib/providers/ActivityTree/private/useActivityTreeWithRenderer.d.ts +5 -0
- package/lib/providers/ActivityTree/private/useActivityTreeWithRenderer.d.ts.map +1 -0
- package/lib/providers/ActivityTree/private/useActivityTreeWithRenderer.js +166 -0
- package/lib/providers/ActivityTree/private/useContext.d.ts +3 -0
- package/lib/providers/ActivityTree/private/useContext.d.ts.map +1 -0
- package/lib/providers/ActivityTree/private/useContext.js +24 -0
- package/lib/providers/ActivityTree/useActivityTreeWithRenderer.d.ts +8 -0
- package/lib/providers/ActivityTree/useActivityTreeWithRenderer.d.ts.map +1 -0
- package/lib/providers/ActivityTree/useActivityTreeWithRenderer.js +17 -0
- package/lib/providers/LiveRegionTwin/LiveRegionTwinComposer.d.ts +35 -0
- package/lib/providers/LiveRegionTwin/LiveRegionTwinComposer.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/LiveRegionTwinComposer.js +156 -0
- package/lib/providers/LiveRegionTwin/private/Context.d.ts +10 -0
- package/lib/providers/LiveRegionTwin/private/Context.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/private/Context.js +13 -0
- package/lib/providers/LiveRegionTwin/private/LiveRegionTwinContainer.d.ts +11 -0
- package/lib/providers/LiveRegionTwin/private/LiveRegionTwinContainer.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/private/LiveRegionTwinContainer.js +86 -0
- package/lib/providers/LiveRegionTwin/private/types.d.ts +8 -0
- package/lib/providers/LiveRegionTwin/private/types.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/private/types.js +2 -0
- package/lib/providers/LiveRegionTwin/private/useContext.d.ts +3 -0
- package/lib/providers/LiveRegionTwin/private/useContext.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/private/useContext.js +24 -0
- package/lib/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.d.ts +2 -0
- package/lib/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.js +24 -0
- package/lib/providers/LiveRegionTwin/private/useStaticElementEntries.d.ts +3 -0
- package/lib/providers/LiveRegionTwin/private/useStaticElementEntries.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/private/useStaticElementEntries.js +15 -0
- package/lib/providers/LiveRegionTwin/useQueueStaticElement.d.ts +8 -0
- package/lib/providers/LiveRegionTwin/useQueueStaticElement.d.ts.map +1 -0
- package/lib/providers/LiveRegionTwin/useQueueStaticElement.js +20 -0
- package/lib/providers/TranscriptFocus/TranscriptFocusComposer.d.ts +7 -0
- package/lib/providers/TranscriptFocus/TranscriptFocusComposer.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/TranscriptFocusComposer.js +184 -0
- package/lib/providers/TranscriptFocus/private/Context.d.ts +12 -0
- package/lib/providers/TranscriptFocus/private/Context.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/private/Context.js +13 -0
- package/lib/providers/TranscriptFocus/private/useContext.d.ts +2 -0
- package/lib/providers/TranscriptFocus/private/useContext.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/private/useContext.js +24 -0
- package/lib/providers/TranscriptFocus/useActiveDescendantId.d.ts +2 -0
- package/lib/providers/TranscriptFocus/useActiveDescendantId.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/useActiveDescendantId.js +15 -0
- package/lib/providers/TranscriptFocus/useFocusByActivityKey.d.ts +8 -0
- package/lib/providers/TranscriptFocus/useFocusByActivityKey.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/useFocusByActivityKey.js +21 -0
- package/lib/providers/TranscriptFocus/useFocusRelativeActivity.d.ts +2 -0
- package/lib/providers/TranscriptFocus/useFocusRelativeActivity.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/useFocusRelativeActivity.js +15 -0
- package/lib/providers/TranscriptFocus/useFocusedActivityKey.d.ts +2 -0
- package/lib/providers/TranscriptFocus/useFocusedActivityKey.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/useFocusedActivityKey.js +15 -0
- package/lib/providers/TranscriptFocus/useFocusedExplicitly.d.ts +2 -0
- package/lib/providers/TranscriptFocus/useFocusedExplicitly.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/useFocusedExplicitly.js +15 -0
- package/lib/providers/TranscriptFocus/useGetDescendantIdByActivityKey.d.ts +2 -0
- package/lib/providers/TranscriptFocus/useGetDescendantIdByActivityKey.d.ts.map +1 -0
- package/lib/providers/TranscriptFocus/useGetDescendantIdByActivityKey.js +15 -0
- package/lib/tsconfig.json +1 -1
- package/lib/types/ScrollPosition.d.ts +6 -0
- package/lib/types/ScrollPosition.d.ts.map +1 -0
- package/lib/types/ScrollPosition.js +2 -0
- package/package.json +33 -40
- package/src/Activity/{Avatar.js → Avatar.tsx} +9 -2
- package/src/Activity/{Bubble.js → Bubble.tsx} +10 -2
- package/src/Activity/CarouselFilmStrip.js +20 -29
- package/src/Activity/CarouselFilmStripAttachment.js +91 -0
- package/src/Activity/{Speak.js → Speak.tsx} +12 -5
- package/src/Activity/{StackedLayout.js → StackedLayout.tsx} +46 -20
- package/src/Attachment/Assets/DownloadIcon.js +8 -1
- package/src/Attachment/{AudioContent.js → AudioContent.tsx} +12 -3
- package/src/Attachment/FileAttachment.js +1 -1
- package/src/Attachment/{FileContent.js → FileContent.tsx} +22 -7
- package/src/Attachment/{HTMLVideoContent.js → HTMLVideoContent.tsx} +10 -2
- package/src/Attachment/{ImageContent.js → ImageContent.tsx} +7 -2
- package/src/Attachment/{TextContent.js → TextContent.tsx} +14 -7
- package/src/Attachment/{VideoContent.js → VideoContent.tsx} +10 -2
- package/src/Attachment/{VimeoContent.js → VimeoContent.tsx} +15 -8
- package/src/Attachment/{YouTubeContent.js → YouTubeContent.tsx} +12 -5
- package/src/{BasicSendBox.js → BasicSendBox.tsx} +9 -5
- package/src/BasicToaster.js +9 -5
- package/src/BasicTranscript.tsx +878 -0
- package/src/{BasicTypingIndicator.js → BasicTypingIndicator.tsx} +4 -3
- package/src/{BasicWebChat.js → BasicWebChat.tsx} +13 -4
- package/src/{Composer.js → Composer.tsx} +82 -71
- package/src/Dictation.js +13 -4
- package/src/{ErrorBox.js → ErrorBox.tsx} +7 -2
- package/src/Middleware/Activity/createCoreMiddleware.tsx +78 -0
- package/src/Middleware/ActivityStatus/SendStatus/{SendStatus.js → SendStatus.tsx} +8 -3
- package/src/Middleware/ActivityStatus/{Timestamp.js → Timestamp.tsx} +8 -2
- package/src/Middleware/ActivityStatus/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -1
- package/src/Middleware/ActivityStatus/createSendStatusMiddleware.js +10 -6
- package/src/Middleware/ActivityStatus/createTimestampMiddleware.js +10 -8
- package/src/Middleware/Attachment/createCoreMiddleware.tsx +44 -0
- package/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.tsx +40 -0
- package/src/Middleware/Avatar/{createCoreMiddleware.js → createCoreMiddleware.tsx} +19 -11
- package/src/Middleware/CardAction/createCoreMiddleware.js +51 -42
- package/src/Middleware/GroupActivities/createCoreMiddleware.js +6 -4
- package/src/Middleware/ScrollToEndButton/ScrollToEndButton.js +45 -0
- package/src/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.ts +19 -0
- package/src/Middleware/Toast/createCoreMiddleware.tsx +24 -0
- package/src/Middleware/TypingIndicator/{createCoreMiddleware.js → createCoreMiddleware.tsx} +10 -5
- package/src/{ReactWebChat.js → ReactWebChat.tsx} +25 -7
- package/src/ScreenReaderActivity.js +65 -40
- package/src/{ScreenReaderText.js → ScreenReaderText.tsx} +27 -9
- package/src/SendBox/Assets/AttachmentIcon.js +1 -1
- package/src/SendBox/Assets/MicrophoneIcon.js +1 -1
- package/src/SendBox/{AutoResizeTextArea.js → AutoResizeTextArea.tsx} +30 -4
- package/src/SendBox/{DictationInterims.js → DictationInterims.tsx} +6 -2
- package/src/SendBox/{IconButton.js → IconButton.tsx} +19 -3
- package/src/SendBox/{MicrophoneButton.js → MicrophoneButton.tsx} +35 -25
- package/src/SendBox/{SendButton.js → SendButton.tsx} +8 -3
- package/src/SendBox/{SuggestedAction.js → SuggestedAction.tsx} +62 -39
- package/src/SendBox/{SuggestedActions.js → SuggestedActions.tsx} +70 -22
- package/src/SendBox/{TextBox.js → TextBox.tsx} +21 -7
- package/src/SendBox/{UploadButton.js → UploadButton.tsx} +7 -3
- package/src/Styles/StyleSet/BasicTranscript.ts +34 -20
- package/src/Styles/StyleSet/Bubble.ts +0 -1
- package/src/Styles/StyleSet/CarouselFilmStrip.ts +12 -30
- package/src/Styles/StyleSet/CarouselFilmStripAttachment.ts +57 -0
- package/src/Styles/StyleSet/KeyboardHelp.ts +157 -0
- package/src/Styles/StyleSet/ScrollToEndButton.ts +33 -31
- package/src/Styles/StyleSet/SendBoxButton.ts +84 -13
- package/src/Styles/StyleSet/SendBoxTextBox.ts +1 -2
- package/src/Styles/StyleSet/StackedLayout.ts +13 -11
- package/src/Styles/StyleSet/SuggestedAction.ts +130 -43
- package/src/Styles/StyleSet/SuggestedActions.ts +13 -5
- package/src/Styles/createStyleSet.ts +43 -40
- package/src/Styles/mirrorStyle.js +10 -2
- package/src/Toast/CollapseIcon.js +9 -1
- package/src/Toast/DismissIcon.js +9 -1
- package/src/Toast/ExpandIcon.js +9 -1
- package/src/Toast/NotificationIcon.js +4 -1
- package/src/Toast/createToastMiddleware.tsx +15 -0
- package/src/Transcript/ActivityRow.tsx +124 -0
- package/src/Transcript/ActivityTextAlt.tsx +32 -0
- package/src/Transcript/FocusTrap.tsx +64 -0
- package/src/Transcript/KeyboardHelp.tsx +282 -0
- package/src/Transcript/LiveRegionTranscript.tsx +181 -0
- package/src/Transcript/types.ts +1 -0
- package/src/Transcript/useActivityAccessibleName.ts +85 -0
- package/src/Utils/{AccessibleButton.js → AccessibleButton.tsx} +19 -4
- package/src/Utils/{AccessibleInputText.js → AccessibleInputText.tsx} +48 -5
- package/src/Utils/{AccessibleTextArea.js → AccessibleTextArea.tsx} +67 -6
- package/src/Utils/{FocusRedirector.js → FocusRedirector.tsx} +21 -8
- package/src/Utils/InlineMarkdown.js +18 -2
- package/src/Utils/TypeFocusSink/FocusBox.js +4 -4
- package/src/Utils/TypeFocusSink/getTabIndex.ts +1 -1
- package/src/Utils/TypeFocusSink/inputtableKey.ts +5 -1
- package/src/Utils/activityAltText.ts +135 -0
- package/src/Utils/createCustomEvent.js +7 -1
- package/src/Utils/detectBrowser.js +2 -1
- package/src/Utils/findAncestor.ts +12 -0
- package/src/Utils/getActivityUniqueId.ts +5 -0
- package/src/Utils/intersectionOf.spec.js +2 -0
- package/src/Utils/intersectionOf.ts +14 -0
- package/src/Utils/isZeroOrPositive.ts +7 -0
- package/src/Utils/mapMap.js +7 -1
- package/src/Utils/mapMap.spec.js +2 -0
- package/src/Utils/removeInline.spec.js +2 -0
- package/src/Utils/scrollIntoViewWithBlockNearest.ts +20 -0
- package/src/Utils/shallowEquals.js +8 -1
- package/src/Utils/{singleToArray.js → singleToArray.ts} +1 -1
- package/src/Utils/supportPseudoClass.ts +17 -0
- package/src/Utils/{tabbableElements.js → tabbableElements.ts} +6 -5
- package/src/Utils/walkMarkdownTokens.spec.js +3 -3
- package/src/connectToWebChat.js +11 -4
- package/src/hooks/{index.js → index.ts} +1 -0
- package/src/hooks/internal/BypassSpeechSynthesisPonyfill.js +70 -17
- package/src/hooks/internal/useChanged.ts +17 -0
- package/src/hooks/internal/useDispatchScrollPosition.js +1 -3
- package/src/hooks/internal/useDispatchTranscriptFocusByActivityKey.ts +5 -0
- package/src/hooks/internal/useFocusVisible.ts +22 -0
- package/src/hooks/internal/useMemoWithPrevious.ts +16 -0
- package/src/hooks/internal/useMemoize.spec.js +3 -1
- package/src/hooks/internal/useMemoize.ts +53 -0
- package/src/hooks/internal/useObserveFocusVisible.ts +252 -0
- package/src/hooks/internal/usePrevious.ts +12 -0
- package/src/hooks/internal/useResumeAudioContext.ts +7 -0
- package/src/hooks/internal/useScrollRelative.js +4 -3
- package/src/hooks/internal/useStateRef.ts +31 -0
- package/src/hooks/internal/{useUniqueId.js → useUniqueId.ts} +1 -1
- package/src/hooks/internal/useValueRef.ts +22 -0
- package/src/hooks/{useDictateAbortable.js → useDictateAbortable.ts} +1 -1
- package/src/hooks/{useFocus.js → useFocus.ts} +1 -1
- package/src/hooks/{useFocusSendBox.js → useFocusSendBox.ts} +2 -1
- package/src/hooks/{useObserveScrollPosition.js → useObserveScrollPosition.ts} +6 -1
- package/src/hooks/{useObserveTranscriptFocus.js → useObserveTranscriptFocus.ts} +6 -1
- package/src/hooks/useRenderMarkdownAsHTML.ts +23 -0
- package/src/hooks/{useScrollDown.js → useScrollDown.ts} +1 -1
- package/src/hooks/useScrollTo.ts +16 -0
- package/src/hooks/useScrollToEnd.ts +12 -0
- package/src/hooks/{useScrollUp.js → useScrollUp.ts} +1 -1
- package/src/hooks/{useSendFiles.js → useSendFiles.ts} +3 -2
- package/src/hooks/{useStyleSet.js → useStyleSet.ts} +1 -1
- package/src/hooks/useWebSpeechPonyfill.ts +7 -0
- package/src/index.ts +7 -12
- package/src/providers/ActivityTree/ActivityTreeComposer.tsx +74 -0
- package/src/providers/ActivityTree/private/Context.ts +12 -0
- package/src/providers/ActivityTree/private/types.ts +12 -0
- package/src/providers/ActivityTree/private/useActivitiesWithRenderer.ts +66 -0
- package/src/providers/ActivityTree/private/useActivityTreeWithRenderer.ts +140 -0
- package/src/providers/ActivityTree/private/useContext.ts +15 -0
- package/src/providers/ActivityTree/useActivityTreeWithRenderer.ts +16 -0
- package/src/providers/LiveRegionTwin/LiveRegionTwinComposer.tsx +154 -0
- package/src/providers/LiveRegionTwin/private/Context.ts +15 -0
- package/src/providers/LiveRegionTwin/private/LiveRegionTwinContainer.tsx +64 -0
- package/src/providers/LiveRegionTwin/private/types.ts +10 -0
- package/src/providers/LiveRegionTwin/private/useContext.ts +15 -0
- package/src/providers/LiveRegionTwin/private/useMarkAllAsRenderedEffect.ts +13 -0
- package/src/providers/LiveRegionTwin/private/useStaticElementEntries.ts +7 -0
- package/src/providers/LiveRegionTwin/useQueueStaticElement.ts +12 -0
- package/src/providers/TranscriptFocus/TranscriptFocusComposer.tsx +180 -0
- package/src/providers/TranscriptFocus/private/Context.ts +16 -0
- package/src/providers/TranscriptFocus/private/useContext.ts +13 -0
- package/src/providers/TranscriptFocus/useActiveDescendantId.ts +5 -0
- package/src/providers/TranscriptFocus/useFocusByActivityKey.ts +14 -0
- package/src/providers/TranscriptFocus/useFocusRelativeActivity.ts +5 -0
- package/src/providers/TranscriptFocus/useFocusedActivityKey.ts +5 -0
- package/src/providers/TranscriptFocus/useFocusedExplicitly.ts +5 -0
- package/src/providers/TranscriptFocus/useGetDescendantIdByActivityKey.ts +5 -0
- package/src/tsconfig.json +1 -1
- package/src/types/ScrollPosition.ts +6 -0
- package/.eslintignore +0 -9
- package/lib/Activity/ScrollToEndButton.js +0 -81
- package/lib/Attachment/Assets/ErrorIcon.js +0 -22
- package/lib/Utils/findLastIndex.js +0 -32
- package/lib/Utils/remarkStripMarkdown.js +0 -26
- package/lib/hooks/internal/useAcknowledgedActivity.js +0 -90
- package/lib/hooks/internal/useDispatchTranscriptFocus.js +0 -19
- package/lib/hooks/internal/useStripMarkdown.js +0 -19
- package/src/Activity/ScrollToEndButton.js +0 -58
- package/src/Attachment/Assets/ErrorIcon.js +0 -9
- package/src/BasicTranscript.js +0 -1123
- package/src/Middleware/Activity/createCoreMiddleware.js +0 -71
- package/src/Middleware/Attachment/createCoreMiddleware.js +0 -43
- package/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.js +0 -37
- package/src/Middleware/Toast/createCoreMiddleware.js +0 -20
- package/src/Toast/createToastMiddleware.js +0 -11
- package/src/Utils/findLastIndex.js +0 -11
- package/src/Utils/findLastIndex.spec.js +0 -29
- package/src/Utils/getActivityUniqueId.js +0 -3
- package/src/Utils/intersectionOf.js +0 -11
- package/src/Utils/isZeroOrPositive.js +0 -4
- package/src/Utils/remarkStripMarkdown.js +0 -13
- package/src/hooks/internal/useAcknowledgedActivity.js +0 -65
- package/src/hooks/internal/useChanged.js +0 -10
- package/src/hooks/internal/useDispatchTranscriptFocus.js +0 -7
- package/src/hooks/internal/useMemoize.js +0 -37
- package/src/hooks/internal/useStripMarkdown.js +0 -7
- package/src/hooks/useRenderMarkdownAsHTML.js +0 -20
- package/src/hooks/useScrollTo.js +0 -11
- package/src/hooks/useScrollToEnd.js +0 -11
- package/src/hooks/useWebSpeechPonyfill.js +0 -5
- package/src/index.tsx +0 -35
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import PropTypes from 'prop-types';
|
|
2
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import type { FC, PropsWithChildren } from 'react';
|
|
5
|
+
|
|
6
|
+
import LiveRegionTwinContainer from './private/LiveRegionTwinContainer';
|
|
7
|
+
import LiveRegionTwinContext from './private/Context';
|
|
8
|
+
import useValueRef from '../../hooks/internal/useValueRef';
|
|
9
|
+
|
|
10
|
+
import type { StaticElement, StaticElementEntry } from './private/types';
|
|
11
|
+
|
|
12
|
+
const DEFAULT_ARIA_LIVE = 'polite';
|
|
13
|
+
const DEFAULT_FADE_AFTER = 1000;
|
|
14
|
+
|
|
15
|
+
type LiveRegionTwinComposerProps = PropsWithChildren<{
|
|
16
|
+
/** Optional "aria-label" attribute for the live region twin container. */
|
|
17
|
+
'aria-label'?: string;
|
|
18
|
+
|
|
19
|
+
/** "aria-live" attribute for the live region twin container, defaults to `'polite'`. */
|
|
20
|
+
'aria-live'?: 'assertive' | 'polite';
|
|
21
|
+
|
|
22
|
+
/** Optional "aria-roledescription" attribute for the live region twin container. */
|
|
23
|
+
'aria-roledescription'?: string;
|
|
24
|
+
|
|
25
|
+
/** Optional "className" attribute for the live region twin container. */
|
|
26
|
+
className?: string;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Static elements will fade out after this timeout value specified in milliseconds, defaults to `1000`.
|
|
30
|
+
*
|
|
31
|
+
* When lowering this value, make sure screen reader can continue to pick up new static elements before fading out.
|
|
32
|
+
*
|
|
33
|
+
* If this prop is updated, it will be reflected in next queueing elements.
|
|
34
|
+
*/
|
|
35
|
+
fadeAfter?: number;
|
|
36
|
+
|
|
37
|
+
/** Optional "role" attribute for the live region twin container. */
|
|
38
|
+
role?: string;
|
|
39
|
+
}>;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Live region twin is an UI component for queueing texts or elements to the screen reader using
|
|
43
|
+
* a container element with `aria-live` attribute set.
|
|
44
|
+
*
|
|
45
|
+
* After the text is rendered and queued, it will be removed to reduce burden on the DOM tree.
|
|
46
|
+
* Currently, we assume the assistive technologies should pick up the text within 1 second of rendering.
|
|
47
|
+
* This value is configurable.
|
|
48
|
+
*
|
|
49
|
+
* By default, the live region is visible. If is is not desirable, the caller can use `className` prop to
|
|
50
|
+
* hide its visuals.
|
|
51
|
+
*/
|
|
52
|
+
const LiveRegionTwinComposer: FC<LiveRegionTwinComposerProps> = ({
|
|
53
|
+
'aria-label': ariaLabel,
|
|
54
|
+
'aria-live': ariaLive = DEFAULT_ARIA_LIVE,
|
|
55
|
+
'aria-roledescription': ariaRoleDescription,
|
|
56
|
+
children,
|
|
57
|
+
className,
|
|
58
|
+
fadeAfter = DEFAULT_FADE_AFTER,
|
|
59
|
+
role
|
|
60
|
+
}) => {
|
|
61
|
+
const [staticElementEntries, setStaticElementEntries] = useState<StaticElementEntry[]>([]);
|
|
62
|
+
const fadeAfterRef = useValueRef(fadeAfter);
|
|
63
|
+
const markAllAsRenderedTimeoutIdRef = useRef<any>();
|
|
64
|
+
const nextKeyRef = useRef<number>(1);
|
|
65
|
+
|
|
66
|
+
const staticElementEntriesRef = useValueRef(staticElementEntries);
|
|
67
|
+
|
|
68
|
+
// This function is called by an effect hook `useMarkAllAsRenderedEffect`, it must be designed with converging in mind.
|
|
69
|
+
// To prevent infinite render loop, after multiple calls to this function, it should eventually no-op.
|
|
70
|
+
const markAllAsRendered = useCallback<() => void>(() => {
|
|
71
|
+
if (!staticElementEntriesRef.current.length) {
|
|
72
|
+
// Nothing to remove.
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// When removing each element one-by-one based on an individual timeout, Narrator would narrate them twice occasionally.
|
|
77
|
+
// Possibly it think some elements that is not removed during the current cycle, are new elements and queued them twice.
|
|
78
|
+
// Thus, we are removing all at once to prevent bugs in Narrator.
|
|
79
|
+
markAllAsRenderedTimeoutIdRef.current && clearTimeout(markAllAsRenderedTimeoutIdRef.current);
|
|
80
|
+
|
|
81
|
+
markAllAsRenderedTimeoutIdRef.current = setTimeout(() => {
|
|
82
|
+
// We are playing safe by using value ref to check its length here.
|
|
83
|
+
// If we are certain that `setStaticElements(emptyArray => emptyArray)` is a no-op,
|
|
84
|
+
// we could replace it with just the setter function.
|
|
85
|
+
staticElementEntriesRef.current.length && setStaticElementEntries([]);
|
|
86
|
+
}, fadeAfterRef.current);
|
|
87
|
+
}, [fadeAfterRef, markAllAsRenderedTimeoutIdRef, setStaticElementEntries, staticElementEntriesRef]);
|
|
88
|
+
|
|
89
|
+
// When this component is unmounting, make sure all future `setTimeout` are cleared and should not be fired.
|
|
90
|
+
useEffect(
|
|
91
|
+
() => () => markAllAsRenderedTimeoutIdRef.current && clearTimeout(markAllAsRenderedTimeoutIdRef.current),
|
|
92
|
+
[markAllAsRenderedTimeoutIdRef]
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const queueStaticElement = useCallback<(staticElement: StaticElement) => void>(
|
|
96
|
+
(element: StaticElement): void => {
|
|
97
|
+
const key = nextKeyRef.current;
|
|
98
|
+
|
|
99
|
+
nextKeyRef.current = nextKeyRef.current + 1;
|
|
100
|
+
|
|
101
|
+
setStaticElementEntries(entries => [...entries, { element, key }]);
|
|
102
|
+
},
|
|
103
|
+
[nextKeyRef, setStaticElementEntries]
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const staticElementEntriesState = useMemo<readonly [readonly StaticElementEntry[]]>(
|
|
107
|
+
() => Object.freeze([Object.freeze(staticElementEntries)]) as readonly [readonly StaticElementEntry[]],
|
|
108
|
+
[staticElementEntries]
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const context = useMemo(
|
|
112
|
+
() => ({
|
|
113
|
+
markAllAsRendered,
|
|
114
|
+
queueStaticElement,
|
|
115
|
+
staticElementEntriesState
|
|
116
|
+
}),
|
|
117
|
+
[markAllAsRendered, queueStaticElement, staticElementEntriesState]
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
return (
|
|
121
|
+
<LiveRegionTwinContext.Provider value={context}>
|
|
122
|
+
<LiveRegionTwinContainer
|
|
123
|
+
aria-label={ariaLabel}
|
|
124
|
+
aria-live={ariaLive}
|
|
125
|
+
aria-roledescription={ariaRoleDescription}
|
|
126
|
+
className={className}
|
|
127
|
+
role={role}
|
|
128
|
+
/>
|
|
129
|
+
{children}
|
|
130
|
+
</LiveRegionTwinContext.Provider>
|
|
131
|
+
);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
LiveRegionTwinComposer.defaultProps = {
|
|
135
|
+
'aria-label': undefined,
|
|
136
|
+
'aria-live': DEFAULT_ARIA_LIVE,
|
|
137
|
+
'aria-roledescription': undefined,
|
|
138
|
+
children: undefined,
|
|
139
|
+
className: undefined,
|
|
140
|
+
fadeAfter: DEFAULT_FADE_AFTER,
|
|
141
|
+
role: undefined
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
LiveRegionTwinComposer.propTypes = {
|
|
145
|
+
'aria-label': PropTypes.string,
|
|
146
|
+
'aria-live': PropTypes.oneOf(['assertive', 'polite']),
|
|
147
|
+
'aria-roledescription': PropTypes.string,
|
|
148
|
+
children: PropTypes.any,
|
|
149
|
+
className: PropTypes.string,
|
|
150
|
+
fadeAfter: PropTypes.number,
|
|
151
|
+
role: PropTypes.string
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export default LiveRegionTwinComposer;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { StaticElement, StaticElementEntry } from './types';
|
|
4
|
+
|
|
5
|
+
type LiveRegionTwinContextType = {
|
|
6
|
+
markAllAsRendered: () => void;
|
|
7
|
+
queueStaticElement: (element: StaticElement) => void;
|
|
8
|
+
staticElementEntriesState: readonly [readonly StaticElementEntry[]];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const LiveRegionTwinContext = createContext<LiveRegionTwinContextType>(undefined);
|
|
12
|
+
|
|
13
|
+
export default LiveRegionTwinContext;
|
|
14
|
+
|
|
15
|
+
export type { LiveRegionTwinContextType };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import PropTypes from 'prop-types';
|
|
2
|
+
import React, { Fragment } from 'react';
|
|
3
|
+
|
|
4
|
+
import type { VFC } from 'react';
|
|
5
|
+
|
|
6
|
+
import useMarkAllAsRenderedEffect from './useMarkAllAsRenderedEffect';
|
|
7
|
+
import useStaticElementEntries from './useStaticElementEntries';
|
|
8
|
+
|
|
9
|
+
type LiveRegionTwinContainerProps = {
|
|
10
|
+
'aria-label'?: string;
|
|
11
|
+
'aria-live': 'assertive' | 'polite';
|
|
12
|
+
'aria-roledescription'?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
role?: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// This container is marked as private because we assume there is only one instance under the <LiveRegionTwinContext>.
|
|
18
|
+
const LiveRegionTwinContainer: VFC<LiveRegionTwinContainerProps> = ({
|
|
19
|
+
'aria-label': ariaLabel,
|
|
20
|
+
'aria-live': ariaLive,
|
|
21
|
+
'aria-roledescription': ariaRoleDescription,
|
|
22
|
+
className,
|
|
23
|
+
role
|
|
24
|
+
}) => {
|
|
25
|
+
const [staticElementEntries] = useStaticElementEntries();
|
|
26
|
+
|
|
27
|
+
// We assume there is only one instance under the <LiveRegionTwinContext>.
|
|
28
|
+
// The assumption made us safe to mark everything is rendered.
|
|
29
|
+
// In contrary, if we have 0-to-many at different time, we may falsely mark something as rendered.
|
|
30
|
+
useMarkAllAsRenderedEffect();
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
aria-label={ariaLabel}
|
|
35
|
+
aria-live={ariaLive}
|
|
36
|
+
aria-roledescription={ariaRoleDescription}
|
|
37
|
+
className={className}
|
|
38
|
+
role={role}
|
|
39
|
+
>
|
|
40
|
+
{staticElementEntries.map(({ element, key }) =>
|
|
41
|
+
typeof element === 'string' ? <div key={key}>{element}</div> : <Fragment key={key}>{element}</Fragment>
|
|
42
|
+
)}
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
LiveRegionTwinContainer.defaultProps = {
|
|
48
|
+
'aria-label': undefined,
|
|
49
|
+
'aria-roledescription': undefined,
|
|
50
|
+
className: undefined,
|
|
51
|
+
role: undefined
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
LiveRegionTwinContainer.propTypes = {
|
|
55
|
+
'aria-label': PropTypes.string,
|
|
56
|
+
// PropTypes.oneOf() returns type of `string`, but not `'assertive' | 'polite'`.
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
'aria-live': PropTypes.oneOf(['assertive', 'polite']).isRequired,
|
|
59
|
+
'aria-roledescription': PropTypes.string,
|
|
60
|
+
className: PropTypes.string,
|
|
61
|
+
role: PropTypes.string
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export default LiveRegionTwinContainer;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
import LiveRegionTwinContext from './Context';
|
|
4
|
+
|
|
5
|
+
import type { LiveRegionTwinContextType } from './Context';
|
|
6
|
+
|
|
7
|
+
export default function useLiveRegionTwinContext(thrownOnUndefined = true): LiveRegionTwinContextType {
|
|
8
|
+
const contextValue = useContext(LiveRegionTwinContext);
|
|
9
|
+
|
|
10
|
+
if (thrownOnUndefined && !contextValue) {
|
|
11
|
+
throw new Error('botframework-webchat internal: This hook can only be used under <LiveRegionComposer>.');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return contextValue;
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import useLiveRegionTwinContext from './useContext';
|
|
4
|
+
|
|
5
|
+
// After calling `markAllAsRendered`, it will cause a re-render.
|
|
6
|
+
// Since `markAllAsRendered` is a converging function, it will eventually stop re-rendering.
|
|
7
|
+
// We call this hook `useXXXEffect` for us to abstract the business logic here.
|
|
8
|
+
export default function useMarkAllAsRenderedEffect(): void {
|
|
9
|
+
const { markAllAsRendered } = useLiveRegionTwinContext();
|
|
10
|
+
|
|
11
|
+
// We did not set the `deps` argument as we want to run this function on every render.
|
|
12
|
+
useEffect(markAllAsRendered);
|
|
13
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import useLiveRegionTwinContext from './useContext';
|
|
2
|
+
|
|
3
|
+
import type { StaticElementEntry } from './types';
|
|
4
|
+
|
|
5
|
+
export default function useStaticElementEntries(): readonly [readonly StaticElementEntry[]] {
|
|
6
|
+
return useLiveRegionTwinContext().staticElementEntriesState;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import useLiveRegionContext from './private/useContext';
|
|
2
|
+
|
|
3
|
+
import type { StaticElement } from './private/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Queues a static element to the live region.
|
|
7
|
+
*
|
|
8
|
+
* After the element is queued, screen reader will eventually narrate it and it cannot be changed.
|
|
9
|
+
*/
|
|
10
|
+
export default function useQueueStaticElement(): (element: StaticElement) => void {
|
|
11
|
+
return useLiveRegionContext().queueStaticElement;
|
|
12
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { hooks } from 'botframework-webchat-api';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import random from 'math-random';
|
|
4
|
+
import React, { useCallback, useMemo } from 'react';
|
|
5
|
+
|
|
6
|
+
import type { FC, MutableRefObject } from 'react';
|
|
7
|
+
|
|
8
|
+
import scrollIntoViewWithBlockNearest from '../../Utils/scrollIntoViewWithBlockNearest';
|
|
9
|
+
import TranscriptFocusContext from './private/Context';
|
|
10
|
+
import useActivityTreeWithRenderer from '../ActivityTree/useActivityTreeWithRenderer';
|
|
11
|
+
import usePrevious from '../../hooks/internal/usePrevious';
|
|
12
|
+
import useStateRef from '../../hooks/internal/useStateRef';
|
|
13
|
+
import useValueRef from '../../hooks/internal/useValueRef';
|
|
14
|
+
|
|
15
|
+
import type { TranscriptFocusContextType } from './private/Context';
|
|
16
|
+
|
|
17
|
+
const { useGetKeyByActivity } = hooks;
|
|
18
|
+
|
|
19
|
+
type TranscriptFocusComposerProps = {
|
|
20
|
+
containerRef: MutableRefObject<HTMLElement>;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function last<T>(array: ArrayLike<T>) {
|
|
24
|
+
return array[array.length - 1];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function uniqueId(count = Infinity) {
|
|
28
|
+
return (
|
|
29
|
+
random()
|
|
30
|
+
// eslint-disable-next-line no-magic-numbers
|
|
31
|
+
.toString(36)
|
|
32
|
+
// eslint-disable-next-line no-magic-numbers
|
|
33
|
+
.substring(2, 2 + count)
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const TranscriptFocusComposer: FC<TranscriptFocusComposerProps> = ({ children, containerRef }) => {
|
|
38
|
+
const [flattenedActivityTree] = useActivityTreeWithRenderer({ flat: true });
|
|
39
|
+
const [_, setRawFocusedActivityKey, rawFocusedActivityKeyRef] = useStateRef<string | undefined>();
|
|
40
|
+
const getKeyByActivity = useGetKeyByActivity();
|
|
41
|
+
|
|
42
|
+
// As we need to use IDREF for `aria-activedescendant`,
|
|
43
|
+
// this prefix will differentiate multiple instances of transcript on the same page.
|
|
44
|
+
// eslint-disable-next-line no-magic-numbers
|
|
45
|
+
const prefix = useMemo<string>(() => uniqueId(3), []);
|
|
46
|
+
|
|
47
|
+
const getDescendantIdByActivityKey: (activityKey?: string) => string | undefined = useCallback(
|
|
48
|
+
(activityKey?: string) => activityKey && `webchat__transcript-focus-${prefix}__activity-${activityKey}`,
|
|
49
|
+
[prefix]
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const renderingActivityKeys = useMemo<readonly string[]>(
|
|
53
|
+
() => Object.freeze(flattenedActivityTree.map(({ activity }) => getKeyByActivity(activity))),
|
|
54
|
+
[flattenedActivityTree, getKeyByActivity]
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const renderingActivityKeysRef = useValueRef<readonly string[]>(renderingActivityKeys);
|
|
58
|
+
|
|
59
|
+
// While the transcript or any descendants are not focused, if the transcript is updated, reset the user-selected active descendant.
|
|
60
|
+
// This will assume the last activity, if any, will be the active descendant.
|
|
61
|
+
const prevRenderingActivityKeys = usePrevious(renderingActivityKeys);
|
|
62
|
+
|
|
63
|
+
if (renderingActivityKeys !== prevRenderingActivityKeys && !containerRef.current?.contains(document.activeElement)) {
|
|
64
|
+
rawFocusedActivityKeyRef.current = undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const { current: rawFocusedActivityKey } = rawFocusedActivityKeyRef;
|
|
68
|
+
|
|
69
|
+
const focusedActivityKey = useMemo<string>(
|
|
70
|
+
() => (renderingActivityKeys.includes(rawFocusedActivityKey) ? rawFocusedActivityKey : last(renderingActivityKeys)),
|
|
71
|
+
[renderingActivityKeys, rawFocusedActivityKey]
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const focusedActivityKeyRef = useValueRef(focusedActivityKey);
|
|
75
|
+
|
|
76
|
+
const activeDescendantId = useMemo<string>(
|
|
77
|
+
() => getDescendantIdByActivityKey(focusedActivityKey),
|
|
78
|
+
[getDescendantIdByActivityKey, focusedActivityKey]
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const focusByActivityKey = useCallback<
|
|
82
|
+
(activityKey: boolean | string | undefined, withFocus: boolean | undefined) => void
|
|
83
|
+
>(
|
|
84
|
+
(activityKey: boolean | string | undefined, withFocus: boolean | undefined = true) => {
|
|
85
|
+
if (activityKey === false) {
|
|
86
|
+
// `false` means set it to nothing.
|
|
87
|
+
setRawFocusedActivityKey(undefined);
|
|
88
|
+
} else if (activityKey === true) {
|
|
89
|
+
// `true` means set to something if it is not set.
|
|
90
|
+
setRawFocusedActivityKey(key => key || focusedActivityKeyRef.current);
|
|
91
|
+
} else if (activityKey) {
|
|
92
|
+
setRawFocusedActivityKey(activityKey);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (withFocus) {
|
|
96
|
+
containerRef.current?.focus();
|
|
97
|
+
|
|
98
|
+
const activeDescendantId = getDescendantIdByActivityKey(
|
|
99
|
+
activityKey === false
|
|
100
|
+
? // If "activityKey" is false, it means "focus nothing and reset it to the last activity".
|
|
101
|
+
last(renderingActivityKeysRef.current)
|
|
102
|
+
: activityKey && activityKey !== true
|
|
103
|
+
? // If "activity" is not "undefined" and not "true", it means "focus on this activity".
|
|
104
|
+
activityKey
|
|
105
|
+
: // If "activityKey" is "undefined", it means "don't modify the focus".
|
|
106
|
+
// If "activityKey" is "true", it means "try to focus on anything".
|
|
107
|
+
rawFocusedActivityKeyRef.current
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const activeDescendantElement = activeDescendantId && document.getElementById(activeDescendantId);
|
|
111
|
+
|
|
112
|
+
// Don't scroll active descendant into view if the focus is already inside it.
|
|
113
|
+
// Otherwise, given the focus is on the send box, clicking on any <input> inside the Adaptive Cards may cause the view to move.
|
|
114
|
+
// This UX is not desirable because click should not cause scroll.
|
|
115
|
+
if (activeDescendantElement && !activeDescendantElement.contains(document.activeElement)) {
|
|
116
|
+
scrollIntoViewWithBlockNearest(activeDescendantElement);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
[
|
|
121
|
+
getDescendantIdByActivityKey,
|
|
122
|
+
containerRef,
|
|
123
|
+
focusedActivityKeyRef,
|
|
124
|
+
renderingActivityKeysRef,
|
|
125
|
+
rawFocusedActivityKeyRef,
|
|
126
|
+
setRawFocusedActivityKey
|
|
127
|
+
]
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
const focusRelativeActivity = useCallback(
|
|
131
|
+
(delta: number) => {
|
|
132
|
+
const { current: orderedActivityKeys } = renderingActivityKeysRef;
|
|
133
|
+
|
|
134
|
+
if (isNaN(delta) || !orderedActivityKeys.length) {
|
|
135
|
+
return focusByActivityKey(false, true);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const { current: focusedActivityKey } = focusedActivityKeyRef;
|
|
139
|
+
|
|
140
|
+
const index = orderedActivityKeys.indexOf(focusedActivityKey);
|
|
141
|
+
const nextIndex = ~index
|
|
142
|
+
? Math.max(0, Math.min(orderedActivityKeys.length - 1, index + delta))
|
|
143
|
+
: orderedActivityKeys.length - 1;
|
|
144
|
+
|
|
145
|
+
focusByActivityKey(orderedActivityKeys[+nextIndex], true);
|
|
146
|
+
},
|
|
147
|
+
[focusedActivityKeyRef, renderingActivityKeysRef, focusByActivityKey]
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const contextValue = useMemo<TranscriptFocusContextType>(
|
|
151
|
+
() => ({
|
|
152
|
+
activeDescendantIdState: Object.freeze([activeDescendantId]) as readonly [string],
|
|
153
|
+
getDescendantIdByActivityKey,
|
|
154
|
+
focusByActivityKey,
|
|
155
|
+
focusedActivityKeyState: Object.freeze([focusedActivityKey]) as readonly [string],
|
|
156
|
+
focusedExplicitlyState: Object.freeze([!!rawFocusedActivityKey]) as readonly [boolean],
|
|
157
|
+
focusRelativeActivity
|
|
158
|
+
}),
|
|
159
|
+
[
|
|
160
|
+
activeDescendantId,
|
|
161
|
+
getDescendantIdByActivityKey,
|
|
162
|
+
focusByActivityKey,
|
|
163
|
+
focusedActivityKey,
|
|
164
|
+
focusRelativeActivity,
|
|
165
|
+
rawFocusedActivityKey
|
|
166
|
+
]
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
return <TranscriptFocusContext.Provider value={contextValue}>{children}</TranscriptFocusContext.Provider>;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
TranscriptFocusComposer.propTypes = {
|
|
173
|
+
// PropTypes is not fully compatible with TypeScript.
|
|
174
|
+
// @ts-ignore
|
|
175
|
+
containerRef: PropTypes.shape({
|
|
176
|
+
current: PropTypes.instanceOf(HTMLElement)
|
|
177
|
+
}).isRequired
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export default TranscriptFocusComposer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
type TranscriptFocusContextType = {
|
|
4
|
+
activeDescendantIdState: readonly [string];
|
|
5
|
+
focusByActivityKey: (activityKey: boolean | string | undefined, withFocus: boolean | undefined) => void;
|
|
6
|
+
focusedActivityKeyState: readonly [string];
|
|
7
|
+
focusedExplicitlyState: readonly [boolean];
|
|
8
|
+
focusRelativeActivity: (delta: number) => void;
|
|
9
|
+
getDescendantIdByActivityKey: (activityKey?: string) => string | undefined;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const TranscriptFocusContext = createContext<TranscriptFocusContextType>(undefined);
|
|
13
|
+
|
|
14
|
+
export default TranscriptFocusContext;
|
|
15
|
+
|
|
16
|
+
export type { TranscriptFocusContextType };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
import TranscriptFocusContext from './Context';
|
|
4
|
+
|
|
5
|
+
export default function useTranscriptFocusContext(throwOnUndefined = true) {
|
|
6
|
+
const contextValue = useContext(TranscriptFocusContext);
|
|
7
|
+
|
|
8
|
+
if (throwOnUndefined && !contextValue) {
|
|
9
|
+
throw new Error('botframework-webchat internal: This hook can only be used under <TranscriptFocusComposer>.');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return contextValue;
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import useTranscriptFocusContext from './private/useContext';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Put the focus on an activity based on its activity key.
|
|
5
|
+
*
|
|
6
|
+
* @param {boolean | string | undefined} activityKey - The activity key to focus on, `false` to reset focus to most recent activity, `true` to focus on anything, `undefined` for not changing the focus.
|
|
7
|
+
* @param {boolean} withFocus - `true` if the user agent focus should be sent to the transcript, otherwise, `false`.
|
|
8
|
+
*/
|
|
9
|
+
export default function useFocusByActivityKey(): (
|
|
10
|
+
activityKey: boolean | string | undefined,
|
|
11
|
+
withFocus?: boolean
|
|
12
|
+
) => void {
|
|
13
|
+
return useTranscriptFocusContext().focusByActivityKey;
|
|
14
|
+
}
|
package/src/tsconfig.json
CHANGED