Handle JSX in MELS

Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
pull/21833/head
Šimon Brandner 2021-07-11 10:34:15 +02:00
parent 7a329b7a01
commit 3e95cd1854
No known key found for this signature in database
GPG Key ID: 9760693FDD98A790
3 changed files with 16 additions and 7 deletions

View File

@ -33,7 +33,7 @@ interface IProps {
// The list of room members for which to show avatars next to the summary // The list of room members for which to show avatars next to the summary
summaryMembers?: RoomMember[]; summaryMembers?: RoomMember[];
// The text to show as the summary of this event list // The text to show as the summary of this event list
summaryText?: string; summaryText?: string | JSX.Element;
// An array of EventTiles to render when expanded // An array of EventTiles to render when expanded
children: ReactNode[]; children: ReactNode[];
// Called when the event list expansion is toggled // Called when the event list expansion is toggled

View File

@ -25,6 +25,7 @@ import { formatCommaSeparatedList } from '../../../utils/FormattingUtils';
import { isValid3pidInvite } from "../../../RoomInvite"; import { isValid3pidInvite } from "../../../RoomInvite";
import EventListSummary from "./EventListSummary"; import EventListSummary from "./EventListSummary";
import { replaceableComponent } from "../../../utils/replaceableComponent"; import { replaceableComponent } from "../../../utils/replaceableComponent";
import { join } from '../../../utils/ReactUtils';
interface IProps extends Omit<ComponentProps<typeof EventListSummary>, "summaryText" | "summaryMembers"> { interface IProps extends Omit<ComponentProps<typeof EventListSummary>, "summaryText" | "summaryMembers"> {
// The maximum number of names to show in either each summary e.g. 2 would result "A, B and 234 others left" // The maximum number of names to show in either each summary e.g. 2 would result "A, B and 234 others left"
@ -89,7 +90,10 @@ export default class MemberEventListSummary extends React.Component<IProps> {
* `Object.keys(eventAggregates)`. * `Object.keys(eventAggregates)`.
* @returns {string} the textual summary of the aggregated events that occurred. * @returns {string} the textual summary of the aggregated events that occurred.
*/ */
private generateSummary(eventAggregates: Record<string, string[]>, orderedTransitionSequences: string[]) { private generateSummary(
eventAggregates: Record<string, string[]>,
orderedTransitionSequences: string[],
): string | JSX.Element {
const summaries = orderedTransitionSequences.map((transitions) => { const summaries = orderedTransitionSequences.map((transitions) => {
const userNames = eventAggregates[transitions]; const userNames = eventAggregates[transitions];
const nameList = this.renderNameList(userNames); const nameList = this.renderNameList(userNames);
@ -118,7 +122,7 @@ export default class MemberEventListSummary extends React.Component<IProps> {
return null; return null;
} }
return summaries.join(", "); return join(summaries, ", ");
} }
/** /**
@ -212,7 +216,11 @@ export default class MemberEventListSummary extends React.Component<IProps> {
* @param {number} repeats the number of times the transition was repeated in a row. * @param {number} repeats the number of times the transition was repeated in a row.
* @returns {string} the written Human Readable equivalent of the transition. * @returns {string} the written Human Readable equivalent of the transition.
*/ */
private static getDescriptionForTransition(t: TransitionType, userCount: number, repeats: number) { private static getDescriptionForTransition(
t: TransitionType,
userCount: number,
repeats: number,
): string | JSX.Element {
// The empty interpolations 'severalUsers' and 'oneUser' // The empty interpolations 'severalUsers' and 'oneUser'
// are there only to show translators to non-English languages // are there only to show translators to non-English languages
// that the verb is conjugated to plural or singular Subject. // that the verb is conjugated to plural or singular Subject.

View File

@ -16,6 +16,7 @@ limitations under the License.
*/ */
import { _t } from '../languageHandler'; import { _t } from '../languageHandler';
import { join } from './ReactUtils';
/** /**
* formats numbers to fit into ~3 characters, suitable for badge counts * formats numbers to fit into ~3 characters, suitable for badge counts
@ -103,7 +104,7 @@ export function getUserNameColorClass(userId: string): string {
* @returns {string} a string constructed by joining `items` with a comma * @returns {string} a string constructed by joining `items` with a comma
* between each item, but with the last item appended as " and [lastItem]". * between each item, but with the last item appended as " and [lastItem]".
*/ */
export function formatCommaSeparatedList(items: string[], itemLimit?: number): string { export function formatCommaSeparatedList(items: Array<string | JSX.Element>, itemLimit?: number): string | JSX.Element {
const remaining = itemLimit === undefined ? 0 : Math.max( const remaining = itemLimit === undefined ? 0 : Math.max(
items.length - itemLimit, 0, items.length - itemLimit, 0,
); );
@ -113,9 +114,9 @@ export function formatCommaSeparatedList(items: string[], itemLimit?: number): s
return items[0]; return items[0];
} else if (remaining > 0) { } else if (remaining > 0) {
items = items.slice(0, itemLimit); items = items.slice(0, itemLimit);
return _t("%(items)s and %(count)s others", { items: items.join(', '), count: remaining } ); return _t("%(items)s and %(count)s others", { items: join(items, ', '), count: remaining } );
} else { } else {
const lastItem = items.pop(); const lastItem = items.pop();
return _t("%(items)s and %(lastItem)s", { items: items.join(', '), lastItem: lastItem }); return _t("%(items)s and %(lastItem)s", { items: join(items, ', '), lastItem: lastItem });
} }
} }