import React, { ReactNode } from 'react'; import { IconSrc, Icons } from 'folds'; import { MatrixEvent } from 'matrix-js-sdk'; import { IMemberContent, Membership } from '../../types/matrix/room'; import { getMxIdLocalPart } from '../utils/matrix'; import { isMembershipChanged } from '../utils/room'; export type ParsedResult = { icon: IconSrc; body: ReactNode; }; export type MemberEventParser = (mEvent: MatrixEvent) => ParsedResult; export const useMemberEventParser = (): MemberEventParser => { const parseMemberEvent: MemberEventParser = (mEvent) => { const content = mEvent.getContent(); const prevContent = mEvent.getPrevContent() as IMemberContent; const senderId = mEvent.getSender(); const userId = mEvent.getStateKey(); if (!senderId || !userId) return { icon: Icons.User, body: 'Broken membership event', }; const senderName = getMxIdLocalPart(senderId); const userName = content.displayname || getMxIdLocalPart(userId); if (isMembershipChanged(mEvent)) { if (content.membership === Membership.Invite) { if (prevContent.membership === Membership.Knock) { return { icon: Icons.ArrowGoRightPlus, body: ( <> {senderName} {' accepted '} {userName} {`'s join request `} {content.reason} ), }; } return { icon: Icons.ArrowGoRightPlus, body: ( <> {senderName} {' invited '} {userName} {content.reason} ), }; } if (content.membership === Membership.Knock) { return { icon: Icons.ArrowGoRightPlus, body: ( <> {userName} {' request to join room '} {content.reason} ), }; } if (content.membership === Membership.Join) { return { icon: Icons.ArrowGoRight, body: ( <> {userName} {' joined the room'} ), }; } if (content.membership === Membership.Leave) { if (prevContent.membership === Membership.Invite) { return { icon: Icons.ArrowGoRightCross, body: senderId === userId ? ( <> {userName} {' rejected the invitation '} {content.reason} ) : ( <> {senderName} {' rejected '} {userName} {`'s join request `} {content.reason} ), }; } if (prevContent.membership === Membership.Knock) { return { icon: Icons.ArrowGoRightCross, body: senderId === userId ? ( <> {userName} {' revoked joined request '} {content.reason} ) : ( <> {senderName} {' revoked '} {userName} {`'s invite `} {content.reason} ), }; } if (prevContent.membership === Membership.Ban) { return { icon: Icons.ArrowGoLeft, body: ( <> {senderName} {' unbanned '} {userName} {content.reason} ), }; } return { icon: Icons.ArrowGoLeft, body: senderId === userId ? ( <> {userName} {' left the room '} {content.reason} ) : ( <> {senderName} {' kicked '} {userName} {content.reason} ), }; } if (content.membership === Membership.Ban) { return { icon: Icons.ArrowGoLeft, body: ( <> {senderName} {' banned '} {userName} {content.reason} ), }; } } if (content.displayname !== prevContent.displayname) { const prevUserName = prevContent.displayname || userId; return { icon: Icons.Mention, body: content.displayname ? ( <> {prevUserName} {' changed display name to '} {userName} ) : ( <> {prevUserName} {' removed their display name '} ), }; } if (content.avatar_url !== prevContent.avatar_url) { return { icon: Icons.User, body: content.displayname ? ( <> {userName} {' changed their avatar'} ) : ( <> {userName} {' removed their avatar '} ), }; } return { icon: Icons.User, body: 'Broken membership event', }; }; return parseMemberEvent; };