From 62b5cc65db88b0a25af14f370dc9acf01df2b8bb Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 10 Aug 2026 11:21:14 +0100 Subject: [PATCH] Custom user status (#34386) * Exploration of a virtuoso-powered emoji picker moved to shared components Fable generated * fix pnpm lock * format & fix some lint issues * wrong import * fix lint warning * Fix off-by-one and remove manual overflow adjustment: let's leave the default unless it turns out to be necessary. Emoji should not take that long to load. * Convert to functional component * WIP: change to one big virtuoso scroller * Change to use virtuoso's own onRangeChanged and santitise category data and how it's passed around * Convert Tabs to functional component and put the focusing behaviour back with it just keeping track of refs by itself. * Absorb two line config file into main component * Actually add the config to the main file * Convert emoji to functional Also make selected always defined and use useCallback. * QuickReactions to functional component * Non-default exports & doc * Search to functional component * Well it seems to work just fine now * Use ref prop * fix lockfile AGAIN * lint * Remove default export * Remove some mx_ classnames and fix the inputRef to make the arrow keys in the search box work (well, work as much as they ever did). * Remove last of the mx_ id / classnames (except the one in the test) * Use useMemo to memoize * No need to export props interface (I think?) and fix comment now we don't do the mutation stuff anymore * Fix test * Fix axe violations & add screenshots * Avoid comparing dom snapshots in test * Allow more before or after, just compare order of the ones present in both. * Switch existing usages to new emoji picker and kill the old one with fire * Unused stuff * Remove i18n strings * Fix some tests * Update screenshots * Fix test by removing the last of the weird memoized-but-mutated data structure * Experimental custom status * Screenshot * snapshots * Update button label and fix test * Move the string somewhere more sensible than 'a11y' * i18n lint * Give the emojis IDs so aria-activedescendant works * Fix more tests * Add a small wrapper emoji picker component This lets us easily memoize the recent emojis when the emoji picker is opened. Also it saves a bit of boilerplate. * Remove old emojipicker css * Typos Co-authored-by: David Langley * Use compound constants * Rethemendex * Test for custom status * Use catalog version for emojibase * Add comments * More comments * Fix comment * More comments * more comments (and make them uniform) * More comments * Fix pnpm lock again * Another comment * Add option to hide quick reactions (and preview) bar * Fix test to use emoji not in the quick reactions bar * Apply button types to new version * Add comment * Disable screenshot as per comment * Fix hover / background / border styles * Screenshot * Don't use the reactions row because it's gone now * Trim overly verbose comment --------- Co-authored-by: Will Hunt <2072976+Half-Shot@users.noreply.github.com> Co-authored-by: David Langley --- .../hide-quick-reactions-auto.png | Bin 0 -> 84925 bytes .../default-auto.png | Bin 0 -> 22935 bytes .../core/EmojiPicker/EmojiPicker.stories.tsx | 6 + .../src/core/EmojiPicker/EmojiPicker.tsx | 21 ++- .../src/i18n/strings/en_EN.json | 4 + .../__snapshots__/UserMenu.test.tsx.snap | 16 +++ .../src/status/CustomStatusView.module.css | 53 ++++++++ .../src/status/CustomStatusView.stories.tsx | 26 ++++ .../src/status/CustomStatusView.test.tsx | 76 +++++++++++ .../src/status/CustomStatusView.tsx | 128 ++++++++++++++++++ .../src/status/SetStatusView.test.tsx | 71 ++++++++++ .../src/status/SetStatusView.tsx | 31 ++++- 12 files changed, 425 insertions(+), 7 deletions(-) create mode 100644 packages/shared-components/__vis__/linux/__baselines__/core/EmojiPicker/EmojiPicker.stories.tsx/hide-quick-reactions-auto.png create mode 100644 packages/shared-components/__vis__/linux/__baselines__/status/CustomStatusView.stories.tsx/default-auto.png create mode 100644 packages/shared-components/src/status/CustomStatusView.module.css create mode 100644 packages/shared-components/src/status/CustomStatusView.stories.tsx create mode 100644 packages/shared-components/src/status/CustomStatusView.test.tsx create mode 100644 packages/shared-components/src/status/CustomStatusView.tsx create mode 100644 packages/shared-components/src/status/SetStatusView.test.tsx diff --git a/packages/shared-components/__vis__/linux/__baselines__/core/EmojiPicker/EmojiPicker.stories.tsx/hide-quick-reactions-auto.png b/packages/shared-components/__vis__/linux/__baselines__/core/EmojiPicker/EmojiPicker.stories.tsx/hide-quick-reactions-auto.png new file mode 100644 index 0000000000000000000000000000000000000000..367e184b0e4171b1f9e79d5a2b879c73b522e638 GIT binary patch literal 84925 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 F{|CWSmi_<$ literal 0 HcmV?d00001 diff --git a/packages/shared-components/src/core/EmojiPicker/EmojiPicker.stories.tsx b/packages/shared-components/src/core/EmojiPicker/EmojiPicker.stories.tsx index c0788217f6..8f67ddc773 100644 --- a/packages/shared-components/src/core/EmojiPicker/EmojiPicker.stories.tsx +++ b/packages/shared-components/src/core/EmojiPicker/EmojiPicker.stories.tsx @@ -45,3 +45,9 @@ export const DisabledEmoji: Story = { isEmojiDisabled: (unicode: string) => unicode === "😀", }, }; + +export const HideQuickReactions: Story = { + args: { + showQuickReactions: false, + }, +}; diff --git a/packages/shared-components/src/core/EmojiPicker/EmojiPicker.tsx b/packages/shared-components/src/core/EmojiPicker/EmojiPicker.tsx index eb9aa532b6..1903a860bc 100644 --- a/packages/shared-components/src/core/EmojiPicker/EmojiPicker.tsx +++ b/packages/shared-components/src/core/EmojiPicker/EmojiPicker.tsx @@ -122,6 +122,11 @@ export interface EmojiPickerProps { * When omitted, a default mapping based on `KeyboardEvent.key` is used. */ getAction?: RovingTabIndexProviderProps["getAction"]; + /** + * Whether to show the quick reactions at the bottom of the picker. Defaults to true. + * Previews of emoji are displayed in the same bar as will also be hidden when this is false. + */ + showQuickReactions?: boolean; } /** Convert recent emoji characters to emoji data, removing unknowns and duplicates */ @@ -193,6 +198,7 @@ export function EmojiPicker({ recentEmojis, onRecordRecent, getAction, + showQuickReactions = true, }: EmojiPickerProps): React.ReactNode { const [filter, setFilter] = useState(""); const [previewEmoji, setPreviewEmoji] = useState(undefined); @@ -468,11 +474,16 @@ export function EmojiPicker({ /> )} - {previewEmoji ? ( - - ) : ( - - )} + {showQuickReactions && + (previewEmoji ? ( + + ) : ( + + ))} )} diff --git a/packages/shared-components/src/i18n/strings/en_EN.json b/packages/shared-components/src/i18n/strings/en_EN.json index c2ec670137..d93dfba100 100644 --- a/packages/shared-components/src/i18n/strings/en_EN.json +++ b/packages/shared-components/src/i18n/strings/en_EN.json @@ -4,6 +4,7 @@ }, "action": { "back": "Back", + "cancel": "Cancel", "click": "Click", "close": "Close", "collapse": "Collapse", @@ -28,6 +29,7 @@ "reply": "Reply", "reply_in_thread": "Reply in thread", "retry": "Retry", + "save": "Save", "search": "Search", "start_chat": "Start chat", "unpin": "Unpin", @@ -218,6 +220,8 @@ "set_status": { "away": "Away", "be_right_back": "Be right back", + "choose_emoji": "Choose Emoji", + "custom": "Custom…", "focus_time": "Focus Time", "in_a_meeting": "In a meeting", "on_the_road": "On the road", diff --git a/packages/shared-components/src/menus/UserMenu/__snapshots__/UserMenu.test.tsx.snap b/packages/shared-components/src/menus/UserMenu/__snapshots__/UserMenu.test.tsx.snap index f80116c261..7c08d70dff 100644 --- a/packages/shared-components/src/menus/UserMenu/__snapshots__/UserMenu.test.tsx.snap +++ b/packages/shared-components/src/menus/UserMenu/__snapshots__/UserMenu.test.tsx.snap @@ -380,6 +380,14 @@ exports[`UserMenu > renders a menu without an avatar 1`] = ` 🌴 Away +
  • + ✍️ Custom… + +
  • @@ -806,6 +814,14 @@ exports[`UserMenu > renders an open menu 1`] = ` 🌴 Away +
  • + ✍️ Custom… + +
  • diff --git a/packages/shared-components/src/status/CustomStatusView.module.css b/packages/shared-components/src/status/CustomStatusView.module.css new file mode 100644 index 0000000000..f0d759c28b --- /dev/null +++ b/packages/shared-components/src/status/CustomStatusView.module.css @@ -0,0 +1,53 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.customStatus { + display: flex; + width: 100%; + flex-direction: row !important; + align-items: center; + gap: var(--cpd-space-2x); + /* Match the 28px tall box the trigger/pill float in so nothing shifts vertically */ + min-height: 28px; +} + +.emojiButton { + flex-shrink: 0; + display: inline-flex; + align-items: center; + justify-content: center; + width: 48px; + height: 48px; + padding: 0; + border: 1px solid var(--cpd-color-border-interactive-secondary); + border-radius: var(--cpd-radius-pill-effect); + background: var(--cpd-color-bg-canvas-default); + font-size: var(--cpd-font-size-heading-sm); + line-height: 1; + cursor: pointer; + + &:hover, + &.selected { + background: var(--cpd-color-bg-subtle-secondary); + border-color: var(--cpd-color-border-interactive-hover); + } +} + +.textField { + min-width: 0; + flex-grow: 1; +} + +.action { + flex-shrink: 0; + cursor: pointer; +} + +/* The picker sizes itself (340x450); drop the menu's default padding so it fills the popover */ +.pickerMenu { + padding: 0; +} diff --git a/packages/shared-components/src/status/CustomStatusView.stories.tsx b/packages/shared-components/src/status/CustomStatusView.stories.tsx new file mode 100644 index 0000000000..ecd76b0abf --- /dev/null +++ b/packages/shared-components/src/status/CustomStatusView.stories.tsx @@ -0,0 +1,26 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type Meta, type StoryObj } from "@storybook/react-vite"; +import { fn } from "storybook/test"; + +import { CustomStatusView } from "./CustomStatusView"; + +const meta = { + title: "Status/CustomStatusView", + component: CustomStatusView, + tags: ["autodocs"], + args: { + onSave: fn(), + onCancel: fn(), + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; diff --git a/packages/shared-components/src/status/CustomStatusView.test.tsx b/packages/shared-components/src/status/CustomStatusView.test.tsx new file mode 100644 index 0000000000..c041dfdda5 --- /dev/null +++ b/packages/shared-components/src/status/CustomStatusView.test.tsx @@ -0,0 +1,76 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { describe, expect, it, vi } from "vitest"; +import userEvent from "@testing-library/user-event"; +import { render, screen, waitFor } from "@test-utils"; + +import { CustomStatusView } from "./CustomStatusView"; + +describe("CustomStatusView", () => { + it("shows the default emoji and a Cancel link while the text is empty", () => { + render(); + expect(screen.getByRole("textbox")).toHaveValue(""); + expect(screen.getByRole("button", { name: "Cancel" })).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Save" })).not.toBeInTheDocument(); + }); + + it("calls onCancel when the link is clicked with empty text", async () => { + const onCancel = vi.fn(); + const onSave = vi.fn(); + render(); + + await userEvent.click(screen.getByRole("button", { name: "Cancel" })); + expect(onCancel).toHaveBeenCalledTimes(1); + expect(onSave).not.toHaveBeenCalled(); + }); + + it("toggles the link to Save and commits the status once text is entered", async () => { + const onCancel = vi.fn(); + const onSave = vi.fn(); + render(); + + await userEvent.type(screen.getByRole("textbox"), "In a meeting"); + const save = await screen.findByRole("button", { name: "Save" }); + await userEvent.click(save); + + expect(onSave).toHaveBeenCalledWith({ emoji: "😄", text: "In a meeting" }); + expect(onCancel).not.toHaveBeenCalled(); + }); + + it("trims whitespace and ignores whitespace-only text", async () => { + const onCancel = vi.fn(); + const onSave = vi.fn(); + render(); + + await userEvent.type(screen.getByRole("textbox"), " "); + // Still a Cancel link, as the trimmed text is empty + await userEvent.click(screen.getByRole("button", { name: "Cancel" })); + expect(onCancel).toHaveBeenCalledTimes(1); + expect(onSave).not.toHaveBeenCalled(); + }); + + it("lets the user pick an emoji from the picker popover", async () => { + const onSave = vi.fn(); + render(); + + await userEvent.click(screen.getByRole("button", { name: "Choose Emoji" })); + await waitFor(() => expect(screen.getByLabelText("Emoji picker")).toBeInTheDocument()); + + await userEvent.click(await screen.findByText("😇")); + + // Picker closes and the trigger now shows the chosen emoji + await waitFor(() => expect(screen.queryByTestId("mx_EmojiPicker")).not.toBeInTheDocument()); + expect(screen.getByRole("button", { name: "Choose Emoji" })).toHaveTextContent("😇"); + + await userEvent.type(screen.getByRole("textbox", { name: "What's your status?" }), "Angelic"); + await userEvent.click(await screen.findByRole("button", { name: "Save" })); + + expect(onSave).toHaveBeenCalledWith({ emoji: "😇", text: "Angelic" }); + }); +}); diff --git a/packages/shared-components/src/status/CustomStatusView.tsx b/packages/shared-components/src/status/CustomStatusView.tsx new file mode 100644 index 0000000000..9616bf3792 --- /dev/null +++ b/packages/shared-components/src/status/CustomStatusView.tsx @@ -0,0 +1,128 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, useCallback, useState } from "react"; +import { Field, Link, Menu, Root, TextControl } from "@vector-im/compound-web"; + +import { _t, type UserStatus } from ".."; +import { EmojiPicker } from "../core/EmojiPicker"; +import styles from "./CustomStatusView.module.css"; +import classNames from "classnames"; + +/** + * The emoji shown on the picker trigger before the user has chosen one. + */ +const DEFAULT_EMOJI = "😄"; + +export interface CustomStatusViewProps { + /** + * Called when the user commits a custom status, i.e. clicks "Save" with + * non-empty text. + */ + onSave: (status: UserStatus) => void; + /** + * Called when the user dismisses the editor without saving, i.e. clicks + * "Cancel" while the text is empty. + */ + onCancel: () => void; +} + +/** + * Editor for composing a custom user status text and choosing an emoji. + */ +export function CustomStatusView({ onSave, onCancel }: CustomStatusViewProps): JSX.Element { + const [emoji, setEmoji] = useState(DEFAULT_EMOJI); + const [text, setText] = useState(""); + const [pickerOpen, setPickerOpen] = useState(false); + + const trimmed = text.trim(); + + const onChooseEmoji = useCallback((unicode: string): boolean => { + setEmoji(unicode); + setPickerOpen(false); + // Don't record custom-status emoji as recently used composer reactions. + return false; + }, []); + + const commit = useCallback(() => { + if (trimmed) { + onSave({ emoji, text: trimmed }); + } else { + onCancel(); + } + }, [trimmed, emoji, onSave, onCancel]); + + const onActionKeyDown = useCallback( + (ev: React.KeyboardEvent) => { + if (ev.key === "Enter" || ev.key === " ") { + ev.preventDefault(); + commit(); + } + }, + [commit], + ); + + const onSubmit = useCallback( + (ev: React.FormEvent) => { + ev.preventDefault(); + // Only commit on submit (e.g. Enter) when there is something to save; + // an empty submit shouldn't silently cancel the editor. + if (trimmed) { + onSave({ emoji, text: trimmed }); + } + }, + [trimmed, emoji, onSave], + ); + + return ( + + + {emoji} + + } + > + setPickerOpen(false)} + showQuickReactions={false} + /> + + + setText(ev.currentTarget.value)} + placeholder={_t("status|set_status|set_status_prompt")} + aria-label={_t("status|set_status|set_status_prompt")} + autoFocus + /> + + + {trimmed ? _t("action|save") : _t("action|cancel")} + + + ); +} diff --git a/packages/shared-components/src/status/SetStatusView.test.tsx b/packages/shared-components/src/status/SetStatusView.test.tsx new file mode 100644 index 0000000000..734a2df830 --- /dev/null +++ b/packages/shared-components/src/status/SetStatusView.test.tsx @@ -0,0 +1,71 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { describe, expect, it, vi } from "vitest"; +import userEvent from "@testing-library/user-event"; +import { render, screen } from "@test-utils"; + +import { SetStatusView, type SetStatusViewActions, type SetStatusViewSnapshot } from "./SetStatusView"; +import { MockViewModel } from "../core/viewmodel/MockViewModel"; + +class SetStatusViewModel extends MockViewModel implements SetStatusViewActions { + public setStatus = vi.fn(); + public clearStatus = vi.fn(); +} + +/** + * Open the dropdown and pick the "Custom…" entry, leaving it ready to enter a + * custom status / pick an emoji. + */ +async function openCustomEditor(): Promise { + await userEvent.click(screen.getByRole("combobox")); + await userEvent.click(screen.getByRole("option", { name: "✍️ Custom…" })); +} + +describe("SetStatusView", () => { + it("lets the user type a custom status", async () => { + const vm = new SetStatusViewModel({}); + render(); + + await openCustomEditor(); + + await userEvent.type(screen.getByRole("textbox", { name: "What's your status?" }), "Happy"); + await userEvent.click(await screen.findByRole("button", { name: "Save" })); + + expect(vm.setStatus).toHaveBeenCalledWith({ emoji: "😄", text: "Happy" }); + }); + + it("sets a custom status with an emoji chosen from the picker", async () => { + const vm = new SetStatusViewModel({}); + render(); + + await openCustomEditor(); + + await userEvent.click(screen.getByRole("button", { name: "Choose Emoji" })); + // Pick from the always-rendered quick reactions row + await userEvent.click(await screen.findByText("🤩")); + + await userEvent.type(screen.getByRole("textbox", { name: "What's your status?" }), "Starstruck"); + await userEvent.click(await screen.findByRole("button", { name: "Save" })); + + expect(vm.setStatus).toHaveBeenCalledWith({ emoji: "🤩", text: "Starstruck" }); + }); + + it("returns to the set status prompt if the custom editor is cancelled", async () => { + const vm = new SetStatusViewModel({}); + render(); + + await openCustomEditor(); + + await userEvent.click(screen.getByRole("button", { name: "Cancel" })); + + expect(vm.setStatus).not.toHaveBeenCalled(); + expect(screen.getByRole("combobox")).toBeInTheDocument(); + expect(screen.queryByRole("textbox")).not.toBeInTheDocument(); + }); +}); diff --git a/packages/shared-components/src/status/SetStatusView.tsx b/packages/shared-components/src/status/SetStatusView.tsx index 675f536611..43e690bada 100644 --- a/packages/shared-components/src/status/SetStatusView.tsx +++ b/packages/shared-components/src/status/SetStatusView.tsx @@ -5,13 +5,14 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX } from "react"; +import React, { type JSX, useState } from "react"; import { Dropdown, type DropdownTriggerProps, Link, Text } from "@vector-im/compound-web"; import { ReactionIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t, _td, type UserStatus } from ".."; import { useViewModel, type ViewModel } from "../core/viewmodel"; import { StatusPillView } from "./StatusPillView"; +import { CustomStatusView } from "./CustomStatusView"; import styles from "./SetStatusView.module.css"; const PRESET_STATUSES = [ @@ -22,6 +23,9 @@ const PRESET_STATUSES = [ { emoji: "🌴", textKey: _td("status|set_status|away") }, ]; +// Sentinel value used to distinguish the "Custom…" dropdown entry from a preset. +const CUSTOM_STATUS_VALUE = "custom"; + export interface SetStatusViewSnapshot { /** * The current user status, or undefined if no status is set. @@ -56,11 +60,24 @@ export type SetStatusViewProps = { export function SetStatusView({ vm }: SetStatusViewProps): JSX.Element { const { userStatus } = useViewModel(vm); + const [customMode, setCustomMode] = useState(false); if (userStatus) { return ; } + if (customMode) { + return ( + { + setCustomMode(false); + vm.setStatus(status); + }} + onCancel={() => setCustomMode(false)} + /> + ); + } + const renderTrigger = (props: DropdownTriggerProps): JSX.Element => { const trigger = (
    @@ -81,6 +98,11 @@ export function SetStatusView({ vm }: SetStatusViewProps): JSX.Element { }; const onValueChange = (value: string): void => { + if (value === CUSTOM_STATUS_VALUE) { + setCustomMode(true); + return; + } + const status = PRESET_STATUSES.find((s) => s.textKey === value); if (!status) { @@ -93,11 +115,16 @@ export function SetStatusView({ vm }: SetStatusViewProps): JSX.Element { }); }; + const dropdownValues: Array<[string, string]> = [ + ...PRESET_STATUSES.map((s): [string, string] => [s.textKey, `${s.emoji} ${_t(s.textKey)}`]), + [CUSTOM_STATUS_VALUE, `✍️ ${_t("status|set_status|custom")}`], + ]; + return vm.onSetStatusClick ? ( renderTrigger({ onClick: vm.onSetStatusClick }) ) : ( [s.textKey, `${s.emoji} ${_t(s.textKey)}`])} + values={dropdownValues} label={null} placeholder={null} trigger={renderTrigger}