-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Expand file tree
/
Copy pathManagersTable.tsx
More file actions
151 lines (140 loc) · 4.88 KB
/
ManagersTable.tsx
File metadata and controls
151 lines (140 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import { Box, Pagination } from '@rocket.chat/fuselage';
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
import { UserAvatar } from '@rocket.chat/ui-avatar';
import {
GenericTable,
GenericTableBody,
GenericTableCell,
GenericTableHeader,
GenericTableHeaderCell,
GenericTableLoadingTable,
GenericTableRow,
usePagination,
useSort,
} from '@rocket.chat/ui-client';
import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts';
import { hashKey, useQuery } from '@tanstack/react-query';
import { useMemo, useState } from 'react';
import AddManager from './AddManager';
import RemoveManagerButton from './RemoveManagerButton';
import FilterByText from '../../../components/FilterByText';
import GenericError from '../../../components/GenericError';
import GenericNoResults from '../../../components/GenericNoResults/GenericNoResults';
import { links } from '../../../lib/links';
import { omnichannelQueryKeys } from '../../../lib/queryKeys';
const ManagersTable = () => {
const t = useTranslation();
const [text, setText] = useState('');
const { sortBy, sortDirection, setSort } = useSort<'name' | 'username' | 'emails.address'>('name');
const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination();
const query = useDebouncedValue(
useMemo(
() => ({
text,
sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`,
count: itemsPerPage,
offset: current,
}),
[text, sortBy, sortDirection, itemsPerPage, current],
),
500,
);
const getManagers = useEndpoint('GET', '/v1/livechat/users/:type', { type: 'manager' });
const { data, isLoading, isSuccess, isError, refetch } = useQuery({
queryKey: omnichannelQueryKeys.managers(query),
queryFn: async () => getManagers(query),
});
const [defaultQuery] = useState(hashKey([query]));
const queryHasChanged = defaultQuery !== hashKey([query]);
const headers = (
<>
<GenericTableHeaderCell key='name' direction={sortDirection} active={sortBy === 'name'} onClick={setSort} sort='name'>
{t('Name')}
</GenericTableHeaderCell>
<GenericTableHeaderCell key='username' direction={sortDirection} active={sortBy === 'username'} onClick={setSort} sort='username'>
{t('Username')}
</GenericTableHeaderCell>
<GenericTableHeaderCell
key='email'
direction={sortDirection}
active={sortBy === 'emails.address'}
onClick={setSort}
sort='emails.address'
>
{t('Email')}
</GenericTableHeaderCell>
<GenericTableHeaderCell key='remove' w='x60'>
{t('Remove')}
</GenericTableHeaderCell>
</>
);
return (
<>
<AddManager />
{((isSuccess && data?.users.length > 0) || queryHasChanged) && (
<FilterByText value={text} onChange={(event) => setText(event.target.value)} />
)}
{isLoading && (
<GenericTable aria-busy={isLoading} aria-label={t('Managers')}>
<GenericTableHeader>{headers}</GenericTableHeader>
<GenericTableBody>
<GenericTableLoadingTable headerCells={4} />
</GenericTableBody>
</GenericTable>
)}
{isSuccess && data.users.length === 0 && (
<GenericNoResults
icon='shield'
title={t('No_managers_yet')}
description={t('No_managers_yet_description')}
linkHref={links.go.omnichannelDocs}
linkText={t('Learn_more_about_managers')}
/>
)}
{isSuccess && data.users.length > 0 && (
<>
<GenericTable aria-busy={isLoading} aria-label={t('Managers')}>
<GenericTableHeader>{headers}</GenericTableHeader>
<GenericTableBody>
{data.users.map((user) => (
<GenericTableRow key={user._id} tabIndex={0}>
<GenericTableCell withTruncatedText>
<Box display='flex' alignItems='center'>
<UserAvatar size='x28' username={user.username || ''} etag={user.avatarETag} />
<Box display='flex' withTruncatedText mi={8}>
<Box display='flex' flexDirection='column' alignSelf='center' withTruncatedText>
<Box fontScale='p2m' withTruncatedText color='default'>
{user.name || user.username}
</Box>
</Box>
</Box>
</Box>
</GenericTableCell>
<GenericTableCell>
<Box fontScale='p2m' withTruncatedText color='hint'>
{user.username}
</Box>
<Box mi={4} />
</GenericTableCell>
<GenericTableCell withTruncatedText>{user.emails?.length && user.emails[0].address}</GenericTableCell>
<RemoveManagerButton _id={user._id} />
</GenericTableRow>
))}
</GenericTableBody>
</GenericTable>
<Pagination
divider
current={current}
itemsPerPage={itemsPerPage}
count={data.total || 0}
onSetItemsPerPage={onSetItemsPerPage}
onSetCurrent={onSetCurrent}
{...paginationProps}
/>
</>
)}
{isError && <GenericError buttonAction={refetch} />}
</>
);
};
export default ManagersTable;