From 3e88689d69cde5b2c6416dce037a5c914da3b5dd Mon Sep 17 00:00:00 2001 From: Valere Fedronic Date: Mon, 16 Mar 2026 11:54:16 +0100 Subject: [PATCH] feat: Devtool for sticky events MSC4354 (#32741) * feat: Devtool for sticky events MSC4354 * Update devtool snapshot to add sticky state devtool * Update devtool playwright screenshot * review: Use UserFriendlyError instead or Error * review: fix docs * review: remove css in js, remove js hover tracking * review: use keyboard enums * add a check to see if homeserver supports sticky events * fixup: prettier * review: No static inline styles * review: use cpd spacing / border / color values * cleanup keyboard code * Fix unsupported alert look * review: proper useState usage (no | null) * review: useAsyncMemo instead of useEffect * review: use useTypedEventEmitterState * fix: better support for empty string event type * review: remove redundant expired state --- .../devtools-dialog-linux.png | Bin 51259 -> 49637 bytes .../css/views/dialogs/_DevtoolsDialog.pcss | 50 +++ .../views/dialogs/DevtoolsDialog.tsx | 2 + .../views/dialogs/devtools/Event.tsx | 6 + .../dialogs/devtools/StickyEventState.tsx | 336 ++++++++++++++++++ apps/web/src/i18n/strings/en_EN.json | 11 + .../DevtoolsDialog-test.tsx.snap | 5 + 7 files changed, 410 insertions(+) create mode 100644 apps/web/src/components/views/dialogs/devtools/StickyEventState.tsx diff --git a/apps/web/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png b/apps/web/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png index 7f802aca0e5b43982aebc0c10cad14c75ee4df38..c84c7465470379fc4be4b7239c4e81c871165895 100644 GIT binary patch literal 49637 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
NM<%__ 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 G``-X45e>iq literal 51259 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 W{j@n;lMZ|WB_;Mzv{Kl>|9=72vvr36 diff --git a/apps/web/res/css/views/dialogs/_DevtoolsDialog.pcss b/apps/web/res/css/views/dialogs/_DevtoolsDialog.pcss index efcf4db372..b691863d86 100644 --- a/apps/web/res/css/views/dialogs/_DevtoolsDialog.pcss +++ b/apps/web/res/css/views/dialogs/_DevtoolsDialog.pcss @@ -187,3 +187,53 @@ Please see LICENSE files in the repository root for full details. /* used on focus */ color: $links !important; } + +.mx_DevTools_sticky_explorer { + table { + width: 100%; + border-collapse: collapse; + table-layout: fixed; + margin-top: var(--cpd-space-3x); + + th { + text-align: left; + padding: var(--cpd-space-2x) var(--cpd-space-3x); + } + + th#user_header { + width: 35%; + } + th#sticky_key_header { + width: 50%; + } + th#expires_in_header { + width: 15%; + } + + tr { + cursor: pointer; + border-bottom: var(--cpd-border-width-1) solid var(--cpd-color-border-interactive-primary); + background: transparent; + } + + tr:hover { + color: var(--cpd-color-text-secondary); + background: var(--cpd-color-bg-action-secondary-hovered); + } + + tr:focus-visible { + outline: var(--cpd-border-width-2) solid var(--cpd-color-border-focused); + } + + td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: var(--cpd-space-2x) var(--cpd-space-3x); + } + + td.remaining_time_column { + text-align: right; + } + } +} diff --git a/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx b/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx index 93ffd8c0d3..fd006ec264 100644 --- a/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx +++ b/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx @@ -28,6 +28,7 @@ import CopyableText from "../elements/CopyableText"; import RoomNotifications from "./devtools/RoomNotifications"; import { Crypto } from "./devtools/Crypto"; import SettingsField from "../elements/SettingsField.tsx"; +import { StickyStateExplorer } from "./devtools/StickyEventState.tsx"; enum Category { Room, @@ -49,6 +50,7 @@ const Tools: Record = { [_td("devtools|notifications_debug"), RoomNotifications], [_td("devtools|active_widgets"), WidgetExplorer], [_td("devtools|users"), UserList], + [_td("devtools|explore_sticky_state"), StickyStateExplorer], ], [Category.Other]: [ [_td("devtools|explore_account_data"), AccountDataExplorer], diff --git a/apps/web/src/components/views/dialogs/devtools/Event.tsx b/apps/web/src/components/views/dialogs/devtools/Event.tsx index c205e89986..d8aeee932c 100644 --- a/apps/web/src/components/views/dialogs/devtools/Event.tsx +++ b/apps/web/src/components/views/dialogs/devtools/Event.tsx @@ -45,6 +45,12 @@ export const stateKeyField = (defaultValue?: string): IFieldDef => ({ default: defaultValue, }); +export const stickyDurationField = (defaultValue?: number): IFieldDef => ({ + id: "sticky_duration", + label: _td("devtools|sticky_duration"), + default: `${defaultValue ?? 360000}`, +}); + const validateEventContent = withValidation({ async deriveData({ value }) { try { diff --git a/apps/web/src/components/views/dialogs/devtools/StickyEventState.tsx b/apps/web/src/components/views/dialogs/devtools/StickyEventState.tsx new file mode 100644 index 0000000000..159fbc113b --- /dev/null +++ b/apps/web/src/components/views/dialogs/devtools/StickyEventState.tsx @@ -0,0 +1,336 @@ +/* + * 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 ChangeEvent, useContext, useEffect, useMemo, useState } from "react"; +import { Pill } from "@element-hq/web-shared-components"; +import { MatrixEvent, type IContent, RoomStickyEventsEvent } from "matrix-js-sdk/src/matrix"; +import { Alert, Form, SettingsToggleInput } from "@vector-im/compound-web"; +import { v4 as uuidv4 } from "uuid"; + +import BaseTool, { DevtoolsContext, type IDevtoolsProps } from "./BaseTool.tsx"; +import { _t, _td, UserFriendlyError } from "../../../../languageHandler.tsx"; +import { + EventEditor, + eventTypeField, + EventViewer, + type IEditorProps, + stickyDurationField, + stringify, +} from "./Event.tsx"; +import Field from "../../elements/Field.tsx"; +import MatrixClientContext from "../../../../contexts/MatrixClientContext.tsx"; +import InlineSpinner from "../../elements/InlineSpinner.tsx"; +import { Key } from "../../../../Keyboard.ts"; +import { useAsyncMemo } from "../../../../hooks/useAsyncMemo.ts"; +import { useTypedEventEmitterState } from "../../../../hooks/useEventEmitter.ts"; + +/** + * Devtool to explore sticky events in the current room. + * It allows you to see all sticky events, filter them by type, and view their content. + * @param onBack - handle back navigation in devtools + * @param setTool - callback to switch to a different devtool (StickyEventEditor) when the user wants to send a new sticky event + */ +export const StickyStateExplorer: React.FC = ({ onBack, setTool }) => { + const context = useContext(DevtoolsContext); + const [eventType, setEventType] = useState(); + const [event, setEvent] = useState(); + + const cli = useContext(MatrixClientContext); + // Check if the server supports sticky events and show a message if it doesn't. + // undefined means we are still checking, true/false means we have the result. + const stickyEventsSupported = useAsyncMemo(() => { + return cli.doesServerSupportUnstableFeature("org.matrix.msc4354"); + }, [cli]); + + // Listen for updates to the sticky events and refresh the list when they change + const events = useTypedEventEmitterState(context.room, RoomStickyEventsEvent.Update, () => { + return [...context.room._unstable_getStickyEvents()]; + }); + + if (stickyEventsSupported === false) { + return ( +

+ {_t("action|back")}} + > + {_t("devtools|sticky_events_not_supported")} + +

+ ); + } else if (stickyEventsSupported === undefined) { + return ( + {}} actionLabel={_td("devtools|send_custom_sticky_event")}> +

+ + {_t("devtools|checking_sticky_events_support")} +

+
+ ); + } + + // If an event is selected, show the single event view, which allows viewing the content of the event + // and sending a new one with the same sticky key. + if (event) { + return renderSingleEvent(setEvent, event); + } + + // If an event type is selected, show the list of events of that type, + // with a filter and the option to show/hide "empty" events (empty sticky event is a way to clear state). + if (eventType !== undefined /* event type can be empty string */) { + return ( + 0 ? eventType : _t("devtools|empty_string")} + setTool={setTool} + events={events.filter((ev) => ev.getType() === eventType)} + onBack={() => setEventType(undefined)} + setEvent={setEvent} + /> + ); + } + + // Get the list of different types. + const uniqueEventTypes = Array.from(new Set(events.map((event) => event.getType()))); + + if (uniqueEventTypes.length === 0) { + return

{_t("devtools|no_sticky_events")}

; + } + + const onAction = async (): Promise => { + setTool(_td("devtools|send_custom_sticky_event"), StickyEventEditor); + }; + return ( + +

+ {uniqueEventTypes.map((eventType) => ( + + ))} +

+
+ ); +}; + +interface StateEventButtonProps { + userId: string; + stickyKey?: string; + expiresAt: number; + onClick(this: void): void; +} + +/** + * A single row in the sticky event list, showing the userId, sticky key and time until expiration for a sticky event. + * @param userId - the sender of the sticky event + * @param stickyKey - the sticky key of the event + * @param expiresAt - the timestamp when the sticky event will expire + * @param onClick - callback to show the event details when the row is clicked + */ +const StickyEventTableLine: React.FC = ({ userId, stickyKey, expiresAt, onClick }) => { + const [timeRemainingFormatted, setTimeRemainingFormatted] = useState(""); + + useEffect(() => { + const updateCountdown = (): void => { + const now = Date.now(); + const remaining = expiresAt - now; + + if (remaining <= 0) { + setTimeRemainingFormatted(_t("devtools|expired")); + return; + } + + // Calculate time remaining + const totalSeconds = Math.floor(remaining / 1000); + const days = Math.floor(totalSeconds / 86400); + const hours = Math.floor((totalSeconds % 86400) / 3600); + const minutes = Math.floor((totalSeconds % 3600) / 60); + const seconds = totalSeconds % 60; + + // Format the display + if (days > 0) { + setTimeRemainingFormatted(`${days}d ${hours}h ${minutes}m`); + } else if (hours > 0) { + setTimeRemainingFormatted(`${hours}h ${minutes}m ${seconds}s`); + } else if (minutes > 0) { + setTimeRemainingFormatted(`${minutes}m ${seconds}s`); + } else { + setTimeRemainingFormatted(`${seconds}s`); + } + }; + + updateCountdown(); + const interval = setInterval(updateCountdown, 1000); + return () => clearInterval(interval); + }, [expiresAt]); + + return ( + { + // Activate on Enter or Space for keyboard users + if (e.key === Key.ENTER || e.key === Key.SPACE) { + onClick(); + } + }} + tabIndex={0} + role="button" + > + {userId} + {stickyKey ?? unkeyed} + {timeRemainingFormatted} + + ); +}; + +interface StickyEventListPerTypeProps { + eventType: string; + events: MatrixEvent[]; + onBack: () => void; + setEvent: (event: MatrixEvent | undefined) => void; + setTool: IDevtoolsProps["setTool"]; +} + +const StickyEventListPerType: React.FC = ({ + eventType, + events, + onBack, + setEvent, + setTool, +}) => { + const onAction = async (): Promise => { + setTool(_td("devtools|send_custom_sticky_event"), StickyEventEditor); + }; + + const [query, setQuery] = useState(""); + const [showEmptyState, setShowEmptyState] = useState(true); + + return ( + +

+ +

+ + ) => setQuery(ev.target.value)} + className="mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query" + /> + + { + evt.preventDefault(); + evt.stopPropagation(); + }} + > + setShowEmptyState(e.target.checked)} + checked={showEmptyState} + /> + + + + + + + + + + + + {events + .filter((eventType) => { + if (showEmptyState) return true; + + // An empty sticky event has a single content key "msc4354_sticky_key" and no other keys, as the sticky key is required but content can otherwise be empty + const contentKeys = Object.keys(eventType.getContent()); + const isEmpty = contentKeys.length === 1 && contentKeys[0] === "msc4354_sticky_key"; + return !isEmpty; + }) + .filter((ev) => { + // No filtering, return all events + if (!query) return true; + // Filter by sender or sticky key + if (ev.getSender()!.includes(query)) { + return true; + } + const matchesStickyKey = ev.getContent().msc4354_sticky_key?.includes(query); + return !!matchesStickyKey; + }) + .sort((a, b) => { + return (a.unstableStickyExpiresAt ?? 0) - (b.unstableStickyExpiresAt ?? 0); + }) + .map((ev) => ( + setEvent(ev)} + /> + ))} + +
{_t("devtools|users")}{_t("devtools|sticky_key")}{_t("devtools|expires_in")}
+
+ ); +}; + +function renderSingleEvent(setEvent: (value: MatrixEvent | undefined) => void, event: MatrixEvent): React.JSX.Element { + const _onBack = (): void => { + setEvent(undefined); + }; + + // If the event is encrypted, getEffectiveEvent will return the event + // as it would appear if it was unencrypted. + const effectiveEvent = event.getEffectiveEvent(); + const clear = new MatrixEvent(effectiveEvent); + + return ; +} + +export const StickyEventEditor: React.FC = ({ mxEvent, onBack }) => { + const context = useContext(DevtoolsContext); + const cli = useContext(MatrixClientContext); + + const fields = useMemo( + () => [eventTypeField(mxEvent?.getType()), stickyDurationField(3600000 /* 1 hour in ms */)], + [mxEvent], + ); + + const onSend = async ([eventType, stickyDuration]: string[], content: IContent): Promise => { + // Parse and validate stickyDuration. It must be an integer number of milliseconds + // between 0 and 3,600,000 (inclusive) — 1-hour max. + const parsed = Number.parseInt(String(stickyDuration), 10); + if (Number.isNaN(parsed)) { + throw new UserFriendlyError("devtools|error_sticky_duration_must_be_a_number"); + } + if (parsed < 0 || parsed > 3600000) { + throw new UserFriendlyError("devtools|error_sticky_duration_out_of_range"); + } + + await cli._unstable_sendStickyEvent(context.room.roomId, parsed, null, eventType as any, content); + }; + + const defaultContent = mxEvent + ? stringify(mxEvent.getContent()) + : stringify({ + msc4354_sticky_key: uuidv4(), + }); + return ; +}; diff --git a/apps/web/src/i18n/strings/en_EN.json b/apps/web/src/i18n/strings/en_EN.json index 1cdceacbe4..dbc3a45041 100644 --- a/apps/web/src/i18n/strings/en_EN.json +++ b/apps/web/src/i18n/strings/en_EN.json @@ -751,6 +751,7 @@ "category_other": "Other", "category_room": "Room", "caution_colon": "Caution:", + "checking_sticky_events_support": "Checking for support for sticky events...", "client_versions": "Client Versions", "crypto": { "4s_public_key_in_account_data": "in account data", @@ -809,13 +810,18 @@ "edit_setting": "Edit setting", "edit_values": "Edit values", "empty_string": "", + "error_sticky_duration_must_be_a_number": "stickyDuration must be a number", + "error_sticky_duration_out_of_range": "stickyDuration must be between 0 and 36000 milliseconds (1h)", "event_content": "Event Content", "event_id": "Event ID: %(eventId)s", "event_sent": "Event sent!", "event_type": "Event Type", + "expired": "Expired", + "expires_in": "Expires in", "explore_account_data": "Explore account data", "explore_room_account_data": "Explore room account data", "explore_room_state": "Explore room state", + "explore_sticky_state": "Explore sticky state", "failed_to_find_widget": "There was an error finding this widget.", "failed_to_load": "Failed to load.", "failed_to_save": "Failed to save settings.", @@ -829,6 +835,7 @@ "main_timeline": "Main timeline", "manual_device_verification": "Manual device verification", "no_receipt_found": "No receipt found", + "no_sticky_events": "There are no sticky events in this room.", "notification_state": "Notification state is %(notificationState)s", "notifications_debug": "Notifications debug", "number_of_users": "Number of users", @@ -855,6 +862,7 @@ "send_custom_account_data_event": "Send custom account data event", "send_custom_room_account_data_event": "Send custom room account data event", "send_custom_state_event": "Send custom state event", + "send_custom_sticky_event": "Send custom sticky event", "send_custom_timeline_event": "Send custom timeline event", "server_info": "Server info", "server_versions": "Server Versions", @@ -874,6 +882,9 @@ "other": "<%(count)s spaces>" }, "state_key": "State Key", + "sticky_duration": "Sticky Duration (ms)", + "sticky_events_not_supported": "Your homeserver does not support sticky events yet.", + "sticky_key": "Sticky Key", "thread_root_id": "Thread Root ID: %(threadRootId)s", "threads_timeline": "Threads timeline", "title": "Developer tools", diff --git a/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap b/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap index c6a5296e64..c756084986 100644 --- a/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap +++ b/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap @@ -103,6 +103,11 @@ exports[`DevtoolsDialog renders the devtools dialog 1`] = ` > Users +