RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/admin/rooms/RoomRow.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import { isDiscussion } from '@rocket.chat/core-typings';
import type { IRoom, RoomAdminFieldsType, Serialized } from '@rocket.chat/core-typings';
import { Box, Icon } from '@rocket.chat/fuselage';
import { useMediaQuery } from '@rocket.chat/fuselage-hooks';
import { RoomAvatar } from '@rocket.chat/ui-avatar';
import { useRouter, useTranslation } from '@rocket.chat/ui-contexts';
import React, { useCallback } from 'react';

import { GenericTableCell, GenericTableRow } from '../../../components/GenericTable';
import { useFormatDate } from '../../../hooks/useFormatDate';
import { roomCoordinator } from '../../../lib/rooms/roomCoordinator';

const roomTypeI18nMap = {
    l: 'Omnichannel',
    c: 'Channel',
    d: 'Direct_Message',
    p: 'Private_Channel',
} as const;

const getRoomDisplayName = (room: Pick<Serialized<IRoom>, RoomAdminFieldsType>): string | undefined =>
    room.t === 'd' ? room.usernames?.join(' x ') : roomCoordinator.getRoomName(room.t, room as IRoom);

const RoomRow = ({ room }: { room: Pick<Serialized<IRoom>, RoomAdminFieldsType> }) => {
    const t = useTranslation();
    const mediaQuery = useMediaQuery('(min-width: 1024px)');
    const router = useRouter();
    const formatDate = useFormatDate();

    const { _id, t: type, usersCount, msgs, default: isDefault, featured, ts, ...args } = room;
    const icon = roomCoordinator.getRoomDirectives(room.t).getIcon?.(room as IRoom);
    const roomName = getRoomDisplayName(room);

    const getRoomType = (
        room: Pick<Serialized<IRoom>, RoomAdminFieldsType>,
    ): (typeof roomTypeI18nMap)[keyof typeof roomTypeI18nMap] | 'Teams_Public_Team' | 'Teams_Private_Team' | 'Discussion' => {
        if (room.teamMain) {
            return room.t === 'c' ? 'Teams_Public_Team' : 'Teams_Private_Team';
        }
        if (isDiscussion(room as IRoom)) {
            return 'Discussion';
        }
        return roomTypeI18nMap[(room as IRoom).t as keyof typeof roomTypeI18nMap];
    };

    const onClick = useCallback(
        (rid) => (): void =>
            router.navigate({
                name: 'admin-rooms',
                params: {
                    context: 'edit',
                    id: rid,
                },
            }),
        [router],
    );

    return (
        <GenericTableRow action key={_id} onKeyDown={onClick(_id)} onClick={onClick(_id)} tabIndex={0} role='link' qa-room-id={_id}>
            <GenericTableCell withTruncatedText>
                <Box display='flex' alignContent='center'>
                    <RoomAvatar size={mediaQuery ? 'x28' : 'x40'} room={{ type, name: roomName, _id, ...args }} />
                    <Box
                        display='flex'
                        flexGrow={1}
                        flexShrink={1}
                        flexBasis='0%'
                        flexDirection='row'
                        alignSelf='center'
                        alignItems='center'
                        withTruncatedText
                    >
                        {icon && <Icon mi={4} name={icon} fontScale='p2m' color='hint' />}
                        <Box fontScale='p2m' withTruncatedText color='default' qa-room-name={roomName}>
                            {roomName}
                        </Box>
                    </Box>
                </Box>
            </GenericTableCell>
            <GenericTableCell>
                <Box color='hint' fontScale='p2m' withTruncatedText>
                    {t(getRoomType(room))}
                </Box>
            </GenericTableCell>
            <GenericTableCell withTruncatedText>{usersCount}</GenericTableCell>
            {mediaQuery && <GenericTableCell withTruncatedText>{msgs}</GenericTableCell>}
            {mediaQuery && <GenericTableCell withTruncatedText>{isDefault ? t('True') : t('False')}</GenericTableCell>}
            {mediaQuery && <GenericTableCell withTruncatedText>{featured ? t('True') : t('False')}</GenericTableCell>}
            {mediaQuery && <GenericTableCell withTruncatedText>{ts ? formatDate(ts) : ''}</GenericTableCell>}
        </GenericTableRow>
    );
};

export default RoomRow;