RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/admin/settings/groups/VoipGroupPage/VoipExtensionsPage.tsx

Summary

Maintainability
B
6 hrs
Test Coverage
import { Box, Chip, Button, Pagination } from '@rocket.chat/fuselage';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import { useSetModal, useTranslation, useEndpoint } from '@rocket.chat/ui-contexts';
import { useQuery } from '@tanstack/react-query';
import React, { useMemo } from 'react';

import GenericNoResults from '../../../../../components/GenericNoResults';
import {
    GenericTable,
    GenericTableHeaderCell,
    GenericTableRow,
    GenericTableCell,
    GenericTableHeader,
    GenericTableBody,
    GenericTableLoadingRow,
} from '../../../../../components/GenericTable';
import { usePagination } from '../../../../../components/GenericTable/hooks/usePagination';
import { PageContent } from '../../../../../components/Page';
import AssignAgentButton from './AssignAgentButton';
import AssignAgentModal from './AssignAgentModal';
import RemoveAgentButton from './RemoveAgentButton';

const VoipExtensionsPage = () => {
    const t = useTranslation();
    const setModal = useSetModal();

    const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination();

    const query = useMemo(
        () => ({
            ...(itemsPerPage && { count: itemsPerPage }),
            ...(current && { offset: current }),
        }),
        [itemsPerPage, current],
    );

    const getExtensions = useEndpoint('GET', '/v1/omnichannel/extensions');
    const { data, isSuccess, isLoading, refetch } = useQuery(['omnichannel-extensions', query], async () => getExtensions(query));

    const headers = (
        <>
            <GenericTableHeaderCell key='extension-number' w='x156'>
                {t('Extension_Number')}
            </GenericTableHeaderCell>
            <GenericTableHeaderCell key='agent-name' w='x160'>
                {t('Agent_Name')}
            </GenericTableHeaderCell>
            <GenericTableHeaderCell key='extension-status' w='x120'>
                {t('Extension_Status')}
            </GenericTableHeaderCell>
            <GenericTableHeaderCell key='queues' w='x120'>
                {t('Queues')}
            </GenericTableHeaderCell>
            <GenericTableHeaderCell key='remove-add' w='x60' />
        </>
    );

    return (
        <PageContent>
            <Box display='flex' flexDirection='row' alignItems='center' justifyContent='space-between' mb={14}>
                <Box fontScale='p2' color='hint'>
                    {data?.total} {t('Extensions')}
                </Box>
                <Box>
                    <Button primary onClick={(): void => setModal(<AssignAgentModal closeModal={(): void => setModal()} reload={refetch} />)}>
                        {t('Associate_Agent')}
                    </Button>
                </Box>
            </Box>
            {isLoading && (
                <GenericTable>
                    <GenericTableHeader>{headers}</GenericTableHeader>
                    <GenericTableBody>
                        <GenericTableLoadingRow cols={4} />
                    </GenericTableBody>
                </GenericTable>
            )}
            {isSuccess && data?.extensions.length === 0 && <GenericNoResults />}
            {isSuccess && data?.extensions.length > 0 && (
                <>
                    <GenericTable>
                        <GenericTableHeader>{headers}</GenericTableHeader>
                        <GenericTableBody>
                            {data?.extensions.map(({ extension, username, name, state, queues }) => (
                                <GenericTableRow key={extension} tabIndex={0}>
                                    <GenericTableCell withTruncatedText>{extension}</GenericTableCell>
                                    <GenericTableCell withTruncatedText>
                                        {username ? (
                                            <Box display='flex' alignItems='center'>
                                                <UserAvatar size='x28' username={username} />
                                                <Box display='flex' mi={8}>
                                                    <Box display='flex' flexDirection='column' alignSelf='center'>
                                                        <Box fontScale='p2m' color='default'>
                                                            {name || username}
                                                        </Box>
                                                    </Box>
                                                </Box>
                                            </Box>
                                        ) : (
                                            t('Free')
                                        )}
                                    </GenericTableCell>
                                    <GenericTableCell withTruncatedText>{state}</GenericTableCell>
                                    <GenericTableCell withTruncatedText maxHeight='x36'>
                                        <Box display='flex' flexDirection='row' alignItems='center' title={queues?.join(', ')}>
                                            {queues?.map(
                                                (queue: string, index: number) =>
                                                    index <= 1 && (
                                                        <Chip mie={4} key={queue} value={queue}>
                                                            {queue}
                                                        </Chip>
                                                    ),
                                            )}
                                            {queues && queues?.length > 2 && `+${(queues.length - 2).toString()}`}
                                        </Box>
                                    </GenericTableCell>
                                    {username ? (
                                        <RemoveAgentButton username={username} reload={refetch} />
                                    ) : (
                                        <AssignAgentButton extension={extension} reload={refetch} />
                                    )}
                                </GenericTableRow>
                            ))}
                        </GenericTableBody>
                    </GenericTable>
                    <Pagination
                        divider
                        current={current}
                        itemsPerPage={itemsPerPage}
                        count={data?.total || 0}
                        onSetItemsPerPage={onSetItemsPerPage}
                        onSetCurrent={onSetCurrent}
                        {...paginationProps}
                    />
                </>
            )}
        </PageContent>
    );
};

export default VoipExtensionsPage;