From 765d226a3a62f1642158a200d75a094818840da8 Mon Sep 17 00:00:00 2001 From: vhuseinova-msft <98852890+vhuseinova-msft@users.noreply.github.com> Date: Tue, 21 Jan 2025 12:21:52 -0800 Subject: [PATCH] Fix keyboard navigation for message menu button (#5576) --- ...-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json | 9 ++ ...-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json | 9 ++ .../FluentChatMessageComponent.tsx | 11 +- .../ChatMyMessageComponent.tsx | 21 ++-- .../ChatMyMessageComponentAsMessageBubble.tsx | 95 +++++++++++----- .../FluentChatMyMessageComponent.tsx | 24 ++-- .../components/styles/MessageThread.styles.ts | 23 ++-- .../utils/ChatMessageComponentUtils.tsx | 16 +++ .../browser/ChatMyMessageComponent.spec.tsx | 80 ++----------- ...eComponentKeyboardNavigationTests.spec.tsx | 2 +- ...eComponentKeyboardNavigationTests.spec.tsx | 49 ++++++++ ...eComponentKeyboardNavigationTests.spec.tsx | 107 ++++++++++++++++++ .../TestChatMyMessageComponent.tsx | 54 +++++++++ ...ithout-attachment-Desktop-Chrome-linux.png | Bin 3848 -> 4019 bytes ...achment-Mobile-Android-Landscape-linux.png | Bin 3582 -> 3758 bytes ...tachment-Mobile-Android-Portrait-linux.png | Bin 3425 -> 3595 bytes ...ithout-attachment-Desktop-Chrome-linux.png | Bin 1639 -> 2220 bytes ...achment-Mobile-Android-Landscape-linux.png | Bin 1508 -> 2039 bytes ...tachment-Mobile-Android-Portrait-linux.png | Bin 1413 -> 1939 bytes ...ithout-attachment-Desktop-Chrome-linux.png | Bin 2192 -> 2770 bytes ...achment-Mobile-Android-Landscape-linux.png | Bin 2017 -> 2553 bytes ...tachment-Mobile-Android-Portrait-linux.png | Bin 1910 -> 2440 bytes ...ithout-attachment-Desktop-Chrome-linux.png | Bin 2192 -> 2770 bytes ...achment-Mobile-Android-Landscape-linux.png | Bin 2017 -> 2553 bytes ...tachment-Mobile-Android-Portrait-linux.png | Bin 1910 -> 2444 bytes 25 files changed, 368 insertions(+), 132 deletions(-) create mode 100644 change-beta/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json create mode 100644 change/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json create mode 100644 packages/react-components/tests/browser/FluentChatMessageComponentKeyboardNavigationTests.spec.tsx create mode 100644 packages/react-components/tests/browser/FluentChatMyMessageComponentKeyboardNavigationTests.spec.tsx create mode 100644 packages/react-components/tests/browser/TestingComponents/TestChatMyMessageComponent.tsx diff --git a/change-beta/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json b/change-beta/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json new file mode 100644 index 00000000000..e88968681fc --- /dev/null +++ b/change-beta/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json @@ -0,0 +1,9 @@ +{ + "type": "patch", + "area": "fix", + "workstream": "A11y", + "comment": "Fix keyboard navigation for message menu button", + "packageName": "@azure/communication-react", + "email": "98852890+vhuseinova-msft@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json b/change/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json new file mode 100644 index 00000000000..e88968681fc --- /dev/null +++ b/change/@azure-communication-react-c7ad66f2-1939-4d90-9c90-f9d73b0dc151.json @@ -0,0 +1,9 @@ +{ + "type": "patch", + "area": "fix", + "workstream": "A11y", + "comment": "Fix keyboard navigation for message menu button", + "packageName": "@azure/communication-react", + "email": "98852890+vhuseinova-msft@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/src/components/ChatMessage/MessageComponents/FluentChatMessageComponent.tsx b/packages/react-components/src/components/ChatMessage/MessageComponents/FluentChatMessageComponent.tsx index 20ed5b9bb58..5d130408ab3 100644 --- a/packages/react-components/src/components/ChatMessage/MessageComponents/FluentChatMessageComponent.tsx +++ b/packages/react-components/src/components/ChatMessage/MessageComponents/FluentChatMessageComponent.tsx @@ -13,7 +13,10 @@ import { IPersona, PersonaSize, mergeStyles, Persona } from '@fluentui/react'; import { mergeClasses } from '@fluentui/react-components'; import { createStyleFromV8Style } from '../../styles/v8StyleShim'; import { ChatMessage as FluentChatMessage } from '@fluentui-contrib/react-chat'; -import { getFluentUIAttachedValue } from '../../utils/ChatMessageComponentUtils'; +import { + getFluentUIAttachedValue, + removeFluentUIKeyboardNavigationStyles +} from '../../utils/ChatMessageComponentUtils'; import { ChatMessageComponentWrapperProps } from '../ChatMessageComponentWrapper'; /* @conditional-compile-remove(data-loss-prevention) */ import { BlockedMessage } from '../../../types/ChatMessage'; @@ -140,8 +143,13 @@ export const FluentChatMessageComponent = (props: FluentChatMessageComponentWrap ); }, [message.senderDisplayName, message.senderId, onRenderAvatar, shouldShowAvatar]); + const setMessageContainerRef = useCallback((node: HTMLDivElement | null) => { + removeFluentUIKeyboardNavigationStyles(node); + }, []); + const messageBodyProps = useMemo(() => { return { + ref: setMessageContainerRef, // chatItemMessageContainer used in className and style prop as style prop can't handle CSS selectors className: mergeClasses( chatMessageRenderStyles.bodyCommon, @@ -157,6 +165,7 @@ export const FluentChatMessageComponent = (props: FluentChatMessageComponentWrap styles?.chatItemMessageContainer !== undefined ? createStyleFromV8Style(styles?.chatItemMessageContainer) : {} }; }, [ + setMessageContainerRef, chatMessageRenderStyles.bodyCommon, chatMessageRenderStyles.bodyWithoutAvatar, chatMessageRenderStyles.bodyHiddenAvatar, diff --git a/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.tsx b/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.tsx index d1657c24420..d61999767bb 100644 --- a/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.tsx +++ b/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent.tsx @@ -108,18 +108,20 @@ export type ChatMyMessageComponentProps = { onInsertInlineImage?: (imageAttributes: Record, messageId: string) => void; /* @conditional-compile-remove(rich-text-editor-image-upload) */ inlineImagesWithProgress?: AttachmentMetadataInProgress[]; - // Optional callback called when editing is complete (submitted or cancelled). - onEditComplete?: () => void; }; /** * @private */ export const ChatMyMessageComponent = (props: ChatMyMessageComponentProps): JSX.Element => { - const { onDeleteMessage, onSendMessage, message, onEditComplete, onCancelEditMessage, onUpdateMessage } = props; + const { onDeleteMessage, onSendMessage, message, onCancelEditMessage, onUpdateMessage } = props; const [isEditing, setIsEditing] = useState(false); + const [focusMessageAfterEditing, setFocusMessageAfterEditing] = useState(false); - const onEditClick = useCallback(() => setIsEditing(true), [setIsEditing]); + const onEditClick = useCallback(() => { + setIsEditing(true); + setFocusMessageAfterEditing(false); + }, []); const clientMessageId = 'clientMessageId' in message ? message.clientMessageId : undefined; const content = 'content' in message ? message.content : undefined; @@ -178,18 +180,20 @@ export const ChatMyMessageComponent = (props: ChatMyMessageComponentProps): JSX. { attachments: attachments } ); setIsEditing(false); - onEditComplete?.(); + + setFocusMessageAfterEditing(true); }, - [message, onEditComplete, onUpdateMessage] + [message, onUpdateMessage] ); const onCancelHandler = useCallback( (messageId: string) => { onCancelEditMessage?.(messageId); setIsEditing(false); - onEditComplete?.(); + + setFocusMessageAfterEditing(true); }, - [onEditComplete, onCancelEditMessage] + [onCancelEditMessage] ); if (isEditing && message.messageType === 'chat') { @@ -227,6 +231,7 @@ export const ChatMyMessageComponent = (props: ChatMyMessageComponentProps): JSX. inlineImageOptions={props.inlineImageOptions} /* @conditional-compile-remove(mention) */ mentionDisplayOptions={props.mentionOptions?.displayOptions} + shouldFocusFluentMessageBody={focusMessageAfterEditing} /> ); } diff --git a/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.tsx b/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.tsx index e43bd109bfa..4c277deb6b7 100644 --- a/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.tsx +++ b/packages/react-components/src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponentAsMessageBubble.tsx @@ -4,7 +4,7 @@ import { Text, mergeStyles } from '@fluentui/react'; import { ChatMyMessage } from '@fluentui-contrib/react-chat'; import { _formatString } from '@internal/acs-ui-common'; -import React, { useCallback, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { chatMessageDateStyle, chatMessageFailedTagStyle, @@ -28,7 +28,11 @@ import { useLocale } from '../../../localization'; import { MentionDisplayOptions } from '../../MentionPopover'; import { createStyleFromV8Style } from '../../styles/v8StyleShim'; import { mergeClasses } from '@fluentui/react-components'; -import { useChatMyMessageStyles, useChatMessageCommonStyles } from '../../styles/MessageThread.styles'; +import { + useChatMyMessageStyles, + useChatMessageCommonStyles, + chatMyMessageActionMenuClassName +} from '../../styles/MessageThread.styles'; import { generateCustomizedTimestamp, generateDefaultTimestamp, @@ -53,6 +57,8 @@ type ChatMyMessageComponentAsMessageBubbleProps = { * Whether the status indicator for each message is displayed or not. */ showMessageStatus?: boolean; + // Focus on the message body after the message is edited + shouldFocusFluentMessageBody: boolean; remoteParticipantsCount?: number; onActionButtonClick: ( message: ChatMessage, @@ -116,7 +122,8 @@ const MessageBubble = (props: ChatMyMessageComponentAsMessageBubbleProps): JSX.E mentionDisplayOptions, onDisplayDateTimeString, onRenderAttachmentDownloads, - actionsForAttachment + actionsForAttachment, + shouldFocusFluentMessageBody } = props; const formattedTimestamp = useMemo(() => { @@ -166,6 +173,15 @@ const MessageBubble = (props: ChatMyMessageComponentAsMessageBubbleProps): JSX.E theme }); + useEffect(() => { + if (shouldFocusFluentMessageBody) { + // set focus in the next render cycle to avoid focus being stolen by other components + setTimeout(() => { + messageRef.current?.focus(); + }); + } + }, [shouldFocusFluentMessageBody]); + const onActionFlyoutDismiss = useCallback((): void => { // When the flyout dismiss is called, since we control if the action flyout is visible // or not we need to set the target to undefined here to actually hide the action flyout @@ -185,19 +201,57 @@ const MessageBubble = (props: ChatMyMessageComponentAsMessageBubbleProps): JSX.E } }, [message, messageStatus, strings.editedTag, strings.failToSendTag, theme]); + const isBlockedMessage = + false || /* @conditional-compile-remove(data-loss-prevention) */ message.messageType === 'blocked'; + const chatMyMessageStyles = useChatMyMessageStyles(); + const chatMessageCommonStyles = useChatMessageCommonStyles(); + + const attached = message.attached === true ? 'center' : message.attached === 'bottom' ? 'bottom' : 'top'; + + const getActionsMenu = useCallback(() => { + return ( +
+ {actionMenuProps?.children} +
+ ); + }, [ + actionMenuProps?.children, + chatMessageActionFlyoutTarget, + chatMyMessageStyles.menu, + chatMyMessageStyles.menuHidden, + chatMyMessageStyles.menuVisible, + focused + ]); + const getContent = useCallback(() => { - return getMessageBubbleContent( - message, - strings, - userId, - inlineImageOptions, - /* @conditional-compile-remove(mention) */ - mentionDisplayOptions, - onRenderAttachmentDownloads, - actionsForAttachment + return ( +
+ {getMessageBubbleContent( + message, + strings, + userId, + inlineImageOptions, + /* @conditional-compile-remove(mention) */ + mentionDisplayOptions, + onRenderAttachmentDownloads, + actionsForAttachment + )} + {getActionsMenu()} +
); }, [ actionsForAttachment, + getActionsMenu, inlineImageOptions, /* @conditional-compile-remove(mention) */ mentionDisplayOptions, message, @@ -206,12 +260,6 @@ const MessageBubble = (props: ChatMyMessageComponentAsMessageBubbleProps): JSX.E userId ]); - const isBlockedMessage = - false || /* @conditional-compile-remove(data-loss-prevention) */ message.messageType === 'blocked'; - const chatMyMessageStyles = useChatMyMessageStyles(); - const chatMessageCommonStyles = useChatMessageCommonStyles(); - - const attached = message.attached === true ? 'center' : message.attached === 'bottom' ? 'bottom' : 'top'; const chatMessage = ( <>
@@ -271,17 +319,6 @@ const MessageBubble = (props: ChatMyMessageComponentAsMessageBubbleProps): JSX.E } details={getMessageDetails()} - actions={{ - children: actionMenuProps?.children, - className: mergeClasses( - chatMyMessageStyles.menu, - // Make actions menu visible when the message is focused or the flyout is shown - focused || chatMessageActionFlyoutTarget?.current - ? chatMyMessageStyles.menuVisible - : chatMyMessageStyles.menuHidden, - attached !== 'top' ? chatMyMessageStyles.menuAttached : undefined - ) - }} onTouchStart={() => setWasInteractionByTouch(true)} onPointerDown={() => setWasInteractionByTouch(false)} onKeyDown={() => setWasInteractionByTouch(false)} diff --git a/packages/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.tsx b/packages/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.tsx index 91b9db4a6e7..e817748fb51 100644 --- a/packages/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.tsx +++ b/packages/react-components/src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent.tsx @@ -2,7 +2,7 @@ // Licensed under the MIT License. import { MessageStatus, _formatString } from '@internal/acs-ui-common'; -import React, { useCallback, useMemo, useRef } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { MessageProps, _ChatMessageProps } from '../../MessageThread'; import { ChatMessage } from '../../../types'; /* @conditional-compile-remove(data-loss-prevention) */ @@ -14,7 +14,10 @@ import { createStyleFromV8Style } from '../../styles/v8StyleShim'; import { MessageStatusIndicatorProps } from '../../MessageStatusIndicator'; import { ChatMyMessageComponent } from './ChatMyMessageComponent'; import { ChatMyMessage as FluentChatMyMessage } from '@fluentui-contrib/react-chat'; -import { getFluentUIAttachedValue } from '../../utils/ChatMessageComponentUtils'; +import { + getFluentUIAttachedValue, + removeFluentUIKeyboardNavigationStyles +} from '../../utils/ChatMessageComponentUtils'; import type { FluentChatMessageComponentWrapperProps } from '../MessageComponents/FluentChatMessageComponent'; /** @@ -59,11 +62,6 @@ export const FluentChatMyMessageComponent = (props: FluentChatMessageComponentWr onInsertInlineImage } = props; const chatMessageRenderStyles = useChatMessageRenderStyles(); - const fluentMessageBodyRef = useRef(null); - - const onEditComplete = useCallback(() => { - fluentMessageBodyRef.current?.focus(); - }, []); // To rerender the defaultChatMessageRenderer if app running across days(every new day chat time stamp // needs to be regenerated), the dependency on "new Date().toDateString()"" is added. @@ -76,7 +74,6 @@ export const FluentChatMyMessageComponent = (props: FluentChatMessageComponentWr return ( { + removeFluentUIKeyboardNavigationStyles(node); + }, []); + const myMessageBodyProps = useMemo(() => { return { className: mergeClasses(chatMessageRenderStyles.bodyCommon, chatMessageRenderStyles.bodyMyMessage), - ref: fluentMessageBodyRef + ref: setMessageContainerRef }; - }, [chatMessageRenderStyles.bodyCommon, chatMessageRenderStyles.bodyMyMessage]); + }, [chatMessageRenderStyles.bodyCommon, chatMessageRenderStyles.bodyMyMessage, setMessageContainerRef]); const myMessageStatusIcon = useMemo(() => { return ( diff --git a/packages/react-components/src/components/styles/MessageThread.styles.ts b/packages/react-components/src/components/styles/MessageThread.styles.ts index dd5e1f5456b..355d5affece 100644 --- a/packages/react-components/src/components/styles/MessageThread.styles.ts +++ b/packages/react-components/src/components/styles/MessageThread.styles.ts @@ -28,6 +28,11 @@ const AVATAR_ZINDEX = 2; // new message button should be on top of chat message const NEW_MESSAGE_BUTTON_ZINDEX = 2; +/** + * @private + */ +export const chatMyMessageActionMenuClassName = 'ChatMyMessage__actions'; + /** * @private */ @@ -152,15 +157,11 @@ export const useChatMessageRenderStyles = makeStyles({ */ export const useChatMyMessageStyles = makeStyles({ root: { - // The first column's width should be set to 1fr - // because otherwise rich text editor's width will grow indefinitely - gridTemplateColumns: '1fr auto', + gridTemplateColumns: 'auto', gridTemplateAreas: ` - ". actions" - "body body" + "body" `, gridGap: '0', - columnGap: '0', paddingTop: '0', marginLeft: '0' }, @@ -173,10 +174,10 @@ export const useChatMyMessageStyles = makeStyles({ // This makes message bubble show border in high contrast mode making each message distinguishable ...shorthands.border('1px', 'solid', 'transparent'), - '&:hover ~ .fui-ChatMyMessage__actions': { + '&:hover .ChatMyMessage__actions': { visibility: 'visible' }, - '&:focus ~ .fui-ChatMyMessage__actions': { + '&:focus .ChatMyMessage__actions': { visibility: 'visible' }, '& msft-mention': { @@ -206,9 +207,8 @@ export const useChatMyMessageStyles = makeStyles({ menu: { boxShadow: tokens.shadow4, backgroundColor: tokens.colorNeutralBackground1, - marginRight: '1px', position: 'absolute', - top: '-2px', + top: '-19px', right: '0', ...shorthands.borderRadius(tokens.borderRadiusMedium), zIndex: 1, @@ -220,9 +220,6 @@ export const useChatMyMessageStyles = makeStyles({ visibility: 'visible' } }, - menuAttached: { - top: '-18px' - }, menuHidden: { visibility: 'hidden' }, diff --git a/packages/react-components/src/components/utils/ChatMessageComponentUtils.tsx b/packages/react-components/src/components/utils/ChatMessageComponentUtils.tsx index 6edd97f207a..115bd2624f0 100644 --- a/packages/react-components/src/components/utils/ChatMessageComponentUtils.tsx +++ b/packages/react-components/src/components/utils/ChatMessageComponentUtils.tsx @@ -150,3 +150,19 @@ export const getMessageEditedDetails = ( } return undefined; }; + +/** + * Removes Fluent UI keyboard navigation styles from the given HTMLDivElement. + * + * This function removes the 'tabindex' and 'data-tabster' attributes from the provided + * HTMLDivElement, making it non-focusable and removing any associated keyboard navigation styles. + * + * @param node - The HTMLDivElement from which to remove the keyboard navigation styles. If null, the function does nothing. + */ +export const removeFluentUIKeyboardNavigationStyles = (node: HTMLDivElement | null): void => { + if (node) { + // Remove tabindex to make the div element non-focusable + node.removeAttribute('tabindex'); + node.removeAttribute('data-tabster'); + } +}; diff --git a/packages/react-components/tests/browser/ChatMyMessageComponent.spec.tsx b/packages/react-components/tests/browser/ChatMyMessageComponent.spec.tsx index 965a9dbba72..e49c5f4a904 100644 --- a/packages/react-components/tests/browser/ChatMyMessageComponent.spec.tsx +++ b/packages/react-components/tests/browser/ChatMyMessageComponent.spec.tsx @@ -4,46 +4,16 @@ import React from 'react'; import { expect } from '@playwright/experimental-ct-react'; import { test as betaTest } from './FlavoredBaseTest'; -import { - ChatMyMessageComponent, - ChatMyMessageComponentProps -} from '../../src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent'; -import { COMPONENT_LOCALE_EN_US, MessageContentType } from '../../src'; import { Locator, Page } from 'playwright-core'; +import { TestChatMyMessageComponent } from './TestingComponents/TestChatMyMessageComponent'; betaTest.describe('ChatMyMessageComponent rich text editor attachment tests', () => { betaTest.skip(({ isBetaBuild }) => !isBetaBuild, 'The tests should be run for beta flavor only'); - const localeStrings = COMPONENT_LOCALE_EN_US.strings; - - const props = (content: string, contentType: MessageContentType): ChatMyMessageComponentProps => { - return { - shouldOverlapAvatarAndMessage: false, - onActionButtonClick: () => {}, - strings: localeStrings.messageThread, - message: { - messageType: 'chat', - senderId: 'user2', - senderDisplayName: 'Test user 2', - messageId: Math.random().toString(), - content: content, - createdOn: new Date('2019-04-13T00:00:00.000+08:10'), - mine: true, - attached: false, - contentType: contentType, - attachments: [ - { - url: '', - name: 'image.png', - id: '1' - } - ] - }, - userId: '1' - }; - }; betaTest('Edit box should not allow to save empty text when attachments are deleted', async ({ mount, page }) => { - const component = await mount(); + const component = await mount( + + ); await startMessageEditing(component, page); await removeAttachmentAndSubmit(component, true); @@ -62,7 +32,7 @@ betaTest.describe('ChatMyMessageComponent rich text editor attachment tests', () 'Edit box should not allow to save empty html text when attachments are deleted', async ({ mount, page }) => { const component = await mount( -
', 'html')} isRichTextEditorEnabled={true} /> +
'} contentType={'html'} isRichTextEditorEnabled={true} /> ); await startMessageEditing(component, page); @@ -83,7 +53,7 @@ betaTest.describe('ChatMyMessageComponent rich text editor attachment tests', () 'Edit box should allow to save the message when content exists but attachments are deleted', async ({ mount, page }) => { const component = await mount( - + ); await startMessageEditing(component, page); @@ -102,37 +72,10 @@ betaTest.describe('ChatMyMessageComponent rich text editor attachment tests', () betaTest.describe('ChatMyMessageComponent text editor attachment tests', () => { betaTest.skip(({ isBetaBuild }) => !isBetaBuild, 'The tests should be run for beta flavor only'); - const localeStrings = COMPONENT_LOCALE_EN_US.strings; - - const props = (content: string, contentType: MessageContentType): ChatMyMessageComponentProps => { - return { - shouldOverlapAvatarAndMessage: false, - onActionButtonClick: () => {}, - strings: localeStrings.messageThread, - message: { - messageType: 'chat', - senderId: 'user2', - senderDisplayName: 'Test user 2', - messageId: Math.random().toString(), - content: content, - createdOn: new Date('2019-04-13T00:00:00.000+08:10'), - mine: true, - attached: false, - contentType: contentType, - attachments: [ - { - url: '', - name: 'image.png', - id: '1' - } - ] - }, - userId: '1' - }; - }; - betaTest('Edit box should not allow to save empty text when attachments are deleted', async ({ mount, page }) => { - const component = await mount(); + const component = await mount( + + ); await startMessageEditing(component, page); await removeAttachmentAndSubmit(component, false); @@ -146,8 +89,9 @@ betaTest.describe('ChatMyMessageComponent text editor attachment tests', () => { }); betaTest('Edit box should allow to save empty html text when attachments are deleted', async ({ mount, page }) => { + await page.evaluate(() => document.fonts.ready); const component = await mount( -
', 'html')} isRichTextEditorEnabled={false} /> +
'} contentType={'html'} isRichTextEditorEnabled={false} /> ); await startMessageEditing(component, page); @@ -165,7 +109,7 @@ betaTest.describe('ChatMyMessageComponent text editor attachment tests', () => { 'Edit box should allow to save the message when content exists but attachments are deleted', async ({ mount, page }) => { const component = await await mount( - + ); await startMessageEditing(component, page); await removeAttachmentAndSubmit(component, false); diff --git a/packages/react-components/tests/browser/ChatMyMessageComponentKeyboardNavigationTests.spec.tsx b/packages/react-components/tests/browser/ChatMyMessageComponentKeyboardNavigationTests.spec.tsx index b3b9cc75b28..780aeedf022 100644 --- a/packages/react-components/tests/browser/ChatMyMessageComponentKeyboardNavigationTests.spec.tsx +++ b/packages/react-components/tests/browser/ChatMyMessageComponentKeyboardNavigationTests.spec.tsx @@ -80,7 +80,7 @@ const showMoreMenuButton = async (component: Locator, page: Page): Promise const openMoreMenu = async (component: Locator, page: Page): Promise => { // navigate to message menu - await page.keyboard.press('Tab'); + await page.keyboard.press('Enter'); await expect(component.getByTestId('chat-composite-message-action-icon')).toBeFocused(); // open message menu diff --git a/packages/react-components/tests/browser/FluentChatMessageComponentKeyboardNavigationTests.spec.tsx b/packages/react-components/tests/browser/FluentChatMessageComponentKeyboardNavigationTests.spec.tsx new file mode 100644 index 00000000000..0202da413f0 --- /dev/null +++ b/packages/react-components/tests/browser/FluentChatMessageComponentKeyboardNavigationTests.spec.tsx @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import React from 'react'; +import { expect } from '@playwright/experimental-ct-react'; +import { test as betaTest } from './FlavoredBaseTest'; +import { COMPONENT_LOCALE_EN_US } from '../../src'; +import { + FluentChatMessageComponentWrapperProps, + FluentChatMessageComponent +} from '../../src/components/ChatMessage/MessageComponents/FluentChatMessageComponent'; + +betaTest.describe('FluentChatMessageComponent keyboard navigation tests', () => { + const localeStrings = COMPONENT_LOCALE_EN_US.strings; + + const props: FluentChatMessageComponentWrapperProps = { + key: '1', + statusToRender: undefined, + shouldOverlapAvatarAndMessage: false, + onActionButtonClick: () => {}, + strings: localeStrings.messageThread, + onRenderMessageStatus: undefined, + styles: undefined, + defaultStatusRenderer: () => <>, + message: { + content: 'Hello World!', + messageId: '1', + attached: true, + messageType: 'chat', + contentType: 'html', + createdOn: new Date(), + mine: false + }, + userId: '1' + }; + + betaTest('User can navigate to message using keyboard', async ({ mount, page }) => { + const component = await mount(); + + await page.keyboard.press('Tab'); + const messageBody = component.getByTestId('chat-composite-message'); + await expect(messageBody).toBeVisible(); + await expect(messageBody).toBeFocused(); + + // check that focus stays on the message and not moved anywhere after additional Enter key press + await page.keyboard.press('Enter'); + await expect(messageBody).toBeFocused(); + }); +}); diff --git a/packages/react-components/tests/browser/FluentChatMyMessageComponentKeyboardNavigationTests.spec.tsx b/packages/react-components/tests/browser/FluentChatMyMessageComponentKeyboardNavigationTests.spec.tsx new file mode 100644 index 00000000000..72391099b3a --- /dev/null +++ b/packages/react-components/tests/browser/FluentChatMyMessageComponentKeyboardNavigationTests.spec.tsx @@ -0,0 +1,107 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import React from 'react'; +import { expect } from '@playwright/experimental-ct-react'; +import { test as betaTest } from './FlavoredBaseTest'; +import { COMPONENT_LOCALE_EN_US } from '../../src'; +import { Locator, Page } from 'playwright-core'; +import { FluentChatMyMessageComponent } from '../../src/components/ChatMessage/MyMessageComponents/FluentChatMyMessageComponent'; +import { FluentChatMessageComponentWrapperProps } from '../../src/components/ChatMessage/MessageComponents/FluentChatMessageComponent'; + +betaTest.describe('FluentChatMyMessageComponent keyboard navigation tests', () => { + const localeStrings = COMPONENT_LOCALE_EN_US.strings; + + const props: FluentChatMessageComponentWrapperProps = { + key: '1', + statusToRender: undefined, + shouldOverlapAvatarAndMessage: false, + onActionButtonClick: () => {}, + strings: localeStrings.messageThread, + onRenderMessageStatus: undefined, + styles: undefined, + defaultStatusRenderer: () => <>, + message: { + content: 'Hello World!', + messageId: '1', + attached: true, + messageType: 'chat', + contentType: 'html', + createdOn: new Date(), + mine: true + }, + userId: '1' + }; + + betaTest('User can navigate to message and edit message using keyboard', async ({ mount, page }) => { + const component = await mount(); + + await showMoreMenuButton(component, page); + await openMoreMenu(component, page); + + // start editing + await page.keyboard.press('Enter'); + await expect(component.getByTestId('chat-message-edit-box-cancel-button')).toBeVisible(); + await expect(component.getByTestId('chat-message-edit-box-submit-button')).toBeVisible(); + + await page.keyboard.press('Tab'); + await expect(component.getByTestId('chat-message-edit-box-cancel-button')).toBeFocused(); + await page.keyboard.press('Tab'); + await expect(component.getByTestId('chat-message-edit-box-submit-button')).toBeFocused(); + await page.keyboard.press('Enter'); + + const messageBody = component.getByTestId('chat-composite-message'); + await expect(messageBody).toBeVisible(); + await expect(messageBody).toBeFocused(); + + await expect(component.getByTestId('chat-composite-message-action-icon')).toBeVisible(); + }); + + betaTest('User can navigate to message and cancel message editing using keyboard', async ({ mount, page }) => { + const component = await mount(); + + await showMoreMenuButton(component, page); + await openMoreMenu(component, page); + + // start editing + await page.keyboard.press('Enter'); + await expect(component.getByTestId('chat-message-edit-box-cancel-button')).toBeVisible(); + await expect(component.getByTestId('chat-message-edit-box-submit-button')).toBeVisible(); + + await page.keyboard.press('Tab'); + await expect(component.getByTestId('chat-message-edit-box-cancel-button')).toBeFocused(); + await page.keyboard.press('Enter'); + + const messageBody = component.getByTestId('chat-composite-message'); + await expect(messageBody).toBeVisible(); + await expect(messageBody).toBeFocused(); + + await expect(component.getByTestId('chat-composite-message-action-icon')).toBeVisible(); + }); +}); + +const showMoreMenuButton = async (component: Locator, page: Page): Promise => { + await component.evaluate(() => document.fonts.ready); + const messageBody = component.getByTestId('chat-composite-message'); + await expect(messageBody).toBeVisible(); + await page.keyboard.press('Tab'); + + await expect(messageBody).toBeFocused(); + + await expect(component.getByTestId('chat-composite-message-action-icon')).toBeVisible(); +}; + +const openMoreMenu = async (component: Locator, page: Page): Promise => { + // navigate to message menu + await page.keyboard.press('Enter'); + await expect(component.getByTestId('chat-composite-message-action-icon')).toBeFocused(); + + // open message menu + await page.keyboard.press('Enter'); + + // page is used here as more menu is not part of the component + const editButton = page.getByTestId('chat-composite-message-contextual-menu-edit-action'); + await expect(editButton).toBeVisible(); + await expect(page.getByTestId('chat-composite-message-contextual-menu-remove-action')).toBeVisible(); + await expect(editButton).toBeFocused(); +}; diff --git a/packages/react-components/tests/browser/TestingComponents/TestChatMyMessageComponent.tsx b/packages/react-components/tests/browser/TestingComponents/TestChatMyMessageComponent.tsx new file mode 100644 index 00000000000..56e5552b16f --- /dev/null +++ b/packages/react-components/tests/browser/TestingComponents/TestChatMyMessageComponent.tsx @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import React from 'react'; +import { useLocale } from '../../../src/localization'; +import { MessageContentType } from '../../../src/types/ChatMessage'; +import { FluentV9ThemeProvider } from '../../../src/theming/FluentV9ThemeProvider'; +import { useTheme } from '../../../src'; +import { ChatMyMessageComponent } from '../../../src/components/ChatMessage/MyMessageComponents/ChatMyMessageComponent'; + +interface TestChatMyMessageComponentProps { + content: string; + contentType: MessageContentType; + isRichTextEditorEnabled: boolean; +} + +/** + * @private + */ +export const TestChatMyMessageComponent = (props: TestChatMyMessageComponentProps): JSX.Element => { + const { content, contentType, isRichTextEditorEnabled } = props; + const locale = useLocale(); + const theme = useTheme(); + + return ( + + {}} + strings={locale.strings.messageThread} + message={{ + messageType: 'chat', + senderId: 'user2', + senderDisplayName: 'Test user 2', + messageId: Math.random().toString(), + content: content, + createdOn: new Date('2019-04-13T00:00:00.000+08:10'), + mine: true, + attached: false, + contentType: contentType, + attachments: [ + { + url: '', + name: 'image.png', + id: '1' + } + ] + }} + userId={'1'} + isRichTextEditorEnabled={isRichTextEditorEnabled} + /> + + ); +}; diff --git a/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-empty-content-without-attachment-Desktop-Chrome-linux.png b/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-empty-content-without-attachment-Desktop-Chrome-linux.png index 7f8b4ec3de4acf5667d747ab29f199e948155d1c..1bc3732e4b4326384e392a1698bd31a55ec9d20e 100644 GIT binary patch literal 4019 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 VHl!xA10!>{gUqZhSD4(6`ybI6E$RRO literal 3848 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 literal 3582 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 I>n;!f4S1ftivR!s diff --git a/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-empty-content-without-attachment-Mobile-Android-Portrait-linux.png b/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-empty-content-without-attachment-Mobile-Android-Portrait-linux.png index 23a104e92e43c2f1cbad87501968770f3afae18e..242f7a5b79a7e08a017f0f58a4a52bb7ae905d90 100644 GIT binary patch literal 3595 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 literal 3425 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 literal 1639 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 Gr~L<2tgp8K literal 1508 zcmd5+k2li`6#tUqcqmH`rM#Yb&+qBS*hb2anXj~LhGv*YQb{uEMVh3Cyy3L`=%7j7 zgk{yTc{6LhlqHlm#zwsJveFjQi^z!gt-qpk?z#7#&pG$pdp`Hx&*e}&&eV9bF#rIj zU{C-N0Q4Q89A~r+@~-Y3c2LkuC*u47?sFS80IX$!0luWOHPbJXL*$8o^gr8EW)5kQ zL8aC=y08QxDa*orGUY%_1EM`k88ZB2s9M&GjJy+mo2}yT1K^TMR|Ih;w z_jI3G+IySVPn8nO_Fb3n^Od&en`b8Fi!-a<%d0OqvtylW%qtSf`T*b_q?)Gd0l)>x zkD-uHGqM1HI2--70AN+H55l{)e*>^IO+959%`lWi2RyZaYut6*hY zJ8L(Z+L>>970wq3ngwqP;}a6Xi5P$Xd=qPT$-gR)&yNW`eE1J$7;!g!*#K=b{6Mze z)(2kM!)7pg^=38ia>`wf`NgvOI09QQXiJL5hBt-U&3mG*Trto3%r9=wUi@%jM|gNS zCg%Z`E}=s9S6nT;i7h0jmZcDmM^%lCxHX>WX}J5Mk-LI7H8s^}G_u_0&m*5S>tcj7 zEOV|~YO5AspE0|((P-{CZt=`kRA}N-mEoGN?T)H>uj^jy9hNt-*<>6chR8mp_ zU(EK|(|Yt?v|FS^_z!)S|2=|y(=lwU$|I#cHZ!y3c@4V0w>MX`9gD?Q?UcKMPNN+l zE;*SLO>_c_iWtPOuzKG8biWD79q!Qk!9ib2+nB;v4~W|^H#gTPT3TOBD`vt|Tt{!) z=Ac}_4@=q1L`N%=`Ra5H=_)Noh7Gi)PkL!O z&JrfN#_G#C5k2aRXYW4dckL%eN7pRVsftMheZ5R^?B_Gh;LrG){+k7rm$aKKEHoU1 zBouc}L>!QjA{Vai+$nW%bUfBSoND>yOt)-OSvq(*Q~F%{bno*P_&Rk`8H-h?P$>GZ zCDl^wK;w0JBZLPr=N3puS1$fWL)q|LoOg2(R#TocfwejFO-{}W-AEbRk{ZP+D=X_4 z7Zw`zv35l+%}>iG4th5gjfq-MD2-2NWSD41rUPz3?_pOk&~)i>z-xQ_;M^jEnXok_0}DFYZ8pIw`Y&srCHmc zXVA&PMOK$*Xb+BSPa-{Q!|-_R0rCEj5Jp4D>165XC^B_C&*QdsDBcj_r#hpxjnk1` z9mue%b1TIu(L$Q&7RVHcKQ;vKPkKAPq#e%x_)bMDCPr4`61qwT*6d0OX1+ljYHUfY zmMauDwxyO7G0( z&N-5u64C~HwNZ5nW4LTmDy{$Y=`6bQ<&xxwuVRAAgK8N55S75h2I$=$q6{FJbT`ZW bcHta-nCyrhcj_?$8X5qx_yDe7+{OO^pB{RD diff --git a/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-empty-html-content-without-attachment-Mobile-Android-Portrait-linux.png b/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-empty-html-content-without-attachment-Mobile-Android-Portrait-linux.png index 6013e27d7d669064aea20b261dda7dab71bfa0f5..5b1890787b574af2a4502e0f4ad9e6a927d09281 100644 GIT binary patch literal 1939 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 diff --git a/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-not-empty-message-content-without-attachment-Desktop-Chrome-linux.png b/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-edit-box-not-empty-message-content-without-attachment-Desktop-Chrome-linux.png index 593794cc4f9d91a3aa16ba54702b54d61c6818f4..ac0844b5d0c1c2a44a421f5c29646c82147495ba 100644 GIT binary patch literal 2770 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 literal 2192 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 F=HDI9w#Wbg literal 2017 zcmd5-X*iqd8veLWJH`|<)0$C~E`nGxmL`#O+P5~gj-^D(9AY{4^Xd6_exD!b&-=dDb6wB--0%I|&;9=7=7N-y zRh9(+Kn~?_%^d)wwZSt|<|Mf48?;{nH>ntRq%FYiQxyTg7tc`FY&_$iuT1&6d5%kU zt*Q60Q~hvjIYlNK$fMaaLA-{W_uZA_W?Bn8i$qqqC*>l04u2UBF5@x4KtM5rg z|LR)+3~7NlX#g;IIOk&p;(D2S(G39Z{Z-}+0Qjj&p8xH^vIX&tFSzFQ&STxpu1;VydGHV(R*Z39T{MZ*rXf<`9~Gu>SMmv~U#6RJxDk!=YI@Ddy%zUB zms?6tkd*o!9lZWBfyeFc>qBdwai?1*YoK2Fx%rZI&jtns#kOwq3R4G-8-v4VUr0L_ z?LWl)){4)E5r*pg2{Rctelf5)t)=KdbsT38uCW{yU7%ErH)gm0wu;Y=j<&b&N_9gQ zk8n6@-py0-Y0`kTLP%&RIz|GQd#kFA^73uPq?#vQqmC$_a-=aGG=@Y)lEr?gNu1|~ zsku3lp0X~uYo%)lMVmxUK2&ohZJ<}C8nqH5aI|iPPgsBd$NJ%ID#!QU%Vx23HV;<` zt;^ftubjS8{4>^xN=w-$Ezj`z8c?`CVWNpwT7_kYynaaL`2BJ5S3K;5^!=rHRCL=^ z*j>5Uy(`6T4)?9CkFKV=l)KW$hJEShcr?0|kNM%g){e5u6Iv1bw3g-2fPcr6yu6V) zar0OAkISxiE$C{QBe~OF2U{lmv644Gg#Y8`Vo(a1IXit+CiR7bMoCTJGw$|*MdGZW ze4c0)h{F)^rr(N)Gc`^8J><#^-?c#D&hlOlO&0=zBBqmmdt)1oad zbh`cf1<6h#aV7S6Ug{nXFHp4%(WR%mmLC5OHS@X2ykM6RYmPu5Fms(0>}G*6^~L=B zot*>hlcGZiih8tsGh5BLY=T68Ch1*L%Uius;QoTDSQ|3gk_7S~*Vo-zE1hm}EWr8Q zO>yDY1AKctS|O?a8-&uS?gl*^jhT}pFUsUyP^X(Q{X5k2G!`gyMu&QeHcIxgNmbL9 zN49DK3E4l?9Odi$+>=q`jR^0|DnL}PuFlGV&V*QlBUsfDxkg4tBlFw3!FSlQvYJj* z1doTle*MkvI`%gf2uIsEhVk_2zVhJ*8RtTTGj-#2u4`zr$ZK@OvkEd$^8H7?(!ri) z+-!YUxp>Y)3y%1qzX?9AZ#Y(C^$9eUqud`&tF6zUr*sWNVUY*$x&E%pJ-Hu1vX+g= zGk;=jZ6DyL@M8V{n9UXg^q;w}!8gA&{R;@uKpt!-kY)E@VMJSkqzo;Yq#S2OaFX}h zcGoB=A#bm4>mJ*c3Or@3!fnYuU-HL~xAJ*D>9)nNaiLH+zd6R@@eZ0K8{h3iaA0Ob z(tD$GW*b->4U*r(q^h@<;TnTPX^&)iJ0DfnNpDklbGb>LKva7!UR*h zOq>=G!v+{Oy8_qLvSvi&K$&w?xPZ!hY8lXJLBix7^Si+qk*ZWSN4SQM*NC@vM=CvT z;_=mK3ky0>T;(equDiFFC+-hbp1vdn_?5=TwI^BnZnU(t+(J^+1_ilVrHeYc6sW3v zRee1=h3{)|TjQ_BV66f<*}w0$~pC93fnzY(8tH?u-A~x3xGEG<92Y1CPE9 PY7;dTWbA~)I+GnGtcjSE zd#$z1T}_ypAqxk~%uIIH?~mW*zu!O4`+lDH`Ml5jKF|04e&5^+=NuIkG!*~lCgYO zG_}A9{O;+Pyd!Ssu|oHUhLyF+GQ-w3puIlwl^9}ewak5@+(EZyoAD>1MHe0(fQ%R7 z5QCBMgX*|F(aagsfqL_k5$Ah=gqjyAL_(2I655Zw1HS|E++D@)3mv5*)y@ZL?=ipMFwX>r8fp z00CQR;#0j3T#l(s^37QO>>sbf)1T4%IhJDC^OVC6M;mV~lbHziF? zOzo)TGe(UdtyMp~PlVC%4Q)vbwD+CPDub{x8?T$uKc>t0pi&ROo_X}w`Hnv~c)ygT z3OzP>yk85flh!(AUY!qA*V`VBevGWhoYlZo&0)(A)jvQ6_ch(;_+Y^@YQJ4)ST4sw zv*nPgy}W=KMgFx^D;*;{c5N1S?Fpxih++YBCS;EOv-*!atjg9B08DIFGVNl6nQ`Ma5+C~ahKkEttPQg#mxubBQBt21sV;Cj|p_q{2gtt6%bb~}h#r#ENs zdwF8b;{_l43|_K5uZGwn59DH&4o_JzUd1#Enrq{#P0hfG6C<1nr795jEBU zjw$9*IDMm|ea0+VTAWGdH)+H+H$P~3nlY^c7A;=(`o7PaeevfG6g1=Eqz(MbmrYr1L-f1 zCzh$DUI3dYA$01~hIDE>3rTLjv(OQvuZ=AYf#%n*EP_3SvT0X#{0Nq8|8-TUABGakAr2ggWoPOI2HEFS1v(6eZAia)Z^Sm)D%& zo@TvYcQq~&x9hm0EQ{N=dajmfd2Pu7Xi;N4p3i!?Sh>_JZGSH>|HYYQC^$tZ8#?i+ zVb){atleH%MW2kO{Qwo0RIozT8UBs=sjd;xA7Gv~L7p!Mn43 z_b>eDs8x%XYDTkT+sZX0LU{)%*d(l9db|KE-R1A@;Qu6h7*kp1CCacI?f;{6eXM?R zi#4N;KKQ683wC)0Oe($knvPT78TI8J*_$Cmu5Ed)wf@A3Z$^=HwYWx(Oh~= z@ZJHi@8lF?E^c5jzO5|1!-|aRI4(?CP&2tjKkid5I3D+LE8mwBVls)et~&q;nrl}r z${*#7og6~^A$@B#Cvs~o$j2_&76jTCl+=DWZcTQ_j3{p<(OuvQQjjnpuI6?z0AFLV8iv2mV|B6Tl*ipI}cQz=Z?%CtX09mY>V{dCwzB&bQ)Irvr3 zL@cF61xs~bS5$&?(PHSSqutj(oN$|WHIgLDg|%*PZbW?g-tBprN#(3I^7O5*ug1X| z1esxN&o-kJ@-W;b?i{{_MfHmCmFlvtxYQ?#2!HGE?)>oi?;Zo;Uq0#UI9(cmOVopY zuq@eQ{j+#Oi?x4gGD=)8CAS{CDyo>Gw|DwbAH{s*a?Pnh%9GR`Sj$Y#*cKZmSe-BD zgEsQ!e~~?8aD-~wcRyKAQxTZ+E@^3UUC-=S$l}Z&c0Q zT!r8uozDsb20qoGzNz{5b+cT-r(Wo{E)5d)OGGXrLBDbekQI2Lb6ykU(wpP3IsEa& z(7awLLWw@=O736xBy3Qzbb(sK*7_?{?9x5-XP)K)b2}HuQ`kua*47%&bz~E&X5XD9 zq|KatukQi8w`L;7JR-gLdfmIEm_o>v003uqT-d#oXy8y~3`bF`W=_(gwnQU zz4K6OYUBauXVrPr!#v=`fX4v5@@Ff`hXPWD{tp!Wm+t=ua5y`IAku(M7Ai~H6Iu=0 zSkt%k18pEB@@rIcc=aCt@H-7NU8_`A7bsJPs1(+%&hCEWUGe@-P}zlfvzo(vH@|>Y Z>(Dakzy^^mLz{&m`oNODA@eii2!T$gN literal 1910 zcmc&#X*k>28vmnOV`+)Ds>8#?R+Wfcz1F5~Ng9eqN(DD04=puyZRwzD>88R+6}41^ z=~yzYrIrZ2u~eB-8bqgdL#m}@5s4NJ>HT-U-!J#e{qj5Kc|V-O3>o1?c18jIb>k5vP3ZYqM~84ArVeew3F#=IRwsC(N z(g~>TQBGNW#f;_5;g`Ewc4JQdonpRdanLsIof|Cunx&pKkvwpJlF5r(e2GkRMFNLv z32`j;-F%N~z;qhoNU15`+2QA{uU#M%JS@Bz>858%4& zH&Xt^L>m}_8tlh1D4&J;>gs3EY?)NLy;YeTy&d#8@-eYH4b_bLz|WlOyh6A*(+qp^ zSyWwB#rmgMbZ%6)j@tKIeLa7U;oL5iA=fgtO`RD4OrbdNai$FcJPe$QnvxzaMg)gW zHts92PgmNXsnR`fq<>)Hs?*9xwZ2pa*@im5wmcs(5-WZ0QNFYEdZ6joUz?)j0+NKy z0?Fkzg&El-4fu?WjpfXzC*sK%(=)shs8lA6l$?;r=XZ-#HAojnf9WwbGsC=0iQ$C; zFZeceEBj{oT=2=yTe_2?1lUk^jz&f=et9lRFq0m>_9v=+jUwwc^L#ZhKsE4mcVEcE zGMghtqRSb(h6$qCo-)Ug#ZSq!Kd&dA2k*N($A4Z}IymqL{-odEvMO6!HIJTf5Ks2? zp~?eU5!)KI%-){o zv$F_4a_e3zD83=2^JwegWW~-kv0O;2`-kz3OMwAJ7y>~rg>CnRpQWp*pX>r)!usPR zyPHaqwpQM#1lgOZH#^?CA)ceJ>t;`NM4G&*@m{;j;k0}+6TSlu_w$c7wy?F%E)UOrusRU zz#?3b+TN%A!UGwu#Em4iy|WBE0!A-L@4CaO1_zagCr3)^nxGj zqo^d5Aj9^8rk8yYJmtqflO%V-0wlrZ4Al2GJ_#n)hd+y|s;hakJKtU36ji2dOWS1| zrs|-FCp#i_X*610z%$4V&kzL8Wfy*YyrHtO@%~bcc{n%uE=jQpcYUNSBbD^uV{l@f z7{q5|*+Yfd-0+_tGMPNcP3r8J7 zg?Hhe_xFFv@6B{b+ex}e^5*J*6Tso{t&~#`2;>;t$^?aC)QUuL%PWx^=Ec;$_K)i} zVCQ9)mN4QL^bHdiF~j~>T}W&8>(^;}l$GKs` n9UV6o7==*kU!M8jU?5#dO&Tg&V23D!A1UC0Ifrg=CExlFU`2~D diff --git a/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-rich-text-edit-box-not-empty-message-content-without-attachment-Desktop-Chrome-linux.png b/packages/react-components/tests/snapshots/beta/ChatMyMessageComponent.spec.tsx-snapshots/chat-my-message-component-rich-text-edit-box-not-empty-message-content-without-attachment-Desktop-Chrome-linux.png index 593794cc4f9d91a3aa16ba54702b54d61c6818f4..ac0844b5d0c1c2a44a421f5c29646c82147495ba 100644 GIT binary patch literal 2770 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 literal 2192 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 F=HDI9w#Wbg literal 2017 zcmd5-X*iqd8veLWJH`|<)0$C~E`nGxmL`#O+P5~gj-^D(9AY{4^Xd6_exD!b&-=dDb6wB--0%I|&;9=7=7N-y zRh9(+Kn~?_%^d)wwZSt|<|Mf48?;{nH>ntRq%FYiQxyTg7tc`FY&_$iuT1&6d5%kU zt*Q60Q~hvjIYlNK$fMaaLA-{W_uZA_W?Bn8i$qqqC*>l04u2UBF5@x4KtM5rg z|LR)+3~7NlX#g;IIOk&p;(D2S(G39Z{Z-}+0Qjj&p8xH^vIX&tFSzFQ&STxpu1;VydGHV(R*Z39T{MZ*rXf<`9~Gu>SMmv~U#6RJxDk!=YI@Ddy%zUB zms?6tkd*o!9lZWBfyeFc>qBdwai?1*YoK2Fx%rZI&jtns#kOwq3R4G-8-v4VUr0L_ z?LWl)){4)E5r*pg2{Rctelf5)t)=KdbsT38uCW{yU7%ErH)gm0wu;Y=j<&b&N_9gQ zk8n6@-py0-Y0`kTLP%&RIz|GQd#kFA^73uPq?#vQqmC$_a-=aGG=@Y)lEr?gNu1|~ zsku3lp0X~uYo%)lMVmxUK2&ohZJ<}C8nqH5aI|iPPgsBd$NJ%ID#!QU%Vx23HV;<` zt;^ftubjS8{4>^xN=w-$Ezj`z8c?`CVWNpwT7_kYynaaL`2BJ5S3K;5^!=rHRCL=^ z*j>5Uy(`6T4)?9CkFKV=l)KW$hJEShcr?0|kNM%g){e5u6Iv1bw3g-2fPcr6yu6V) zar0OAkISxiE$C{QBe~OF2U{lmv644Gg#Y8`Vo(a1IXit+CiR7bMoCTJGw$|*MdGZW ze4c0)h{F)^rr(N)Gc`^8J><#^-?c#D&hlOlO&0=zBBqmmdt)1oad zbh`cf1<6h#aV7S6Ug{nXFHp4%(WR%mmLC5OHS@X2ykM6RYmPu5Fms(0>}G*6^~L=B zot*>hlcGZiih8tsGh5BLY=T68Ch1*L%Uius;QoTDSQ|3gk_7S~*Vo-zE1hm}EWr8Q zO>yDY1AKctS|O?a8-&uS?gl*^jhT}pFUsUyP^X(Q{X5k2G!`gyMu&QeHcIxgNmbL9 zN49DK3E4l?9Odi$+>=q`jR^0|DnL}PuFlGV&V*QlBUsfDxkg4tBlFw3!FSlQvYJj* z1doTle*MkvI`%gf2uIsEhVk_2zVhJ*8RtTTGj-#2u4`zr$ZK@OvkEd$^8H7?(!ri) z+-!YUxp>Y)3y%1qzX?9AZ#Y(C^$9eUqud`&tF6zUr*sWNVUY*$x&E%pJ-Hu1vX+g= zGk;=jZ6DyL@M8V{n9UXg^q;w}!8gA&{R;@uKpt!-kY)E@VMJSkqzo;Yq#S2OaFX}h zcGoB=A#bm4>mJ*c3Or@3!fnYuU-HL~xAJ*D>9)nNaiLH+zd6R@@eZ0K8{h3iaA0Ob z(tD$GW*b->4U*r(q^h@<;TnTPX^&)iJ0DfnNpDklbGb>LKva7!UR*h zOq>=G!v+{Oy8_qLvSvi&K$&w?xPZ!hY8lXJLBix7^Si+qk*ZWSN4SQM*NC@vM=CvT z;_=mK3ky0>T;(equDiFFC+-hbp1vdn_?5=TwI^BnZnU(t+(J^+1_ilVrHeYc6sW3v zRee1=h3{)|TjQ_BV66f<*}w0$~pC93fnzY(8tH?u-A~x3xGEG<92Y1CPE9 PY7;wcc={@vGe-}mqLq}kb8f(|Mi1ONaaq!q#e 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