Prevent history visible banner from displaying in threads. (#31535)

* fix: Prevent history visible banner from displaying in threads.

* tests: Verify banner is not visible in threads.
This commit is contained in:
Skye Elliot
2025-12-15 11:43:00 +00:00
committed by GitHub
parent 1d3421417f
commit c7134e8532
4 changed files with 34 additions and 6 deletions

View File

@@ -11,7 +11,7 @@ import { type Room } from "matrix-js-sdk/src/matrix";
import { HistoryVisibleBannerViewModel } from "../../../viewmodels/composer/HistoryVisibleBannerViewModel";
export const HistoryVisibleBanner: React.FC<{ room: Room }> = ({ room }) => {
const vm = useCreateAutoDisposedViewModel(() => new HistoryVisibleBannerViewModel({ room }));
export const HistoryVisibleBanner: React.FC<{ room: Room; threadId?: string | null }> = (props) => {
const vm = useCreateAutoDisposedViewModel(() => new HistoryVisibleBannerViewModel(props));
return <HistoryVisibleBannerView vm={vm} />;
};

View File

@@ -675,7 +675,7 @@ export class MessageComposer extends React.Component<IProps, IState> {
return (
<div className={classes} ref={this.ref} role="region" aria-label={_t("a11y|message_composer")}>
<HistoryVisibleBanner room={this.props.room} />
<HistoryVisibleBanner room={this.props.room} threadId={threadId} />
<div className="mx_MessageComposer_wrapper">
<UserIdentityWarning room={this.props.room} key={this.props.room.roomId} />
<ReplyPreview

View File

@@ -17,6 +17,7 @@ import { SettingLevel } from "../../settings/SettingLevel";
interface Props {
room: Room;
threadId?: string | null;
}
export class HistoryVisibleBannerViewModel
@@ -33,13 +34,17 @@ export class HistoryVisibleBannerViewModel
*/
private readonly acknowledgedWatcher: string;
private static readonly computeSnapshot = (room: Room): HistoryVisibleBannerViewSnapshot => {
private static readonly computeSnapshot = (
room: Room,
threadId?: string | null,
): HistoryVisibleBannerViewSnapshot => {
const featureEnabled = SettingsStore.getValue("feature_share_history_on_invite");
const acknowledged = SettingsStore.getValue("acknowledgedHistoryVisibility", room.roomId);
return {
visible:
featureEnabled &&
!threadId &&
room.hasEncryptionStateEvent() &&
room.getHistoryVisibility() !== HistoryVisibility.Joined &&
!acknowledged,
@@ -47,7 +52,7 @@ export class HistoryVisibleBannerViewModel
};
public constructor(props: Props) {
super(props, HistoryVisibleBannerViewModel.computeSnapshot(props.room));
super(props, HistoryVisibleBannerViewModel.computeSnapshot(props.room, props.threadId));
this.disposables.trackListener(props.room, RoomStateEvent.Update, () => this.setSnapshot());
@@ -77,7 +82,7 @@ export class HistoryVisibleBannerViewModel
);
}
this.snapshot.set(HistoryVisibleBannerViewModel.computeSnapshot(this.props.room));
this.snapshot.set(HistoryVisibleBannerViewModel.computeSnapshot(this.props.room, this.props.threadId));
}
/**

View File

@@ -104,6 +104,29 @@ describe("HistoryVisibleBannerViewModel", () => {
vm.dispose();
});
it("should not show the banner in threads", () => {
upsertRoomStateEvents(room, [
mkEvent({
event: true,
type: "m.room.encryption",
user: "@user1:server",
content: {},
}),
mkEvent({
event: true,
type: "m.room.history_visibility",
user: "@user1:server",
content: {
history_visibility: "shared",
},
}),
]);
const vm = new HistoryVisibleBannerViewModel({ room, threadId: "some thread ID" });
expect(vm.getSnapshot().visible).toBe(false);
vm.dispose();
});
it("should show the banner in encrypted rooms with non-joined history visibility", async () => {
upsertRoomStateEvents(room, [
mkEvent({