Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/four-eels-compete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@rocket.chat/ui-composer': minor
'@rocket.chat/meteor': minor
---

Composer keyboard navigability

![Kapture 2024-01-22 at 11 33 14](https://github.com/RocketChat/Rocket.Chat/assets/27704687/f116c1e6-4ec7-4175-a01b-fa98eade2416)
1 change: 1 addition & 0 deletions apps/meteor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@
"@nivo/line": "0.84.0",
"@nivo/pie": "0.84.0",
"@react-aria/color": "^3.0.0-beta.15",
"@react-aria/toolbar": "^3.0.0-beta.1",
"@react-pdf/renderer": "^3.1.14",
"@rocket.chat/account-utils": "workspace:^",
"@rocket.chat/agenda": "workspace:^",
Expand Down
29 changes: 26 additions & 3 deletions apps/meteor/tests/e2e/message-composer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { expect, test } from './utils/test';

test.use({ storageState: Users.user1.state });

test.describe.serial('Composer', () => {
test.describe.serial('message-composer', () => {
let poHomeChannel: HomeChannel;
let targetChannel: string;

Expand All @@ -23,7 +23,7 @@ test.describe.serial('Composer', () => {
await poHomeChannel.sidenav.openChat(targetChannel);
await poHomeChannel.content.sendMessage('hello composer');

await expect(poHomeChannel.composerToolboxActions).toHaveCount(11);
await expect(poHomeChannel.composerToolbarActions).toHaveCount(11);
});

test('should have only the main formatter and the main action', async ({ page }) => {
Expand All @@ -32,6 +32,29 @@ test.describe.serial('Composer', () => {
await poHomeChannel.sidenav.openChat(targetChannel);
await poHomeChannel.content.sendMessage('hello composer');

await expect(poHomeChannel.composerToolboxActions).toHaveCount(5);
await expect(poHomeChannel.composerToolbarActions).toHaveCount(5);
});

test('should navigate on toolbar using arrow keys', async ({ page }) => {
await poHomeChannel.sidenav.openChat(targetChannel);
await poHomeChannel.content.sendMessage('hello composer');

await page.keyboard.press('Tab');
await page.keyboard.press('ArrowRight');
await page.keyboard.press('ArrowRight');
await expect(poHomeChannel.composerToolbar.getByRole('button', { name: 'Italic' })).toBeFocused();

await page.keyboard.press('ArrowLeft');
await expect(poHomeChannel.composerToolbar.getByRole('button', { name: 'Bold' })).toBeFocused();
});

test('should move the focus away from toolbar using tab key', async ({ page }) => {
await poHomeChannel.sidenav.openChat(targetChannel);
await poHomeChannel.content.sendMessage('hello composer');

await page.keyboard.press('Tab');
await page.keyboard.press('Tab');

await expect(poHomeChannel.composerToolbar.getByRole('button', { name: 'Emoji' })).not.toBeFocused();
});
});
6 changes: 5 additions & 1 deletion apps/meteor/tests/e2e/page-objects/home-channel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,11 @@ export class HomeChannel {
await this.page.mouse.move(0, 0);
}

get composerToolboxActions(): Locator {
get composerToolbar(): Locator {
return this.page.locator('[role=toolbar][aria-label="Composer Primary Actions"]');
}

get composerToolbarActions(): Locator {
return this.page.locator('[role=toolbar][aria-label="Composer Primary Actions"] button');
}
}
5 changes: 2 additions & 3 deletions packages/ui-composer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"private": true,
"devDependencies": {
"@babel/core": "~7.22.20",
"@react-aria/toolbar": "^3.0.0-beta.1",
"@rocket.chat/eslint-config": "workspace:^",
"@rocket.chat/fuselage": "^0.44.2",
"@rocket.chat/icons": "^0.33.0",
Expand All @@ -26,6 +27,7 @@
"typescript": "~5.3.2"
},
"peerDependencies": {
"@react-aria/toolbar": "*",
"@rocket.chat/fuselage": "*",
"@rocket.chat/icons": "*",
"react": "^17.0.2",
Expand All @@ -46,8 +48,5 @@
],
"volta": {
"extends": "../../package.json"
},
"dependencies": {
"@react-aria/toolbar": "^3.0.0-beta.1"
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
import { useToolbar } from '@react-aria/toolbar';
import { ButtonGroup } from '@rocket.chat/fuselage';
import type { ComponentProps, ReactElement } from 'react';
import { useRef, type ComponentProps, type ReactElement } from 'react';

const MessageComposerToolbarActions = (props: ComponentProps<typeof ButtonGroup>): ReactElement => (
<ButtonGroup role='toolbar' small {...props} />
);
const MessageComposerToolbarActions = (props: ComponentProps<typeof ButtonGroup>): ReactElement => {
const ref = useRef(null);
const { toolbarProps } = useToolbar(props, ref);

return (
<ButtonGroup role='toolbar' small ref={ref} {...toolbarProps}>
{props.children}
</ButtonGroup>
);
};

export default MessageComposerToolbarActions;
2 changes: 2 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -9591,6 +9591,7 @@ __metadata:
"@nivo/pie": 0.84.0
"@playwright/test": ^1.40.1
"@react-aria/color": ^3.0.0-beta.15
"@react-aria/toolbar": ^3.0.0-beta.1
"@react-pdf/renderer": ^3.1.14
"@rocket.chat/account-utils": "workspace:^"
"@rocket.chat/agenda": "workspace:^"
Expand Down Expand Up @@ -10521,6 +10522,7 @@ __metadata:
ts-jest: ~29.1.1
typescript: ~5.3.2
peerDependencies:
"@react-aria/toolbar": "*"
"@rocket.chat/fuselage": "*"
"@rocket.chat/icons": "*"
react: ^17.0.2
Expand Down