Use cached setting values when calling TextForEvent

Signed-off-by: Robin Townsend <robin@robin.town>
This commit is contained in:
Robin Townsend 2021-06-16 20:40:47 -04:00
parent 819fe419b7
commit af11878e0c
7 changed files with 28 additions and 13 deletions

View file

@ -41,7 +41,7 @@ const continuedTypes = ['m.sticker', 'm.room.message'];
// check if there is a previous event and it has the same sender as this event // check if there is a previous event and it has the same sender as this event
// and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL // and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL
function shouldFormContinuation(prevEvent, mxEvent) { function shouldFormContinuation(prevEvent, mxEvent, showHiddenEvents) {
// sanity check inputs // sanity check inputs
if (!prevEvent || !prevEvent.sender || !mxEvent.sender) return false; if (!prevEvent || !prevEvent.sender || !mxEvent.sender) return false;
// check if within the max continuation period // check if within the max continuation period
@ -61,7 +61,7 @@ function shouldFormContinuation(prevEvent, mxEvent) {
mxEvent.sender.getMxcAvatarUrl() !== prevEvent.sender.getMxcAvatarUrl()) return false; mxEvent.sender.getMxcAvatarUrl() !== prevEvent.sender.getMxcAvatarUrl()) return false;
// if we don't have tile for previous event then it was shown by showHiddenEvents and has no SenderProfile // if we don't have tile for previous event then it was shown by showHiddenEvents and has no SenderProfile
if (!haveTileForEvent(prevEvent)) return false; if (!haveTileForEvent(prevEvent, showHiddenEvents)) return false;
return true; return true;
} }
@ -202,7 +202,8 @@ export default class MessagePanel extends React.Component {
this._readReceiptsByUserId = {}; this._readReceiptsByUserId = {};
// Cache hidden events setting on mount since Settings is expensive to // Cache hidden events setting on mount since Settings is expensive to
// query, and we check this in a hot code path. // query, and we check this in a hot code path. This is also cached in
// our RoomContext, however we still need a fallback for roomless MessagePanels.
this._showHiddenEventsInTimeline = this._showHiddenEventsInTimeline =
SettingsStore.getValue("showHiddenEventsInTimeline"); SettingsStore.getValue("showHiddenEventsInTimeline");
@ -372,11 +373,11 @@ export default class MessagePanel extends React.Component {
return false; // ignored = no show (only happens if the ignore happens after an event was received) return false; // ignored = no show (only happens if the ignore happens after an event was received)
} }
if (this._showHiddenEventsInTimeline) { if (this.context?.showHiddenEventsInTimeline ?? this._showHiddenEventsInTimeline) {
return true; return true;
} }
if (!haveTileForEvent(mxEv)) { if (!haveTileForEvent(mxEv, this.context?.showHiddenEventsInTimeline)) {
return false; // no tile = no show return false; // no tile = no show
} }
@ -613,7 +614,8 @@ export default class MessagePanel extends React.Component {
} }
// is this a continuation of the previous message? // is this a continuation of the previous message?
const continuation = !wantsDateSeparator && shouldFormContinuation(prevEvent, mxEv); const continuation = !wantsDateSeparator &&
shouldFormContinuation(prevEvent, mxEv, this.context?.showHiddenEventsInTimeline);
const eventId = mxEv.getId(); const eventId = mxEv.getId();
const highlight = (eventId === this.props.highlightedEventId); const highlight = (eventId === this.props.highlightedEventId);
@ -1168,7 +1170,7 @@ class MemberGrouper {
add(ev) { add(ev) {
if (ev.getType() === 'm.room.member') { if (ev.getType() === 'm.room.member') {
// We can ignore any events that don't actually have a message to display // We can ignore any events that don't actually have a message to display
if (!hasText(ev)) return; if (!hasText(ev, this.context?.showHiddenEventsInTimeline)) return;
} }
this.readMarker = this.readMarker || this.panel._readMarkerForEvent( this.readMarker = this.readMarker || this.panel._readMarkerForEvent(
ev.getId(), ev.getId(),

View file

@ -181,6 +181,7 @@ export interface IState {
canReply: boolean; canReply: boolean;
layout: Layout; layout: Layout;
lowBandwidth: boolean; lowBandwidth: boolean;
showHiddenEventsInTimeline: boolean;
showReadReceipts: boolean; showReadReceipts: boolean;
showRedactions: boolean; showRedactions: boolean;
showJoinLeaves: boolean; showJoinLeaves: boolean;
@ -244,6 +245,7 @@ export default class RoomView extends React.Component<IProps, IState> {
canReply: false, canReply: false,
layout: SettingsStore.getValue("layout"), layout: SettingsStore.getValue("layout"),
lowBandwidth: SettingsStore.getValue("lowBandwidth"), lowBandwidth: SettingsStore.getValue("lowBandwidth"),
showHiddenEventsInTimeline: SettingsStore.getValue("showHiddenEventsInTimeline"),
showReadReceipts: true, showReadReceipts: true,
showRedactions: true, showRedactions: true,
showJoinLeaves: true, showJoinLeaves: true,
@ -282,6 +284,9 @@ export default class RoomView extends React.Component<IProps, IState> {
SettingsStore.watchSetting("lowBandwidth", null, () => SettingsStore.watchSetting("lowBandwidth", null, () =>
this.setState({ lowBandwidth: SettingsStore.getValue("lowBandwidth") }), this.setState({ lowBandwidth: SettingsStore.getValue("lowBandwidth") }),
), ),
SettingsStore.watchSetting("showHiddenEventsInTimeline", null, () =>
this.setState({ showHiddenEventsInTimeline: SettingsStore.getValue("showHiddenEventsInTimeline") }),
),
]; ];
} }
@ -1411,7 +1416,7 @@ export default class RoomView extends React.Component<IProps, IState> {
continue; continue;
} }
if (!haveTileForEvent(mxEv)) { if (!haveTileForEvent(mxEv, this.state.showHiddenEventsInTimeline)) {
// XXX: can this ever happen? It will make the result count // XXX: can this ever happen? It will make the result count
// not match the displayed count. // not match the displayed count.
continue; continue;

View file

@ -1291,7 +1291,8 @@ class TimelinePanel extends React.Component {
const shouldIgnore = !!ev.status || // local echo const shouldIgnore = !!ev.status || // local echo
(ignoreOwn && ev.sender && ev.sender.userId == myUserId); // own message (ignoreOwn && ev.sender && ev.sender.userId == myUserId); // own message
const isWithoutTile = !haveTileForEvent(ev) || shouldHideEvent(ev, this.context); const isWithoutTile = !haveTileForEvent(ev, this.context?.showHiddenEventsInTimeline) ||
shouldHideEvent(ev, this.context);
if (isWithoutTile || !node) { if (isWithoutTile || !node) {
// don't start counting if the event should be ignored, // don't start counting if the event should be ignored,

View file

@ -17,6 +17,7 @@ limitations under the License.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import RoomContext from "../../../contexts/RoomContext";
import * as TextForEvent from "../../../TextForEvent"; import * as TextForEvent from "../../../TextForEvent";
import {replaceableComponent} from "../../../utils/replaceableComponent"; import {replaceableComponent} from "../../../utils/replaceableComponent";
@ -27,8 +28,10 @@ export default class TextualEvent extends React.Component {
mxEvent: PropTypes.object.isRequired, mxEvent: PropTypes.object.isRequired,
}; };
static contextType = RoomContext;
render() { render() {
const text = TextForEvent.textForEvent(this.props.mxEvent); const text = TextForEvent.textForEvent(this.props.mxEvent, this.context?.showHiddenEventsInTimeline);
if (text == null || text.length === 0) return null; if (text == null || text.length === 0) return null;
return ( return (
<div className="mx_TextualEvent">{ text }</div> <div className="mx_TextualEvent">{ text }</div>

View file

@ -1217,7 +1217,7 @@ function isMessageEvent(ev) {
return (messageTypes.includes(ev.getType())); return (messageTypes.includes(ev.getType()));
} }
export function haveTileForEvent(e) { export function haveTileForEvent(e: MatrixEvent, showHiddenEvents?: boolean) {
// Only messages have a tile (black-rectangle) if redacted // Only messages have a tile (black-rectangle) if redacted
if (e.isRedacted() && !isMessageEvent(e)) return false; if (e.isRedacted() && !isMessageEvent(e)) return false;
@ -1227,7 +1227,7 @@ export function haveTileForEvent(e) {
const handler = getHandlerTile(e); const handler = getHandlerTile(e);
if (handler === undefined) return false; if (handler === undefined) return false;
if (handler === 'messages.TextualEvent') { if (handler === 'messages.TextualEvent') {
return hasText(e); return hasText(e, showHiddenEvents);
} else if (handler === 'messages.RoomCreate') { } else if (handler === 'messages.RoomCreate') {
return Boolean(e.getContent()['predecessor']); return Boolean(e.getContent()['predecessor']);
} else { } else {

View file

@ -18,6 +18,7 @@ limitations under the License.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import * as sdk from '../../../index'; import * as sdk from '../../../index';
import RoomContext from "../../../contexts/RoomContext";
import {haveTileForEvent} from "./EventTile"; import {haveTileForEvent} from "./EventTile";
import SettingsStore from "../../../settings/SettingsStore"; import SettingsStore from "../../../settings/SettingsStore";
import {UIFeature} from "../../../settings/UIFeature"; import {UIFeature} from "../../../settings/UIFeature";
@ -38,6 +39,8 @@ export default class SearchResultTile extends React.Component {
onHeightChanged: PropTypes.func, onHeightChanged: PropTypes.func,
}; };
static contextType = RoomContext;
render() { render() {
const DateSeparator = sdk.getComponent('messages.DateSeparator'); const DateSeparator = sdk.getComponent('messages.DateSeparator');
const EventTile = sdk.getComponent('rooms.EventTile'); const EventTile = sdk.getComponent('rooms.EventTile');
@ -57,7 +60,7 @@ export default class SearchResultTile extends React.Component {
if (!contextual) { if (!contextual) {
highlights = this.props.searchHighlights; highlights = this.props.searchHighlights;
} }
if (haveTileForEvent(ev)) { if (haveTileForEvent(ev, this.context?.showHiddenEventsInTimeline)) {
ret.push(( ret.push((
<EventTile <EventTile
key={`${eventId}+${j}`} key={`${eventId}+${j}`}

View file

@ -41,6 +41,7 @@ const RoomContext = createContext<IState>({
canReply: false, canReply: false,
layout: Layout.Group, layout: Layout.Group,
lowBandwidth: false, lowBandwidth: false,
showHiddenEventsInTimeline: false,
showReadReceipts: true, showReadReceipts: true,
showRedactions: true, showRedactions: true,
showJoinLeaves: true, showJoinLeaves: true,