diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx
index c80b50c5660..91245c943e6 100644
--- a/src/HtmlUtils.tsx
+++ b/src/HtmlUtils.tsx
@@ -403,9 +403,14 @@ export function bodyToHtml(content: IContent, highlights: string[], opts: IOpts
try {
if (highlights && highlights.length > 0) {
const highlighter = new HtmlHighlighter("mx_EventTile_searchHighlight", opts.highlightLink);
- const safeHighlights = highlights.map(function(highlight) {
- return sanitizeHtml(highlight, sanitizeParams);
- });
+ const safeHighlights = highlights
+ // sanitizeHtml can hang if an unclosed HTML tag is thrown at it
+ // A search for ` !highlight.includes("<"))
+ .map((highlight: string): string => sanitizeHtml(highlight, sanitizeParams));
// XXX: hacky bodge to temporarily apply a textFilter to the sanitizeParams structure.
sanitizeParams.textFilter = function(safeText) {
return highlighter.applyHighlights(safeText, safeHighlights).join('');
diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx
index 277f3ccb7cb..cebb6317088 100644
--- a/src/components/views/rooms/EventTile.tsx
+++ b/src/components/views/rooms/EventTile.tsx
@@ -267,7 +267,7 @@ interface IProps {
showReactions?: boolean;
// which layout to use
- layout: Layout;
+ layout?: Layout;
// whether or not to show flair at all
enableFlair?: boolean;
@@ -321,6 +321,7 @@ export default class EventTile extends React.Component {
static defaultProps = {
// no-op function because onHeightChanged is optional yet some sub-components assume its existence
onHeightChanged: function() {},
+ layout: Layout.Group,
};
static contextType = MatrixClientContext;
diff --git a/src/components/views/rooms/SearchResultTile.js b/src/components/views/rooms/SearchResultTile.tsx
similarity index 76%
rename from src/components/views/rooms/SearchResultTile.js
rename to src/components/views/rooms/SearchResultTile.tsx
index 3581a263511..980e8835f84 100644
--- a/src/components/views/rooms/SearchResultTile.js
+++ b/src/components/views/rooms/SearchResultTile.tsx
@@ -16,31 +16,28 @@ limitations under the License.
*/
import React from 'react';
-import PropTypes from 'prop-types';
-import * as sdk from '../../../index';
-import { haveTileForEvent } from "./EventTile";
+import { SearchResult } from "matrix-js-sdk/src/models/search-result";
+import EventTile, { haveTileForEvent } from "./EventTile";
+import DateSeparator from '../messages/DateSeparator';
import SettingsStore from "../../../settings/SettingsStore";
import { UIFeature } from "../../../settings/UIFeature";
+import { RoomPermalinkCreator } from '../../../utils/permalinks/Permalinks';
import { replaceableComponent } from "../../../utils/replaceableComponent";
-@replaceableComponent("views.rooms.SearchResultTile")
-export default class SearchResultTile extends React.Component {
- static propTypes = {
- // a matrix-js-sdk SearchResult containing the details of this result
- searchResult: PropTypes.object.isRequired,
-
- // a list of strings to be highlighted in the results
- searchHighlights: PropTypes.array,
-
- // href for the highlights in this result
- resultLink: PropTypes.string,
-
- onHeightChanged: PropTypes.func,
- };
+interface IProps {
+ // a matrix-js-sdk SearchResult containing the details of this result
+ searchResult: SearchResult;
+ // a list of strings to be highlighted in the results
+ searchHighlights?: string[];
+ // href for the highlights in this result
+ resultLink?: string;
+ onHeightChanged?: () => void;
+ permalinkCreator?: RoomPermalinkCreator;
+}
- render() {
- const DateSeparator = sdk.getComponent('messages.DateSeparator');
- const EventTile = sdk.getComponent('rooms.EventTile');
+@replaceableComponent("views.rooms.SearchResultTile")
+export default class SearchResultTile extends React.Component {
+ public render() {
const result = this.props.searchResult;
const mxEv = result.context.getEvent();
const eventId = mxEv.getId();