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:
@@ -11,7 +11,7 @@ import { type Room } from "matrix-js-sdk/src/matrix";
|
|||||||
|
|
||||||
import { HistoryVisibleBannerViewModel } from "../../../viewmodels/composer/HistoryVisibleBannerViewModel";
|
import { HistoryVisibleBannerViewModel } from "../../../viewmodels/composer/HistoryVisibleBannerViewModel";
|
||||||
|
|
||||||
export const HistoryVisibleBanner: React.FC<{ room: Room }> = ({ room }) => {
|
export const HistoryVisibleBanner: React.FC<{ room: Room; threadId?: string | null }> = (props) => {
|
||||||
const vm = useCreateAutoDisposedViewModel(() => new HistoryVisibleBannerViewModel({ room }));
|
const vm = useCreateAutoDisposedViewModel(() => new HistoryVisibleBannerViewModel(props));
|
||||||
return <HistoryVisibleBannerView vm={vm} />;
|
return <HistoryVisibleBannerView vm={vm} />;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -675,7 +675,7 @@ export class MessageComposer extends React.Component<IProps, IState> {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classes} ref={this.ref} role="region" aria-label={_t("a11y|message_composer")}>
|
<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">
|
<div className="mx_MessageComposer_wrapper">
|
||||||
<UserIdentityWarning room={this.props.room} key={this.props.room.roomId} />
|
<UserIdentityWarning room={this.props.room} key={this.props.room.roomId} />
|
||||||
<ReplyPreview
|
<ReplyPreview
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import { SettingLevel } from "../../settings/SettingLevel";
|
|||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
room: Room;
|
room: Room;
|
||||||
|
threadId?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class HistoryVisibleBannerViewModel
|
export class HistoryVisibleBannerViewModel
|
||||||
@@ -33,13 +34,17 @@ export class HistoryVisibleBannerViewModel
|
|||||||
*/
|
*/
|
||||||
private readonly acknowledgedWatcher: string;
|
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 featureEnabled = SettingsStore.getValue("feature_share_history_on_invite");
|
||||||
const acknowledged = SettingsStore.getValue("acknowledgedHistoryVisibility", room.roomId);
|
const acknowledged = SettingsStore.getValue("acknowledgedHistoryVisibility", room.roomId);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
visible:
|
visible:
|
||||||
featureEnabled &&
|
featureEnabled &&
|
||||||
|
!threadId &&
|
||||||
room.hasEncryptionStateEvent() &&
|
room.hasEncryptionStateEvent() &&
|
||||||
room.getHistoryVisibility() !== HistoryVisibility.Joined &&
|
room.getHistoryVisibility() !== HistoryVisibility.Joined &&
|
||||||
!acknowledged,
|
!acknowledged,
|
||||||
@@ -47,7 +52,7 @@ export class HistoryVisibleBannerViewModel
|
|||||||
};
|
};
|
||||||
|
|
||||||
public constructor(props: Props) {
|
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());
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -104,6 +104,29 @@ describe("HistoryVisibleBannerViewModel", () => {
|
|||||||
vm.dispose();
|
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 () => {
|
it("should show the banner in encrypted rooms with non-joined history visibility", async () => {
|
||||||
upsertRoomStateEvents(room, [
|
upsertRoomStateEvents(room, [
|
||||||
mkEvent({
|
mkEvent({
|
||||||
|
|||||||
Reference in New Issue
Block a user