Skip to content

Commit dbf7d6e

Browse files
committed
Replace some occurences of useEndpointData
1 parent 78ff5df commit dbf7d6e

File tree

5 files changed

+69
-39
lines changed

5 files changed

+69
-39
lines changed

apps/meteor/client/components/deviceManagement/DeviceManagementTable/DeviceManagementTable.tsx

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
import type { DeviceManagementSession, DeviceManagementPopulatedSession, Serialized } from '@rocket.chat/core-typings';
22
import { Box, Pagination, States, StatesAction, StatesActions, StatesIcon, StatesSubtitle, StatesTitle } from '@rocket.chat/fuselage';
33
import type { PaginatedResult } from '@rocket.chat/rest-typings';
4+
import type { UseQueryResult } from '@tanstack/react-query';
45
import type { ComponentProps, ReactElement } from 'react';
56
import { useTranslation } from 'react-i18next';
67

7-
import { AsyncStatePhase } from '../../../lib/asyncState';
88
import GenericNoResults from '../../GenericNoResults/GenericNoResults';
99
import { GenericTable, GenericTableHeader, GenericTableBody, GenericTableLoadingTable } from '../../GenericTable';
1010

11-
type DeviceManagementTableProps<T> = {
12-
data?: Serialized<PaginatedResult<{ sessions: T[] }>>;
13-
phase?: Partial<AsyncStatePhase>;
14-
error?: Error;
15-
reload?: () => void;
11+
// FIXME: this tight coupling with the query result is not ideal; it indicates visual components should not be tightly
12+
// coupled with data fetching logic.
13+
type DeviceManagementTableProps<T> = UseQueryResult<PaginatedResult<{ sessions: Serialized<T>[] }>> & {
1614
headers: (ReactElement | false)[];
1715
renderRow: (data: Serialized<T>) => ReactElement;
1816
current?: ComponentProps<typeof Pagination>['current'];
@@ -24,10 +22,12 @@ type DeviceManagementTableProps<T> = {
2422

2523
// TODO: Missing error state
2624
const DeviceManagementTable = <T extends DeviceManagementSession | DeviceManagementPopulatedSession>({
27-
data,
28-
phase,
25+
isPending,
26+
isError,
2927
error,
30-
reload,
28+
isSuccess,
29+
data,
30+
refetch,
3131
headers,
3232
renderRow,
3333
current,
@@ -38,16 +38,16 @@ const DeviceManagementTable = <T extends DeviceManagementSession | DeviceManagem
3838
}: DeviceManagementTableProps<T>): ReactElement => {
3939
const { t } = useTranslation();
4040

41-
if (!data && phase === AsyncStatePhase.REJECTED) {
41+
if (isError) {
4242
return (
4343
<Box display='flex' justifyContent='center' alignItems='center' height='100%'>
4444
<States>
4545
<StatesIcon name='warning' variation='danger' />
4646
<StatesTitle>{t('Something_went_wrong')}</StatesTitle>
4747
<StatesSubtitle>{t('We_Could_not_retrive_any_data')}</StatesSubtitle>
48-
<StatesSubtitle>{error?.message}</StatesSubtitle>
48+
<StatesSubtitle>{error.message}</StatesSubtitle>
4949
<StatesActions>
50-
<StatesAction onClick={reload}>{t('Retry')}</StatesAction>
50+
<StatesAction onClick={refetch}>{t('Retry')}</StatesAction>
5151
</StatesActions>
5252
</States>
5353
</Box>
@@ -56,15 +56,15 @@ const DeviceManagementTable = <T extends DeviceManagementSession | DeviceManagem
5656

5757
return (
5858
<>
59-
{data?.sessions.length === 0 && phase === AsyncStatePhase.RESOLVED && <GenericNoResults />}
59+
{data?.sessions.length === 0 && isSuccess && <GenericNoResults />}
6060
<GenericTable>
6161
{data?.sessions && data.sessions.length > 0 && headers && <GenericTableHeader>{headers}</GenericTableHeader>}
6262
<GenericTableBody>
63-
{phase === AsyncStatePhase.LOADING && <GenericTableLoadingTable headerCells={headers.filter(Boolean).length} />}
64-
{phase === AsyncStatePhase.RESOLVED && data?.sessions && data.sessions.map(renderRow)}
63+
{isPending && <GenericTableLoadingTable headerCells={headers.filter(Boolean).length} />}
64+
{isSuccess && data?.sessions && data.sessions.map(renderRow)}
6565
</GenericTableBody>
6666
</GenericTable>
67-
{phase === AsyncStatePhase.RESOLVED && (
67+
{isSuccess && (
6868
<Pagination
6969
divider
7070
current={current}

apps/meteor/client/lib/queryKeys.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,16 @@ export const rolesQueryKeys = {
2525
all: ['roles'] as const,
2626
userRoles: () => [...rolesQueryKeys.all, 'user-roles'] as const,
2727
};
28+
29+
export const omnichannelQueryKeys = {
30+
all: ['omnichannel'] as const,
31+
department: (id: string) => [...omnichannelQueryKeys.all, 'department', id] as const,
32+
};
33+
34+
export const deviceManagementQueryKeys = {
35+
all: ['device-management'] as const,
36+
userSessions: (params: { sort?: string; count?: number; offset?: number }) =>
37+
[...deviceManagementQueryKeys.all, 'users-sessions', params] as const,
38+
sessions: (params: { sort?: string; count?: number; offset?: number }) =>
39+
[...deviceManagementQueryKeys.all, 'all-users-sessions', params] as const,
40+
};

apps/meteor/client/omnichannel/cannedResponses/CannedResponseEditWithDepartmentData.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,37 @@
11
import type { IOmnichannelCannedResponse, Serialized } from '@rocket.chat/core-typings';
22
import { Callout } from '@rocket.chat/fuselage';
3+
import { useEndpoint } from '@rocket.chat/ui-contexts';
4+
import { useQuery } from '@tanstack/react-query';
35
import { useMemo } from 'react';
46
import { useTranslation } from 'react-i18next';
57

68
import CannedResponseEdit from './CannedResponseEdit';
79
import { FormSkeleton } from '../../components/Skeleton';
8-
import { AsyncStatePhase } from '../../hooks/useAsyncState';
9-
import { useEndpointData } from '../../hooks/useEndpointData';
10+
import { omnichannelQueryKeys } from '../../lib/queryKeys';
1011

1112
const CannedResponseEditWithDepartmentData = ({ cannedResponseData }: { cannedResponseData: Serialized<IOmnichannelCannedResponse> }) => {
1213
const departmentId = useMemo(() => cannedResponseData?.departmentId, [cannedResponseData]) as string;
13-
const { value: departmentData, phase: state, error } = useEndpointData('/v1/livechat/department/:_id', { keys: { _id: departmentId } });
14+
15+
const getDepartment = useEndpoint('GET', '/v1/livechat/department/:_id', { _id: departmentId });
16+
const {
17+
data: departmentData,
18+
isPending,
19+
isError,
20+
} = useQuery({
21+
queryKey: omnichannelQueryKeys.department(departmentId),
22+
queryFn: async () => {
23+
const { department } = await getDepartment({});
24+
return department;
25+
},
26+
});
1427

1528
const { t } = useTranslation();
1629

17-
if (state === AsyncStatePhase.LOADING) {
30+
if (isPending) {
1831
return <FormSkeleton />;
1932
}
2033

21-
if (error) {
34+
if (isError) {
2235
return (
2336
<Callout m={16} type='danger'>
2437
{t('Not_Available')}

apps/meteor/client/views/account/deviceManagement/DeviceManagementAccountTable/DeviceManagementAccountTable.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { useMediaQuery } from '@rocket.chat/fuselage-hooks';
2+
import { useEndpoint } from '@rocket.chat/ui-contexts';
3+
import { useQuery } from '@tanstack/react-query';
24
import type { ReactElement } from 'react';
35
import { useMemo } from 'react';
46
import { useTranslation } from 'react-i18next';
@@ -8,7 +10,7 @@ import { GenericTableHeaderCell } from '../../../../components/GenericTable';
810
import { usePagination } from '../../../../components/GenericTable/hooks/usePagination';
911
import { useSort } from '../../../../components/GenericTable/hooks/useSort';
1012
import DeviceManagementTable from '../../../../components/deviceManagement/DeviceManagementTable';
11-
import { useEndpointData } from '../../../../hooks/useEndpointData';
13+
import { deviceManagementQueryKeys } from '../../../../lib/queryKeys';
1214

1315
const sortMapping = {
1416
client: 'device.name',
@@ -30,7 +32,11 @@ const DeviceManagementAccountTable = (): ReactElement => {
3032
[itemsPerPage, current, sortBy, sortDirection],
3133
);
3234

33-
const { value: data, phase, error, reload } = useEndpointData('/v1/sessions/list', { params: query });
35+
const listSessions = useEndpoint('GET', '/v1/sessions/list');
36+
const queryResult = useQuery({
37+
queryKey: deviceManagementQueryKeys.userSessions(query),
38+
queryFn: () => listSessions(query),
39+
});
3440

3541
const mediaQuery = useMediaQuery('(min-width: 1024px)');
3642

@@ -53,10 +59,7 @@ const DeviceManagementAccountTable = (): ReactElement => {
5359

5460
return (
5561
<DeviceManagementTable
56-
data={data}
57-
phase={phase}
58-
error={error}
59-
reload={reload}
62+
{...queryResult}
6063
headers={headers}
6164
renderRow={(session): ReactElement => (
6265
<DeviceManagementAccountRow
@@ -66,7 +69,7 @@ const DeviceManagementAccountTable = (): ReactElement => {
6669
deviceType={session.device?.type}
6770
deviceOSName={session.device?.os.name}
6871
loginAt={session.loginAt}
69-
onReload={reload}
72+
onReload={queryResult.refetch}
7073
/>
7174
)}
7275
current={current}

apps/meteor/client/views/admin/deviceManagement/DeviceManagementAdminTable/DeviceManagementAdminTable.tsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import type { DeviceManagementPopulatedSession, DeviceManagementSession, Serialized } from '@rocket.chat/core-typings';
22
import { useDebouncedValue, useMediaQuery } from '@rocket.chat/fuselage-hooks';
3+
import { useEndpoint } from '@rocket.chat/ui-contexts';
4+
import { useQuery } from '@tanstack/react-query';
35
import type { ReactElement, MutableRefObject } from 'react';
4-
import { useState, useMemo, useEffect } from 'react';
6+
import { useState, useMemo } from 'react';
57
import { useTranslation } from 'react-i18next';
68

79
import DeviceManagementAdminRow from './DeviceManagementAdminRow';
@@ -10,7 +12,7 @@ import { GenericTableHeaderCell } from '../../../../components/GenericTable';
1012
import { usePagination } from '../../../../components/GenericTable/hooks/usePagination';
1113
import { useSort } from '../../../../components/GenericTable/hooks/useSort';
1214
import DeviceManagementTable from '../../../../components/deviceManagement/DeviceManagementTable';
13-
import { useEndpointData } from '../../../../hooks/useEndpointData';
15+
import { deviceManagementQueryKeys } from '../../../../lib/queryKeys';
1416

1517
const sortMapping = {
1618
client: 'device.name',
@@ -42,11 +44,13 @@ const DeviceManagementAdminTable = ({ reloadRef }: { reloadRef: MutableRefObject
4244
500,
4345
);
4446

45-
const { value: data, phase, error, reload } = useEndpointData('/v1/sessions/list.all', { params: query });
47+
const listAllSessions = useEndpoint('GET', '/v1/sessions/list.all');
48+
const queryResult = useQuery({
49+
queryKey: deviceManagementQueryKeys.sessions(query),
50+
queryFn: () => listAllSessions(query),
51+
});
4652

47-
useEffect(() => {
48-
reloadRef.current = reload;
49-
}, [reloadRef, reload]);
53+
reloadRef.current = queryResult.refetch;
5054

5155
const mediaQuery = useMediaQuery('(min-width: 1024px)');
5256

@@ -78,10 +82,7 @@ const DeviceManagementAdminTable = ({ reloadRef }: { reloadRef: MutableRefObject
7882
<>
7983
<FilterByText placeholder={t('Search_Devices_Users')} value={text} onChange={(event) => setText(event.target.value)} />
8084
<DeviceManagementTable
81-
data={data}
82-
phase={phase}
83-
error={error}
84-
reload={reload}
85+
{...queryResult}
8586
headers={headers}
8687
renderRow={(session): ReactElement => (
8788
<DeviceManagementAdminRow
@@ -94,7 +95,7 @@ const DeviceManagementAdminTable = ({ reloadRef }: { reloadRef: MutableRefObject
9495
deviceOSName={session?.device?.os?.name}
9596
rcVersion={session?.device?.version}
9697
loginAt={session.loginAt}
97-
onReload={reload}
98+
onReload={queryResult.refetch}
9899
/>
99100
)}
100101
current={current}

0 commit comments

Comments
 (0)