remove some twemoji functions

This commit is contained in:
array-in-a-matrix 2023-04-03 15:16:20 -04:00
parent cc116ad8dc
commit 57fc0414ab
3 changed files with 212 additions and 170 deletions

View file

@ -1,14 +1,11 @@
/* eslint-disable jsx-a11y/no-static-element-interactions */
/* eslint-disable jsx-a11y/click-events-have-key-events */
/* eslint-disable react/prop-types */
import React, {
useState, useEffect, useLayoutEffect, useCallback, useRef,
} from 'react';
import React, { useState, useEffect, useLayoutEffect, useCallback, useRef } from 'react';
import PropTypes from 'prop-types';
import './RoomViewContent.scss';
import dateFormat from 'dateformat';
import { twemojify } from '../../../util/twemojify';
import initMatrix from '../../../client/initMatrix';
import cons from '../../../client/state/cons';
@ -44,11 +41,7 @@ function loadingMsgPlaceholders(key, count = 2) {
return pl;
};
return (
<React.Fragment key={`placeholder-container${key}`}>
{genPlaceholders()}
</React.Fragment>
);
return <React.Fragment key={`placeholder-container${key}`}>{genPlaceholders()}</React.Fragment>;
}
function RoomIntroContainer({ event, timeline }) {
@ -59,28 +52,27 @@ function RoomIntroContainer({ event, timeline }) {
const roomTopic = room.currentState.getStateEvents('m.room.topic')[0]?.getContent().topic;
const isDM = roomList.directs.has(timeline.roomId);
let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop');
avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc;
avatarSrc = isDM
? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop')
: avatarSrc;
const heading = isDM ? room.name : `Welcome to ${room.name}`;
const topic = twemojify(roomTopic || '', undefined, true);
const nameJsx = twemojify(room.name);
const desc = isDM
? (
<>
This is the beginning of your direct message history with @
<b>{nameJsx}</b>
{'. '}
{topic}
</>
)
: (
<>
{'This is the beginning of the '}
<b>{nameJsx}</b>
{' room. '}
{topic}
</>
);
const topic = roomTopic || '';
const nameJsx = room.name;
const desc = isDM ? (
<>
This is the beginning of your direct message history with @<b>{nameJsx}</b>
{'. '}
{topic}
</>
) : (
<>
{'This is the beginning of the '}
<b>{nameJsx}</b>
{' room. '}
{topic}
</>
);
useEffect(() => {
const handleUpdate = () => nameForceUpdate();
@ -96,7 +88,7 @@ function RoomIntroContainer({ event, timeline }) {
roomId={timeline.roomId}
avatarSrc={avatarSrc}
name={room.name}
heading={twemojify(heading)}
heading={heading}
desc={desc}
time={event ? `Created at ${dateFormat(event.getDate(), 'dd mmmm yyyy, hh:MM TT')}` : null}
/>
@ -118,21 +110,13 @@ function handleOnClickCapture(e) {
}
}
function renderEvent(
roomTimeline,
mEvent,
prevMEvent,
isFocus,
isEdit,
setEdit,
cancelEdit,
) {
const isBodyOnly = (prevMEvent !== null
&& prevMEvent.getSender() === mEvent.getSender()
&& prevMEvent.getType() !== 'm.room.member'
&& prevMEvent.getType() !== 'm.room.create'
&& diffMinutes(mEvent.getDate(), prevMEvent.getDate()) <= MAX_MSG_DIFF_MINUTES
);
function renderEvent(roomTimeline, mEvent, prevMEvent, isFocus, isEdit, setEdit, cancelEdit) {
const isBodyOnly =
prevMEvent !== null &&
prevMEvent.getSender() === mEvent.getSender() &&
prevMEvent.getType() !== 'm.room.member' &&
prevMEvent.getType() !== 'm.room.create' &&
diffMinutes(mEvent.getDate(), prevMEvent.getDate()) <= MAX_MSG_DIFF_MINUTES;
const timestamp = mEvent.getTs();
if (mEvent.getType() === 'm.room.member') {
@ -221,7 +205,7 @@ function usePaginate(
readUptoEvtStore,
forceUpdateLimit,
timelineScrollRef,
eventLimitRef,
eventLimitRef
) {
const [info, setInfo] = useState(null);
@ -234,10 +218,12 @@ function usePaginate(
readUptoEvtStore.setItem(roomTimeline.findEventByIdInTimelineSet(readUpToId));
}
limit.paginate(backwards, PAG_LIMIT, roomTimeline.timeline.length);
setTimeout(() => setInfo({
backwards,
loaded,
}));
setTimeout(() =>
setInfo({
backwards,
loaded,
})
);
};
roomTimeline.on(cons.events.roomTimeline.PAGINATED, handlePaginatedFromServer);
return () => {
@ -283,17 +269,17 @@ function useHandleScroll(
readUptoEvtStore,
forceUpdateLimit,
timelineScrollRef,
eventLimitRef,
eventLimitRef
) {
const handleScroll = useCallback(() => {
const timelineScroll = timelineScrollRef.current;
const limit = eventLimitRef.current;
requestAnimationFrame(() => {
// emit event to toggle scrollToBottom button visibility
const isAtBottom = (
timelineScroll.bottom < 16 && !roomTimeline.canPaginateForward()
&& limit.length >= roomTimeline.timeline.length
);
const isAtBottom =
timelineScroll.bottom < 16 &&
!roomTimeline.canPaginateForward() &&
limit.length >= roomTimeline.timeline.length;
roomTimeline.emit(cons.events.roomTimeline.AT_BOTTOM, isAtBottom);
if (isAtBottom && readUptoEvtStore.getItem()) {
requestAnimationFrame(() => markAsRead(roomTimeline.roomId));
@ -363,7 +349,8 @@ function useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, event
setEvent(event);
return;
}
const isRelates = (event.getType() === 'm.reaction' || event.getRelation()?.rel_type === 'm.replace');
const isRelates =
event.getType() === 'm.reaction' || event.getRelation()?.rel_type === 'm.replace';
if (isRelates) {
setEvent(event);
return;
@ -409,7 +396,7 @@ function RoomViewContent({ eventId, roomTimeline }) {
readUptoEvtStore,
forceUpdateLimit,
timelineScrollRef,
eventLimitRef,
eventLimitRef
);
const [handleScroll, handleScrollToLive] = useHandleScroll(
roomTimeline,
@ -417,7 +404,7 @@ function RoomViewContent({ eventId, roomTimeline }) {
readUptoEvtStore,
forceUpdateLimit,
timelineScrollRef,
eventLimitRef,
eventLimitRef
);
const newEvent = useEventArrive(roomTimeline, readUptoEvtStore, timelineScrollRef, eventLimitRef);
@ -476,41 +463,46 @@ function RoomViewContent({ eventId, roomTimeline }) {
useEffect(() => {
const timelineScroll = timelineScrollRef.current;
if (!roomTimeline.initialized) return;
if (timelineScroll.bottom < 16 && !roomTimeline.canPaginateForward() && document.visibilityState === 'visible') {
if (
timelineScroll.bottom < 16 &&
!roomTimeline.canPaginateForward() &&
document.visibilityState === 'visible'
) {
timelineScroll.scrollToBottom();
} else {
timelineScroll.tryRestoringScroll();
}
}, [newEvent]);
const listenKeyboard = useCallback((event) => {
if (event.ctrlKey || event.altKey || event.metaKey) return;
if (event.key !== 'ArrowUp') return;
if (navigation.isRawModalVisible) return;
const listenKeyboard = useCallback(
(event) => {
if (event.ctrlKey || event.altKey || event.metaKey) return;
if (event.key !== 'ArrowUp') return;
if (navigation.isRawModalVisible) return;
if (document.activeElement.id !== 'message-textarea') return;
if (document.activeElement.value !== '') return;
if (document.activeElement.id !== 'message-textarea') return;
if (document.activeElement.value !== '') return;
const {
timeline: tl, activeTimeline, liveTimeline, matrixClient: mx,
} = roomTimeline;
const limit = eventLimitRef.current;
if (activeTimeline !== liveTimeline) return;
if (tl.length > limit.length) return;
const { timeline: tl, activeTimeline, liveTimeline, matrixClient: mx } = roomTimeline;
const limit = eventLimitRef.current;
if (activeTimeline !== liveTimeline) return;
if (tl.length > limit.length) return;
const mTypes = ['m.text'];
for (let i = tl.length - 1; i >= 0; i -= 1) {
const mE = tl[i];
if (
mE.getSender() === mx.getUserId()
&& mE.getType() === 'm.room.message'
&& mTypes.includes(mE.getContent()?.msgtype)
) {
setEditEventId(mE.getId());
return;
const mTypes = ['m.text'];
for (let i = tl.length - 1; i >= 0; i -= 1) {
const mE = tl[i];
if (
mE.getSender() === mx.getUserId() &&
mE.getType() === 'm.room.message' &&
mTypes.includes(mE.getContent()?.msgtype)
) {
setEditEventId(mE.getId());
return;
}
}
}
}, [roomTimeline]);
},
[roomTimeline]
);
useEffect(() => {
document.body.addEventListener('keydown', listenKeyboard);
@ -551,7 +543,7 @@ function RoomViewContent({ eventId, roomTimeline }) {
if (i === 0 && !roomTimeline.canPaginateBackward()) {
if (mEvent.getType() === 'm.room.create') {
tl.push(
<RoomIntroContainer key={mEvent.getId()} event={mEvent} timeline={roomTimeline} />,
<RoomIntroContainer key={mEvent.getId()} event={mEvent} timeline={roomTimeline} />
);
itemCountIndex += 1;
// eslint-disable-next-line no-continue
@ -564,9 +556,10 @@ function RoomViewContent({ eventId, roomTimeline }) {
let isNewEvent = false;
if (!unreadDivider) {
unreadDivider = (readUptoEvent
&& prevMEvent?.getTs() <= readUptoEvent.getTs()
&& readUptoEvent.getTs() < mEvent.getTs());
unreadDivider =
readUptoEvent &&
prevMEvent?.getTs() <= readUptoEvent.getTs() &&
readUptoEvent.getTs() < mEvent.getTs();
if (unreadDivider) {
isNewEvent = true;
tl.push(<Divider key={`new-${mEvent.getId()}`} variant="positive" text="New messages" />);
@ -576,7 +569,12 @@ function RoomViewContent({ eventId, roomTimeline }) {
}
const dayDivider = prevMEvent && !isInSameDay(mEvent.getDate(), prevMEvent.getDate());
if (dayDivider) {
tl.push(<Divider key={`divider-${mEvent.getId()}`} text={`${dateFormat(mEvent.getDate(), 'mmmm dd, yyyy')}`} />);
tl.push(
<Divider
key={`divider-${mEvent.getId()}`}
text={`${dateFormat(mEvent.getDate(), 'mmmm dd, yyyy')}`}
/>
);
itemCountIndex += 1;
}
@ -584,15 +582,17 @@ function RoomViewContent({ eventId, roomTimeline }) {
const isFocus = focusId === mEvent.getId();
if (isFocus) jumpToItemIndex = itemCountIndex;
tl.push(renderEvent(
roomTimeline,
mEvent,
isNewEvent ? null : prevMEvent,
isFocus,
editEventId === mEvent.getId(),
setEditEventId,
cancelEdit,
));
tl.push(
renderEvent(
roomTimeline,
mEvent,
isNewEvent ? null : prevMEvent,
isFocus,
editEventId === mEvent.getId(),
setEditEventId,
cancelEdit
)
);
itemCountIndex += 1;
}
if (roomTimeline.canPaginateForward() || limit.length < timeline.length) {
@ -606,7 +606,7 @@ function RoomViewContent({ eventId, roomTimeline }) {
<ScrollView onScroll={handleTimelineScroll} ref={timelineSVRef} autoHide>
<div className="room-view__content" onClick={handleOnClickCapture}>
<div className="timeline__wrapper">
{ roomTimeline.initialized ? renderTimeline() : loadingMsgPlaceholders('loading', 3) }
{roomTimeline.initialized ? renderTimeline() : loadingMsgPlaceholders('loading', 3)}
</div>
</div>
</ScrollView>

View file

@ -2,13 +2,16 @@ import React, { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import './RoomViewHeader.scss';
import { twemojify } from '../../../util/twemojify';
import { blurOnBubbling } from '../../atoms/button/script';
import initMatrix from '../../../client/initMatrix';
import cons from '../../../client/state/cons';
import navigation from '../../../client/state/navigation';
import { toggleRoomSettings, openReusableContextMenu, openNavigation } from '../../../client/action/navigation';
import {
toggleRoomSettings,
openReusableContextMenu,
openNavigation,
} from '../../../client/action/navigation';
import { togglePeopleDrawer } from '../../../client/action/settings';
import colorMXID from '../../../util/colorMXID';
import { getEventCords } from '../../../util/common';
@ -35,16 +38,16 @@ function RoomViewHeader({ roomId }) {
const isDM = initMatrix.roomList.directs.has(roomId);
const room = mx.getRoom(roomId);
let avatarSrc = room.getAvatarUrl(mx.baseUrl, 36, 36, 'crop');
avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop') : avatarSrc;
avatarSrc = isDM
? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 36, 36, 'crop')
: avatarSrc;
const roomName = room.name;
const roomHeaderBtnRef = useRef(null);
useEffect(() => {
const settingsToggle = (isVisibile) => {
const rawIcon = roomHeaderBtnRef.current.lastElementChild;
rawIcon.style.transform = isVisibile
? 'rotateX(180deg)'
: 'rotateX(0deg)';
rawIcon.style.transform = isVisibile ? 'rotateX(180deg)' : 'rotateX(0deg)';
};
navigation.on(cons.events.navigation.ROOM_SETTINGS_TOGGLED, settingsToggle);
return () => {
@ -66,11 +69,9 @@ function RoomViewHeader({ roomId }) {
}, [roomId]);
const openRoomOptions = (e) => {
openReusableContextMenu(
'bottom',
getEventCords(e, '.ic-btn'),
(closeMenu) => <RoomOptions roomId={roomId} afterOptionSelect={closeMenu} />,
);
openReusableContextMenu('bottom', getEventCords(e, '.ic-btn'), (closeMenu) => (
<RoomOptions roomId={roomId} afterOptionSelect={closeMenu} />
));
};
return (
@ -90,18 +91,32 @@ function RoomViewHeader({ roomId }) {
>
<Avatar imageSrc={avatarSrc} text={roomName} bgColor={colorMXID(roomId)} size="small" />
<TitleWrapper>
<Text variant="h2" weight="medium" primary>{twemojify(roomName)}</Text>
<Text variant="h2" weight="medium" primary>
{roomName}
</Text>
</TitleWrapper>
<RawIcon src={ChevronBottomIC} />
</button>
{mx.isRoomEncrypted(roomId) === false && <IconButton onClick={() => toggleRoomSettings(tabText.SEARCH)} tooltip="Search" src={SearchIC} />}
<IconButton className="room-header__drawer-btn" onClick={togglePeopleDrawer} tooltip="People" src={UserIC} />
<IconButton className="room-header__members-btn" onClick={() => toggleRoomSettings(tabText.MEMBERS)} tooltip="Members" src={UserIC} />
{mx.isRoomEncrypted(roomId) === false && (
<IconButton
onClick={() => toggleRoomSettings(tabText.SEARCH)}
tooltip="Search"
src={SearchIC}
/>
)}
<IconButton
onClick={openRoomOptions}
tooltip="Options"
src={VerticalMenuIC}
className="room-header__drawer-btn"
onClick={togglePeopleDrawer}
tooltip="People"
src={UserIC}
/>
<IconButton
className="room-header__members-btn"
onClick={() => toggleRoomSettings(tabText.MEMBERS)}
tooltip="Members"
src={UserIC}
/>
<IconButton onClick={openRoomOptions} tooltip="Options" src={VerticalMenuIC} />
</Header>
);
}

View file

@ -1,7 +1,5 @@
import React from 'react';
import { twemojify } from '../../../util/twemojify';
import initMatrix from '../../../client/initMatrix';
import { getUsername, getUsernameOfRoomMember } from '../../../util/matrixUtil';
@ -10,83 +8,83 @@ function getTimelineJSXMessages() {
join(user) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' joined the room'}
</>
);
},
leave(user, reason) {
const reasonMsg = (typeof reason === 'string') ? `: ${reason}` : '';
const reasonMsg = typeof reason === 'string' ? `: ${reason}` : '';
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' left the room'}
{twemojify(reasonMsg)}
{reasonMsg}
</>
);
},
invite(inviter, user) {
return (
<>
<b>{twemojify(inviter)}</b>
<b>{inviter}</b>
{' invited '}
<b>{twemojify(user)}</b>
<b>{user}</b>
</>
);
},
cancelInvite(inviter, user) {
return (
<>
<b>{twemojify(inviter)}</b>
<b>{inviter}</b>
{' canceled '}
<b>{twemojify(user)}</b>
{'\'s invite'}
<b>{user}</b>
{"'s invite"}
</>
);
},
rejectInvite(user) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' rejected the invitation'}
</>
);
},
kick(actor, user, reason) {
const reasonMsg = (typeof reason === 'string') ? `: ${reason}` : '';
const reasonMsg = typeof reason === 'string' ? `: ${reason}` : '';
return (
<>
<b>{twemojify(actor)}</b>
<b>{actor}</b>
{' kicked '}
<b>{twemojify(user)}</b>
{twemojify(reasonMsg)}
<b>{user}</b>
{reasonMsg}
</>
);
},
ban(actor, user, reason) {
const reasonMsg = (typeof reason === 'string') ? `: ${reason}` : '';
const reasonMsg = typeof reason === 'string' ? `: ${reason}` : '';
return (
<>
<b>{twemojify(actor)}</b>
<b>{actor}</b>
{' banned '}
<b>{twemojify(user)}</b>
{twemojify(reasonMsg)}
<b>{user}</b>
{reasonMsg}
</>
);
},
unban(actor, user) {
return (
<>
<b>{twemojify(actor)}</b>
<b>{actor}</b>
{' unbanned '}
<b>{twemojify(user)}</b>
<b>{user}</b>
</>
);
},
avatarSets(user) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' set a avatar'}
</>
);
@ -94,7 +92,7 @@ function getTimelineJSXMessages() {
avatarChanged(user) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' changed their avatar'}
</>
);
@ -102,7 +100,7 @@ function getTimelineJSXMessages() {
avatarRemoved(user) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' removed their avatar'}
</>
);
@ -110,27 +108,27 @@ function getTimelineJSXMessages() {
nameSets(user, newName) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' set display name to '}
<b>{twemojify(newName)}</b>
<b>{newName}</b>
</>
);
},
nameChanged(user, newName) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' changed their display name to '}
<b>{twemojify(newName)}</b>
<b>{newName}</b>
</>
);
},
nameRemoved(user, lastName) {
return (
<>
<b>{twemojify(user)}</b>
<b>{user}</b>
{' removed their display name '}
<b>{twemojify(lastName)}</b>
<b>{lastName}</b>
</>
);
},
@ -143,28 +141,46 @@ function getUsersActionJsx(roomId, userIds, actionStr) {
if (room?.getMember(userId)) return getUsernameOfRoomMember(room.getMember(userId));
return getUsername(userId);
};
const getUserJSX = (userId) => <b>{twemojify(getUserDisplayName(userId))}</b>;
const getUserJSX = (userId) => <b>{getUserDisplayName(userId)}</b>;
if (!Array.isArray(userIds)) return 'Idle';
if (userIds.length === 0) return 'Idle';
const MAX_VISIBLE_COUNT = 3;
const u1Jsx = getUserJSX(userIds[0]);
// eslint-disable-next-line react/jsx-one-expression-per-line
if (userIds.length === 1) return <>{u1Jsx} is {actionStr}</>;
if (userIds.length === 1)
return (
<>
{u1Jsx} is {actionStr}
</>
);
const u2Jsx = getUserJSX(userIds[1]);
// eslint-disable-next-line react/jsx-one-expression-per-line
if (userIds.length === 2) return <>{u1Jsx} and {u2Jsx} are {actionStr}</>;
if (userIds.length === 2)
return (
<>
{u1Jsx} and {u2Jsx} are {actionStr}
</>
);
const u3Jsx = getUserJSX(userIds[2]);
if (userIds.length === 3) {
// eslint-disable-next-line react/jsx-one-expression-per-line
return <>{u1Jsx}, {u2Jsx} and {u3Jsx} are {actionStr}</>;
return (
<>
{u1Jsx}, {u2Jsx} and {u3Jsx} are {actionStr}
</>
);
}
const othersCount = userIds.length - MAX_VISIBLE_COUNT;
// eslint-disable-next-line react/jsx-one-expression-per-line
return <>{u1Jsx}, {u2Jsx}, {u3Jsx} and {othersCount} others are {actionStr}</>;
return (
<>
{u1Jsx}, {u2Jsx}, {u3Jsx} and {othersCount} others are {actionStr}
</>
);
}
function parseTimelineChange(mEvent) {
@ -180,18 +196,27 @@ function parseTimelineChange(mEvent) {
const userName = getUsername(mEvent.getStateKey());
switch (content.membership) {
case 'invite': return makeReturnObj('invite', tJSXMsgs.invite(senderName, userName));
case 'ban': return makeReturnObj('leave', tJSXMsgs.ban(senderName, userName, content.reason));
case 'invite':
return makeReturnObj('invite', tJSXMsgs.invite(senderName, userName));
case 'ban':
return makeReturnObj('leave', tJSXMsgs.ban(senderName, userName, content.reason));
case 'join':
if (prevContent.membership === 'join') {
if (content.displayname !== prevContent.displayname) {
if (typeof content.displayname === 'undefined') return makeReturnObj('avatar', tJSXMsgs.nameRemoved(sender, prevContent.displayname));
if (typeof prevContent.displayname === 'undefined') return makeReturnObj('avatar', tJSXMsgs.nameSets(sender, content.displayname));
return makeReturnObj('avatar', tJSXMsgs.nameChanged(prevContent.displayname, content.displayname));
if (typeof content.displayname === 'undefined')
return makeReturnObj('avatar', tJSXMsgs.nameRemoved(sender, prevContent.displayname));
if (typeof prevContent.displayname === 'undefined')
return makeReturnObj('avatar', tJSXMsgs.nameSets(sender, content.displayname));
return makeReturnObj(
'avatar',
tJSXMsgs.nameChanged(prevContent.displayname, content.displayname)
);
}
if (content.avatar_url !== prevContent.avatar_url) {
if (typeof content.avatar_url === 'undefined') return makeReturnObj('avatar', tJSXMsgs.avatarRemoved(content.displayname));
if (typeof prevContent.avatar_url === 'undefined') return makeReturnObj('avatar', tJSXMsgs.avatarSets(content.displayname));
if (typeof content.avatar_url === 'undefined')
return makeReturnObj('avatar', tJSXMsgs.avatarRemoved(content.displayname));
if (typeof prevContent.avatar_url === 'undefined')
return makeReturnObj('avatar', tJSXMsgs.avatarSets(content.displayname));
return makeReturnObj('avatar', tJSXMsgs.avatarChanged(content.displayname));
}
return null;
@ -200,23 +225,25 @@ function parseTimelineChange(mEvent) {
case 'leave':
if (sender === mEvent.getStateKey()) {
switch (prevContent.membership) {
case 'invite': return makeReturnObj('invite-cancel', tJSXMsgs.rejectInvite(senderName));
default: return makeReturnObj('leave', tJSXMsgs.leave(senderName, content.reason));
case 'invite':
return makeReturnObj('invite-cancel', tJSXMsgs.rejectInvite(senderName));
default:
return makeReturnObj('leave', tJSXMsgs.leave(senderName, content.reason));
}
}
switch (prevContent.membership) {
case 'invite': return makeReturnObj('invite-cancel', tJSXMsgs.cancelInvite(senderName, userName));
case 'ban': return makeReturnObj('other', tJSXMsgs.unban(senderName, userName));
case 'invite':
return makeReturnObj('invite-cancel', tJSXMsgs.cancelInvite(senderName, userName));
case 'ban':
return makeReturnObj('other', tJSXMsgs.unban(senderName, userName));
// sender is not target and made the target leave,
// if not from invite/ban then this is a kick
default: return makeReturnObj('leave', tJSXMsgs.kick(senderName, userName, content.reason));
default:
return makeReturnObj('leave', tJSXMsgs.kick(senderName, userName, content.reason));
}
default: return null;
default:
return null;
}
}
export {
getTimelineJSXMessages,
getUsersActionJsx,
parseTimelineChange,
};
export { getTimelineJSXMessages, getUsersActionJsx, parseTimelineChange };