From e30adf4eb34d0e84e1fa910c326ff080adc4402e Mon Sep 17 00:00:00 2001 From: rbondesson Date: Fri, 10 Apr 2026 20:28:39 +0200 Subject: [PATCH] Fix date separator trigger ref forwarding for jump-to-date menu (#33102) * Fix date separator trigger ref forwarding for jump-to-date menu * Normal forwarded ref is sufficient for the menu-button setup in Compound * Better comment --- .../DateSeparatorView/DateSeparatorButton.tsx | 22 ++++++++----------- .../DateSeparatorView.test.tsx | 11 +++++++++- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorButton.tsx b/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorButton.tsx index 0f1bd9b3a4..d259d3325f 100644 --- a/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorButton.tsx +++ b/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorButton.tsx @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -import React from "react"; +import React, { forwardRef } from "react"; import { Heading, Tooltip } from "@vector-im/compound-web"; import ChevronDownIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-down"; @@ -20,8 +20,6 @@ export interface DateSeparatorButtonProps { tooltipOpen?: boolean; /** Extra CSS classes to apply to the component. */ className?: string; - /** Optional ref for the button container element. */ - buttonRef?: React.Ref; /** Called when the pointer enters the button trigger. */ onMouseEnter?: React.MouseEventHandler; /** Called when the pointer leaves the button trigger. */ @@ -32,19 +30,17 @@ export interface DateSeparatorButtonProps { onBlur?: React.FocusEventHandler; } -/** Interactive date separator button that opens the jump-to-date menu. */ -export function DateSeparatorButton({ - label, - tooltipOpen, - className, - buttonRef, - ...props -}: DateSeparatorButtonProps): React.ReactNode { +/** Interactive date separator button that forwards its ref to the underlying trigger element used by Compound Menu. */ +export const DateSeparatorButton = forwardRef(function DateSeparatorButton( + { label, tooltipOpen, className, ...props }, + forwardedRef, +): React.ReactNode { const { translate: _t } = useI18n(); + return ( ); -} +}); diff --git a/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorView.test.tsx b/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorView.test.tsx index 703b0cd195..b21f1efecc 100644 --- a/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorView.test.tsx +++ b/packages/shared-components/src/room/timeline/DateSeparatorView/DateSeparatorView.test.tsx @@ -7,12 +7,13 @@ import { render, screen } from "@test-utils"; import { composeStories } from "@storybook/react-vite"; -import React from "react"; +import React, { createRef } from "react"; import { describe, it, expect } from "vitest"; import { waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { BaseViewModel } from "../../../core/viewmodel/BaseViewModel"; +import { DateSeparatorButton } from "./DateSeparatorButton"; import { DateSeparatorView, type DateSeparatorViewModel, type DateSeparatorViewSnapshot } from "./DateSeparatorView"; import * as stories from "./DateSeparatorView.stories"; @@ -73,4 +74,12 @@ describe("DateSeparatorView", () => { vm.setSnapshot({ label: "Yesterday" }); await waitFor(() => expect(screen.getByText("Yesterday", { selector: "h2" })).toBeInTheDocument()); }); + + it("forwards refs to the trigger element", () => { + const ref = createRef(); + + render(); + + expect(ref.current).toBe(screen.getByTestId("jump-to-date-separator-button")); + }); });