Files
ThreadNet-Web/apps/web/src/shouldHideEvent.ts
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

80 lines
3.1 KiB
TypeScript
Raw Normal View History

2017-07-21 19:38:01 +01:00
/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
2017-07-21 19:38:01 +01:00
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
2024-09-09 14:57:16 +01:00
Please see LICENSE files in the repository root for full details.
2017-07-21 19:38:01 +01:00
*/
import { type MatrixEvent, EventType, RelationType, M_POLL_END } from "matrix-js-sdk/src/matrix";
import { KnownMembership } from "matrix-js-sdk/src/types";
2020-10-13 17:38:59 +01:00
import SettingsStore from "./settings/SettingsStore";
2025-02-05 13:25:06 +00:00
import { type IRoomState } from "./components/structures/RoomView";
import { type SettingKey } from "./settings/Settings.tsx";
2020-10-13 17:38:59 +01:00
interface IDiff {
isMemberEvent: boolean;
isJoin?: boolean;
isPart?: boolean;
isDisplaynameChange?: boolean;
isAvatarChange?: boolean;
}
function memberEventDiff(ev: MatrixEvent): IDiff {
const diff: IDiff = {
isMemberEvent: ev.getType() === EventType.RoomMember,
2017-08-04 17:22:01 +01:00
};
2017-07-21 19:38:01 +01:00
2017-08-10 15:22:53 +01:00
// If is not a Member Event then the other checks do not apply, so bail early.
2017-08-10 13:58:19 +01:00
if (!diff.isMemberEvent) return diff;
2017-07-21 19:38:01 +01:00
2017-08-04 17:22:01 +01:00
const content = ev.getContent();
const prevContent = ev.getPrevContent();
2018-02-28 00:49:14 +00:00
const isMembershipChanged = content.membership !== prevContent.membership;
diff.isJoin = isMembershipChanged && content.membership === KnownMembership.Join;
diff.isPart =
isMembershipChanged && content.membership === KnownMembership.Leave && ev.getStateKey() === ev.getSender();
const isJoinToJoin = !isMembershipChanged && content.membership === KnownMembership.Join;
2017-08-04 17:22:01 +01:00
diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname;
diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url;
return diff;
2017-07-21 19:38:01 +01:00
}
/**
* Determines whether the given event should be hidden from timelines.
* @param ev The event
* @param ctx An optional RoomContext to pull cached settings values from to avoid
* hitting the settings store
*/
export default function shouldHideEvent(ev: MatrixEvent, ctx?: IRoomState): boolean {
// Hide all poll end events
if (M_POLL_END.matches(ev.getType())) return true;
// Accessing the settings store directly can be expensive if done frequently,
// so we should prefer using cached values if a RoomContext is available
2023-02-13 11:39:16 +00:00
const isEnabled = ctx
? (name: keyof IRoomState) => ctx[name]
2024-12-23 20:25:15 +00:00
: (name: SettingKey) => SettingsStore.getValue(name, ev.getRoomId());
2017-07-21 19:38:01 +01:00
// Hide redacted events
// Deleted events with a thread are always shown regardless of user preference
// to make sure that a thread can be accessible even if the root message is deleted
if (ev.isRedacted() && !isEnabled("showRedactions") && !ev.getThread()) return true;
2019-06-24 16:53:42 +02:00
// Hide replacement events since they update the original tile (if enabled)
if (ev.isRelation(RelationType.Replace)) return true;
2017-08-04 17:22:01 +01:00
const eventDiff = memberEventDiff(ev);
2017-08-10 13:58:19 +01:00
if (eventDiff.isMemberEvent) {
2019-01-24 20:57:40 -07:00
if ((eventDiff.isJoin || eventDiff.isPart) && !isEnabled("showJoinLeaves")) return true;
if (eventDiff.isAvatarChange && !isEnabled("showAvatarChanges")) return true;
if (eventDiff.isDisplaynameChange && !isEnabled("showDisplaynameChanges")) return true;
2017-08-04 17:22:01 +01:00
}
2017-07-21 19:38:01 +01:00
return false;
}